Merge pull request #150 from jmichelp/master

Update to a newer kernel version
This commit is contained in:
Jean-Michel Picod
2020-09-22 17:35:16 +02:00
committed by GitHub
12 changed files with 815 additions and 367 deletions

View File

@@ -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" }

View File

@@ -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" }

View File

@@ -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!(( let button = components::button::ButtonComponent::new(
board_kernel,
components::button_component_helper!(
nrf52840::gpio::GPIOPin,
(
&nrf52840::gpio::PORT[BUTTON_PIN], &nrf52840::gpio::PORT[BUTTON_PIN],
kernel::hil::gpio::ActivationMode::ActiveLow, kernel::hil::gpio::ActivationMode::ActiveLow,
kernel::hil::gpio::FloatingState::PullUp kernel::hil::gpio::FloatingState::PullUp
)), )
); ),
)
.finalize(components::button_component_buf!(nrf52840::gpio::GPIOPin));
let led = components::led::LedsComponent::new().finalize(components::led_component_helper!( 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,
); );
} }

View File

@@ -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] {

View File

@@ -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>>,
@@ -130,6 +137,9 @@ impl kernel::Platform for Platform {
f(self.nonvolatile_storage.map_or(None, |nv| Some(nv)))
} }
nrf52::nvmc::DRIVER_NUM => f(Some(self.nvmc)),
+ capsules::usb::usb_ctap::DRIVER_NUM => { impl kernel::Platform for Platform {
+ f(self.usb.map(|ctap| ctap as &dyn kernel::Driver)) @@ -115,6 +132,7 @@ impl kernel::Platform for Platform {
+ } 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)), 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,
+ manufacturer_string: 1,
+ product_string: 2,
+ serial_number_string: 3,
+ ..Default::default()
+ },
+ ConfigurationDescriptor {
+ // Must be non-zero, otherwise dmesg prints the following error:
+ // [...] usb 2-3: config 0 descriptor??
+ configuration_value: 1,
+ ..Default::default()
+ },
+ // Interface declared in the FIDO2 specification, section 8.1.8.1 + // Interface declared in the FIDO2 specification, section 8.1.8.1
+ InterfaceDescriptor { + InterfaceDescriptor {
+ interface_class: 0x03, // HID + interface_class: 0x03, // HID
+ interface_subclass: 0x00, + interface_subclass: 0x00,
+ interface_protocol: 0x00, + interface_protocol: 0x00,
+ ..Default::default() + ..InterfaceDescriptor::default()
+ }, + },
+ ENDPOINTS, + ];
+
+ 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,
+ product_string: 2,
+ serial_number_string: 3,
+ max_packet_size_ep0: max_ctrl_packet_size,
+ ..descriptors::DeviceDescriptor::default()
+ },
+ descriptors::ConfigurationDescriptor {
+ configuration_value: 1,
+ ..descriptors::ConfigurationDescriptor::default()
+ },
+ interfaces,
+ endpoints,
+ Some(&HID),
+ None, // No CDC descriptor array
+ );
+
+ ClientCtapHID {
+ 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;

View File

@@ -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];

View File

@@ -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",

View File

@@ -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);
})

View 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.

View File

@@ -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
fd7febdc4497c59d3adeeba572effbd20d95cb7e58dc29619306f002c919495f 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
4f4a5428fb06548ad2cf16f050bde37c9af5fac4629141455064fdb7f96dfbd9 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
4367026ef48c8109f0635d5e635ec5999f0a1f2e0af9c5f35e51969ebd3fd3c0 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
009f4e60074ad1dc6d0aacbeb7e78fa7b6de9e39fa79a6aaad33105389f8ed02 target/nrf52840_mdk_dfu_merged.hex 1dbc1c8aacfc2e996e8b318b0ef8f64db385e1b887f092ed6cff4d5425542836 target/nrf52840_mdk_dfu_merged.hex
09b7ff9a4d44cd675c4ee581d43713addb5f3931ea9e7c8d71d448e0539f7070 target/tab/ctap2.tab 09b7ff9a4d44cd675c4ee581d43713addb5f3931ea9e7c8d71d448e0539f7070 target/tab/ctap2.tab

View File

@@ -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
b0711a92223dfd2b3801caf38b2f004a4e18fa2dbd1ca8d5ec60b7b7b0720a8e 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
2af04acdc8705f9a06535dee1fdbedc6e39d1e59e88ced9acc2fd3e2b585c29b 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
0b9591842b56e5c9a1c4a9160681d023a11135593373c483f383c39142be9a8f 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
43393a780ed9fe89cfb000a153a6e8af3735e75c5ccc0b34795381a4914973e2 target/nrf52840_mdk_dfu_merged.hex 93e23a8e9964bf22794c2f453738af68ae348456fdd898cddfe8e2b3ada8bf79 target/nrf52840_mdk_dfu_merged.hex
0fe175c3cf5a77a9f6df8f5aa3f82715986536e2f737aee44cb680a1e801dac4 target/tab/ctap2.tab 0fe175c3cf5a77a9f6df8f5aa3f82715986536e2f737aee44cb680a1e801dac4 target/tab/ctap2.tab