Merge branch 'master' into v2_error
This commit is contained in:
@@ -15,4 +15,4 @@ cortexm4 = { path = "../../../arch/cortex-m4" }
|
|||||||
capsules = { path = "../../../capsules" }
|
capsules = { path = "../../../capsules" }
|
||||||
kernel = { path = "../../../kernel" }
|
kernel = { path = "../../../kernel" }
|
||||||
nrf52840 = { path = "../../../chips/nrf52840" }
|
nrf52840 = { path = "../../../chips/nrf52840" }
|
||||||
nrf52dk_base = { path = "../nrf52dk_base" }
|
nrf52_components = { path = "../nrf52_components" }
|
||||||
|
|||||||
@@ -11,4 +11,4 @@ cortexm4 = { path = "../../../arch/cortex-m4" }
|
|||||||
capsules = { path = "../../../capsules" }
|
capsules = { path = "../../../capsules" }
|
||||||
kernel = { path = "../../../kernel" }
|
kernel = { path = "../../../kernel" }
|
||||||
nrf52840 = { path = "../../../chips/nrf52840" }
|
nrf52840 = { path = "../../../chips/nrf52840" }
|
||||||
nrf52dk_base = { path = "../nrf52dk_base" }
|
nrf52_components = { path = "../nrf52_components" }
|
||||||
|
|||||||
@@ -4,14 +4,20 @@
|
|||||||
//! many exported I/O and peripherals.
|
//! many exported I/O and peripherals.
|
||||||
|
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
// Disable this attribute when documenting, as a workaround for
|
||||||
|
// https://github.com/rust-lang/rust/issues/62184.
|
||||||
|
#![cfg_attr(not(doc), no_main)]
|
||||||
|
#![feature(const_in_array_repeat_expressions)]
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs)]
|
||||||
|
|
||||||
|
use capsules::virtual_alarm::VirtualMuxAlarm;
|
||||||
|
use kernel::common::dynamic_deferred_call::{DynamicDeferredCall, DynamicDeferredCallClientState};
|
||||||
use kernel::component::Component;
|
use kernel::component::Component;
|
||||||
#[allow(unused_imports)]
|
#[allow(unused_imports)]
|
||||||
use kernel::{debug, debug_gpio, debug_verbose, static_init};
|
use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init};
|
||||||
|
use kernel::hil::usb::UsbController;
|
||||||
use nrf52840::gpio::Pin;
|
use nrf52840::gpio::Pin;
|
||||||
use nrf52dk_base::{SpiPins, UartChannel, UartPins};
|
use nrf52_components::{self, UartChannel, UartPins};
|
||||||
|
|
||||||
// The nRF52840 MDK USB Dongle LEDs
|
// The nRF52840 MDK USB Dongle LEDs
|
||||||
const LED1_R_PIN: Pin = Pin::P0_23;
|
const LED1_R_PIN: Pin = Pin::P0_23;
|
||||||
@@ -27,13 +33,24 @@ const UART_TXD: Pin = Pin::P0_20;
|
|||||||
const UART_CTS: Option<Pin> = Some(Pin::P0_03);
|
const UART_CTS: Option<Pin> = Some(Pin::P0_03);
|
||||||
const UART_RXD: Pin = Pin::P0_19;
|
const UART_RXD: Pin = Pin::P0_19;
|
||||||
|
|
||||||
const SPI_MOSI: Pin = Pin::P0_05;
|
// Constants related to the configuration of the 15.4 network stack
|
||||||
const SPI_MISO: Pin = Pin::P0_06;
|
const SRC_MAC: u16 = 0xf00f;
|
||||||
const SPI_CLK: Pin = Pin::P0_07;
|
const PAN_ID: u16 = 0xABCD;
|
||||||
|
|
||||||
/// UART Writer
|
/// UART Writer
|
||||||
pub mod io;
|
pub mod io;
|
||||||
|
|
||||||
|
const VENDOR_ID: u16 = 0x1915; // Nordic Semiconductor
|
||||||
|
const PRODUCT_ID: u16 = 0x521f; // nRF52840 Dongle (PCA10059)
|
||||||
|
static STRINGS: &'static [&'static str] = &[
|
||||||
|
// Manufacturer
|
||||||
|
"Nordic Semiconductor ASA",
|
||||||
|
// Product
|
||||||
|
"OpenSK",
|
||||||
|
// Serial number
|
||||||
|
"v0.1",
|
||||||
|
];
|
||||||
|
|
||||||
// State for loading and holding applications.
|
// State for loading and holding applications.
|
||||||
// How should the kernel respond when a process faults.
|
// How should the kernel respond when a process faults.
|
||||||
const FAULT_RESPONSE: kernel::procs::FaultResponse = kernel::procs::FaultResponse::Panic;
|
const FAULT_RESPONSE: kernel::procs::FaultResponse = kernel::procs::FaultResponse::Panic;
|
||||||
@@ -41,12 +58,8 @@ const FAULT_RESPONSE: kernel::procs::FaultResponse = kernel::procs::FaultRespons
|
|||||||
// Number of concurrent processes this platform supports.
|
// Number of concurrent processes this platform supports.
|
||||||
const NUM_PROCS: usize = 8;
|
const NUM_PROCS: usize = 8;
|
||||||
|
|
||||||
// RAM to be shared by all application processes.
|
|
||||||
#[link_section = ".app_memory"]
|
|
||||||
static mut APP_MEMORY: [u8; 0x3C000] = [0; 0x3C000];
|
|
||||||
|
|
||||||
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
||||||
[None, None, None, None, None, None, None, None];
|
[None; NUM_PROCS];
|
||||||
|
|
||||||
static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 1] = [kernel::StorageLocation {
|
static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 1] = [kernel::StorageLocation {
|
||||||
address: 0xC0000,
|
address: 0xC0000,
|
||||||
@@ -61,6 +74,84 @@ static mut CHIP: Option<&'static nrf52840::chip::Chip> = None;
|
|||||||
#[link_section = ".stack_buffer"]
|
#[link_section = ".stack_buffer"]
|
||||||
pub static mut STACK_MEMORY: [u8; 0x1000] = [0; 0x1000];
|
pub static mut STACK_MEMORY: [u8; 0x1000] = [0; 0x1000];
|
||||||
|
|
||||||
|
/// Supported drivers by the platform
|
||||||
|
pub struct Platform {
|
||||||
|
ble_radio: &'static capsules::ble_advertising_driver::BLE<
|
||||||
|
'static,
|
||||||
|
nrf52840::ble_radio::Radio<'static>,
|
||||||
|
VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
|
||||||
|
>,
|
||||||
|
ieee802154_radio: &'static capsules::ieee802154::RadioDriver<'static>,
|
||||||
|
button: &'static capsules::button::Button<'static, nrf52840::gpio::GPIOPin<'static>>,
|
||||||
|
pconsole: &'static capsules::process_console::ProcessConsole<
|
||||||
|
'static,
|
||||||
|
components::process_console::Capability,
|
||||||
|
>,
|
||||||
|
console: &'static capsules::console::Console<'static>,
|
||||||
|
gpio: &'static capsules::gpio::GPIO<'static, nrf52840::gpio::GPIOPin<'static>>,
|
||||||
|
led: &'static capsules::led::LED<'static, nrf52840::gpio::GPIOPin<'static>>,
|
||||||
|
rng: &'static capsules::rng::RngDriver<'static>,
|
||||||
|
temp: &'static capsules::temperature::TemperatureSensor<'static>,
|
||||||
|
ipc: kernel::ipc::IPC,
|
||||||
|
analog_comparator: &'static capsules::analog_comparator::AnalogComparator<
|
||||||
|
'static,
|
||||||
|
nrf52840::acomp::Comparator<'static>,
|
||||||
|
>,
|
||||||
|
alarm: &'static capsules::alarm::AlarmDriver<
|
||||||
|
'static,
|
||||||
|
capsules::virtual_alarm::VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
|
||||||
|
>,
|
||||||
|
nvmc: &'static nrf52840::nvmc::SyscallDriver,
|
||||||
|
usb: &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
|
'static,
|
||||||
|
'static,
|
||||||
|
nrf52840::usbd::Usbd<'static>,
|
||||||
|
>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl kernel::Platform for Platform {
|
||||||
|
fn with_driver<F, R>(&self, driver_num: usize, f: F) -> R
|
||||||
|
where
|
||||||
|
F: FnOnce(Option<&dyn kernel::Driver>) -> R,
|
||||||
|
{
|
||||||
|
match driver_num {
|
||||||
|
capsules::console::DRIVER_NUM => f(Some(self.console)),
|
||||||
|
capsules::gpio::DRIVER_NUM => f(Some(self.gpio)),
|
||||||
|
capsules::alarm::DRIVER_NUM => f(Some(self.alarm)),
|
||||||
|
capsules::led::DRIVER_NUM => f(Some(self.led)),
|
||||||
|
capsules::button::DRIVER_NUM => f(Some(self.button)),
|
||||||
|
capsules::rng::DRIVER_NUM => f(Some(self.rng)),
|
||||||
|
capsules::ble_advertising_driver::DRIVER_NUM => f(Some(self.ble_radio)),
|
||||||
|
capsules::ieee802154::DRIVER_NUM => f(Some(self.ieee802154_radio)),
|
||||||
|
capsules::temperature::DRIVER_NUM => f(Some(self.temp)),
|
||||||
|
capsules::analog_comparator::DRIVER_NUM => f(Some(self.analog_comparator)),
|
||||||
|
nrf52840::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
||||||
|
capsules::usb::usb_ctap::DRIVER_NUM => f(Some(self.usb)),
|
||||||
|
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
||||||
|
_ => f(None),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn filter_syscall(
|
||||||
|
&self,
|
||||||
|
process: &dyn kernel::procs::ProcessType,
|
||||||
|
syscall: &kernel::syscall::Syscall,
|
||||||
|
) -> Result<(), kernel::ReturnCode> {
|
||||||
|
use kernel::syscall::Syscall;
|
||||||
|
match *syscall {
|
||||||
|
Syscall::COMMAND {
|
||||||
|
driver_number: nrf52840::nvmc::DRIVER_NUM,
|
||||||
|
subdriver_number: cmd,
|
||||||
|
arg0: ptr,
|
||||||
|
arg1: len,
|
||||||
|
} if (cmd == 2 || cmd == 3) && !process.fits_in_storage_location(ptr, len) => {
|
||||||
|
Err(kernel::ReturnCode::EINVAL)
|
||||||
|
}
|
||||||
|
_ => Ok(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Entry point in the vector table called on hard reset.
|
/// Entry point in the vector table called on hard reset.
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe fn reset_handler() {
|
pub unsafe fn reset_handler() {
|
||||||
@@ -72,24 +163,34 @@ pub unsafe fn reset_handler() {
|
|||||||
kernel::Kernel::new_with_storage(&PROCESSES, &STORAGE_LOCATIONS)
|
kernel::Kernel::new_with_storage(&PROCESSES, &STORAGE_LOCATIONS)
|
||||||
);
|
);
|
||||||
// GPIOs
|
// GPIOs
|
||||||
let gpio = components::gpio::GpioComponent::new(board_kernel).finalize(
|
let gpio = components::gpio::GpioComponent::new(
|
||||||
|
board_kernel,
|
||||||
components::gpio_component_helper!(
|
components::gpio_component_helper!(
|
||||||
&nrf52840::gpio::PORT[Pin::P0_04],
|
nrf52840::gpio::GPIOPin,
|
||||||
&nrf52840::gpio::PORT[Pin::P0_05],
|
// left side of the USB plug. Right side is used for UART
|
||||||
&nrf52840::gpio::PORT[Pin::P0_06],
|
0 => &nrf52840::gpio::PORT[Pin::P0_04],
|
||||||
&nrf52840::gpio::PORT[Pin::P0_07],
|
1 => &nrf52840::gpio::PORT[Pin::P0_05],
|
||||||
&nrf52840::gpio::PORT[Pin::P0_08]
|
2 => &nrf52840::gpio::PORT[Pin::P0_06],
|
||||||
|
3 => &nrf52840::gpio::PORT[Pin::P0_07],
|
||||||
|
4 => &nrf52840::gpio::PORT[Pin::P0_08]
|
||||||
),
|
),
|
||||||
);
|
).finalize(components::gpio_component_buf!(nrf52840::gpio::GPIOPin));
|
||||||
let button = components::button::ButtonComponent::new(board_kernel).finalize(
|
|
||||||
components::button_component_helper!((
|
|
||||||
&nrf52840::gpio::PORT[BUTTON_PIN],
|
|
||||||
kernel::hil::gpio::ActivationMode::ActiveLow,
|
|
||||||
kernel::hil::gpio::FloatingState::PullUp
|
|
||||||
)),
|
|
||||||
);
|
|
||||||
|
|
||||||
let led = components::led::LedsComponent::new().finalize(components::led_component_helper!(
|
let button = components::button::ButtonComponent::new(
|
||||||
|
board_kernel,
|
||||||
|
components::button_component_helper!(
|
||||||
|
nrf52840::gpio::GPIOPin,
|
||||||
|
(
|
||||||
|
&nrf52840::gpio::PORT[BUTTON_PIN],
|
||||||
|
kernel::hil::gpio::ActivationMode::ActiveLow,
|
||||||
|
kernel::hil::gpio::FloatingState::PullUp
|
||||||
|
)
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.finalize(components::button_component_buf!(nrf52840::gpio::GPIOPin));
|
||||||
|
|
||||||
|
let led = components::led::LedsComponent::new(components::led_component_helper!(
|
||||||
|
nrf52840::gpio::GPIOPin,
|
||||||
(
|
(
|
||||||
&nrf52840::gpio::PORT[LED1_R_PIN],
|
&nrf52840::gpio::PORT[LED1_R_PIN],
|
||||||
kernel::hil::gpio::ActivationMode::ActiveLow
|
kernel::hil::gpio::ActivationMode::ActiveLow
|
||||||
@@ -102,30 +203,216 @@ pub unsafe fn reset_handler() {
|
|||||||
&nrf52840::gpio::PORT[LED1_B_PIN],
|
&nrf52840::gpio::PORT[LED1_B_PIN],
|
||||||
kernel::hil::gpio::ActivationMode::ActiveLow
|
kernel::hil::gpio::ActivationMode::ActiveLow
|
||||||
)
|
)
|
||||||
));
|
))
|
||||||
|
.finalize(components::led_component_buf!(nrf52840::gpio::GPIOPin));
|
||||||
|
|
||||||
let chip = static_init!(nrf52840::chip::Chip, nrf52840::chip::new());
|
let chip = static_init!(nrf52840::chip::Chip, nrf52840::chip::new());
|
||||||
CHIP = Some(chip);
|
CHIP = Some(chip);
|
||||||
|
|
||||||
nrf52dk_base::setup_board(
|
nrf52_components::startup::NrfStartupComponent::new(
|
||||||
board_kernel,
|
false,
|
||||||
BUTTON_RST_PIN,
|
BUTTON_RST_PIN,
|
||||||
&nrf52840::gpio::PORT,
|
nrf52840::uicr::Regulator0Output::V3_0,
|
||||||
gpio,
|
)
|
||||||
LED1_R_PIN,
|
.finalize(());
|
||||||
LED1_G_PIN,
|
|
||||||
LED1_B_PIN,
|
// Create capabilities that the board needs to call certain protected kernel
|
||||||
led,
|
// functions.
|
||||||
UartChannel::Pins(UartPins::new(UART_RTS, UART_TXD, UART_CTS, UART_RXD)),
|
let process_management_capability =
|
||||||
&SpiPins::new(SPI_MOSI, SPI_MISO, SPI_CLK),
|
create_capability!(capabilities::ProcessManagementCapability);
|
||||||
&None,
|
let main_loop_capability = create_capability!(capabilities::MainLoopCapability);
|
||||||
|
let memory_allocation_capability = create_capability!(capabilities::MemoryAllocationCapability);
|
||||||
|
|
||||||
|
let gpio_port = &nrf52840::gpio::PORT;
|
||||||
|
|
||||||
|
// Configure kernel debug gpios as early as possible
|
||||||
|
kernel::debug::assign_gpios(
|
||||||
|
Some(&gpio_port[LED1_R_PIN]),
|
||||||
|
Some(&gpio_port[LED1_G_PIN]),
|
||||||
|
Some(&gpio_port[LED1_B_PIN]),
|
||||||
|
);
|
||||||
|
|
||||||
|
let rtc = &nrf52840::rtc::RTC;
|
||||||
|
rtc.start();
|
||||||
|
let mux_alarm = components::alarm::AlarmMuxComponent::new(rtc)
|
||||||
|
.finalize(components::alarm_mux_component_helper!(nrf52840::rtc::Rtc));
|
||||||
|
let alarm = components::alarm::AlarmDriverComponent::new(board_kernel, mux_alarm)
|
||||||
|
.finalize(components::alarm_component_helper!(nrf52840::rtc::Rtc));
|
||||||
|
let uart_channel = UartChannel::Pins(UartPins::new(UART_RTS, UART_TXD, UART_CTS, UART_RXD));
|
||||||
|
let channel = nrf52_components::UartChannelComponent::new(uart_channel, mux_alarm).finalize(());
|
||||||
|
|
||||||
|
let dynamic_deferred_call_clients =
|
||||||
|
static_init!([DynamicDeferredCallClientState; 2], Default::default());
|
||||||
|
let dynamic_deferred_caller = static_init!(
|
||||||
|
DynamicDeferredCall,
|
||||||
|
DynamicDeferredCall::new(dynamic_deferred_call_clients)
|
||||||
|
);
|
||||||
|
DynamicDeferredCall::set_global_instance(dynamic_deferred_caller);
|
||||||
|
|
||||||
|
// Create a shared UART channel for the console and for kernel debug.
|
||||||
|
let uart_mux =
|
||||||
|
components::console::UartMuxComponent::new(channel, 115200, dynamic_deferred_caller)
|
||||||
|
.finalize(());
|
||||||
|
|
||||||
|
let pconsole =
|
||||||
|
components::process_console::ProcessConsoleComponent::new(board_kernel, uart_mux)
|
||||||
|
.finalize(());
|
||||||
|
|
||||||
|
// Setup the console.
|
||||||
|
let console = components::console::ConsoleComponent::new(board_kernel, uart_mux).finalize(());
|
||||||
|
// Create the debugger object that handles calls to `debug!()`.
|
||||||
|
components::debug_writer::DebugWriterComponent::new(uart_mux).finalize(());
|
||||||
|
|
||||||
|
let ble_radio =
|
||||||
|
nrf52_components::BLEComponent::new(board_kernel, &nrf52840::ble_radio::RADIO, mux_alarm)
|
||||||
|
.finalize(());
|
||||||
|
|
||||||
|
let (ieee802154_radio, _mux_mac) = components::ieee802154::Ieee802154Component::new(
|
||||||
|
board_kernel,
|
||||||
|
&nrf52840::ieee802154_radio::RADIO,
|
||||||
|
&nrf52840::aes::AESECB,
|
||||||
|
PAN_ID,
|
||||||
|
SRC_MAC,
|
||||||
|
)
|
||||||
|
.finalize(components::ieee802154_component_helper!(
|
||||||
|
nrf52840::ieee802154_radio::Radio,
|
||||||
|
nrf52840::aes::AesECB<'static>
|
||||||
|
));
|
||||||
|
|
||||||
|
let temp = components::temperature::TemperatureComponent::new(
|
||||||
|
board_kernel,
|
||||||
|
&nrf52840::temperature::TEMP,
|
||||||
|
)
|
||||||
|
.finalize(());
|
||||||
|
|
||||||
|
let rng = components::rng::RngComponent::new(board_kernel, &nrf52840::trng::TRNG).finalize(());
|
||||||
|
|
||||||
|
// Initialize AC using AIN5 (P0.29) as VIN+ and VIN- as AIN0 (P0.02)
|
||||||
|
// These are hardcoded pin assignments specified in the driver
|
||||||
|
let analog_comparator = components::analog_comparator::AcComponent::new(
|
||||||
|
&nrf52840::acomp::ACOMP,
|
||||||
|
components::acomp_component_helper!(
|
||||||
|
nrf52840::acomp::Channel,
|
||||||
|
&nrf52840::acomp::CHANNEL_AC0
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.finalize(components::acomp_component_buf!(
|
||||||
|
nrf52840::acomp::Comparator
|
||||||
|
));
|
||||||
|
|
||||||
|
let nvmc = static_init!(
|
||||||
|
nrf52840::nvmc::SyscallDriver,
|
||||||
|
nrf52840::nvmc::SyscallDriver::new(
|
||||||
|
&nrf52840::nvmc::NVMC,
|
||||||
|
board_kernel.create_grant(&memory_allocation_capability),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Configure USB controller
|
||||||
|
let usb:
|
||||||
|
&'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
|
'static,
|
||||||
|
'static,
|
||||||
|
nrf52840::usbd::Usbd<'static>,
|
||||||
|
> = {
|
||||||
|
let usb_ctap = static_init!(
|
||||||
|
capsules::usb::usbc_ctap_hid::ClientCtapHID<
|
||||||
|
'static,
|
||||||
|
'static,
|
||||||
|
nrf52840::usbd::Usbd<'static>,
|
||||||
|
>,
|
||||||
|
capsules::usb::usbc_ctap_hid::ClientCtapHID::new(
|
||||||
|
&nrf52840::usbd::USBD,
|
||||||
|
capsules::usb::usbc_client::MAX_CTRL_PACKET_SIZE_NRF52840,
|
||||||
|
VENDOR_ID,
|
||||||
|
PRODUCT_ID,
|
||||||
|
STRINGS,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
nrf52840::usbd::USBD.set_client(usb_ctap);
|
||||||
|
|
||||||
|
// Enable power events to be sent to USB controller
|
||||||
|
nrf52840::power::POWER.set_usb_client(&nrf52840::usbd::USBD);
|
||||||
|
nrf52840::power::POWER.enable_interrupts();
|
||||||
|
|
||||||
|
// Configure the USB userspace driver
|
||||||
|
let usb_driver = static_init!(
|
||||||
|
capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
|
'static,
|
||||||
|
'static,
|
||||||
|
nrf52840::usbd::Usbd<'static>,
|
||||||
|
>,
|
||||||
|
capsules::usb::usb_ctap::CtapUsbSyscallDriver::new(
|
||||||
|
usb_ctap,
|
||||||
|
board_kernel.create_grant(&memory_allocation_capability)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
usb_ctap.set_client(usb_driver);
|
||||||
|
usb_driver as &'static _
|
||||||
|
};
|
||||||
|
|
||||||
|
nrf52_components::NrfClockComponent::new().finalize(());
|
||||||
|
|
||||||
|
let platform = Platform {
|
||||||
button,
|
button,
|
||||||
true,
|
ble_radio,
|
||||||
&mut APP_MEMORY,
|
ieee802154_radio,
|
||||||
|
pconsole,
|
||||||
|
console,
|
||||||
|
led,
|
||||||
|
gpio,
|
||||||
|
rng,
|
||||||
|
temp,
|
||||||
|
alarm,
|
||||||
|
analog_comparator,
|
||||||
|
nvmc,
|
||||||
|
usb,
|
||||||
|
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
||||||
|
};
|
||||||
|
|
||||||
|
platform.pconsole.start();
|
||||||
|
debug!("Initialization complete. Entering main loop\r");
|
||||||
|
debug!("{}", &nrf52840::ficr::FICR_INSTANCE);
|
||||||
|
|
||||||
|
/// These symbols are defined in the linker script.
|
||||||
|
extern "C" {
|
||||||
|
/// Beginning of the ROM region containing app images.
|
||||||
|
static _sapps: u8;
|
||||||
|
/// End of the ROM region containing app images.
|
||||||
|
static _eapps: u8;
|
||||||
|
/// Beginning of the RAM region for app memory.
|
||||||
|
static mut _sappmem: u8;
|
||||||
|
/// End of the RAM region for app memory.
|
||||||
|
static _eappmem: u8;
|
||||||
|
}
|
||||||
|
|
||||||
|
kernel::procs::load_processes(
|
||||||
|
board_kernel,
|
||||||
|
chip,
|
||||||
|
core::slice::from_raw_parts(
|
||||||
|
&_sapps as *const u8,
|
||||||
|
&_eapps as *const u8 as usize - &_sapps as *const u8 as usize,
|
||||||
|
),
|
||||||
|
core::slice::from_raw_parts_mut(
|
||||||
|
&mut _sappmem as *mut u8,
|
||||||
|
&_eappmem as *const u8 as usize - &_sappmem as *const u8 as usize,
|
||||||
|
),
|
||||||
&mut PROCESSES,
|
&mut PROCESSES,
|
||||||
FAULT_RESPONSE,
|
FAULT_RESPONSE,
|
||||||
nrf52840::uicr::Regulator0Output::V3_0,
|
&process_management_capability,
|
||||||
false,
|
)
|
||||||
&Some(&nrf52840::usbd::USBD),
|
.unwrap_or_else(|err| {
|
||||||
|
debug!("Error loading processes!");
|
||||||
|
debug!("{:?}", err);
|
||||||
|
});
|
||||||
|
|
||||||
|
let scheduler = components::sched::round_robin::RoundRobinComponent::new(&PROCESSES)
|
||||||
|
.finalize(components::rr_component_helper!(NUM_PROCS));
|
||||||
|
board_kernel.kernel_loop(
|
||||||
|
&platform,
|
||||||
chip,
|
chip,
|
||||||
|
Some(&platform.ipc),
|
||||||
|
scheduler,
|
||||||
|
&main_loop_capability,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -913,6 +913,13 @@ if __name__ == "__main__":
|
|||||||
const="oom_test",
|
const="oom_test",
|
||||||
help=("Compiles and installs the oom_test example that tests the "
|
help=("Compiles and installs the oom_test example that tests the "
|
||||||
"allocator until an out-of-memory error occurs."))
|
"allocator until an out-of-memory error occurs."))
|
||||||
|
apps_group.add_argument(
|
||||||
|
"--console_test",
|
||||||
|
dest="application",
|
||||||
|
action="store_const",
|
||||||
|
const="console_test",
|
||||||
|
help=("Compiles and installs the console_test example that tests the "
|
||||||
|
"console driver with messages of various lengths."))
|
||||||
|
|
||||||
main_parser.set_defaults(features=["with_ctap1"])
|
main_parser.set_defaults(features=["with_ctap1"])
|
||||||
|
|
||||||
|
|||||||
33
examples/console_test.rs
Normal file
33
examples/console_test.rs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright 2020 Google LLC
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#![no_std]
|
||||||
|
|
||||||
|
extern crate lang_items;
|
||||||
|
|
||||||
|
use libtock_drivers::console::{Console, BUFFER_SIZE};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Write messages of length up to the console driver's buffer size.
|
||||||
|
let mut buf = [0; BUFFER_SIZE];
|
||||||
|
loop {
|
||||||
|
for i in 1..buf.len() {
|
||||||
|
for j in 0..i {
|
||||||
|
buf[j] = b'0' + ((i % 10) as u8);
|
||||||
|
}
|
||||||
|
buf[i] = b'\n';
|
||||||
|
Console::write_unbuffered(&mut buf[..(i + 1)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
diff --git a/boards/nordic/nrf52840_dongle/src/main.rs b/boards/nordic/nrf52840_dongle/src/main.rs
|
diff --git a/boards/nordic/nrf52840_dongle/src/main.rs b/boards/nordic/nrf52840_dongle/src/main.rs
|
||||||
index 040f4d3a..f6e1069c 100644
|
index fc53f59..d72d204 100644
|
||||||
--- a/boards/nordic/nrf52840_dongle/src/main.rs
|
--- a/boards/nordic/nrf52840_dongle/src/main.rs
|
||||||
+++ b/boards/nordic/nrf52840_dongle/src/main.rs
|
+++ b/boards/nordic/nrf52840_dongle/src/main.rs
|
||||||
@@ -49,6 +49,11 @@ static mut APP_MEMORY: [u8; 0x3C000] = [0; 0x3C000];
|
@@ -55,6 +55,11 @@ const NUM_PROCS: usize = 8;
|
||||||
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
||||||
[None, None, None, None, None, None, None, None];
|
[None; NUM_PROCS];
|
||||||
|
|
||||||
+static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 1] = [kernel::StorageLocation {
|
+static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 1] = [kernel::StorageLocation {
|
||||||
+ address: 0xC0000,
|
+ address: 0xC0000,
|
||||||
@@ -14,63 +14,19 @@ index 040f4d3a..f6e1069c 100644
|
|||||||
// Static reference to chip for panic dumps
|
// Static reference to chip for panic dumps
|
||||||
static mut CHIP: Option<&'static nrf52840::chip::Chip> = None;
|
static mut CHIP: Option<&'static nrf52840::chip::Chip> = None;
|
||||||
|
|
||||||
@@ -63,7 +68,10 @@ pub unsafe fn reset_handler() {
|
@@ -90,6 +95,7 @@ pub struct Platform {
|
||||||
// Loads relocations and clears BSS
|
'static,
|
||||||
nrf52840::init();
|
capsules::virtual_alarm::VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
|
||||||
|
>,
|
||||||
- let board_kernel = static_init!(kernel::Kernel, kernel::Kernel::new(&PROCESSES));
|
+ nvmc: &'static nrf52840::nvmc::SyscallDriver,
|
||||||
+ let board_kernel = static_init!(
|
|
||||||
+ kernel::Kernel,
|
|
||||||
+ kernel::Kernel::new_with_storage(&PROCESSES, &STORAGE_LOCATIONS)
|
|
||||||
+ );
|
|
||||||
// GPIOs
|
|
||||||
let gpio = components::gpio::GpioComponent::new(board_kernel).finalize(
|
|
||||||
components::gpio_component_helper!(
|
|
||||||
diff --git a/boards/nordic/nrf52840dk/src/main.rs b/boards/nordic/nrf52840dk/src/main.rs
|
|
||||||
index 44a6c1cc..2ebc2868 100644
|
|
||||||
--- a/boards/nordic/nrf52840dk/src/main.rs
|
|
||||||
+++ b/boards/nordic/nrf52840dk/src/main.rs
|
|
||||||
@@ -117,6 +117,11 @@ static mut APP_MEMORY: [u8; 0x3C000] = [0; 0x3C000];
|
|
||||||
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
|
||||||
[None, None, None, None, None, None, None, None];
|
|
||||||
|
|
||||||
+static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 1] = [kernel::StorageLocation {
|
|
||||||
+ address: 0xC0000,
|
|
||||||
+ size: 0x40000,
|
|
||||||
+}];
|
|
||||||
+
|
|
||||||
static mut CHIP: Option<&'static nrf52840::chip::Chip> = None;
|
|
||||||
|
|
||||||
/// Dummy buffer that causes the linker to reserve enough space for the stack.
|
|
||||||
@@ -146,7 +151,10 @@ pub unsafe fn reset_handler() {
|
|
||||||
UartChannel::Pins(UartPins::new(UART_RTS, UART_TXD, UART_CTS, UART_RXD))
|
|
||||||
};
|
|
||||||
|
|
||||||
- let board_kernel = static_init!(kernel::Kernel, kernel::Kernel::new(&PROCESSES));
|
|
||||||
+ let board_kernel = static_init!(
|
|
||||||
+ kernel::Kernel,
|
|
||||||
+ kernel::Kernel::new_with_storage(&PROCESSES, &STORAGE_LOCATIONS)
|
|
||||||
+ );
|
|
||||||
let gpio = components::gpio::GpioComponent::new(board_kernel).finalize(
|
|
||||||
components::gpio_component_helper!(
|
|
||||||
&nrf52840::gpio::PORT[Pin::P1_01],
|
|
||||||
diff --git a/boards/nordic/nrf52dk_base/src/lib.rs b/boards/nordic/nrf52dk_base/src/lib.rs
|
|
||||||
index 5dd4328e..a117d35f 100644
|
|
||||||
--- a/boards/nordic/nrf52dk_base/src/lib.rs
|
|
||||||
+++ b/boards/nordic/nrf52dk_base/src/lib.rs
|
|
||||||
@@ -104,6 +104,7 @@ pub struct Platform {
|
|
||||||
// The nRF52dk does not have the flash chip on it, so we make this optional.
|
|
||||||
nonvolatile_storage:
|
|
||||||
Option<&'static capsules::nonvolatile_storage_driver::NonvolatileStorage<'static>>,
|
|
||||||
+ nvmc: &'static nrf52::nvmc::SyscallDriver,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl kernel::Platform for Platform {
|
impl kernel::Platform for Platform {
|
||||||
@@ -128,10 +129,30 @@ impl kernel::Platform for Platform {
|
@@ -108,19 +114,42 @@ impl kernel::Platform for Platform {
|
||||||
capsules::nonvolatile_storage_driver::DRIVER_NUM => {
|
capsules::ieee802154::DRIVER_NUM => f(Some(self.ieee802154_radio)),
|
||||||
f(self.nonvolatile_storage.map_or(None, |nv| Some(nv)))
|
capsules::temperature::DRIVER_NUM => f(Some(self.temp)),
|
||||||
}
|
capsules::analog_comparator::DRIVER_NUM => f(Some(self.analog_comparator)),
|
||||||
+ nrf52::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
+ nrf52840::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
||||||
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
||||||
_ => f(None),
|
_ => f(None),
|
||||||
}
|
}
|
||||||
@@ -84,7 +40,7 @@ index 5dd4328e..a117d35f 100644
|
|||||||
+ use kernel::syscall::Syscall;
|
+ use kernel::syscall::Syscall;
|
||||||
+ match *syscall {
|
+ match *syscall {
|
||||||
+ Syscall::COMMAND {
|
+ Syscall::COMMAND {
|
||||||
+ driver_number: nrf52::nvmc::DRIVER_NUM,
|
+ driver_number: nrf52840::nvmc::DRIVER_NUM,
|
||||||
+ subdriver_number: cmd,
|
+ subdriver_number: cmd,
|
||||||
+ arg0: ptr,
|
+ arg0: ptr,
|
||||||
+ arg1: len,
|
+ arg1: len,
|
||||||
@@ -96,35 +52,138 @@ index 5dd4328e..a117d35f 100644
|
|||||||
+ }
|
+ }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generic function for starting an nrf52dk board.
|
/// Entry point in the vector table called on hard reset.
|
||||||
@@ -405,6 +426,14 @@ pub unsafe fn setup_board<I: nrf52::interrupt_service::InterruptService>(
|
#[no_mangle]
|
||||||
);
|
pub unsafe fn reset_handler() {
|
||||||
nrf52::acomp::ACOMP.set_client(analog_comparator);
|
// Loads relocations and clears BSS
|
||||||
|
nrf52840::init();
|
||||||
|
|
||||||
|
- let board_kernel = static_init!(kernel::Kernel, kernel::Kernel::new(&PROCESSES));
|
||||||
|
+ let board_kernel = static_init!(
|
||||||
|
+ kernel::Kernel,
|
||||||
|
+ kernel::Kernel::new_with_storage(&PROCESSES, &STORAGE_LOCATIONS)
|
||||||
|
+ );
|
||||||
|
|
||||||
|
// GPIOs
|
||||||
|
let gpio = components::gpio::GpioComponent::new(
|
||||||
|
@@ -286,6 +315,14 @@ pub unsafe fn reset_handler() {
|
||||||
|
nrf52840::acomp::Comparator
|
||||||
|
));
|
||||||
|
|
||||||
+ let nvmc = static_init!(
|
+ let nvmc = static_init!(
|
||||||
+ nrf52::nvmc::SyscallDriver,
|
+ nrf52840::nvmc::SyscallDriver,
|
||||||
+ nrf52::nvmc::SyscallDriver::new(
|
+ nrf52840::nvmc::SyscallDriver::new(
|
||||||
+ &nrf52::nvmc::NVMC,
|
+ &nrf52840::nvmc::NVMC,
|
||||||
+ board_kernel.create_grant(&memory_allocation_capability),
|
+ board_kernel.create_grant(&memory_allocation_capability),
|
||||||
+ )
|
+ )
|
||||||
+ );
|
+ );
|
||||||
+
|
+
|
||||||
// Start all of the clocks. Low power operation will require a better
|
nrf52_components::NrfClockComponent::new().finalize(());
|
||||||
// approach than this.
|
|
||||||
nrf52::clock::CLOCK.low_stop();
|
let platform = Platform {
|
||||||
@@ -431,6 +460,7 @@ pub unsafe fn setup_board<I: nrf52::interrupt_service::InterruptService>(
|
@@ -300,6 +337,7 @@ pub unsafe fn reset_handler() {
|
||||||
analog_comparator: analog_comparator,
|
temp,
|
||||||
nonvolatile_storage: nonvolatile_storage,
|
alarm,
|
||||||
|
analog_comparator,
|
||||||
|
+ nvmc,
|
||||||
|
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/boards/nordic/nrf52840dk/src/main.rs b/boards/nordic/nrf52840dk/src/main.rs
|
||||||
|
index 169f3d3..2ebb384 100644
|
||||||
|
--- a/boards/nordic/nrf52840dk/src/main.rs
|
||||||
|
+++ b/boards/nordic/nrf52840dk/src/main.rs
|
||||||
|
@@ -123,6 +123,11 @@ const NUM_PROCS: usize = 8;
|
||||||
|
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
||||||
|
[None; NUM_PROCS];
|
||||||
|
|
||||||
|
+static mut STORAGE_LOCATIONS: [kernel::StorageLocation; 1] = [kernel::StorageLocation {
|
||||||
|
+ address: 0xC0000,
|
||||||
|
+ size: 0x40000,
|
||||||
|
+}];
|
||||||
|
+
|
||||||
|
static mut CHIP: Option<&'static nrf52840::chip::Chip> = None;
|
||||||
|
|
||||||
|
/// Dummy buffer that causes the linker to reserve enough space for the stack.
|
||||||
|
@@ -158,6 +163,7 @@ pub struct Platform {
|
||||||
|
capsules::virtual_alarm::VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
|
||||||
|
>,
|
||||||
|
nonvolatile_storage: &'static capsules::nonvolatile_storage_driver::NonvolatileStorage<'static>,
|
||||||
|
+ nvmc: &'static nrf52840::nvmc::SyscallDriver,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl kernel::Platform for Platform {
|
||||||
|
@@ -177,10 +183,30 @@ impl kernel::Platform for Platform {
|
||||||
|
capsules::temperature::DRIVER_NUM => f(Some(self.temp)),
|
||||||
|
capsules::analog_comparator::DRIVER_NUM => f(Some(self.analog_comparator)),
|
||||||
|
capsules::nonvolatile_storage_driver::DRIVER_NUM => f(Some(self.nonvolatile_storage)),
|
||||||
|
+ nrf52840::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
||||||
|
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
||||||
|
_ => f(None),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ fn filter_syscall(
|
||||||
|
+ &self,
|
||||||
|
+ process: &dyn kernel::procs::ProcessType,
|
||||||
|
+ syscall: &kernel::syscall::Syscall,
|
||||||
|
+ ) -> Result<(), kernel::ReturnCode> {
|
||||||
|
+ use kernel::syscall::Syscall;
|
||||||
|
+ match *syscall {
|
||||||
|
+ Syscall::COMMAND {
|
||||||
|
+ driver_number: nrf52840::nvmc::DRIVER_NUM,
|
||||||
|
+ subdriver_number: cmd,
|
||||||
|
+ arg0: ptr,
|
||||||
|
+ arg1: len,
|
||||||
|
+ } if (cmd == 2 || cmd == 3) && !process.fits_in_storage_location(ptr, len) => {
|
||||||
|
+ Err(kernel::ReturnCode::EINVAL)
|
||||||
|
+ }
|
||||||
|
+ _ => Ok(()),
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Entry point in the vector table called on hard reset.
|
||||||
|
@@ -204,7 +230,10 @@ pub unsafe fn reset_handler() {
|
||||||
|
UartChannel::Pins(UartPins::new(UART_RTS, UART_TXD, UART_CTS, UART_RXD))
|
||||||
|
};
|
||||||
|
|
||||||
|
- let board_kernel = static_init!(kernel::Kernel, kernel::Kernel::new(&PROCESSES));
|
||||||
|
+ let board_kernel = static_init!(
|
||||||
|
+ kernel::Kernel,
|
||||||
|
+ kernel::Kernel::new_with_storage(&PROCESSES, &STORAGE_LOCATIONS)
|
||||||
|
+ );
|
||||||
|
|
||||||
|
let gpio = components::gpio::GpioComponent::new(
|
||||||
|
board_kernel,
|
||||||
|
@@ -411,6 +440,14 @@ pub unsafe fn reset_handler() {
|
||||||
|
nrf52840::acomp::Comparator
|
||||||
|
));
|
||||||
|
|
||||||
|
+ let nvmc = static_init!(
|
||||||
|
+ nrf52840::nvmc::SyscallDriver,
|
||||||
|
+ nrf52840::nvmc::SyscallDriver::new(
|
||||||
|
+ &nrf52840::nvmc::NVMC,
|
||||||
|
+ board_kernel.create_grant(&memory_allocation_capability),
|
||||||
|
+ )
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
nrf52_components::NrfClockComponent::new().finalize(());
|
||||||
|
|
||||||
|
let platform = Platform {
|
||||||
|
@@ -426,6 +463,7 @@ pub unsafe fn reset_handler() {
|
||||||
|
alarm,
|
||||||
|
analog_comparator,
|
||||||
|
nonvolatile_storage,
|
||||||
|
+ nvmc,
|
||||||
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
||||||
+ nvmc: nvmc,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
platform.pconsole.start();
|
|
||||||
diff --git a/chips/nrf52/src/nvmc.rs b/chips/nrf52/src/nvmc.rs
|
diff --git a/chips/nrf52/src/nvmc.rs b/chips/nrf52/src/nvmc.rs
|
||||||
index 60fc2da8..ca41b899 100644
|
index b70162c..9dcb82b 100644
|
||||||
--- a/chips/nrf52/src/nvmc.rs
|
--- a/chips/nrf52/src/nvmc.rs
|
||||||
+++ b/chips/nrf52/src/nvmc.rs
|
+++ b/chips/nrf52/src/nvmc.rs
|
||||||
@@ -3,6 +3,7 @@
|
@@ -3,15 +3,16 @@
|
||||||
//! Used in order read and write to internal flash.
|
//! Used in order read and write to internal flash.
|
||||||
|
|
||||||
use core::cell::Cell;
|
use core::cell::Cell;
|
||||||
@@ -132,7 +191,8 @@ index 60fc2da8..ca41b899 100644
|
|||||||
use core::ops::{Index, IndexMut};
|
use core::ops::{Index, IndexMut};
|
||||||
use kernel::common::cells::OptionalCell;
|
use kernel::common::cells::OptionalCell;
|
||||||
use kernel::common::cells::TakeCell;
|
use kernel::common::cells::TakeCell;
|
||||||
@@ -11,7 +12,7 @@ use kernel::common::deferred_call::DeferredCall;
|
use kernel::common::cells::VolatileCell;
|
||||||
|
use kernel::common::deferred_call::DeferredCall;
|
||||||
use kernel::common::registers::{register_bitfields, ReadOnly, ReadWrite};
|
use kernel::common::registers::{register_bitfields, ReadOnly, ReadWrite};
|
||||||
use kernel::common::StaticRef;
|
use kernel::common::StaticRef;
|
||||||
use kernel::hil;
|
use kernel::hil;
|
||||||
@@ -155,7 +215,7 @@ index 60fc2da8..ca41b899 100644
|
|||||||
|
|
||||||
/// This is a wrapper around a u8 array that is sized to a single page for the
|
/// This is a wrapper around a u8 array that is sized to a single page for the
|
||||||
/// nrf. Users of this module must pass an object of this type to use the
|
/// nrf. Users of this module must pass an object of this type to use the
|
||||||
@@ -215,6 +222,11 @@ impl Nvmc {
|
@@ -219,6 +226,11 @@ impl Nvmc {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -167,7 +227,7 @@ index 60fc2da8..ca41b899 100644
|
|||||||
/// Configure the NVMC to allow writes to flash.
|
/// Configure the NVMC to allow writes to flash.
|
||||||
pub fn configure_writeable(&self) {
|
pub fn configure_writeable(&self) {
|
||||||
let regs = &*self.registers;
|
let regs = &*self.registers;
|
||||||
@@ -230,7 +242,7 @@ impl Nvmc {
|
@@ -234,7 +246,7 @@ impl Nvmc {
|
||||||
let regs = &*self.registers;
|
let regs = &*self.registers;
|
||||||
regs.config.write(Configuration::WEN::Een);
|
regs.config.write(Configuration::WEN::Een);
|
||||||
while !self.is_ready() {}
|
while !self.is_ready() {}
|
||||||
@@ -176,7 +236,7 @@ index 60fc2da8..ca41b899 100644
|
|||||||
while !self.is_ready() {}
|
while !self.is_ready() {}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,7 +334,7 @@ impl Nvmc {
|
@@ -326,7 +338,7 @@ impl Nvmc {
|
||||||
// Put the NVMC in write mode.
|
// Put the NVMC in write mode.
|
||||||
regs.config.write(Configuration::WEN::Wen);
|
regs.config.write(Configuration::WEN::Wen);
|
||||||
|
|
||||||
@@ -185,7 +245,7 @@ index 60fc2da8..ca41b899 100644
|
|||||||
let word: u32 = (data[i + 0] as u32) << 0
|
let word: u32 = (data[i + 0] as u32) << 0
|
||||||
| (data[i + 1] as u32) << 8
|
| (data[i + 1] as u32) << 8
|
||||||
| (data[i + 2] as u32) << 16
|
| (data[i + 2] as u32) << 16
|
||||||
@@ -390,3 +402,180 @@ impl hil::flash::Flash for Nvmc {
|
@@ -394,3 +406,180 @@ impl hil::flash::Flash for Nvmc {
|
||||||
self.erase_page(page_number)
|
self.erase_page(page_number)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -367,23 +427,23 @@ index 60fc2da8..ca41b899 100644
|
|||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
|
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
|
||||||
index ebe8052a..a6dcd278 100644
|
index dbe5035..428d90c 100644
|
||||||
--- a/kernel/src/lib.rs
|
--- a/kernel/src/lib.rs
|
||||||
+++ b/kernel/src/lib.rs
|
+++ b/kernel/src/lib.rs
|
||||||
@@ -47,7 +47,7 @@ pub use crate::platform::systick::SysTick;
|
@@ -123,7 +123,7 @@ pub use crate::sched::cooperative::{CoopProcessNode, CooperativeSched};
|
||||||
pub use crate::platform::{mpu, Chip, Platform};
|
pub use crate::sched::mlfq::{MLFQProcessNode, MLFQSched};
|
||||||
pub use crate::platform::{ClockInterface, NoClockControl, NO_CLOCK_CONTROL};
|
pub use crate::sched::priority::PrioritySched;
|
||||||
pub use crate::returncode::ReturnCode;
|
pub use crate::sched::round_robin::{RoundRobinProcessNode, RoundRobinSched};
|
||||||
-pub use crate::sched::Kernel;
|
-pub use crate::sched::{Kernel, Scheduler};
|
||||||
+pub use crate::sched::{Kernel, StorageLocation};
|
+pub use crate::sched::{Kernel, Scheduler, StorageLocation};
|
||||||
|
|
||||||
// Export only select items from the process module. To remove the name conflict
|
// Export only select items from the process module. To remove the name conflict
|
||||||
// this cannot be called `process`, so we use a shortened version. These
|
// this cannot be called `process`, so we use a shortened version. These
|
||||||
diff --git a/kernel/src/memop.rs b/kernel/src/memop.rs
|
diff --git a/kernel/src/memop.rs b/kernel/src/memop.rs
|
||||||
index 7537d2b4..61870ccd 100644
|
index 348c746..5465c95 100644
|
||||||
--- a/kernel/src/memop.rs
|
--- a/kernel/src/memop.rs
|
||||||
+++ b/kernel/src/memop.rs
|
+++ b/kernel/src/memop.rs
|
||||||
@@ -108,6 +108,25 @@ crate fn memop(process: &dyn ProcessType, op_type: usize, r1: usize) -> ReturnCo
|
@@ -108,6 +108,25 @@ pub(crate) fn memop(process: &dyn ProcessType, op_type: usize, r1: usize) -> Ret
|
||||||
ReturnCode::SUCCESS
|
ReturnCode::SUCCESS
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,10 +470,10 @@ index 7537d2b4..61870ccd 100644
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
diff --git a/kernel/src/process.rs b/kernel/src/process.rs
|
diff --git a/kernel/src/process.rs b/kernel/src/process.rs
|
||||||
index eb00f274..41243c8e 100644
|
index 4dfde3b..0ceff3e 100644
|
||||||
--- a/kernel/src/process.rs
|
--- a/kernel/src/process.rs
|
||||||
+++ b/kernel/src/process.rs
|
+++ b/kernel/src/process.rs
|
||||||
@@ -281,6 +281,15 @@ pub trait ProcessType {
|
@@ -360,6 +360,15 @@ pub trait ProcessType {
|
||||||
/// writeable flash region.
|
/// writeable flash region.
|
||||||
fn get_writeable_flash_region(&self, region_index: usize) -> (u32, u32);
|
fn get_writeable_flash_region(&self, region_index: usize) -> (u32, u32);
|
||||||
|
|
||||||
@@ -429,7 +489,7 @@ index eb00f274..41243c8e 100644
|
|||||||
/// Debug function to update the kernel on where the stack starts for this
|
/// Debug function to update the kernel on where the stack starts for this
|
||||||
/// process. Processes are not required to call this through the memop
|
/// process. Processes are not required to call this through the memop
|
||||||
/// system call, but it aids in debugging the process.
|
/// system call, but it aids in debugging the process.
|
||||||
@@ -999,6 +1008,32 @@ impl<C: Chip> ProcessType for Process<'a, C> {
|
@@ -1015,6 +1024,32 @@ impl<C: Chip> ProcessType for Process<'_, C> {
|
||||||
self.header.get_writeable_flash_region(region_index)
|
self.header.get_writeable_flash_region(region_index)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -462,8 +522,8 @@ index eb00f274..41243c8e 100644
|
|||||||
fn update_stack_start_pointer(&self, stack_pointer: *const u8) {
|
fn update_stack_start_pointer(&self, stack_pointer: *const u8) {
|
||||||
if stack_pointer >= self.mem_start() && stack_pointer < self.mem_end() {
|
if stack_pointer >= self.mem_start() && stack_pointer < self.mem_end() {
|
||||||
self.debug.map(|debug| {
|
self.debug.map(|debug| {
|
||||||
@@ -1604,6 +1639,33 @@ impl<C: 'static + Chip> Process<'a, C> {
|
@@ -1664,6 +1699,33 @@ impl<C: 'static + Chip> Process<'_, C> {
|
||||||
return Ok((None, 0));
|
return Err(ProcessLoadError::MpuInvalidFlashLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ // Allocate MPU region for the storage locations. The storage locations are currently
|
+ // Allocate MPU region for the storage locations. The storage locations are currently
|
||||||
@@ -490,19 +550,19 @@ index eb00f274..41243c8e 100644
|
|||||||
+ process_name
|
+ process_name
|
||||||
+ );
|
+ );
|
||||||
+ }
|
+ }
|
||||||
+ return Ok((None, 0));
|
+ return Ok((None, remaining_memory));
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
// Determine how much space we need in the application's
|
// Determine how much space we need in the application's
|
||||||
// memory space just for kernel and grant state. We need to make
|
// memory space just for kernel and grant state. We need to make
|
||||||
// sure we allocate enough memory just for that.
|
// sure we allocate enough memory just for that.
|
||||||
diff --git a/kernel/src/sched.rs b/kernel/src/sched.rs
|
diff --git a/kernel/src/sched.rs b/kernel/src/sched.rs
|
||||||
index fbd68319..43cce76f 100644
|
index 88eea40..ed3ae82 100644
|
||||||
--- a/kernel/src/sched.rs
|
--- a/kernel/src/sched.rs
|
||||||
+++ b/kernel/src/sched.rs
|
+++ b/kernel/src/sched.rs
|
||||||
@@ -24,6 +24,12 @@ const KERNEL_TICK_DURATION_US: u32 = 10000;
|
@@ -118,15 +118,24 @@ pub enum SchedulingDecision {
|
||||||
/// Skip re-scheduling a process if its quanta is nearly exhausted
|
TrySleep,
|
||||||
const MIN_QUANTA_THRESHOLD_US: u32 = 500;
|
}
|
||||||
|
|
||||||
+/// Represents a storage location in flash.
|
+/// Represents a storage location in flash.
|
||||||
+pub struct StorageLocation {
|
+pub struct StorageLocation {
|
||||||
@@ -513,7 +573,9 @@ index fbd68319..43cce76f 100644
|
|||||||
/// Main object for the kernel. Each board will need to create one.
|
/// Main object for the kernel. Each board will need to create one.
|
||||||
pub struct Kernel {
|
pub struct Kernel {
|
||||||
/// How many "to-do" items exist at any given time. These include
|
/// How many "to-do" items exist at any given time. These include
|
||||||
@@ -33,6 +39,9 @@ pub struct Kernel {
|
/// outstanding callbacks and processes in the Running state.
|
||||||
|
work: Cell<usize>,
|
||||||
|
|
||||||
/// This holds a pointer to the static array of Process pointers.
|
/// This holds a pointer to the static array of Process pointers.
|
||||||
processes: &'static [Option<&'static dyn process::ProcessType>],
|
processes: &'static [Option<&'static dyn process::ProcessType>],
|
||||||
|
|
||||||
@@ -523,7 +585,7 @@ index fbd68319..43cce76f 100644
|
|||||||
/// A counter which keeps track of how many process identifiers have been
|
/// A counter which keeps track of how many process identifiers have been
|
||||||
/// created. This is used to create new unique identifiers for processes.
|
/// created. This is used to create new unique identifiers for processes.
|
||||||
process_identifier_max: Cell<usize>,
|
process_identifier_max: Cell<usize>,
|
||||||
@@ -51,9 +60,17 @@ pub struct Kernel {
|
@@ -170,9 +179,17 @@ pub enum StoppedExecutingReason {
|
||||||
|
|
||||||
impl Kernel {
|
impl Kernel {
|
||||||
pub fn new(processes: &'static [Option<&'static dyn process::ProcessType>]) -> Kernel {
|
pub fn new(processes: &'static [Option<&'static dyn process::ProcessType>]) -> Kernel {
|
||||||
@@ -536,14 +598,14 @@ index fbd68319..43cce76f 100644
|
|||||||
+ ) -> Kernel {
|
+ ) -> Kernel {
|
||||||
Kernel {
|
Kernel {
|
||||||
work: Cell::new(0),
|
work: Cell::new(0),
|
||||||
processes: processes,
|
processes,
|
||||||
+ storage_locations: storage_locations,
|
+ storage_locations: storage_locations,
|
||||||
process_identifier_max: Cell::new(0),
|
process_identifier_max: Cell::new(0),
|
||||||
grant_counter: Cell::new(0),
|
grant_counter: Cell::new(0),
|
||||||
grants_finalized: Cell::new(false),
|
grants_finalized: Cell::new(false),
|
||||||
@@ -599,4 +616,8 @@ impl Kernel {
|
@@ -899,4 +916,8 @@ impl Kernel {
|
||||||
}
|
|
||||||
systick.reset();
|
(return_reason, time_executed_us)
|
||||||
}
|
}
|
||||||
+
|
+
|
||||||
+ pub fn storage_locations(&self) -> &'static [StorageLocation] {
|
+ pub fn storage_locations(&self) -> &'static [StorageLocation] {
|
||||||
|
|||||||
@@ -1,107 +1,90 @@
|
|||||||
diff --git a/boards/nordic/nrf52840_dongle/src/main.rs b/boards/nordic/nrf52840_dongle/src/main.rs
|
diff --git a/boards/nordic/nrf52840_dongle/src/main.rs b/boards/nordic/nrf52840_dongle/src/main.rs
|
||||||
index 9a8dccfd..ad3e69b8 100644
|
index d72d204..8b97f8d 100644
|
||||||
--- a/boards/nordic/nrf52840_dongle/src/main.rs
|
--- a/boards/nordic/nrf52840_dongle/src/main.rs
|
||||||
+++ b/boards/nordic/nrf52840_dongle/src/main.rs
|
+++ b/boards/nordic/nrf52840_dongle/src/main.rs
|
||||||
@@ -152,6 +152,7 @@ pub unsafe fn reset_handler() {
|
@@ -15,6 +15,7 @@ use kernel::common::dynamic_deferred_call::{DynamicDeferredCall, DynamicDeferred
|
||||||
FAULT_RESPONSE,
|
use kernel::component::Component;
|
||||||
nrf52840::uicr::Regulator0Output::V3_0,
|
#[allow(unused_imports)]
|
||||||
false,
|
use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init};
|
||||||
+ &Some(&nrf52840::usbd::USBD),
|
+use kernel::hil::usb::UsbController;
|
||||||
chip,
|
use nrf52840::gpio::Pin;
|
||||||
);
|
use nrf52_components::{self, UartChannel, UartPins};
|
||||||
}
|
|
||||||
diff --git a/boards/nordic/nrf52840dk/src/main.rs b/boards/nordic/nrf52840dk/src/main.rs
|
@@ -45,6 +46,17 @@ const PAN_ID: u16 = 0xABCD;
|
||||||
index 127c4f2f..a5847805 100644
|
/// UART Writer
|
||||||
--- a/boards/nordic/nrf52840dk/src/main.rs
|
pub mod io;
|
||||||
+++ b/boards/nordic/nrf52840dk/src/main.rs
|
|
||||||
@@ -244,6 +244,7 @@ pub unsafe fn reset_handler() {
|
+const VENDOR_ID: u16 = 0x1915; // Nordic Semiconductor
|
||||||
FAULT_RESPONSE,
|
+const PRODUCT_ID: u16 = 0x521f; // nRF52840 Dongle (PCA10059)
|
||||||
nrf52840::uicr::Regulator0Output::DEFAULT,
|
+static STRINGS: &'static [&'static str] = &[
|
||||||
false,
|
+ // Manufacturer
|
||||||
+ &Some(&nrf52840::usbd::USBD),
|
+ "Nordic Semiconductor ASA",
|
||||||
chip,
|
+ // Product
|
||||||
);
|
+ "OpenSK",
|
||||||
}
|
+ // Serial number
|
||||||
diff --git a/boards/nordic/nrf52dk/src/main.rs b/boards/nordic/nrf52dk/src/main.rs
|
+ "v0.1",
|
||||||
index d67ac695..b0bd8bf1 100644
|
+];
|
||||||
--- a/boards/nordic/nrf52dk/src/main.rs
|
+
|
||||||
+++ b/boards/nordic/nrf52dk/src/main.rs
|
// State for loading and holding applications.
|
||||||
@@ -213,6 +213,7 @@ pub unsafe fn reset_handler() {
|
// How should the kernel respond when a process faults.
|
||||||
FAULT_RESPONSE,
|
const FAULT_RESPONSE: kernel::procs::FaultResponse = kernel::procs::FaultResponse::Panic;
|
||||||
nrf52832::uicr::Regulator0Output::DEFAULT,
|
@@ -96,6 +108,11 @@ pub struct Platform {
|
||||||
false,
|
capsules::virtual_alarm::VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
|
||||||
+ &None,
|
|
||||||
chip,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
diff --git a/boards/nordic/nrf52dk_base/src/lib.rs b/boards/nordic/nrf52dk_base/src/lib.rs
|
|
||||||
index 105f7120..535e5cd8 100644
|
|
||||||
--- a/boards/nordic/nrf52dk_base/src/lib.rs
|
|
||||||
+++ b/boards/nordic/nrf52dk_base/src/lib.rs
|
|
||||||
@@ -101,6 +101,13 @@ pub struct Platform {
|
|
||||||
'static,
|
|
||||||
capsules::virtual_alarm::VirtualMuxAlarm<'static, nrf52::rtc::Rtc<'static>>,
|
|
||||||
>,
|
>,
|
||||||
+ usb: Option<
|
nvmc: &'static nrf52840::nvmc::SyscallDriver,
|
||||||
+ &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
+ usb: &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ nrf52::usbd::Usbd<'static>,
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
+ >,
|
|
||||||
+ >,
|
+ >,
|
||||||
// The nRF52dk does not have the flash chip on it, so we make this optional.
|
}
|
||||||
nonvolatile_storage:
|
|
||||||
Option<&'static capsules::nonvolatile_storage_driver::NonvolatileStorage<'static>>,
|
impl kernel::Platform for Platform {
|
||||||
@@ -130,6 +137,9 @@ impl kernel::Platform for Platform {
|
@@ -115,6 +132,7 @@ impl kernel::Platform for Platform {
|
||||||
f(self.nonvolatile_storage.map_or(None, |nv| Some(nv)))
|
capsules::temperature::DRIVER_NUM => f(Some(self.temp)),
|
||||||
}
|
capsules::analog_comparator::DRIVER_NUM => f(Some(self.analog_comparator)),
|
||||||
nrf52::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
nrf52840::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
||||||
+ capsules::usb::usb_ctap::DRIVER_NUM => {
|
+ capsules::usb::usb_ctap::DRIVER_NUM => f(Some(self.usb)),
|
||||||
+ f(self.usb.map(|ctap| ctap as &dyn kernel::Driver))
|
|
||||||
+ }
|
|
||||||
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
||||||
_ => f(None),
|
_ => f(None),
|
||||||
}
|
}
|
||||||
@@ -176,6 +186,7 @@ pub unsafe fn setup_board<I: nrf52::interrupt_service::InterruptService>(
|
@@ -323,6 +341,49 @@ pub unsafe fn reset_handler() {
|
||||||
app_fault_response: kernel::procs::FaultResponse,
|
|
||||||
reg_vout: Regulator0Output,
|
|
||||||
nfc_as_gpios: bool,
|
|
||||||
+ usb: &Option<&'static nrf52::usbd::Usbd<'static>>,
|
|
||||||
chip: &'static nrf52::chip::NRF52<I>,
|
|
||||||
) {
|
|
||||||
// Make non-volatile memory writable and activate the reset button
|
|
||||||
@@ -434,6 +445,44 @@ pub unsafe fn setup_board<I: nrf52::interrupt_service::InterruptService>(
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
+ // Configure USB controller if supported
|
+ // Configure USB controller
|
||||||
+ let usb_driver: Option<
|
+ let usb:
|
||||||
+ &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
+ &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ nrf52::usbd::Usbd<'static>,
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
+ >,
|
+ > = {
|
||||||
+ > = usb.map(|driver| {
|
|
||||||
+ let usb_ctap = static_init!(
|
+ let usb_ctap = static_init!(
|
||||||
+ capsules::usb::usbc_ctap_hid::ClientCtapHID<
|
+ capsules::usb::usbc_ctap_hid::ClientCtapHID<
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ nrf52::usbd::Usbd<'static>,
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
+ >,
|
+ >,
|
||||||
+ capsules::usb::usbc_ctap_hid::ClientCtapHID::new(driver)
|
+ capsules::usb::usbc_ctap_hid::ClientCtapHID::new(
|
||||||
|
+ &nrf52840::usbd::USBD,
|
||||||
|
+ capsules::usb::usbc_client::MAX_CTRL_PACKET_SIZE_NRF52840,
|
||||||
|
+ VENDOR_ID,
|
||||||
|
+ PRODUCT_ID,
|
||||||
|
+ STRINGS,
|
||||||
|
+ )
|
||||||
+ );
|
+ );
|
||||||
+ driver.set_client(usb_ctap);
|
+ nrf52840::usbd::USBD.set_client(usb_ctap);
|
||||||
+
|
+
|
||||||
+ // Enable power events to be sent to USB controller
|
+ // Enable power events to be sent to USB controller
|
||||||
+ nrf52::power::POWER.set_usb_client(driver);
|
+ nrf52840::power::POWER.set_usb_client(&nrf52840::usbd::USBD);
|
||||||
+ nrf52::power::POWER.enable_interrupts();
|
+ nrf52840::power::POWER.enable_interrupts();
|
||||||
+
|
+
|
||||||
+ // Configure the USB userspace driver
|
+ // Configure the USB userspace driver
|
||||||
+ let usb_driver = static_init!(
|
+ let usb_driver = static_init!(
|
||||||
+ capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
+ capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ 'static,
|
+ 'static,
|
||||||
+ nrf52::usbd::Usbd<'static>,
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
+ >,
|
+ >,
|
||||||
+ capsules::usb::usb_ctap::CtapUsbSyscallDriver::new(
|
+ capsules::usb::usb_ctap::CtapUsbSyscallDriver::new(
|
||||||
+ usb_ctap,
|
+ usb_ctap,
|
||||||
@@ -110,24 +93,132 @@ index 105f7120..535e5cd8 100644
|
|||||||
+ );
|
+ );
|
||||||
+ usb_ctap.set_client(usb_driver);
|
+ usb_ctap.set_client(usb_driver);
|
||||||
+ usb_driver as &'static _
|
+ usb_driver as &'static _
|
||||||
+ });
|
+ };
|
||||||
+
|
+
|
||||||
// Start all of the clocks. Low power operation will require a better
|
nrf52_components::NrfClockComponent::new().finalize(());
|
||||||
// approach than this.
|
|
||||||
nrf52::clock::CLOCK.low_stop();
|
let platform = Platform {
|
||||||
@@ -458,6 +507,7 @@ pub unsafe fn setup_board<I: nrf52::interrupt_service::InterruptService>(
|
@@ -338,6 +399,7 @@ pub unsafe fn reset_handler() {
|
||||||
temp: temp,
|
alarm,
|
||||||
alarm: alarm,
|
analog_comparator,
|
||||||
analog_comparator: analog_comparator,
|
nvmc,
|
||||||
+ usb: usb_driver,
|
+ usb,
|
||||||
nonvolatile_storage: nonvolatile_storage,
|
|
||||||
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
||||||
nvmc: nvmc,
|
};
|
||||||
|
|
||||||
|
diff --git a/boards/nordic/nrf52840dk/src/main.rs b/boards/nordic/nrf52840dk/src/main.rs
|
||||||
|
index 2ebb384..303a451 100644
|
||||||
|
--- a/boards/nordic/nrf52840dk/src/main.rs
|
||||||
|
+++ b/boards/nordic/nrf52840dk/src/main.rs
|
||||||
|
@@ -72,6 +72,7 @@ use kernel::common::dynamic_deferred_call::{DynamicDeferredCall, DynamicDeferred
|
||||||
|
use kernel::component::Component;
|
||||||
|
#[allow(unused_imports)]
|
||||||
|
use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init};
|
||||||
|
+use kernel::hil::usb::UsbController;
|
||||||
|
use nrf52840::gpio::Pin;
|
||||||
|
use nrf52_components::{self, UartChannel, UartPins};
|
||||||
|
|
||||||
|
@@ -113,6 +114,17 @@ pub mod io;
|
||||||
|
// - Set to true to use Segger RTT over USB.
|
||||||
|
const USB_DEBUGGING: bool = false;
|
||||||
|
|
||||||
|
+const VENDOR_ID: u16 = 0x1915; // Nordic Semiconductor
|
||||||
|
+const PRODUCT_ID: u16 = 0x521f; // nRF52840 Dongle (PCA10059)
|
||||||
|
+static STRINGS: &'static [&'static str] = &[
|
||||||
|
+ // Manufacturer
|
||||||
|
+ "Nordic Semiconductor ASA",
|
||||||
|
+ // Product
|
||||||
|
+ "OpenSK",
|
||||||
|
+ // Serial number
|
||||||
|
+ "v0.1",
|
||||||
|
+];
|
||||||
|
+
|
||||||
|
// State for loading and holding applications.
|
||||||
|
// How should the kernel respond when a process faults.
|
||||||
|
const FAULT_RESPONSE: kernel::procs::FaultResponse = kernel::procs::FaultResponse::Panic;
|
||||||
|
@@ -164,6 +176,11 @@ pub struct Platform {
|
||||||
|
>,
|
||||||
|
nonvolatile_storage: &'static capsules::nonvolatile_storage_driver::NonvolatileStorage<'static>,
|
||||||
|
nvmc: &'static nrf52840::nvmc::SyscallDriver,
|
||||||
|
+ usb: &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
|
+ 'static,
|
||||||
|
+ 'static,
|
||||||
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
|
+ >,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl kernel::Platform for Platform {
|
||||||
|
@@ -184,6 +201,7 @@ impl kernel::Platform for Platform {
|
||||||
|
capsules::analog_comparator::DRIVER_NUM => f(Some(self.analog_comparator)),
|
||||||
|
capsules::nonvolatile_storage_driver::DRIVER_NUM => f(Some(self.nonvolatile_storage)),
|
||||||
|
nrf52840::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
|
||||||
|
+ capsules::usb::usb_ctap::DRIVER_NUM => f(Some(self.usb)),
|
||||||
|
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
|
||||||
|
_ => f(None),
|
||||||
|
}
|
||||||
|
@@ -448,6 +466,49 @@ pub unsafe fn reset_handler() {
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
+ // Configure USB controller
|
||||||
|
+ let usb:
|
||||||
|
+ &'static capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
|
+ 'static,
|
||||||
|
+ 'static,
|
||||||
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
|
+ > = {
|
||||||
|
+ let usb_ctap = static_init!(
|
||||||
|
+ capsules::usb::usbc_ctap_hid::ClientCtapHID<
|
||||||
|
+ 'static,
|
||||||
|
+ 'static,
|
||||||
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
|
+ >,
|
||||||
|
+ capsules::usb::usbc_ctap_hid::ClientCtapHID::new(
|
||||||
|
+ &nrf52840::usbd::USBD,
|
||||||
|
+ capsules::usb::usbc_client::MAX_CTRL_PACKET_SIZE_NRF52840,
|
||||||
|
+ VENDOR_ID,
|
||||||
|
+ PRODUCT_ID,
|
||||||
|
+ STRINGS,
|
||||||
|
+ )
|
||||||
|
+ );
|
||||||
|
+ nrf52840::usbd::USBD.set_client(usb_ctap);
|
||||||
|
+
|
||||||
|
+ // Enable power events to be sent to USB controller
|
||||||
|
+ nrf52840::power::POWER.set_usb_client(&nrf52840::usbd::USBD);
|
||||||
|
+ nrf52840::power::POWER.enable_interrupts();
|
||||||
|
+
|
||||||
|
+ // Configure the USB userspace driver
|
||||||
|
+ let usb_driver = static_init!(
|
||||||
|
+ capsules::usb::usb_ctap::CtapUsbSyscallDriver<
|
||||||
|
+ 'static,
|
||||||
|
+ 'static,
|
||||||
|
+ nrf52840::usbd::Usbd<'static>,
|
||||||
|
+ >,
|
||||||
|
+ capsules::usb::usb_ctap::CtapUsbSyscallDriver::new(
|
||||||
|
+ usb_ctap,
|
||||||
|
+ board_kernel.create_grant(&memory_allocation_capability)
|
||||||
|
+ )
|
||||||
|
+ );
|
||||||
|
+ usb_ctap.set_client(usb_driver);
|
||||||
|
+ usb_driver as &'static _
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
nrf52_components::NrfClockComponent::new().finalize(());
|
||||||
|
|
||||||
|
let platform = Platform {
|
||||||
|
@@ -464,6 +525,7 @@ pub unsafe fn reset_handler() {
|
||||||
|
analog_comparator,
|
||||||
|
nonvolatile_storage,
|
||||||
|
nvmc,
|
||||||
|
+ usb,
|
||||||
|
ipc: kernel::ipc::IPC::new(board_kernel, &memory_allocation_capability),
|
||||||
|
};
|
||||||
|
|
||||||
diff --git a/capsules/src/driver.rs b/capsules/src/driver.rs
|
diff --git a/capsules/src/driver.rs b/capsules/src/driver.rs
|
||||||
index bfc06429..5858d352 100644
|
index 256fc0e..ae458b3 100644
|
||||||
--- a/capsules/src/driver.rs
|
--- a/capsules/src/driver.rs
|
||||||
+++ b/capsules/src/driver.rs
|
+++ b/capsules/src/driver.rs
|
||||||
@@ -25,6 +25,7 @@ pub enum NUM {
|
@@ -26,6 +26,7 @@ pub enum NUM {
|
||||||
I2cMaster = 0x20003,
|
I2cMaster = 0x20003,
|
||||||
UsbUser = 0x20005,
|
UsbUser = 0x20005,
|
||||||
I2cMasterSlave = 0x20006,
|
I2cMasterSlave = 0x20006,
|
||||||
@@ -136,10 +227,11 @@ index bfc06429..5858d352 100644
|
|||||||
// Radio
|
// Radio
|
||||||
BleAdvertising = 0x30000,
|
BleAdvertising = 0x30000,
|
||||||
diff --git a/capsules/src/usb/mod.rs b/capsules/src/usb/mod.rs
|
diff --git a/capsules/src/usb/mod.rs b/capsules/src/usb/mod.rs
|
||||||
index e5c8d6ad..7af3da2e 100644
|
index 767f5de..3f3a4f6 100644
|
||||||
--- a/capsules/src/usb/mod.rs
|
--- a/capsules/src/usb/mod.rs
|
||||||
+++ b/capsules/src/usb/mod.rs
|
+++ b/capsules/src/usb/mod.rs
|
||||||
@@ -1,4 +1,6 @@
|
@@ -1,5 +1,7 @@
|
||||||
|
pub mod cdc;
|
||||||
pub mod descriptors;
|
pub mod descriptors;
|
||||||
+pub mod usb_ctap;
|
+pub mod usb_ctap;
|
||||||
pub mod usb_user;
|
pub mod usb_user;
|
||||||
@@ -148,7 +240,7 @@ index e5c8d6ad..7af3da2e 100644
|
|||||||
+pub mod usbc_ctap_hid;
|
+pub mod usbc_ctap_hid;
|
||||||
diff --git a/capsules/src/usb/usb_ctap.rs b/capsules/src/usb/usb_ctap.rs
|
diff --git a/capsules/src/usb/usb_ctap.rs b/capsules/src/usb/usb_ctap.rs
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..da3d16d8
|
index 0000000..da3d16d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/capsules/src/usb/usb_ctap.rs
|
+++ b/capsules/src/usb/usb_ctap.rs
|
||||||
@@ -0,0 +1,355 @@
|
@@ -0,0 +1,355 @@
|
||||||
@@ -509,16 +601,15 @@ index 00000000..da3d16d8
|
|||||||
+}
|
+}
|
||||||
diff --git a/capsules/src/usb/usbc_ctap_hid.rs b/capsules/src/usb/usbc_ctap_hid.rs
|
diff --git a/capsules/src/usb/usbc_ctap_hid.rs b/capsules/src/usb/usbc_ctap_hid.rs
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..4b1916cf
|
index 0000000..d97b72d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/capsules/src/usb/usbc_ctap_hid.rs
|
+++ b/capsules/src/usb/usbc_ctap_hid.rs
|
||||||
@@ -0,0 +1,359 @@
|
@@ -0,0 +1,363 @@
|
||||||
+//! A USB HID client of the USB hardware interface
|
+//! A USB HID client of the USB hardware interface
|
||||||
+
|
+
|
||||||
|
+use super::descriptors;
|
||||||
+use super::descriptors::Buffer64;
|
+use super::descriptors::Buffer64;
|
||||||
+use super::descriptors::ConfigurationDescriptor;
|
|
||||||
+use super::descriptors::DescriptorType;
|
+use super::descriptors::DescriptorType;
|
||||||
+use super::descriptors::DeviceDescriptor;
|
|
||||||
+use super::descriptors::EndpointAddress;
|
+use super::descriptors::EndpointAddress;
|
||||||
+use super::descriptors::EndpointDescriptor;
|
+use super::descriptors::EndpointDescriptor;
|
||||||
+use super::descriptors::HIDCountryCode;
|
+use super::descriptors::HIDCountryCode;
|
||||||
@@ -535,36 +626,11 @@ index 00000000..4b1916cf
|
|||||||
+use kernel::hil;
|
+use kernel::hil;
|
||||||
+use kernel::hil::usb::TransferType;
|
+use kernel::hil::usb::TransferType;
|
||||||
+
|
+
|
||||||
+const VENDOR_ID: u16 = 0x1915; // Nordic Semiconductor
|
|
||||||
+const PRODUCT_ID: u16 = 0x521f; // nRF52840 Dongle (PCA10059)
|
|
||||||
+
|
|
||||||
+static LANGUAGES: &'static [u16; 1] = &[
|
+static LANGUAGES: &'static [u16; 1] = &[
|
||||||
+ 0x0409, // English (United States)
|
+ 0x0409, // English (United States)
|
||||||
+];
|
+];
|
||||||
+
|
+
|
||||||
+static STRINGS: &'static [&'static str] = &[
|
+const ENDPOINT_NUM: usize = 1;
|
||||||
+ // Manufacturer
|
|
||||||
+ "Nordic Semiconductor ASA",
|
|
||||||
+ // Product
|
|
||||||
+ "OpenSK",
|
|
||||||
+ // Serial number
|
|
||||||
+ "v0.1",
|
|
||||||
+];
|
|
||||||
+
|
|
||||||
+static ENDPOINTS: &'static [EndpointDescriptor] = &[
|
|
||||||
+ EndpointDescriptor {
|
|
||||||
+ endpoint_address: EndpointAddress::new_const(1, TransferDirection::HostToDevice),
|
|
||||||
+ transfer_type: TransferType::Interrupt,
|
|
||||||
+ max_packet_size: 64,
|
|
||||||
+ interval: 5,
|
|
||||||
+ },
|
|
||||||
+ EndpointDescriptor {
|
|
||||||
+ endpoint_address: EndpointAddress::new_const(1, TransferDirection::DeviceToHost),
|
|
||||||
+ transfer_type: TransferType::Interrupt,
|
|
||||||
+ max_packet_size: 64,
|
|
||||||
+ interval: 5,
|
|
||||||
+ },
|
|
||||||
+];
|
|
||||||
+
|
+
|
||||||
+static CTAP_REPORT_DESCRIPTOR: &'static [u8] = &[
|
+static CTAP_REPORT_DESCRIPTOR: &'static [u8] = &[
|
||||||
+ 0x06, 0xD0, 0xF1, // HID_UsagePage ( FIDO_USAGE_PAGE ),
|
+ 0x06, 0xD0, 0xF1, // HID_UsagePage ( FIDO_USAGE_PAGE ),
|
||||||
@@ -616,41 +682,71 @@ index 00000000..4b1916cf
|
|||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+impl<'a, 'b, C: hil::usb::UsbController<'a>> ClientCtapHID<'a, 'b, C> {
|
+impl<'a, 'b, C: hil::usb::UsbController<'a>> ClientCtapHID<'a, 'b, C> {
|
||||||
+ pub fn new(controller: &'a C) -> Self {
|
+ pub fn new(
|
||||||
+ ClientCtapHID {
|
+ controller: &'a C,
|
||||||
+ client_ctrl: ClientCtrl::new(
|
+ max_ctrl_packet_size: u8,
|
||||||
+ controller,
|
+ vendor_id: u16,
|
||||||
+ DeviceDescriptor {
|
+ product_id: u16,
|
||||||
+ // TODO: set this field at the board level.
|
+ strings: &'static [&'static str]
|
||||||
+ max_packet_size_ep0: 64,
|
+ ) -> Self {
|
||||||
+ vendor_id: VENDOR_ID,
|
+ let interfaces: &mut [InterfaceDescriptor] = &mut [
|
||||||
+ product_id: PRODUCT_ID,
|
+ // Interface declared in the FIDO2 specification, section 8.1.8.1
|
||||||
|
+ InterfaceDescriptor {
|
||||||
|
+ interface_class: 0x03, // HID
|
||||||
|
+ interface_subclass: 0x00,
|
||||||
|
+ interface_protocol: 0x00,
|
||||||
|
+ ..InterfaceDescriptor::default()
|
||||||
|
+ },
|
||||||
|
+ ];
|
||||||
|
+
|
||||||
|
+ let endpoints: &[&[EndpointDescriptor]] = &[&[
|
||||||
|
+ EndpointDescriptor {
|
||||||
|
+ endpoint_address: EndpointAddress::new_const(ENDPOINT_NUM, TransferDirection::HostToDevice),
|
||||||
|
+ transfer_type: TransferType::Interrupt,
|
||||||
|
+ max_packet_size: 64,
|
||||||
|
+ interval: 5,
|
||||||
|
+ },
|
||||||
|
+ EndpointDescriptor {
|
||||||
|
+ endpoint_address: EndpointAddress::new_const(ENDPOINT_NUM, TransferDirection::DeviceToHost),
|
||||||
|
+ transfer_type: TransferType::Interrupt,
|
||||||
|
+ max_packet_size: 64,
|
||||||
|
+ interval: 5,
|
||||||
|
+ },
|
||||||
|
+ ]];
|
||||||
|
+
|
||||||
|
+ let (device_descriptor_buffer, other_descriptor_buffer) =
|
||||||
|
+ descriptors::create_descriptor_buffers(
|
||||||
|
+ descriptors::DeviceDescriptor {
|
||||||
|
+ vendor_id: vendor_id,
|
||||||
|
+ product_id: product_id,
|
||||||
+ manufacturer_string: 1,
|
+ manufacturer_string: 1,
|
||||||
+ product_string: 2,
|
+ product_string: 2,
|
||||||
+ serial_number_string: 3,
|
+ serial_number_string: 3,
|
||||||
+ ..Default::default()
|
+ max_packet_size_ep0: max_ctrl_packet_size,
|
||||||
|
+ ..descriptors::DeviceDescriptor::default()
|
||||||
+ },
|
+ },
|
||||||
+ ConfigurationDescriptor {
|
+ descriptors::ConfigurationDescriptor {
|
||||||
+ // Must be non-zero, otherwise dmesg prints the following error:
|
|
||||||
+ // [...] usb 2-3: config 0 descriptor??
|
|
||||||
+ configuration_value: 1,
|
+ configuration_value: 1,
|
||||||
+ ..Default::default()
|
+ ..descriptors::ConfigurationDescriptor::default()
|
||||||
+ },
|
+ },
|
||||||
+ // Interface declared in the FIDO2 specification, section 8.1.8.1
|
+ interfaces,
|
||||||
+ InterfaceDescriptor {
|
+ endpoints,
|
||||||
+ interface_class: 0x03, // HID
|
+ Some(&HID),
|
||||||
+ interface_subclass: 0x00,
|
+ None, // No CDC descriptor array
|
||||||
+ interface_protocol: 0x00,
|
+ );
|
||||||
+ ..Default::default()
|
+
|
||||||
+ },
|
+ ClientCtapHID {
|
||||||
+ ENDPOINTS,
|
+ client_ctrl: ClientCtrl::new(
|
||||||
|
+ controller,
|
||||||
|
+ device_descriptor_buffer,
|
||||||
|
+ other_descriptor_buffer,
|
||||||
+ Some(&HID),
|
+ Some(&HID),
|
||||||
+ Some(&CTAP_REPORT),
|
+ Some(&CTAP_REPORT),
|
||||||
+ LANGUAGES,
|
+ LANGUAGES,
|
||||||
+ STRINGS,
|
+ strings,
|
||||||
+ ),
|
+ ),
|
||||||
+ in_buffer: Default::default(),
|
+ in_buffer: Buffer64::default(),
|
||||||
+ out_buffer: Default::default(),
|
+ out_buffer: Buffer64::default(),
|
||||||
+ client: OptionalCell::empty(),
|
+ client: OptionalCell::empty(),
|
||||||
+ tx_packet: OptionalCell::empty(),
|
+ tx_packet: OptionalCell::empty(),
|
||||||
+ pending_in: Cell::new(false),
|
+ pending_in: Cell::new(false),
|
||||||
@@ -872,3 +968,16 @@ index 00000000..4b1916cf
|
|||||||
+ self.client.map(|client| client.packet_transmitted());
|
+ self.client.map(|client| client.packet_transmitted());
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
|
diff --git a/chips/nrf52840/src/lib.rs b/chips/nrf52840/src/lib.rs
|
||||||
|
index 942d028..ce73e1f 100644
|
||||||
|
--- a/chips/nrf52840/src/lib.rs
|
||||||
|
+++ b/chips/nrf52840/src/lib.rs
|
||||||
|
@@ -2,7 +2,7 @@
|
||||||
|
|
||||||
|
pub use nrf52::{
|
||||||
|
acomp, adc, aes, ble_radio, clock, constants, crt1, ficr, i2c, ieee802154_radio, init, nvmc,
|
||||||
|
- pinmux, ppi, pwm, rtc, spi, temperature, timer, trng, uart, uicr, usbd,
|
||||||
|
+ pinmux, power, ppi, pwm, rtc, spi, temperature, timer, trng, uart, uicr, usbd,
|
||||||
|
};
|
||||||
|
pub mod chip;
|
||||||
|
pub mod gpio;
|
||||||
|
|||||||
@@ -1,22 +1,13 @@
|
|||||||
diff --git a/boards/nordic/nrf52840dk/src/main.rs b/boards/nordic/nrf52840dk/src/main.rs
|
diff --git a/boards/nordic/nrf52840dk/src/main.rs b/boards/nordic/nrf52840dk/src/main.rs
|
||||||
index a5847805..f0b303bf 100644
|
index 303a451..18fd331 100644
|
||||||
--- a/boards/nordic/nrf52840dk/src/main.rs
|
--- a/boards/nordic/nrf52840dk/src/main.rs
|
||||||
+++ b/boards/nordic/nrf52840dk/src/main.rs
|
+++ b/boards/nordic/nrf52840dk/src/main.rs
|
||||||
@@ -102,7 +102,7 @@ pub mod io;
|
@@ -112,7 +112,7 @@ pub mod io;
|
||||||
// Whether to use UART debugging or Segger RTT (USB) debugging.
|
// Whether to use UART debugging or Segger RTT (USB) debugging.
|
||||||
// - Set to false to use UART.
|
// - Set to false to use UART.
|
||||||
// - Set to true to use Segger RTT over USB.
|
// - Set to true to use Segger RTT over USB.
|
||||||
-const USB_DEBUGGING: bool = false;
|
-const USB_DEBUGGING: bool = false;
|
||||||
+const USB_DEBUGGING: bool = true;
|
+const USB_DEBUGGING: bool = true;
|
||||||
|
|
||||||
// State for loading and holding applications.
|
const VENDOR_ID: u16 = 0x1915; // Nordic Semiconductor
|
||||||
// How should the kernel respond when a process faults.
|
const PRODUCT_ID: u16 = 0x521f; // nRF52840 Dongle (PCA10059)
|
||||||
@@ -112,7 +112,7 @@ const FAULT_RESPONSE: kernel::procs::FaultResponse = kernel::procs::FaultRespons
|
|
||||||
const NUM_PROCS: usize = 8;
|
|
||||||
|
|
||||||
#[link_section = ".app_memory"]
|
|
||||||
-static mut APP_MEMORY: [u8; 0x3C000] = [0; 0x3C000];
|
|
||||||
+static mut APP_MEMORY: [u8; 0x3A000] = [0; 0x3A000];
|
|
||||||
|
|
||||||
static mut PROCESSES: [Option<&'static dyn kernel::procs::ProcessType>; NUM_PROCS] =
|
|
||||||
[None, None, None, None, None, None, None, None];
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
diff --git a/Cargo.toml b/Cargo.toml
|
diff --git a/Cargo.toml b/Cargo.toml
|
||||||
index 18f4a10d..db88dc1d 100644
|
index 83c4855..cfd63b1 100644
|
||||||
--- a/Cargo.toml
|
--- a/Cargo.toml
|
||||||
+++ b/Cargo.toml
|
+++ b/Cargo.toml
|
||||||
@@ -13,6 +13,8 @@ members = [
|
@@ -13,6 +13,8 @@ members = [
|
||||||
"boards/launchxl",
|
"boards/msp_exp432p401r",
|
||||||
"boards/nordic/nrf52840dk",
|
"boards/nordic/nrf52840dk",
|
||||||
"boards/nordic/nrf52840_dongle",
|
"boards/nordic/nrf52840_dongle",
|
||||||
+ "boards/nordic/nrf52840_dongle_dfu",
|
+ "boards/nordic/nrf52840_dongle_dfu",
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
diff --git a/capsules/src/segger_rtt.rs b/capsules/src/segger_rtt.rs
|
|
||||||
index 89a9ddbf..135e7b45 100644
|
|
||||||
--- a/capsules/src/segger_rtt.rs
|
|
||||||
+++ b/capsules/src/segger_rtt.rs
|
|
||||||
@@ -240,7 +240,7 @@ impl<'a, A: hil::time::Alarm<'a>> uart::Transmit<'a> for SeggerRtt<'a, A> {
|
|
||||||
|
|
||||||
// Start a short timer so that we get a callback and
|
|
||||||
// can issue the callback to the client.
|
|
||||||
- let interval = (100 as u32) * <A::Frequency>::frequency() / 1000000;
|
|
||||||
+ let interval = (1000 as u32) * <A::Frequency>::frequency() / 1000000;
|
|
||||||
let tics = self.alarm.now().wrapping_add(interval);
|
|
||||||
self.alarm.set_alarm(tics);
|
|
||||||
})
|
|
||||||
12
patches/tock/05-mpu-fix.patch
Normal file
12
patches/tock/05-mpu-fix.patch
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
diff --git a/kernel/src/sched.rs b/kernel/src/sched.rs
|
||||||
|
index ed3ae8260..f109960d3 100644
|
||||||
|
--- a/kernel/src/sched.rs
|
||||||
|
+++ b/kernel/src/sched.rs
|
||||||
|
@@ -632,6 +632,7 @@ impl Kernel {
|
||||||
|
let context_switch_reason = process.switch_to();
|
||||||
|
scheduler_timer.disarm();
|
||||||
|
chip.mpu().disable_app_mpu();
|
||||||
|
+ chip.mpu().clear_mpu();
|
||||||
|
|
||||||
|
// Now the process has returned back to the kernel. Check
|
||||||
|
// why and handle the process as appropriate.
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
91a98f475cb3042dd5184598a8292edb2a414df8d967a35c8f2295826b5a161b third_party/tock/target/thumbv7em-none-eabi/release/nrf52840dk.bin
|
c242b0237b93328eea0213411916f84e3ce631c3eea3bf56d6769ae5aa0b8d06 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840dk.bin
|
||||||
7cc5c802e22e73c1edfd5b890642c5f6c4a1f888b61f0cd6d638a770eb0af739 target/nrf52840dk_merged.hex
|
9fca5250e6730276bc361661994495c9c9c707fb46d61cee75410bef5549dd62 target/nrf52840dk_merged.hex
|
||||||
a5943c5311158b0f99370246d37782eb9b12fc36c56387eadb6587a3a4fe8fd5 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle.bin
|
259a54fae11cb8f1306051354825d19223ba4c33f3adfdb2d3e9d9efc7229302 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle.bin
|
||||||
9ff31263bd33e92b5f1f59d83f557046cb4d022919a5082931a197a2f6ec4398 target/nrf52840_dongle_merged.hex
|
6d4b85a31b8f16962478f6cb72ccec94bbed4f6e955484dc8e73405d8fcd27ea target/nrf52840_dongle_merged.hex
|
||||||
663297e3e29b9e2a972b68cea1592aaf965d797242579bb5bca09cd73cdfb637 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle_dfu.bin
|
49d647374a1448c9c3107758b6e0a1cabdf008c3e53524a3b047a16c27b8af29 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle_dfu.bin
|
||||||
4b1f17b3dda2460fe83adc157f8ae1fb2559fb151b8897806e7b0aa25c898ec1 target/nrf52840_dongle_dfu_merged.hex
|
bf2407823be0550c7d606d97e240d3dc8b2572225f2f55383f903bbf58c4f26a target/nrf52840_dongle_dfu_merged.hex
|
||||||
162a05d056aafc16d4868d5c3aa10518e41299dddd60608f96954dc9cf964cd3 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_mdk_dfu.bin
|
06a38a0d6d356145467a73c765e28a945878f663664016f888393207097bfe10 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_mdk_dfu.bin
|
||||||
90369c2f5c1b3b3a443114be069fd2da0806444865830a7e992ed52e036c5a39 target/nrf52840_mdk_dfu_merged.hex
|
1dbc1c8aacfc2e996e8b318b0ef8f64db385e1b887f092ed6cff4d5425542836 target/nrf52840_mdk_dfu_merged.hex
|
||||||
299201ff87cd84bd767516143b4e6a54759e01fcd864c0e579c62217b21d4fa4 target/tab/ctap2.tab
|
09b7ff9a4d44cd675c4ee581d43713addb5f3931ea9e7c8d71d448e0539f7070 target/tab/ctap2.tab
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
3feb5d29a3d669107b460a00391440be4ebc5e50461f9ef3248714f4f99c070e third_party/tock/target/thumbv7em-none-eabi/release/nrf52840dk.bin
|
dab66677002854f6abfb1745d24d1c9e4e93c9bba286b14024e42cb8f2b99b9a third_party/tock/target/thumbv7em-none-eabi/release/nrf52840dk.bin
|
||||||
875fdc2bbd473a5c77c119ba860e54a43f8097c20931cc5ae83a26e9311ce124 target/nrf52840dk_merged.hex
|
316b393bd4b18fd154e9203b15f6abb5d27a3ac2c98f19c95b80033091aeccb6 target/nrf52840dk_merged.hex
|
||||||
8eebe1c1dfe22003466c2570b3735c54c58ae91b8168582ad363ab79c9230a15 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle.bin
|
70cf9f6c1d6b2149c1ca88664073a92e092215faaf551310f8bfd8e171d3d3a1 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle.bin
|
||||||
70c1249370144c6ca55ad490dc5e418f9c2994c2649941dec41d769963a0e0ad target/nrf52840_dongle_merged.hex
|
a03a6b5239703c38c0eee7e76ab7b1b8a3813abdd7d84f51c495b8889d4b9605 target/nrf52840_dongle_merged.hex
|
||||||
779d77071d1e629f92210ac313e230bcaea6d77c710210c1ac4b40f8085cdad7 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle_dfu.bin
|
f550b6493c8cd401d191306510de50ddd6d4c709dcf90ea1bd3a9f1bcffd11b5 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_dongle_dfu.bin
|
||||||
6c12edd4ec4d952619e976e635df39235d821eec9902e8882563fc43a1690ddb target/nrf52840_dongle_dfu_merged.hex
|
249ed37202b5ce102ae4c112358e4f4bcd275a19ac6dea2c474920342bcf6e79 target/nrf52840_dongle_dfu_merged.hex
|
||||||
f466490d6498f6c06c7c4a717eb437ba2fb06d1985532c23f145d38b9daa8259 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_mdk_dfu.bin
|
1baaf518a74c6077cb936d9cf178b6dd0232e7562fa56174886b05b77886cc32 third_party/tock/target/thumbv7em-none-eabi/release/nrf52840_mdk_dfu.bin
|
||||||
7b67e726071ac5161344212821b9869c8f289559c8b91a5f2a0f17624855ce8a target/nrf52840_mdk_dfu_merged.hex
|
93e23a8e9964bf22794c2f453738af68ae348456fdd898cddfe8e2b3ada8bf79 target/nrf52840_mdk_dfu_merged.hex
|
||||||
4dd8753dba382bdbadd0c9761949f7bdacbd77408cfc8dc466107a81ff664b15 target/tab/ctap2.tab
|
0fe175c3cf5a77a9f6df8f5aa3f82715986536e2f737aee44cb680a1e801dac4 target/tab/ctap2.tab
|
||||||
|
|||||||
@@ -1,76 +1,96 @@
|
|||||||
========================================
|
========================================
|
||||||
Board: nrf52840dk
|
Board: nrf52840dk
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178688 (0x2ba00) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186112 (0x2d700) bytes.
|
||||||
Adding .stack section. Offset: 178816 (0x2ba80). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186240 (0x2d780). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
========================================
|
========================================
|
||||||
Board: nrf52840_dongle
|
Board: nrf52840_dongle
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178688 (0x2ba00) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186112 (0x2d700) bytes.
|
||||||
Adding .stack section. Offset: 178816 (0x2ba80). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186240 (0x2d780). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
========================================
|
========================================
|
||||||
Board: nrf52840_dongle_dfu
|
Board: nrf52840_dongle_dfu
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178688 (0x2ba00) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186112 (0x2d700) bytes.
|
||||||
Adding .stack section. Offset: 178816 (0x2ba80). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186240 (0x2d780). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
========================================
|
========================================
|
||||||
Board: nrf52840_mdk_dfu
|
Board: nrf52840_mdk_dfu
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178688 (0x2ba00) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186112 (0x2d700) bytes.
|
||||||
Adding .stack section. Offset: 178816 (0x2ba80). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186240 (0x2d780). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
|
|||||||
@@ -1,76 +1,96 @@
|
|||||||
========================================
|
========================================
|
||||||
Board: nrf52840dk
|
Board: nrf52840dk
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178536 (0x2b968) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186080 (0x2d6e0) bytes.
|
||||||
Adding .stack section. Offset: 178664 (0x2b9e8). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186208 (0x2d760). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
========================================
|
========================================
|
||||||
Board: nrf52840_dongle
|
Board: nrf52840_dongle
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178536 (0x2b968) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186080 (0x2d6e0) bytes.
|
||||||
Adding .stack section. Offset: 178664 (0x2b9e8). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186208 (0x2d760). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
========================================
|
========================================
|
||||||
Board: nrf52840_dongle_dfu
|
Board: nrf52840_dongle_dfu
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178536 (0x2b968) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186080 (0x2d6e0) bytes.
|
||||||
Adding .stack section. Offset: 178664 (0x2b9e8). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186208 (0x2d760). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
========================================
|
========================================
|
||||||
Board: nrf52840_mdk_dfu
|
Board: nrf52840_mdk_dfu
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
Min RAM size from sections in ELF: 20 bytes
|
Creating "target/tab/thumbv7em-none-eabi.tbf"
|
||||||
|
Min RAM size from segments in ELF: 20 bytes
|
||||||
Number of writeable flash regions: 0
|
Number of writeable flash regions: 0
|
||||||
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
Adding .crt0_header section. Offset: 64 (0x40). Length: 64 (0x40) bytes.
|
||||||
Entry point is in .text section
|
Entry point is in .text section
|
||||||
Adding .text section. Offset: 128 (0x80). Length: 178536 (0x2b968) bytes.
|
Adding .text section. Offset: 128 (0x80). Length: 186080 (0x2d6e0) bytes.
|
||||||
Adding .stack section. Offset: 178664 (0x2b9e8). Length: 16384 (0x4000) bytes.
|
Adding .stack section. Offset: 186208 (0x2d760). Length: 16384 (0x4000) bytes.
|
||||||
Searching for .rel.X sections to add.
|
Searching for .rel.X sections to add.
|
||||||
TBF Header:
|
TBF Header:
|
||||||
version: 2 0x2
|
version: 2 0x2
|
||||||
header_size: 44 0x2C
|
header_size: 56 0x38
|
||||||
total_size: 262144 0x40000
|
total_size: 262144 0x40000
|
||||||
flags: 1 0x1
|
flags: 1 0x1
|
||||||
|
|
||||||
init_fn_offset: 85 0x55
|
init_fn_offset: 73 0x49
|
||||||
protected_size: 20 0x14
|
protected_size: 8 0x8
|
||||||
minimum_ram_size: 107428 0x1A3A4
|
minimum_ram_size: 107428 0x1A3A4
|
||||||
|
|
||||||
|
start_process_ram: 4294967295 0xFFFFFFFF
|
||||||
|
start_process_flash: 262208 0x40040
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ use super::hid::ChannelID;
|
|||||||
use super::key_material::{ATTESTATION_CERTIFICATE, ATTESTATION_PRIVATE_KEY};
|
use super::key_material::{ATTESTATION_CERTIFICATE, ATTESTATION_PRIVATE_KEY};
|
||||||
use super::status_code::Ctap2StatusCode;
|
use super::status_code::Ctap2StatusCode;
|
||||||
use super::CtapState;
|
use super::CtapState;
|
||||||
use crate::timer::ClockValue;
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::convert::Into;
|
use core::convert::Into;
|
||||||
use core::convert::TryFrom;
|
use core::convert::TryFrom;
|
||||||
use crypto::rng256::Rng256;
|
use crypto::rng256::Rng256;
|
||||||
|
use libtock_drivers::timer::ClockValue;
|
||||||
|
|
||||||
// The specification referenced in this file is at:
|
// The specification referenced in this file is at:
|
||||||
// https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-raw-message-formats-v1.2-ps-20170411.pdf
|
// https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-raw-message-formats-v1.2-ps-20170411.pdf
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
mod receive;
|
pub mod receive;
|
||||||
mod send;
|
pub mod send;
|
||||||
|
|
||||||
use self::receive::MessageAssembler;
|
use self::receive::MessageAssembler;
|
||||||
use self::send::HidPacketIterator;
|
use self::send::HidPacketIterator;
|
||||||
@@ -22,13 +22,13 @@ use super::ctap1;
|
|||||||
use super::status_code::Ctap2StatusCode;
|
use super::status_code::Ctap2StatusCode;
|
||||||
use super::timed_permission::TimedPermission;
|
use super::timed_permission::TimedPermission;
|
||||||
use super::CtapState;
|
use super::CtapState;
|
||||||
use crate::timer::{ClockValue, Duration, Timestamp};
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
#[cfg(feature = "debug_ctap")]
|
#[cfg(feature = "debug_ctap")]
|
||||||
use core::fmt::Write;
|
use core::fmt::Write;
|
||||||
use crypto::rng256::Rng256;
|
use crypto::rng256::Rng256;
|
||||||
#[cfg(feature = "debug_ctap")]
|
#[cfg(feature = "debug_ctap")]
|
||||||
use libtock_drivers::console::Console;
|
use libtock_drivers::console::Console;
|
||||||
|
use libtock_drivers::timer::{ClockValue, Duration, Timestamp};
|
||||||
|
|
||||||
// CTAP specification (version 20190130) section 8.1
|
// CTAP specification (version 20190130) section 8.1
|
||||||
// TODO: Channel allocation, section 8.1.3?
|
// TODO: Channel allocation, section 8.1.3?
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use super::{ChannelID, CtapHid, HidPacket, Message, ProcessedPacket};
|
use super::{ChannelID, CtapHid, HidPacket, Message, ProcessedPacket};
|
||||||
use crate::timer::Timestamp;
|
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::mem::swap;
|
use core::mem::swap;
|
||||||
|
use libtock_drivers::timer::Timestamp;
|
||||||
|
|
||||||
// A structure to assemble CTAPHID commands from a series of incoming USB HID packets.
|
// A structure to assemble CTAPHID commands from a series of incoming USB HID packets.
|
||||||
pub struct MessageAssembler {
|
pub struct MessageAssembler {
|
||||||
@@ -195,7 +195,7 @@ impl MessageAssembler {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::timer::Duration;
|
use libtock_drivers::timer::Duration;
|
||||||
|
|
||||||
// Except for tests that exercise timeouts, all packets are synchronized at the same dummy
|
// Except for tests that exercise timeouts, all packets are synchronized at the same dummy
|
||||||
// timestamp.
|
// timestamp.
|
||||||
|
|||||||
@@ -12,17 +12,17 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use crate::crypto::rng256::Rng256;
|
|
||||||
#[cfg(feature = "with_ctap2_1")]
|
#[cfg(feature = "with_ctap2_1")]
|
||||||
use crate::ctap::data_formats::{extract_array, extract_text_string};
|
use crate::ctap::data_formats::{extract_array, extract_text_string};
|
||||||
use crate::ctap::data_formats::{CredentialProtectionPolicy, PublicKeyCredentialSource};
|
use crate::ctap::data_formats::{CredentialProtectionPolicy, PublicKeyCredentialSource};
|
||||||
use crate::ctap::pin_protocol_v1::PIN_AUTH_LENGTH;
|
use crate::ctap::pin_protocol_v1::PIN_AUTH_LENGTH;
|
||||||
use crate::ctap::status_code::Ctap2StatusCode;
|
use crate::ctap::status_code::Ctap2StatusCode;
|
||||||
use crate::ctap::{key_material, USE_BATCH_ATTESTATION};
|
use crate::ctap::{key_material, USE_BATCH_ATTESTATION};
|
||||||
|
use crate::embedded_flash::{self, StoreConfig, StoreEntry, StoreError};
|
||||||
use alloc::string::String;
|
use alloc::string::String;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::convert::TryInto;
|
use core::convert::TryInto;
|
||||||
use ctap2::embedded_flash::{self, StoreConfig, StoreEntry, StoreError};
|
use crypto::rng256::Rng256;
|
||||||
|
|
||||||
#[cfg(any(test, feature = "ram_storage"))]
|
#[cfg(any(test, feature = "ram_storage"))]
|
||||||
type Storage = embedded_flash::BufferStorage;
|
type Storage = embedded_flash::BufferStorage;
|
||||||
@@ -671,9 +671,9 @@ fn _serialize_min_pin_length_rp_ids(rp_ids: Vec<String>) -> Result<Vec<u8>, Ctap
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::crypto;
|
|
||||||
use crate::crypto::rng256::{Rng256, ThreadRng256};
|
|
||||||
use crate::ctap::data_formats::{PublicKeyCredentialSource, PublicKeyCredentialType};
|
use crate::ctap::data_formats::{PublicKeyCredentialSource, PublicKeyCredentialType};
|
||||||
|
use crypto;
|
||||||
|
use crypto::rng256::{Rng256, ThreadRng256};
|
||||||
|
|
||||||
fn create_credential_source(
|
fn create_credential_source(
|
||||||
rng: &mut ThreadRng256,
|
rng: &mut ThreadRng256,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use crate::timer::{ClockValue, Duration};
|
use libtock_drivers::timer::{ClockValue, Duration};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub enum TimedPermission {
|
pub enum TimedPermission {
|
||||||
|
|||||||
@@ -12,12 +12,16 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
#[cfg(any(test, feature = "ram_storage"))]
|
||||||
mod buffer;
|
mod buffer;
|
||||||
mod storage;
|
mod storage;
|
||||||
mod store;
|
mod store;
|
||||||
|
#[cfg(not(any(test, feature = "ram_storage")))]
|
||||||
mod syscall;
|
mod syscall;
|
||||||
|
|
||||||
|
#[cfg(any(test, feature = "ram_storage"))]
|
||||||
pub use self::buffer::{BufferOptions, BufferStorage};
|
pub use self::buffer::{BufferOptions, BufferStorage};
|
||||||
pub use self::storage::{Index, Storage, StorageError, StorageResult};
|
pub use self::storage::{Index, Storage, StorageError, StorageResult};
|
||||||
pub use self::store::{Store, StoreConfig, StoreEntry, StoreError, StoreIndex};
|
pub use self::store::{Store, StoreConfig, StoreEntry, StoreError, StoreIndex};
|
||||||
|
#[cfg(not(any(test, feature = "ram_storage")))]
|
||||||
pub use self::syscall::SyscallStorage;
|
pub use self::syscall::SyscallStorage;
|
||||||
|
|||||||
@@ -163,9 +163,11 @@ mod bitfield;
|
|||||||
mod format;
|
mod format;
|
||||||
|
|
||||||
use self::format::{Format, IsReplace};
|
use self::format::{Format, IsReplace};
|
||||||
#[cfg(feature = "std")]
|
|
||||||
use super::BufferStorage;
|
|
||||||
use super::{Index, Storage};
|
use super::{Index, Storage};
|
||||||
|
#[cfg(any(test, feature = "ram_storage"))]
|
||||||
|
use crate::embedded_flash::BufferStorage;
|
||||||
|
#[cfg(any(test, feature = "ram_storage"))]
|
||||||
|
use alloc::boxed::Box;
|
||||||
use alloc::collections::BTreeMap;
|
use alloc::collections::BTreeMap;
|
||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
|
|
||||||
@@ -402,6 +404,7 @@ impl<S: Storage, C: StoreConfig> Store<S, C> {
|
|||||||
/// Computes the length in bytes that would be used in the storage if an insert operation is
|
/// Computes the length in bytes that would be used in the storage if an insert operation is
|
||||||
/// executed provided the data of the inserted entry has `length` bytes and whether this data is
|
/// executed provided the data of the inserted entry has `length` bytes and whether this data is
|
||||||
/// sensitive.
|
/// sensitive.
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn insert_len(&self, sensitive: bool, length: usize) -> usize {
|
pub fn insert_len(&self, sensitive: bool, length: usize) -> usize {
|
||||||
self.format.entry_size(IsReplace::Insert, sensitive, length)
|
self.format.entry_size(IsReplace::Insert, sensitive, length)
|
||||||
}
|
}
|
||||||
@@ -410,6 +413,7 @@ impl<S: Storage, C: StoreConfig> Store<S, C> {
|
|||||||
///
|
///
|
||||||
/// The value at index `page` of the result is the number of times page `page` was erased. This
|
/// The value at index `page` of the result is the number of times page `page` was erased. This
|
||||||
/// number is an underestimate in case power was lost when this page was erased.
|
/// number is an underestimate in case power was lost when this page was erased.
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn compaction_info(&self) -> Vec<usize> {
|
pub fn compaction_info(&self) -> Vec<usize> {
|
||||||
let mut info = Vec::with_capacity(self.format.num_pages);
|
let mut info = Vec::with_capacity(self.format.num_pages);
|
||||||
for page in 0..self.format.num_pages {
|
for page in 0..self.format.num_pages {
|
||||||
@@ -766,7 +770,7 @@ impl<S: Storage, C: StoreConfig> Store<S, C> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Those functions are not meant for production.
|
// Those functions are not meant for production.
|
||||||
#[cfg(feature = "std")]
|
#[cfg(any(test, feature = "ram_storage"))]
|
||||||
impl<C: StoreConfig> Store<BufferStorage, C> {
|
impl<C: StoreConfig> Store<BufferStorage, C> {
|
||||||
/// Takes a snapshot of the storage after a given amount of word operations.
|
/// Takes a snapshot of the storage after a given amount of word operations.
|
||||||
pub fn arm_snapshot(&mut self, delay: usize) {
|
pub fn arm_snapshot(&mut self, delay: usize) {
|
||||||
|
|||||||
@@ -16,8 +16,13 @@
|
|||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate alloc;
|
extern crate alloc;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate arrayref;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate cbor;
|
||||||
extern crate lang_items;
|
extern crate lang_items;
|
||||||
extern crate libtock_core;
|
extern crate libtock_core;
|
||||||
extern crate libtock_drivers;
|
extern crate libtock_drivers;
|
||||||
|
|
||||||
|
pub mod ctap;
|
||||||
pub mod embedded_flash;
|
pub mod embedded_flash;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ extern crate cbor;
|
|||||||
extern crate crypto;
|
extern crate crypto;
|
||||||
|
|
||||||
mod ctap;
|
mod ctap;
|
||||||
|
pub mod embedded_flash;
|
||||||
|
|
||||||
use core::cell::Cell;
|
use core::cell::Cell;
|
||||||
#[cfg(feature = "debug_ctap")]
|
#[cfg(feature = "debug_ctap")]
|
||||||
|
|||||||
7
third_party/lang-items/src/lib.rs
vendored
7
third_party/lang-items/src/lib.rs
vendored
@@ -7,3 +7,10 @@ mod allocator;
|
|||||||
mod panic_handler;
|
mod panic_handler;
|
||||||
#[cfg(not(feature = "std"))]
|
#[cfg(not(feature = "std"))]
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
#[no_mangle]
|
||||||
|
unsafe fn libtock_alloc_init(_app_heap_start: usize, _app_heap_size: usize) {
|
||||||
|
// Stub so that the symbol is present.
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|||||||
14
third_party/libtock-drivers/src/console.rs
vendored
14
third_party/libtock-drivers/src/console.rs
vendored
@@ -17,7 +17,7 @@ mod allow_nr {
|
|||||||
pub const SHARE_BUFFER: usize = 1;
|
pub const SHARE_BUFFER: usize = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const BUFFER_SIZE: usize = 1024;
|
pub const BUFFER_SIZE: usize = 1024;
|
||||||
|
|
||||||
pub struct Console {
|
pub struct Console {
|
||||||
allow_buffer: [u8; BUFFER_SIZE],
|
allow_buffer: [u8; BUFFER_SIZE],
|
||||||
@@ -70,11 +70,13 @@ impl Console {
|
|||||||
// Clear the buffer even in case of error, to avoid an infinite loop.
|
// Clear the buffer even in case of error, to avoid an infinite loop.
|
||||||
self.count_pending = 0;
|
self.count_pending = 0;
|
||||||
|
|
||||||
let result = syscalls::allow(
|
Console::write_unbuffered(&mut self.allow_buffer[..count]);
|
||||||
DRIVER_NUMBER,
|
}
|
||||||
allow_nr::SHARE_BUFFER,
|
|
||||||
&mut self.allow_buffer[..count],
|
pub fn write_unbuffered(buf: &mut [u8]) {
|
||||||
);
|
let count = buf.len();
|
||||||
|
|
||||||
|
let result = syscalls::allow(DRIVER_NUMBER, allow_nr::SHARE_BUFFER, buf);
|
||||||
if result.is_err() {
|
if result.is_err() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
2
third_party/tock
vendored
2
third_party/tock
vendored
Submodule third_party/tock updated: f1f9d717a4...c5b7a4f2c8
Reference in New Issue
Block a user