#![no_std]
#![deny(missing_docs)]
use core::ptr::addr_of;
use capsules_core::virtualizers::virtual_alarm::{MuxAlarm, VirtualMuxAlarm};
use capsules_extra::net::ieee802154::MacAddress;
use capsules_extra::net::ipv6::ip_utils::IPAddr;
use kernel::component::Component;
use kernel::hil::led::LedLow;
use kernel::hil::time::Counter;
#[allow(unused_imports)]
use kernel::hil::usb::Client;
use kernel::platform::{KernelResources, SyscallDriverLookup};
use kernel::scheduler::round_robin::RoundRobinSched;
#[allow(unused_imports)]
use kernel::{capabilities, create_capability, debug, debug_gpio, debug_verbose, static_init};
use nrf52840::gpio::Pin;
use nrf52840::interrupt_service::Nrf52840DefaultPeripherals;
use nrf52_components::{UartChannel, UartPins};
const LED1_PIN: Pin = Pin::P0_13;
const LED2_PIN: Pin = Pin::P0_14;
const LED3_PIN: Pin = Pin::P0_15;
const LED4_PIN: Pin = Pin::P0_16;
const BUTTON1_PIN: Pin = Pin::P0_11;
const BUTTON2_PIN: Pin = Pin::P0_12;
const BUTTON3_PIN: Pin = Pin::P0_24;
const BUTTON4_PIN: Pin = Pin::P0_25;
const BUTTON_RST_PIN: Pin = Pin::P0_18;
const UART_RTS: Option<Pin> = Some(Pin::P0_05);
const UART_TXD: Pin = Pin::P0_06;
const UART_CTS: Option<Pin> = Some(Pin::P0_07);
const UART_RXD: Pin = Pin::P0_08;
const SPI_MOSI: Pin = Pin::P0_20;
const SPI_MISO: Pin = Pin::P0_21;
const SPI_CLK: Pin = Pin::P0_19;
const SPI_CS: Pin = Pin::P0_22;
const SPI_MX25R6435F_CHIP_SELECT: Pin = Pin::P0_17;
const SPI_MX25R6435F_WRITE_PROTECT_PIN: Pin = Pin::P0_22;
const SPI_MX25R6435F_HOLD_PIN: Pin = Pin::P0_23;
const I2C_SDA_PIN: Pin = Pin::P0_26;
const I2C_SCL_PIN: Pin = Pin::P0_27;
const PAN_ID: u16 = 0xABCD;
const DST_MAC_ADDR: capsules_extra::net::ieee802154::MacAddress =
capsules_extra::net::ieee802154::MacAddress::Short(49138);
const DEFAULT_CTX_PREFIX_LEN: u8 = 8; const DEFAULT_CTX_PREFIX: [u8; 16] = [0x0_u8; 16]; pub mod io;
const USB_DEBUGGING: bool = false;
pub type Chip = nrf52840::chip::NRF52<'static, Nrf52840DefaultPeripherals<'static>>;
pub const NUM_PROCS: usize = 8;
pub static mut PROCESSES: [Option<&'static dyn kernel::process::Process>; NUM_PROCS] =
[None; NUM_PROCS];
static mut CHIP: Option<&'static nrf52840::chip::NRF52<Nrf52840DefaultPeripherals>> = None;
static mut PROCESS_PRINTER: Option<&'static capsules_system::process_printer::ProcessPrinterText> =
None;
#[no_mangle]
#[link_section = ".stack_buffer"]
pub static mut STACK_MEMORY: [u8; 0x2000] = [0; 0x2000];
type AlarmDriver = components::alarm::AlarmDriverComponentType<nrf52840::rtc::Rtc<'static>>;
type RngDriver = components::rng::RngComponentType<nrf52840::trng::Trng<'static>>;
type Mx25r6435f = components::mx25r6435f::Mx25r6435fComponentType<
nrf52840::spi::SPIM<'static>,
nrf52840::gpio::GPIOPin<'static>,
nrf52840::rtc::Rtc<'static>,
>;
const TICKV_PAGE_SIZE: usize =
core::mem::size_of::<<Mx25r6435f as kernel::hil::flash::Flash>::Page>();
type Siphasher24 = components::siphash::Siphasher24ComponentType;
type TicKVDedicatedFlash =
components::tickv::TicKVDedicatedFlashComponentType<Mx25r6435f, Siphasher24, TICKV_PAGE_SIZE>;
type TicKVKVStore = components::kv::TicKVKVStoreComponentType<
TicKVDedicatedFlash,
capsules_extra::tickv::TicKVKeyType,
>;
type KVStorePermissions = components::kv::KVStorePermissionsComponentType<TicKVKVStore>;
type VirtualKVPermissions = components::kv::VirtualKVPermissionsComponentType<KVStorePermissions>;
type KVDriver = components::kv::KVDriverComponentType<VirtualKVPermissions>;
type TemperatureDriver =
components::temperature::TemperatureComponentType<nrf52840::temperature::Temp<'static>>;
type Ieee802154MacDevice = components::ieee802154::Ieee802154ComponentMacDeviceType<
nrf52840::ieee802154_radio::Radio<'static>,
nrf52840::aes::AesECB<'static>,
>;
pub type Ieee802154Driver = components::ieee802154::Ieee802154ComponentType<
nrf52840::ieee802154_radio::Radio<'static>,
nrf52840::aes::AesECB<'static>,
>;
pub type Eui64Driver = components::eui64::Eui64ComponentType;
pub struct Platform {
ble_radio: &'static capsules_extra::ble_advertising_driver::BLE<
'static,
nrf52840::ble_radio::Radio<'static>,
VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
>,
button: &'static capsules_core::button::Button<'static, nrf52840::gpio::GPIOPin<'static>>,
pconsole: &'static capsules_core::process_console::ProcessConsole<
'static,
{ capsules_core::process_console::DEFAULT_COMMAND_HISTORY_LEN },
VirtualMuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
components::process_console::Capability,
>,
console: &'static capsules_core::console::Console<'static>,
gpio: &'static capsules_core::gpio::GPIO<'static, nrf52840::gpio::GPIOPin<'static>>,
led: &'static capsules_core::led::LedDriver<
'static,
kernel::hil::led::LedLow<'static, nrf52840::gpio::GPIOPin<'static>>,
4,
>,
rng: &'static RngDriver,
adc: &'static capsules_core::adc::AdcDedicated<'static, nrf52840::adc::Adc<'static>>,
temp: &'static TemperatureDriver,
pub ipc: kernel::ipc::IPC<{ NUM_PROCS as u8 }>,
analog_comparator: &'static capsules_extra::analog_comparator::AnalogComparator<
'static,
nrf52840::acomp::Comparator<'static>,
>,
alarm: &'static AlarmDriver,
i2c_master_slave: &'static capsules_core::i2c_master_slave_driver::I2CMasterSlaveDriver<
'static,
nrf52840::i2c::TWI<'static>,
>,
spi_controller: &'static capsules_core::spi_controller::Spi<
'static,
capsules_core::virtualizers::virtual_spi::VirtualSpiMasterDevice<
'static,
nrf52840::spi::SPIM<'static>,
>,
>,
kv_driver: &'static KVDriver,
scheduler: &'static RoundRobinSched<'static>,
systick: cortexm4::systick::SysTick,
}
impl SyscallDriverLookup for Platform {
fn with_driver<F, R>(&self, driver_num: usize, f: F) -> R
where
F: FnOnce(Option<&dyn kernel::syscall::SyscallDriver>) -> R,
{
match driver_num {
capsules_core::console::DRIVER_NUM => f(Some(self.console)),
capsules_core::gpio::DRIVER_NUM => f(Some(self.gpio)),
capsules_core::alarm::DRIVER_NUM => f(Some(self.alarm)),
capsules_core::led::DRIVER_NUM => f(Some(self.led)),
capsules_core::button::DRIVER_NUM => f(Some(self.button)),
capsules_core::rng::DRIVER_NUM => f(Some(self.rng)),
capsules_core::adc::DRIVER_NUM => f(Some(self.adc)),
capsules_extra::ble_advertising_driver::DRIVER_NUM => f(Some(self.ble_radio)),
capsules_extra::temperature::DRIVER_NUM => f(Some(self.temp)),
capsules_extra::analog_comparator::DRIVER_NUM => f(Some(self.analog_comparator)),
kernel::ipc::DRIVER_NUM => f(Some(&self.ipc)),
capsules_core::i2c_master_slave_driver::DRIVER_NUM => f(Some(self.i2c_master_slave)),
capsules_core::spi_controller::DRIVER_NUM => f(Some(self.spi_controller)),
capsules_extra::kv_driver::DRIVER_NUM => f(Some(self.kv_driver)),
_ => f(None),
}
}
}
impl KernelResources<Chip> for Platform {
type SyscallDriverLookup = Self;
type SyscallFilter = ();
type ProcessFault = ();
type Scheduler = RoundRobinSched<'static>;
type SchedulerTimer = cortexm4::systick::SysTick;
type WatchDog = ();
type ContextSwitchCallback = ();
fn syscall_driver_lookup(&self) -> &Self::SyscallDriverLookup {
self
}
fn syscall_filter(&self) -> &Self::SyscallFilter {
&()
}
fn process_fault(&self) -> &Self::ProcessFault {
&()
}
fn scheduler(&self) -> &Self::Scheduler {
self.scheduler
}
fn scheduler_timer(&self) -> &Self::SchedulerTimer {
&self.systick
}
fn watchdog(&self) -> &Self::WatchDog {
&()
}
fn context_switch_callback(&self) -> &Self::ContextSwitchCallback {
&()
}
}
pub unsafe fn ieee802154_udp(
board_kernel: &'static kernel::Kernel,
nrf52840_peripherals: &'static Nrf52840DefaultPeripherals<'static>,
mux_alarm: &'static MuxAlarm<nrf52840::rtc::Rtc>,
) -> (
&'static Eui64Driver,
&'static Ieee802154Driver,
&'static capsules_extra::net::udp::UDPDriver<'static>,
) {
let aes_mux =
components::ieee802154::MuxAes128ccmComponent::new(&nrf52840_peripherals.nrf52.ecb)
.finalize(components::mux_aes128ccm_component_static!(
nrf52840::aes::AesECB
));
let device_id = (*addr_of!(nrf52840::ficr::FICR_INSTANCE)).id();
let device_id_bottom_16: u16 = u16::from_le_bytes([device_id[0], device_id[1]]);
let eui64_driver = components::eui64::Eui64Component::new(u64::from_le_bytes(device_id))
.finalize(components::eui64_component_static!());
let (ieee802154_driver, mux_mac) = components::ieee802154::Ieee802154Component::new(
board_kernel,
capsules_extra::ieee802154::DRIVER_NUM,
&nrf52840_peripherals.ieee802154_radio,
aes_mux,
PAN_ID,
device_id_bottom_16,
device_id,
)
.finalize(components::ieee802154_component_static!(
nrf52840::ieee802154_radio::Radio,
nrf52840::aes::AesECB<'static>
));
let local_ip_ifaces = static_init!(
[IPAddr; 3],
[
IPAddr::generate_from_mac(capsules_extra::net::ieee802154::MacAddress::Long(device_id)),
IPAddr([
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
0x1e, 0x1f,
]),
IPAddr::generate_from_mac(capsules_extra::net::ieee802154::MacAddress::Short(
device_id_bottom_16
)),
]
);
let (udp_send_mux, udp_recv_mux, udp_port_table) = components::udp_mux::UDPMuxComponent::new(
mux_mac,
DEFAULT_CTX_PREFIX_LEN,
DEFAULT_CTX_PREFIX,
DST_MAC_ADDR,
MacAddress::Long(device_id),
local_ip_ifaces,
mux_alarm,
)
.finalize(components::udp_mux_component_static!(
nrf52840::rtc::Rtc,
Ieee802154MacDevice
));
let udp_driver = components::udp_driver::UDPDriverComponent::new(
board_kernel,
capsules_extra::net::udp::driver::DRIVER_NUM,
udp_send_mux,
udp_recv_mux,
udp_port_table,
local_ip_ifaces,
)
.finalize(components::udp_driver_component_static!(nrf52840::rtc::Rtc));
(eui64_driver, ieee802154_driver, udp_driver)
}
#[inline(never)]
pub unsafe fn start() -> (
&'static kernel::Kernel,
Platform,
&'static Chip,
&'static Nrf52840DefaultPeripherals<'static>,
&'static MuxAlarm<'static, nrf52840::rtc::Rtc<'static>>,
) {
nrf52840::init();
let ieee802154_ack_buf = static_init!(
[u8; nrf52840::ieee802154_radio::ACK_BUF_SIZE],
[0; nrf52840::ieee802154_radio::ACK_BUF_SIZE]
);
let nrf52840_peripherals = static_init!(
Nrf52840DefaultPeripherals,
Nrf52840DefaultPeripherals::new(ieee802154_ack_buf)
);
nrf52840_peripherals.init();
let base_peripherals = &nrf52840_peripherals.nrf52;
kernel::debug::assign_gpios(
Some(&nrf52840_peripherals.gpio_port[LED1_PIN]),
Some(&nrf52840_peripherals.gpio_port[LED2_PIN]),
Some(&nrf52840_peripherals.gpio_port[LED3_PIN]),
);
let uart_channel = if USB_DEBUGGING {
let mut rtt_memory_refs = components::segger_rtt::SeggerRttMemoryComponent::new()
.finalize(components::segger_rtt_memory_component_static!());
self::io::set_rtt_memory(&*rtt_memory_refs.get_rtt_memory_ptr());
UartChannel::Rtt(rtt_memory_refs)
} else {
UartChannel::Pins(UartPins::new(UART_RTS, UART_TXD, UART_CTS, UART_RXD))
};
let board_kernel = static_init!(kernel::Kernel, kernel::Kernel::new(&*addr_of!(PROCESSES)));
let chip = static_init!(Chip, nrf52840::chip::NRF52::new(nrf52840_peripherals));
CHIP = Some(chip);
nrf52_components::startup::NrfStartupComponent::new(
false,
BUTTON_RST_PIN,
nrf52840::uicr::Regulator0Output::DEFAULT,
&base_peripherals.nvmc,
)
.finalize(());
let memory_allocation_capability = create_capability!(capabilities::MemoryAllocationCapability);
let gpio_port = &nrf52840_peripherals.gpio_port;
let gpio = components::gpio::GpioComponent::new(
board_kernel,
capsules_core::gpio::DRIVER_NUM,
components::gpio_component_helper!(
nrf52840::gpio::GPIOPin,
0 => &nrf52840_peripherals.gpio_port[Pin::P1_01],
1 => &nrf52840_peripherals.gpio_port[Pin::P1_02],
2 => &nrf52840_peripherals.gpio_port[Pin::P1_03],
3 => &nrf52840_peripherals.gpio_port[Pin::P1_04],
4 => &nrf52840_peripherals.gpio_port[Pin::P1_05],
5 => &nrf52840_peripherals.gpio_port[Pin::P1_06],
6 => &nrf52840_peripherals.gpio_port[Pin::P1_07],
7 => &nrf52840_peripherals.gpio_port[Pin::P1_08],
10 => &nrf52840_peripherals.gpio_port[Pin::P1_12],
11 => &nrf52840_peripherals.gpio_port[Pin::P1_13],
12 => &nrf52840_peripherals.gpio_port[Pin::P1_14],
13 => &nrf52840_peripherals.gpio_port[Pin::P1_15],
),
)
.finalize(components::gpio_component_static!(nrf52840::gpio::GPIOPin));
let button = components::button::ButtonComponent::new(
board_kernel,
capsules_core::button::DRIVER_NUM,
components::button_component_helper!(
nrf52840::gpio::GPIOPin,
(
&nrf52840_peripherals.gpio_port[BUTTON1_PIN],
kernel::hil::gpio::ActivationMode::ActiveLow,
kernel::hil::gpio::FloatingState::PullUp
),
(
&nrf52840_peripherals.gpio_port[BUTTON2_PIN],
kernel::hil::gpio::ActivationMode::ActiveLow,
kernel::hil::gpio::FloatingState::PullUp
),
(
&nrf52840_peripherals.gpio_port[BUTTON3_PIN],
kernel::hil::gpio::ActivationMode::ActiveLow,
kernel::hil::gpio::FloatingState::PullUp
),
(
&nrf52840_peripherals.gpio_port[BUTTON4_PIN],
kernel::hil::gpio::ActivationMode::ActiveLow,
kernel::hil::gpio::FloatingState::PullUp
)
),
)
.finalize(components::button_component_static!(
nrf52840::gpio::GPIOPin
));
let led = components::led::LedsComponent::new().finalize(components::led_component_static!(
LedLow<'static, nrf52840::gpio::GPIOPin>,
LedLow::new(&nrf52840_peripherals.gpio_port[LED1_PIN]),
LedLow::new(&nrf52840_peripherals.gpio_port[LED2_PIN]),
LedLow::new(&nrf52840_peripherals.gpio_port[LED3_PIN]),
LedLow::new(&nrf52840_peripherals.gpio_port[LED4_PIN]),
));
let rtc = &base_peripherals.rtc;
let _ = rtc.start();
let mux_alarm = components::alarm::AlarmMuxComponent::new(rtc)
.finalize(components::alarm_mux_component_static!(nrf52840::rtc::Rtc));
let alarm = components::alarm::AlarmDriverComponent::new(
board_kernel,
capsules_core::alarm::DRIVER_NUM,
mux_alarm,
)
.finalize(components::alarm_component_static!(nrf52840::rtc::Rtc));
let uart_channel = nrf52_components::UartChannelComponent::new(
uart_channel,
mux_alarm,
&base_peripherals.uarte0,
)
.finalize(nrf52_components::uart_channel_component_static!(
nrf52840::rtc::Rtc
));
let process_printer = components::process_printer::ProcessPrinterTextComponent::new()
.finalize(components::process_printer_text_component_static!());
PROCESS_PRINTER = Some(process_printer);
let uart_mux = components::console::UartMuxComponent::new(uart_channel, 115200)
.finalize(components::uart_mux_component_static!());
let pconsole = components::process_console::ProcessConsoleComponent::new(
board_kernel,
uart_mux,
mux_alarm,
process_printer,
Some(cortexm4::support::reset),
)
.finalize(components::process_console_component_static!(
nrf52840::rtc::Rtc<'static>
));
let console = components::console::ConsoleComponent::new(
board_kernel,
capsules_core::console::DRIVER_NUM,
uart_mux,
)
.finalize(components::console_component_static!());
components::debug_writer::DebugWriterComponent::new(uart_mux)
.finalize(components::debug_writer_component_static!());
let ble_radio = components::ble::BLEComponent::new(
board_kernel,
capsules_extra::ble_advertising_driver::DRIVER_NUM,
&base_peripherals.ble_radio,
mux_alarm,
)
.finalize(components::ble_component_static!(
nrf52840::rtc::Rtc,
nrf52840::ble_radio::Radio
));
let temp = components::temperature::TemperatureComponent::new(
board_kernel,
capsules_extra::temperature::DRIVER_NUM,
&base_peripherals.temp,
)
.finalize(components::temperature_component_static!(
nrf52840::temperature::Temp
));
let rng = components::rng::RngComponent::new(
board_kernel,
capsules_core::rng::DRIVER_NUM,
&base_peripherals.trng,
)
.finalize(components::rng_component_static!(nrf52840::trng::Trng));
let adc_channels = static_init!(
[nrf52840::adc::AdcChannelSetup; 6],
[
nrf52840::adc::AdcChannelSetup::new(nrf52840::adc::AdcChannel::AnalogInput1),
nrf52840::adc::AdcChannelSetup::new(nrf52840::adc::AdcChannel::AnalogInput2),
nrf52840::adc::AdcChannelSetup::new(nrf52840::adc::AdcChannel::AnalogInput4),
nrf52840::adc::AdcChannelSetup::new(nrf52840::adc::AdcChannel::AnalogInput5),
nrf52840::adc::AdcChannelSetup::new(nrf52840::adc::AdcChannel::AnalogInput6),
nrf52840::adc::AdcChannelSetup::new(nrf52840::adc::AdcChannel::AnalogInput7),
]
);
let adc = components::adc::AdcDedicatedComponent::new(
&base_peripherals.adc,
adc_channels,
board_kernel,
capsules_core::adc::DRIVER_NUM,
)
.finalize(components::adc_dedicated_component_static!(
nrf52840::adc::Adc
));
let mux_spi = components::spi::SpiMuxComponent::new(&base_peripherals.spim0)
.finalize(components::spi_mux_component_static!(nrf52840::spi::SPIM));
let spi_controller = components::spi::SpiSyscallComponent::new(
board_kernel,
mux_spi,
kernel::hil::spi::cs::IntoChipSelect::<_, kernel::hil::spi::cs::ActiveLow>::into_cs(
&gpio_port[SPI_CS],
),
capsules_core::spi_controller::DRIVER_NUM,
)
.finalize(components::spi_syscall_component_static!(
nrf52840::spi::SPIM
));
base_peripherals.spim0.configure(
nrf52840::pinmux::Pinmux::new(SPI_MOSI as u32),
nrf52840::pinmux::Pinmux::new(SPI_MISO as u32),
nrf52840::pinmux::Pinmux::new(SPI_CLK as u32),
);
let mx25r6435f = components::mx25r6435f::Mx25r6435fComponent::new(
Some(&gpio_port[SPI_MX25R6435F_WRITE_PROTECT_PIN]),
Some(&gpio_port[SPI_MX25R6435F_HOLD_PIN]),
&gpio_port[SPI_MX25R6435F_CHIP_SELECT],
mux_alarm,
mux_spi,
)
.finalize(components::mx25r6435f_component_static!(
nrf52840::spi::SPIM,
nrf52840::gpio::GPIOPin,
nrf52840::rtc::Rtc
));
let page_buffer = static_init!(
<Mx25r6435f as kernel::hil::flash::Flash>::Page,
<Mx25r6435f as kernel::hil::flash::Flash>::Page::default()
);
let sip_hash = components::siphash::Siphasher24Component::new()
.finalize(components::siphasher24_component_static!());
let tickv = components::tickv::TicKVDedicatedFlashComponent::new(
sip_hash,
mx25r6435f,
0, (capsules_extra::mx25r6435f::SECTOR_SIZE as usize) * 32, page_buffer,
)
.finalize(components::tickv_dedicated_flash_component_static!(
Mx25r6435f,
Siphasher24,
TICKV_PAGE_SIZE,
));
let tickv_kv_store = components::kv::TicKVKVStoreComponent::new(tickv).finalize(
components::tickv_kv_store_component_static!(
TicKVDedicatedFlash,
capsules_extra::tickv::TicKVKeyType,
),
);
let kv_store_permissions = components::kv::KVStorePermissionsComponent::new(tickv_kv_store)
.finalize(components::kv_store_permissions_component_static!(
TicKVKVStore
));
let mux_kv = components::kv::KVPermissionsMuxComponent::new(kv_store_permissions).finalize(
components::kv_permissions_mux_component_static!(KVStorePermissions),
);
let virtual_kv_driver = components::kv::VirtualKVPermissionsComponent::new(mux_kv).finalize(
components::virtual_kv_permissions_component_static!(KVStorePermissions),
);
let kv_driver = components::kv::KVDriverComponent::new(
virtual_kv_driver,
board_kernel,
capsules_extra::kv_driver::DRIVER_NUM,
)
.finalize(components::kv_driver_component_static!(
VirtualKVPermissions
));
let i2c_master_slave = components::i2c::I2CMasterSlaveDriverComponent::new(
board_kernel,
capsules_core::i2c_master_slave_driver::DRIVER_NUM,
&base_peripherals.twi1,
)
.finalize(components::i2c_master_slave_component_static!(
nrf52840::i2c::TWI
));
base_peripherals.twi1.configure(
nrf52840::pinmux::Pinmux::new(I2C_SCL_PIN as u32),
nrf52840::pinmux::Pinmux::new(I2C_SDA_PIN as u32),
);
base_peripherals.twi1.set_speed(nrf52840::i2c::Speed::K400);
let analog_comparator = components::analog_comparator::AnalogComparatorComponent::new(
&base_peripherals.acomp,
components::analog_comparator_component_helper!(
nrf52840::acomp::Channel,
&*addr_of!(nrf52840::acomp::CHANNEL_AC0)
),
board_kernel,
capsules_extra::analog_comparator::DRIVER_NUM,
)
.finalize(components::analog_comparator_component_static!(
nrf52840::acomp::Comparator
));
nrf52_components::NrfClockComponent::new(&base_peripherals.clock).finalize(());
let scheduler = components::sched::round_robin::RoundRobinComponent::new(&*addr_of!(PROCESSES))
.finalize(components::round_robin_component_static!(NUM_PROCS));
let platform = Platform {
button,
ble_radio,
pconsole,
console,
led,
gpio,
rng,
adc,
temp,
alarm,
analog_comparator,
ipc: kernel::ipc::IPC::new(
board_kernel,
kernel::ipc::DRIVER_NUM,
&memory_allocation_capability,
),
i2c_master_slave,
spi_controller,
kv_driver,
scheduler,
systick: cortexm4::systick::SysTick::new_with_calibration(64000000),
};
let _ = platform.pconsole.start();
base_peripherals.adc.calibrate();
debug!("Initialization complete. Entering main loop\r");
debug!("{}", &*addr_of!(nrf52840::ficr::FICR_INSTANCE));
(
board_kernel,
platform,
chip,
nrf52840_peripherals,
mux_alarm,
)
}