capsules_extra/debug_process_restart.rs
1// Licensed under the Apache License, Version 2.0 or the MIT License.
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3// Copyright Tock Contributors 2022.
4
5//! Debug capsule to cause a button press to make all apps fault.
6//!
7//! This is useful for debugging that capsules and apps work when they are
8//! restarted by the kernel.
9//!
10//! Usage
11//! -----
12//!
13//! ```rust,ignore
14//! # use kernel::{capabilities, static_init};
15//!
16//! struct ProcessMgmtCap;
17//! unsafe impl capabilities::ProcessManagementCapability for ProcessMgmtCap {}
18//! let debug_process_restart = static_init!(
19//! capsules::debug_process_restart::DebugProcessRestart<
20//! 'static,
21//! ProcessMgmtCap,
22//! >,
23//! capsules::debug_process_restart::DebugProcessRestart::new(
24//! board_kernel,
25//! ProcessMgmtCap
26//! &sam4l::gpio::PA[16],
27//! kernel::hil::gpio::ActivationMode::ActiveLow,
28//! kernel::hil::gpio::FloatingState::PullUp
29//! )
30//! );
31//! sam4l::gpio::PA[16].set_client(debug_process_restart);
32//! ```
33
34use kernel::capabilities::ProcessManagementCapability;
35use kernel::hil::gpio;
36use kernel::Kernel;
37
38pub struct DebugProcessRestart<'a, C: ProcessManagementCapability> {
39 kernel: &'static Kernel,
40 capability: C,
41 pin: &'a dyn gpio::InterruptPin<'a>,
42 mode: gpio::ActivationMode,
43}
44
45impl<'a, C: ProcessManagementCapability> DebugProcessRestart<'a, C> {
46 pub fn new(
47 kernel: &'static Kernel,
48 cap: C,
49 pin: &'a dyn gpio::InterruptPin<'a>,
50 mode: gpio::ActivationMode,
51 floating_state: gpio::FloatingState,
52 ) -> Self {
53 pin.make_input();
54 pin.set_floating_state(floating_state);
55 pin.enable_interrupts(gpio::InterruptEdge::EitherEdge);
56
57 DebugProcessRestart {
58 kernel,
59 capability: cap,
60 pin,
61 mode,
62 }
63 }
64}
65
66impl<C: ProcessManagementCapability> gpio::Client for DebugProcessRestart<'_, C> {
67 fn fired(&self) {
68 if self.pin.read_activation(self.mode) == gpio::ActivationState::Active {
69 self.kernel.hardfault_all_apps(&self.capability);
70 }
71 }
72}