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}