Commit Graph

20 Commits

Author SHA1 Message Date
icedrocket
e28a7d1ba0 Fix typo 2022-11-01 20:32:55 +09:00
Björn Quentin
af745ac7b0
Fix ESP32-C3 interrupt/exception handling (#207)
* Fix ESP32-C3 interrupt/exception handling

* Use riscv-atomic-emulation-trap 0.2.0
2022-10-05 14:15:17 +01:00
Jesse Braham
5ca771a12e
Inject configuration symbols in build script, simplify cfg gating (#187)
* Update the build script to inject a configuration value for the enabled chip

* Update all cfg gates to use the new symbols instead of the chip features

* Inject architecture and core count symbols as well, update as needed

* Organize the imports and exports of `esp-hal-common`
2022-09-14 07:46:23 -07:00
Scott Mabin
b30886cce6
Periodic system timer & esp32s2 fixes & edge interrupt fixes (#167)
* Add Periodic mode to SYSTIMER

* Deduplicate shared code in SYSTIMER

* esp32s2 edge mode systimer interrupt

- Make systimer interrupts edge mode
- fix examples for s3 & s2

* Fix TPS for esp32s2, clean up examples
2022-08-25 07:13:56 -07:00
Scott Mabin
de379897a9 perf: vectored interrupt improvements
Instead of building a table of _all_ configured interrupts,
we now only check the currently _pending_ interrupts configuration
status. This means in the best case scenario we only ever do _one_
lookup instead of the 60~ we did before.

Tested on esp32c3, gpio_interrupt:

Before: 850cycles from `handler_interrupts` to the actual handler
After: 125cycles
2022-07-26 23:30:50 +01:00
Scott Mabin
1d02bf87c3
RISCV vectored interrupts (#118)
* RISCV interrupt vectoring

- Adds support for vectoring peripheral interrupts to PAC handlers
- Currently supports level interrupts with priorities from 1-15
- Updated the gpio interrupt example to reflect the new changes

* remove .vscode files

* Support vectored edge interrupts

This is as simple as making sure we clear the CPU interrupt whenever we
receive one. This also documents further what APIs are safe to call when
the `vectored` feature is enabled.

* fix all examples to use vectoring

* doc & cleanup

* run handlers from ram

* make xtensa::interrupt::vectored private, we rexport public items

* fix default handlers

* pass interrupt into EspDefaultHandler
2022-07-26 09:24:47 -07:00
Scott Mabin
1789780d06
Xtensa vectored interrupts (#103)
* Xtensa interrupt vectoring: peripheral source

- Initial Xtensa vectoring, updated esp32 gpio example to use new interrupt macro.
- Only peripheral sources supported.
- Only level one priority supported.
- CPU & Edge interrupts still need to be handled.

* Xtensa interrupt vectoring: CPU & EDGE

- Add support for handling CPU interrupts and edge interrupts
- PR required to xtensa-lx-rt for CPU handlers

* Xtensa interrupt vectoring: Priority

- Finally implement priortization
- Only three priorities available at the moment. Xtensa programmer guide
  discourages using highpri interrupts in Rust/C. Guide also mentions
  using software priortization to increase the number of Priorities
  available

* support CPU interrupts, using patch xtensa-lx-rt

* Update example

* Add support & examples for the s2 & s3 too

* Fix formatting and missing imports

* Run interrupt handling in ram, optionally run the vector handler in ram in the examples

* Use xtensa_lx::Mutex CS when enabling interrupts

* Run clippy on each target

* Remove redundant features

* Fix C3 builds

* make enable unsafe. Add note about preallocated interrupts in vectored mode.

* Remove `INTERRUPT_LEVELS` static

The interrupt levels static introduces a few issues
  - A lock is needed when configuring interrupts to keep
    INTERRUPT_LEVELS in a consistent state
  - Interrupts enabled from outside the Rust domain wouldn't be
    serviced, this is the case with the wifi blobs

To remove it, the prioty configuration is now calculated dynamically in
the interrupt handler. Essentially INTERRUPT_LEVELS is now created once
the interrupt triggers. It has some benefits, such as only having to
look at interrupts configured on the current core, not both, but there
is of course an overhead with doing this in the interrupt.

* Allow raw interrupts on levels 4-7, whilst also supporting vectoring on levels 1-3

* rename core number features

* Fix examples and formatting

* use xtensa-lx-rt release, update pacs

* Support passing the trap frame into interrupt handlers

* cfg away the #[interrupt] macro when not using vectoring

* rename enable to map

move vectored feature to chip specific hals

* export vectored functions

- rename `enable_with_priority` to `enable`
- add docs for interrupt macro

* Update all examples to use vectored interrupts
2022-07-25 07:12:34 -07:00
Jesse Braham
422cd5036d Use the PTR constant instead of the ptr() function for peripherals 2022-06-07 10:08:52 -07:00
Jesse Braham
e745e84869 Fix a whole bunch of clippy warnings 2022-05-05 11:51:12 +02:00
Jesse Braham
ec6a82b3f4 Clean up imports and format all packages 2022-05-05 11:16:05 +02:00
bjoernQ
23b6e17e52 Pass the right TrapFrame to the exception handler 2022-05-05 11:13:27 +02:00
bjoernQ
e83fd25e49 Optionally pass interrupt context to handlers for Xtensa 2022-03-29 09:31:09 -07:00
bjoernQ
651d27430a Replace the precompiled asm.S with global-asm 2022-03-14 09:33:05 -07:00
bjoernQ
e7eea75ef8 Add timer interrupt support and examples 2022-03-04 09:54:28 -08:00
bjoernQ
83f961431c Support atomic emulation for ESP32C3 if needed 2022-02-24 15:40:41 +00:00
bjoernQ
181892d02a Fix Xtensa interrupts 2022-02-22 15:33:15 +00:00
bjoernQ
7b59c9e76d Move linker scripts to sub-folders 2022-02-18 12:00:05 +01:00
bjoernQ
545f997b07 Support ESP32S3 2022-02-16 15:44:06 +00:00
bjoernQ
9c5468e814 Support ESP32S2 2022-02-14 18:04:48 +00:00
bjoernQ
cac30b7544 Add basic interrupt support for ESP32C3 and ESP32 2022-01-31 16:34:45 +00:00