diff --git a/.cargo/config b/.cargo/config index 8292c1c0..e49a7dea 100644 --- a/.cargo/config +++ b/.cargo/config @@ -11,5 +11,6 @@ rtv7em = "rthumbv7em" rustflags = [ "-C", "relocation-model=static", "-C", "link-arg=-Tlayout.ld", + "--emit=llvm-ir", ] runner = "./tools/flash.sh" diff --git a/examples/adc.rs b/examples/adc.rs index c0a6da73..65a6af5c 100644 --- a/examples/adc.rs +++ b/examples/adc.rs @@ -1,8 +1,8 @@ #![no_std] +use libtock::alarm::Duration; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -11,7 +11,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let adc_driver = drivers.adc.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/blink.rs b/examples/blink.rs index c923c16f..d7cf26bb 100644 --- a/examples/blink.rs +++ b/examples/blink.rs @@ -1,7 +1,7 @@ #![no_std] +use libtock::alarm::Duration; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x400} @@ -9,8 +9,8 @@ libtock_core::stack_size! {0x400} async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; - let leds_driver = drivers.leds.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let leds_driver = drivers.led.init_driver()?; + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; // Blink the LEDs in a binary count pattern and scale diff --git a/examples/blink_random.rs b/examples/blink_random.rs index 1e108148..4c411fd9 100644 --- a/examples/blink_random.rs +++ b/examples/blink_random.rs @@ -1,8 +1,8 @@ #![no_std] +use libtock::alarm::Duration; use libtock::leds::LedsDriver; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x400} @@ -11,7 +11,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let leds_driver = drivers.leds.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; // blink_nibble assumes 4 leds. diff --git a/examples/button_read.rs b/examples/button_read.rs index 38a822b0..1ca18513 100644 --- a/examples/button_read.rs +++ b/examples/button_read.rs @@ -1,8 +1,8 @@ #![no_std] +use libtock::alarm::Duration; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -11,7 +11,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let buttons_driver = drivers.buttons.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/button_subscribe.rs b/examples/button_subscribe.rs index 34b7d8d8..3a575eac 100644 --- a/examples/button_subscribe.rs +++ b/examples/button_subscribe.rs @@ -1,10 +1,10 @@ #![no_std] use core::cell::Cell; +use libtock::alarm::Duration; use libtock::buttons::ButtonState; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -13,7 +13,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let buttons_driver = drivers.buttons.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/gpio.rs b/examples/gpio.rs index 4d61d5a1..f2524b6b 100644 --- a/examples/gpio.rs +++ b/examples/gpio.rs @@ -1,7 +1,7 @@ #![no_std] +use libtock::alarm::Duration; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -11,7 +11,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let mut gpio_driver = drivers.gpio.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; let mut gpio = gpio_driver.gpios().next().unwrap(); diff --git a/examples/gpio_read.rs b/examples/gpio_read.rs index 1bd13883..6c8fb1b6 100644 --- a/examples/gpio_read.rs +++ b/examples/gpio_read.rs @@ -1,9 +1,9 @@ #![no_std] +use libtock::alarm::Duration; use libtock::gpio::ResistorMode; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -13,7 +13,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let mut gpio_driver = drivers.gpio.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/ninedof.rs b/examples/ninedof.rs index ec0724c9..4fe7a251 100644 --- a/examples/ninedof.rs +++ b/examples/ninedof.rs @@ -1,8 +1,8 @@ #![no_std] +use libtock::alarm::Duration; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -10,7 +10,7 @@ libtock_core::stack_size! {0x800} async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/sensors.rs b/examples/sensors.rs index 5dce6985..698eb610 100644 --- a/examples/sensors.rs +++ b/examples/sensors.rs @@ -1,9 +1,9 @@ #![no_std] +use libtock::alarm::Duration; use libtock::println; use libtock::result::TockResult; use libtock::sensors::Sensor; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -11,7 +11,7 @@ libtock_core::stack_size! {0x800} async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/seven_segment.rs b/examples/seven_segment.rs index 7befeb5d..c5d5fdbb 100644 --- a/examples/seven_segment.rs +++ b/examples/seven_segment.rs @@ -1,8 +1,8 @@ #![no_std] +use libtock::alarm::Duration; use libtock::electronics::ShiftRegister; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -37,7 +37,7 @@ async fn main() -> TockResult<()> { let gpio2 = gpio2.enable_output()?; let mut shift_register = ShiftRegister::new(&gpio0, &gpio1, &gpio2); - let mut driver = drivers.timer.create_timer_driver(); + let mut driver = drivers.alarm.create_timer_driver(); let timer_driver = driver.activate()?; let mut i = 0; diff --git a/examples/temperature.rs b/examples/temperature.rs index 5e46f905..85ea30f2 100644 --- a/examples/temperature.rs +++ b/examples/temperature.rs @@ -1,8 +1,8 @@ #![no_std] +use libtock::alarm::Duration; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -11,7 +11,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let mut temperature_driver = drivers.temperature.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; drivers.console.create_console(); diff --git a/examples/timer.rs b/examples/timer.rs index d8f5b1d1..1dec47bf 100644 --- a/examples/timer.rs +++ b/examples/timer.rs @@ -1,12 +1,12 @@ #![no_std] +use libtock::alarm::DriverContext; +use libtock::alarm::Duration; use libtock::println; /** * This example shows a repeated timer combined with reading and displaying the current time in * clock ticks. **/ use libtock::result::TockResult; -use libtock::timer::DriverContext; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -21,8 +21,8 @@ async fn main() -> TockResult<()> { let mut previous_ticks = None; for i in 0.. { - print_now(&mut drivers.timer, &mut previous_ticks, i)?; - let mut timer_driver = drivers.timer.create_timer_driver(); + print_now(&mut drivers.alarm, &mut previous_ticks, i)?; + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; timer_driver.sleep(Duration::from_ms(DELAY_MS)).await?; diff --git a/examples/timer_parallel.rs b/examples/timer_parallel.rs index f2fc7869..8752cfdd 100644 --- a/examples/timer_parallel.rs +++ b/examples/timer_parallel.rs @@ -1,10 +1,10 @@ #![no_std] use futures::future; +use libtock::alarm::Duration; +use libtock::alarm::ParallelSleepDriver; use libtock::leds::Led; use libtock::result::TockResult; -use libtock::timer::Duration; -use libtock::timer::ParallelSleepDriver; libtock_core::stack_size! {0x800} @@ -25,7 +25,7 @@ async fn main() -> TockResult<()> { let mut drivers = libtock::retrieve_drivers()?; let leds_driver = drivers.leds.init_driver()?; - let mut timer_driver = drivers.timer.create_timer_driver(); + let mut timer_driver = drivers.alarm.create_timer_driver(); let timer_driver = timer_driver.activate()?; let mut leds = leds_driver.leds(); diff --git a/examples/timer_subscribe.rs b/examples/timer_subscribe.rs index f021345b..62d59991 100644 --- a/examples/timer_subscribe.rs +++ b/examples/timer_subscribe.rs @@ -1,9 +1,9 @@ #![no_std] use futures::future; +use libtock::alarm::Duration; use libtock::println; use libtock::result::TockResult; -use libtock::timer::Duration; libtock_core::stack_size! {0x800} @@ -13,7 +13,7 @@ async fn main() -> TockResult<()> { drivers.console.create_console(); - let mut with_callback = drivers.timer.with_callback(|_, _| { + let mut with_callback = drivers.alarm.with_callback(|_, _| { println!("This line is printed 2 seconds after the start of the program."); }); diff --git a/src/timer.rs b/src/alarm.rs similarity index 100% rename from src/timer.rs rename to src/alarm.rs diff --git a/src/drivers.rs b/src/drivers.rs index 86046916..4eb7d21b 100644 --- a/src/drivers.rs +++ b/src/drivers.rs @@ -1,4 +1,5 @@ use crate::adc::AdcDriverFactory; +use crate::alarm::DriverContext; use crate::buttons::ButtonsDriverFactory; use crate::console::ConsoleDriver; use crate::ctap::CtapDriverFactory; @@ -6,7 +7,7 @@ use crate::gpio::GpioDriverFactory; use crate::hmac::HmacDriverFactory; use crate::i2c_master::I2cDriverFactory; use crate::i2c_master_slave::I2cMSDriverFactory; -use crate::leds::LedsDriverFactory; +use crate::led::LedsDriverFactory; use crate::result::OtherError; use crate::result::TockError; use crate::rng::RngDriver; @@ -17,7 +18,6 @@ use crate::sensors::TemperatureSensor; use crate::simple_ble::BleAdvertisingDriverFactory; use crate::simple_ble::BleScanningDriverFactory; use crate::temperature::TemperatureDriverFactory; -use crate::timer::DriverContext; use core::cell::Cell; /// Struct containing all drivers constructible through [retrieve_drivers()] @@ -25,8 +25,8 @@ use core::cell::Cell; pub struct Drivers { pub console: ConsoleDriver, pub ctap: CtapDriverFactory, - pub leds: LedsDriverFactory, - pub timer: DriverContext, + pub led: LedsDriverFactory, + pub alarm: DriverContext, pub gpio: GpioDriverFactory, pub hmac: HmacDriverFactory, pub temperature: TemperatureDriverFactory, @@ -75,8 +75,8 @@ const DRIVERS: Drivers = Drivers { buttons: ButtonsDriverFactory, console: ConsoleDriver, ctap: CtapDriverFactory, - leds: LedsDriverFactory, - timer: DriverContext { + led: LedsDriverFactory, + alarm: DriverContext { active_timer: Cell::new(None), }, gpio: GpioDriverFactory, diff --git a/src/leds.rs b/src/led.rs similarity index 100% rename from src/leds.rs rename to src/led.rs diff --git a/src/lib.rs b/src/lib.rs index 6f5be5a0..b9149580 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ #![cfg_attr(not(test), no_std)] pub mod adc; +pub mod alarm; pub mod ble_composer; pub mod ble_parser; pub mod buttons; @@ -15,13 +16,12 @@ pub mod gpio; pub mod hmac; pub mod i2c_master; pub mod i2c_master_slave; -pub mod leds; +pub mod led; pub mod result; pub mod rng; pub mod sensors; pub mod simple_ble; pub mod temperature; -pub mod timer; pub use drivers::retrieve_drivers; pub use libtock_codegen::main; diff --git a/tools/flash.sh b/tools/flash.sh index 48bf4866..4067f4f2 100755 --- a/tools/flash.sh +++ b/tools/flash.sh @@ -1,6 +1,45 @@ #!/usr/bin/env bash -set -eux +set -eu + +get_drivers() { + # List all of the drivers in the IR output + driver_output=$(cat ${rust_target_folder}/release/examples/${artifact}*.ll | grep "^%\"libtock::") + # Remove all of the parts we don't need to get a nice list + used_drivers=$(echo "${driver_output}" | cut -d ":" -f 3 | sort -u) + + for driver in ${used_drivers}; do + # Get the full official kernel name + cat tock/capsules/src/driver.rs | grep -i ${driver} | tr -s ' ' | cut -d ' ' -f 2 + done +} + +get_driver_numbers_and_perms() { + # Lookup in the kernel what driver number is used (in hex). + driver_nums=$(for driver in ${1}; do + cat tock/capsules/src/driver.rs | grep -i ${driver} | tr -s ' ' | cut -d ' ' -f 4 | cut -d , -f 1 | cut -d x -f 2 + done) + + for driver in ${driver_nums}; do + # Convert the number to a decimal value + driver_base_ten=$(echo "obase=10; ibase=16; ${driver}" | bc) + + # We now know the driver. + # We don't have an easy way to figure out what commands we are using. + # So instead we just allow all of them by default. + + # Get a list of all commands in libtock-s + name=$(cat tock/capsules/src/driver.rs | grep ${driver} | tr -s ' ' | cut -d ' ' -f 2) + lower_name=$(echo "$name" | awk '{print tolower($0)}') + + # Get all of the command numbers + command_nums=$(sed -n '/mod command_nr {/,/}/p' src/${lower_name}.rs | grep usize | tr -s ' ' | cut -d ' ' -f 7 | cut -d ';' -f 1) + + for num in ${command_nums}; do + echo ${driver_base_ten},${num} + done + done +} artifact="$(basename $1)" rust_target_folder="$(cd $(dirname $1)/../.. && pwd -P)" @@ -70,7 +109,16 @@ cp "$1" "${elf_file_name}" STACK_SIZE=$(nm --print-size --size-sort --radix=d "${elf_file_name}" | grep STACK_MEMORY | cut -d " " -f 2) -elf2tab -n "${artifact}" -o "${tab_file_name}" "${elf_file_name}" --stack ${STACK_SIZE} --app-heap $APP_HEAP_SIZE --kernel-heap $KERNEL_HEAP_SIZE --protected-region-size=64 +drivers=$(get_drivers) + +echo "This app uses the following drivers" +echo ${drivers} + +perms=$(get_driver_numbers_and_perms "${drivers}") + +elf2tab -n "${artifact}" -o "${tab_file_name}" "${elf_file_name}" \ + --stack ${STACK_SIZE} --app-heap $APP_HEAP_SIZE --kernel-heap $KERNEL_HEAP_SIZE \ + --protected-region-size=64 --permissions ${perms} --verbose if [ $tockload == "n" ]; then echo "Skipping flashing for platform \"${PLATFORM}\""