| [![Build Status](https://travis-ci.org/tock/libtock-rs.svg?branch=master)](https://travis-ci.org/tock/libtock-rs) |
| |
| # libtock-rs |
| |
| Rust userland library for Tock (WIP) |
| |
| Generally this library was tested with tock [Release 1.5](https://github.com/tock/tock/releases/tag/release-1.5). |
| Since then changes have been made that might not work with the Tock |
| release 1.5, but instead target Tock master. For example this library |
| might support newer boards (Apollo3), changed boards (HiFive1 revB) or |
| new drivers (HMAC). |
| |
| The library works in principle on most boards, but there is currently the [showstopper |
| bug #28](https://github.com/tock/libtock-rs/issues/28) that prevents |
| the generation of relocatable code. This means that all applications |
| must be installed at the flash address they are compiled with, which |
| usually means that they must be compiled especially for your board |
| and that there can only be one application written in rust at a time |
| and it must be installed as the first application on the board, unless |
| you want to play games with linker scripts. |
| There are some `boards/layout_*.ld` files provided that allow to run the |
| examples on common boards. |
| Due to MPU region alignment issues they may not work for applications |
| that use a lot of RAM, in that case you may have to change the SRAM |
| start address to fit your application. |
| |
| ## Getting Started |
| |
| This project is nascent and still under heavy development, but first steps: |
| |
| 1. Ensure you have [rustup](https://www.rustup.rs/) installed. |
| |
| 1. Clone the repository: |
| |
| ```shell |
| git clone --recursive https://github.com/tock/libtock-rs |
| cd libtock-rs |
| ``` |
| |
| 1. Install the dependencies: |
| |
| ```shell |
| make setup |
| ``` |
| |
| 1. Use `make` to build examples |
| |
| ```shell |
| make nrf52 # Builds all examples for the nrf52 platform |
| ``` |
| |
| ```bash |
| make opentitan # Builds all examples for the OpenTitan platform |
| ``` |
| |
| ```bash |
| make opentitan FEATURES=alloc # Builds all examples for the OpenTitan platform, with alloc feature enabled |
| ``` |
| |
| ```bash |
| make flash-hail EXAMPLE=blink # Flash the example 'blink' program to the hail platform |
| ``` |
| |
| For an unknown platform, you may have to create your own memory layout definition. Place the layout definition file at `boards/layout_<platform>.ld` and do not forget to enhance the `tockloader_flags` dispatching section in `tools/flash.sh`. You are welcome to create a PR, s.t. the number of supported platforms grows. |
| |
| ## Using libtock-rs |
| |
| The easiest way to start using libtock-rs is adding an example to the examples folder. |
| The boiler plate code you would write is |
| |
| ```rust |
| #![no_std] |
| |
| use libtock::result::TockResult; |
| |
| #[libtock::main] |
| async fn main() -> TockResult<()> { |
| // Your code |
| } |
| ``` |
| |
| If you want to use heap based allocation you will have to add |
| |
| ```rust |
| extern crate alloc; |
| ``` |
| |
| to the preamble and store your example in the `examples-alloc` folder. |
| |
| To build the examples for your board you can use |
| |
| ```shell |
| make <platform> [FEATURES=alloc] |
| ``` |
| |
| An example can be flashed to your board after the build process by running: |
| |
| ```shell |
| make flash-<platform> EXAMPLE=<example> |
| ``` |
| |
| This script does the following steps for you: |
| |
| - cross-compile your program |
| - create a TAB (tock application bundle) |
| - if you have a J-Link compatible board connected: flash this TAB to your board (using tockloader) |
| |
| |
| ## License |
| |
| libtock-rs is licensed under either of |
| |
| - Apache License, Version 2.0 |
| ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) |
| - MIT license |
| ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) |
| |
| at your option. |
| |
| Submodules have their own licenses. |
| |
| ### Contribution |
| |
| Unless you explicitly state otherwise, any contribution intentionally submitted |
| for inclusion in the work by you, as defined in the Apache-2.0 license, shall be |
| dual licensed as above, without any additional terms or conditions. |
| |
| The contribution guidelines can be found here: [contribution guidelines](CONTRIBUTING.md) |