Compare commits
3 Commits
d4cdc2eec9
...
ae04f2d537
Author | SHA1 | Date | |
---|---|---|---|
ae04f2d537 | |||
62a4123f82 | |||
17f13fc4dc
|
@ -4,10 +4,9 @@
|
|||||||
# runner = "arm-none-eabi-gdb -q -x openocd.gdb"
|
# runner = "arm-none-eabi-gdb -q -x openocd.gdb"
|
||||||
# runner = "gdb-multiarch -q -x openocd.gdb"
|
# runner = "gdb-multiarch -q -x openocd.gdb"
|
||||||
# runner = "gdb -q -x openocd.gdb"
|
# runner = "gdb -q -x openocd.gdb"
|
||||||
runner = "gdb-multiarch -q -x jlink.gdb"
|
# runner = "gdb-multiarch -q -x jlink.gdb"
|
||||||
|
|
||||||
# Probe-rs is currently problematic: https://github.com/probe-rs/probe-rs/issues/2567
|
runner = "probe-rs run --chip VA108xx_RAM --protocol jtag"
|
||||||
# runner = "probe-rs run --chip VA108xx --chip-description-path ./scripts/VA108xx_Series.yaml"
|
|
||||||
# runner = ["probe-rs", "run", "--chip", "$CHIP", "--log-format", "{L} {s}"]
|
# runner = ["probe-rs", "run", "--chip", "$CHIP", "--log-format", "{L} {s}"]
|
||||||
|
|
||||||
rustflags = [
|
rustflags = [
|
||||||
|
73
README.md
73
README.md
@ -60,14 +60,56 @@ You can then adapt the files in `.vscode` to your needs.
|
|||||||
You can use CLI or VS Code for flashing, running and debugging. In any case, take
|
You can use CLI or VS Code for flashing, running and debugging. In any case, take
|
||||||
care of installing the pre-requisites first.
|
care of installing the pre-requisites first.
|
||||||
|
|
||||||
### Pre-Requisites
|
### Using CLI with probe-rs
|
||||||
|
|
||||||
|
Install [probe-rs](https://github.com/probe-rs/probe-rs) first.
|
||||||
|
|
||||||
|
You can use `probe-rs` to run the software and display RTT log output. However, debugging does not
|
||||||
|
work yet.
|
||||||
|
|
||||||
|
After installation, you can run the following command
|
||||||
|
|
||||||
|
```sh
|
||||||
|
probe-rs run --chip VA108xx_RAM --protocol jtag --example blinky
|
||||||
|
```
|
||||||
|
|
||||||
|
to flash and run the blinky program on the RAM. There is also a `VA108xx` chip target
|
||||||
|
available for persistent flashing.
|
||||||
|
|
||||||
|
Runner configuration avilable in the `.cargo/def-config.toml` file to use `probe-rs` for
|
||||||
|
convenience.
|
||||||
|
|
||||||
|
### Using VS Code
|
||||||
|
|
||||||
|
Assuming a working debug connection to your VA108xx board, you can debug using VS Code with
|
||||||
|
the [`Cortex-Debug` plugin](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug).
|
||||||
|
Please make sure that [`objdump-multiarch` and `nm-multiarch`](https://forums.raspberrypi.com/viewtopic.php?t=333146)
|
||||||
|
are installed as well.
|
||||||
|
|
||||||
|
Some sample configuration files for VS code were provided and can be used by running
|
||||||
|
`cp -rT vscode .vscode` like specified above. After that, you can use `Run and Debug`
|
||||||
|
to automatically rebuild and flash your application.
|
||||||
|
|
||||||
|
If you would like to use a custom GDB application, you can specify the gdb binary in the following
|
||||||
|
configuration variables in your `settings.json`:
|
||||||
|
|
||||||
|
- `"cortex-debug.gdbPath"`
|
||||||
|
- `"cortex-debug.gdbPath.linux"`
|
||||||
|
- `"cortex-debug.gdbPath.windows"`
|
||||||
|
- `"cortex-debug.gdbPath.osx"`
|
||||||
|
|
||||||
|
The provided VS Code configurations also provide an integrated RTT logger, which you can access
|
||||||
|
via the terminal at `RTT Ch:0 console`. In order for the RTT block address detection to
|
||||||
|
work properly, `objdump-multiarch` and `nm-multiarch` need to be installed.
|
||||||
|
|
||||||
|
### Using CLI with GDB and Segger J-Link Tools
|
||||||
|
|
||||||
|
Install the following two tools first:
|
||||||
|
|
||||||
1. [SEGGER J-Link tools](https://www.segger.com/downloads/jlink/) installed
|
1. [SEGGER J-Link tools](https://www.segger.com/downloads/jlink/) installed
|
||||||
2. [gdb-multiarch](https://packages.debian.org/sid/gdb-multiarch) or similar
|
2. [gdb-multiarch](https://packages.debian.org/sid/gdb-multiarch) or similar
|
||||||
cross-architecture debugger installed. All commands here assume `gdb-multiarch`.
|
cross-architecture debugger installed. All commands here assume `gdb-multiarch`.
|
||||||
|
|
||||||
### Using CLI
|
|
||||||
|
|
||||||
You can build the blinky example application with the following command
|
You can build the blinky example application with the following command
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
@ -101,25 +143,8 @@ runner = "gdb-multiarch -q -x jlink/jlink.gdb"
|
|||||||
After that, you can simply use `cargo run --example blinky` to flash the blinky
|
After that, you can simply use `cargo run --example blinky` to flash the blinky
|
||||||
example.
|
example.
|
||||||
|
|
||||||
### Using VS Code
|
### Using the RTT Viewer
|
||||||
|
|
||||||
Assuming a working debug connection to your VA108xx board, you can debug using VS Code with
|
The Segger RTT viewer can be used to display log messages received from the target. The base
|
||||||
the [`Cortex-Debug` plugin](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug).
|
address for the RTT block placement is 0x10000000. It is recommended to use a search range of
|
||||||
Please make sure that [`objdump-multiarch` and `nm-multiarch`](https://forums.raspberrypi.com/viewtopic.php?t=333146)
|
0x1000 around that base address when using the RTT viewer.
|
||||||
are installed as well.
|
|
||||||
|
|
||||||
Some sample configuration files for VS code were provided and can be used by running
|
|
||||||
`cp -rT vscode .vscode` like specified above. After that, you can use `Run and Debug`
|
|
||||||
to automatically rebuild and flash your application.
|
|
||||||
|
|
||||||
If you would like to use a custom GDB application, you can specify the gdb binary in the following
|
|
||||||
configuration variables in your `settings.json`:
|
|
||||||
|
|
||||||
- `"cortex-debug.gdbPath"`
|
|
||||||
- `"cortex-debug.gdbPath.linux"`
|
|
||||||
- `"cortex-debug.gdbPath.windows"`
|
|
||||||
- `"cortex-debug.gdbPath.osx"`
|
|
||||||
|
|
||||||
The provided VS Code configurations also provide an integrated RTT logger, which you can access
|
|
||||||
via the terminal at `RTT Ch:0 console`. In order for the RTT block address detection to
|
|
||||||
work properly, `objdump-multiarch` and `nm-multiarch` need to be installed.
|
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
export RUSTDOCFLAGS="--cfg docsrs --generate-link-to-definition -Z unstable-options"
|
export RUSTDOCFLAGS="--cfg docsrs --generate-link-to-definition -Z unstable-options"
|
||||||
cargo +nightly doc --open
|
cargo +nightly doc --open
|
||||||
|
@ -33,8 +33,7 @@
|
|||||||
#![no_std]
|
#![no_std]
|
||||||
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
|
||||||
use core::cell::{Cell, RefCell};
|
use core::cell::{Cell, RefCell};
|
||||||
use critical_section::CriticalSection;
|
use critical_section::{CriticalSection, Mutex};
|
||||||
use embassy_sync::blocking_mutex::CriticalSectionMutex as Mutex;
|
|
||||||
use portable_atomic::{AtomicU32, Ordering};
|
use portable_atomic::{AtomicU32, Ordering};
|
||||||
|
|
||||||
use embassy_time_driver::{time_driver_impl, Driver, TICK_HZ};
|
use embassy_time_driver::{time_driver_impl, Driver, TICK_HZ};
|
||||||
@ -46,7 +45,7 @@ use va108xx_hal::{
|
|||||||
clock::enable_peripheral_clock,
|
clock::enable_peripheral_clock,
|
||||||
enable_nvic_interrupt, pac,
|
enable_nvic_interrupt, pac,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
timer::{enable_tim_clk, get_tim_raw, TimRegInterface},
|
timer::{enable_tim_clk, get_tim_raw, TimRegInterface, ValidTim},
|
||||||
PeripheralSelect,
|
PeripheralSelect,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -116,12 +115,15 @@ pub mod embassy {
|
|||||||
/// This has to be called once at initialization time to initiate the time driver for
|
/// This has to be called once at initialization time to initiate the time driver for
|
||||||
/// embassy.
|
/// embassy.
|
||||||
#[cfg(feature = "irqs-in-lib")]
|
#[cfg(feature = "irqs-in-lib")]
|
||||||
pub unsafe fn init(
|
pub unsafe fn init<
|
||||||
|
TimekeeperTim: TimRegInterface + ValidTim,
|
||||||
|
AlarmTim: TimRegInterface + ValidTim,
|
||||||
|
>(
|
||||||
syscfg: &mut pac::Sysconfig,
|
syscfg: &mut pac::Sysconfig,
|
||||||
irqsel: &pac::Irqsel,
|
irqsel: &pac::Irqsel,
|
||||||
sysclk: impl Into<Hertz>,
|
sysclk: impl Into<Hertz>,
|
||||||
timekeeper_tim: impl TimRegInterface,
|
timekeeper_tim: TimekeeperTim,
|
||||||
alarm_tim: impl TimRegInterface,
|
alarm_tim: AlarmTim,
|
||||||
) {
|
) {
|
||||||
TIME_DRIVER.init(
|
TIME_DRIVER.init(
|
||||||
syscfg,
|
syscfg,
|
||||||
@ -140,12 +142,15 @@ pub mod embassy {
|
|||||||
///
|
///
|
||||||
/// This has to be called once at initialization time to initiate the time driver for
|
/// This has to be called once at initialization time to initiate the time driver for
|
||||||
/// embassy.
|
/// embassy.
|
||||||
pub unsafe fn init_with_custom_irqs(
|
pub unsafe fn init_with_custom_irqs<
|
||||||
|
TimekeeperTim: TimRegInterface + ValidTim,
|
||||||
|
AlarmTim: TimRegInterface + ValidTim,
|
||||||
|
>(
|
||||||
syscfg: &mut pac::Sysconfig,
|
syscfg: &mut pac::Sysconfig,
|
||||||
irqsel: &pac::Irqsel,
|
irqsel: &pac::Irqsel,
|
||||||
sysclk: impl Into<Hertz>,
|
sysclk: impl Into<Hertz>,
|
||||||
timekeeper_tim: impl TimRegInterface,
|
timekeeper_tim: TimekeeperTim,
|
||||||
alarm_tim: impl TimRegInterface,
|
alarm_tim: AlarmTim,
|
||||||
timekeeper_irq: pac::Interrupt,
|
timekeeper_irq: pac::Interrupt,
|
||||||
alarm_irq: pac::Interrupt,
|
alarm_irq: pac::Interrupt,
|
||||||
) {
|
) {
|
||||||
@ -188,21 +193,21 @@ pub struct TimerDriver {
|
|||||||
|
|
||||||
impl TimerDriver {
|
impl TimerDriver {
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
fn init(
|
fn init<TimekeeperTim: TimRegInterface + ValidTim, AlarmTim: TimRegInterface + ValidTim>(
|
||||||
&self,
|
&self,
|
||||||
syscfg: &mut pac::Sysconfig,
|
syscfg: &mut pac::Sysconfig,
|
||||||
irqsel: &pac::Irqsel,
|
irqsel: &pac::Irqsel,
|
||||||
sysclk: impl Into<Hertz>,
|
sysclk: impl Into<Hertz>,
|
||||||
timekeeper_tim: impl TimRegInterface,
|
timekeeper_tim: TimekeeperTim,
|
||||||
alarm_tim: impl TimRegInterface,
|
alarm_tim: AlarmTim,
|
||||||
timekeeper_irq: pac::Interrupt,
|
timekeeper_irq: pac::Interrupt,
|
||||||
alarm_irq: pac::Interrupt,
|
alarm_irq: pac::Interrupt,
|
||||||
) {
|
) {
|
||||||
if ALARM_TIM.get().is_some() {
|
if ALARM_TIM.get().is_some() || TIMEKEEPER_TIM.get().is_some() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ALARM_TIM.set(alarm_tim.tim_id()).ok();
|
ALARM_TIM.set(AlarmTim::TIM_ID).ok();
|
||||||
TIMEKEEPER_TIM.set(timekeeper_tim.tim_id()).ok();
|
TIMEKEEPER_TIM.set(TimekeeperTim::TIM_ID).ok();
|
||||||
enable_peripheral_clock(syscfg, PeripheralSelect::Irqsel);
|
enable_peripheral_clock(syscfg, PeripheralSelect::Irqsel);
|
||||||
enable_tim_clk(syscfg, timekeeper_tim.tim_id());
|
enable_tim_clk(syscfg, timekeeper_tim.tim_id());
|
||||||
let timekeeper_reg_block = timekeeper_tim.reg_block();
|
let timekeeper_reg_block = timekeeper_tim.reg_block();
|
||||||
|
Reference in New Issue
Block a user