Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add integration with bt-hci crate #1971

Merged
merged 15 commits into from
Sep 6, 2024
Merged

Conversation

lulf
Copy link
Contributor

@lulf lulf commented Aug 20, 2024

Implementing traits from bt-hci allows the BleConnector to be used with the Trouble BLE stack.

See #1933

The bt-hci crate is not yet released on crates.io, hence marking this as draft until that's done. I've created an example here that use the TrouBLE stack. I'm not sure if it makes sense to add an example to esp-hal or not, there's no trouble release yet so it would have to be a git dependency.

@Dominaezzz
Copy link
Collaborator

I'm not sure if it makes sense to add an example to esp-hal or not, there's no trouble release yet so it would have to be a git dependency.

I think that's what this PR should be. Which can land now, rather than wait for a release.

Ideally esp-wifi should expose an API that allows users to implement traits of any 3rd party library, rather than require esp-wifi to provide an implementation for every bluetooth library that exists out there.

This PR can just be to add an example trouble.rs that just shows how to integrate esp-hal and trouble yourself.

(For pragmatic reasons, once trouble is released esp-wifi will probably provide an implementation 🙂)

I strongly suggest using a commit hash rather than the main branch. The examples are built in CI and breaking changes in trouble would break CI here.

@lulf
Copy link
Contributor Author

lulf commented Aug 21, 2024

I'm not sure if it makes sense to add an example to esp-hal or not, there's no trouble release yet so it would have to be a git dependency.

I think that's what this PR should be. Which can land now, rather than wait for a release.

We're in the process of moving the bt-hci crate to the embassy org, so will wait for that before updating this PR.

Ideally esp-wifi should expose an API that allows users to implement traits of any 3rd party library, rather than require esp-wifi to provide an implementation for every bluetooth library that exists out there.

Just to clear things up, there are two crates at play:

  • bt-hci which is just HCI type definitions following the bluetooth specification (no BLE stack implementation), it's not bound to any BLE stack and is generally a small stable dependency that doesn't change. This is not part of trouble at all.
  • trouble which implements the BLE Host stack, similar to bleps. I agree an integration with that is outside the scope of esp-hal, so it should only be put as an example (which I've pushed now).

Whether or not to depend on bt-hci in esp-hal is up to you. It would reduce the boilerplate needed for users, so my recommendation would be to do that, as I think whatever API would be in esp-hal instead would end up pretty similar (since HCI is a spec). It's another dependency though, so I can understand why you'd want to keep it out as well.

This PR can just be to add an example trouble.rs that just shows how to integrate esp-hal and trouble yourself.

I agree that the trouble crate should only be depended on in the example. I've pushed an example just now for that.

(For pragmatic reasons, once trouble is released esp-wifi will probably provide an implementation 🙂)

Just to clarify, there isn't any need for esp-wifi to integrate with trouble, it's kind of at the layer above, using the esp-wifi implementations of the bt-hci traits.

I strongly suggest using a commit hash rather than the main branch. The examples are built in CI and breaking changes in trouble would break CI here.

@bjoernQ
Copy link
Contributor

bjoernQ commented Aug 21, 2024

I think it's totally fine (and something I want) to offer two HCI interfaces - embedded-io (what we already have) since it's not too uncommon to have a serial interface and bt-hci. I agree esp-wifi shouldn't depend on any BLE-stack directly (which it doesn't and this PR doesn't change that)

In theory we could have just one interface and use / offer adapters but in the end, I think this is a more convenient solution.

@Dominaezzz
Copy link
Collaborator

Ah yeah sorry, I used "trouble" and "bt-hci" interchangeably. (I understand the difference)
To be more precise, I always referring to bt-hci.

I was just saying that the bt-hci integration can live in the example code until the crate is released, that way the PR can land now.

@lulf lulf marked this pull request as ready for review August 21, 2024 16:44
Copy link
Member

@jessebraham jessebraham left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for this, LGTM!

@lulf
Copy link
Contributor Author

lulf commented Aug 21, 2024

Allright its ready for a proper review now, bt-hci is released

Edit: let me know if you want me to squash commits.

@bjoernQ
Copy link
Contributor

bjoernQ commented Aug 22, 2024

Thanks a lot!

I tried this on some targets but unfortunately on ESP32-C3 and ESP32-S3 it advertises but I cannot connect. On ESP32-C6 I don't see it advertising.

Here is a pcap from ESP32-C3 (using Windows BLE Explorer, but also NRF Connect on Android shows same behavior)
esp32c3_trouble.zip

@lulf
Copy link
Contributor Author

lulf commented Aug 22, 2024

@bjoernQ Oh, that's not good, thanks for testing. I only have esp32c3 to test on, but I'm able to connect, read attribute and get notifications. On iphone (nrf connect 2.7.8), so it might be some differences with Android that triggers that. I'll look more into it.

nrf_connect_iphone

@bjoernQ
Copy link
Contributor

bjoernQ commented Aug 22, 2024

You probably already know this but you can use https://github.com/esp-rs/esp-hal/tree/main/extras/esp-wifishark to capture HCI data in Wireshark - at least for me that was quite helpful before. I remember at least e.g. Windows and Android perform very different things during service discovery

@lulf lulf marked this pull request as draft August 22, 2024 14:19
@lulf lulf marked this pull request as ready for review August 24, 2024 13:21
@lulf
Copy link
Contributor Author

lulf commented Aug 24, 2024

@bjoernQ Well, that was a good find. The BleConnector integration was using read_hci, which ended up giving 2 hci frames during read, and the second one was skipped. I switched it to use read_next which just reads a single HCI packet rather than a stream, and now it's working on both Android and iOS for me. My guess I was just 'lucky' that it worked on iOS before.

The HCI capture thing helped identify that there was a frame in the internal buffer that was 'skipped' in the read(), thanks

@bjoernQ
Copy link
Contributor

bjoernQ commented Aug 26, 2024

Thanks!

The BleConnector integration was using read_hci, which ended up giving 2 hci frames during read, and the second one was skipped. I switched it to use read_next which just reads a single HCI packet rather than a stream, and now it's working on both Android and iOS for me.

That makes a lot of sense - thanks for fixing this. I am now able to connect from Android to most chips. Unfortunately, Windows LE Explorer still locks-up on connecting.

Also, for some chips (ESP32-C2, ESP32-C6 and ESP32-H2) it seems that it never gets to start the advertising. The example stops at

I (23) boot: ESP-IDF v5.1-beta1-378-gea5e0ff298-dirt 2nd stage bootloader
I (24) boot: compile time Jun  7 2023 08:03:28
I (25) boot: chip revision: v0.1
I (29) boot.esp32h2: SPI Speed      : 32MHz
I (33) boot.esp32h2: SPI Mode       : DIO
I (38) boot.esp32h2: SPI Flash Size : 4MB
I (43) boot: Enabling RNG early entropy source...
I (48) boot: Partition Table:
I (52) boot: ## Label            Usage          Type ST Offset   Length
I (59) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (67) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (74) boot:  2 factory          factory app      00 00 00010000 003f0000
I (82) boot: End of partition table
I (86) esp_image: segment 0: paddr=00010020 vaddr=40800000 size=04ba4h ( 19364) load
I (100) esp_image: segment 1: paddr=00014bcc vaddr=40824958 size=00030h (    48) load
I (103) esp_image: segment 2: paddr=00014c04 vaddr=00000000 size=0b3f4h ( 46068)
I (124) esp_image: segment 3: paddr=00020000 vaddr=42000000 size=4f258h (324184) map
I (212) esp_image: segment 4: paddr=0006f260 vaddr=00000000 size=03ae8h ( 15080)
I (217) esp_image: segment 5: paddr=00072d50 vaddr=42052d50 size=0adc0h ( 44480) map
I (231) boot: Loaded app from partition at offset 0x10000
I (231) boot: Disabling RNG early entropy source...
INFO - esp-wifi configuration Config { rx_queue_size: 5, tx_queue_size: 3, static_rx_buf_num: 10, dynamic_rx_buf_num: 32, static_tx_buf_num: 0, dynamic_tx_buf_num: 32, ampdu_rx_enable: 0, ampdu_tx_enable: 0, amsdu_tx_enable: 0, rx_ba_win: 6, max_burst_size: 1, country_code: "CN", country_code_operating_class: 0, mtu: 1492, heap_size: 65536, tick_rate_hz: 100, listen_interval: 3, beacon_timeout: 6, ap_beacon_timeout: 300, failure_retry_cnt: 1, scan_method: 0 }
INFO - Starting advertising and GATT service

What all these chips have in common is that they are using the newer (Nimble based) driver under the hood - so might be something on our side. Haven't looked into this yet

@lulf
Copy link
Contributor Author

lulf commented Aug 26, 2024

Thanks!

The BleConnector integration was using read_hci, which ended up giving 2 hci frames during read, and the second one was skipped. I switched it to use read_next which just reads a single HCI packet rather than a stream, and now it's working on both Android and iOS for me.

That makes a lot of sense - thanks for fixing this. I am now able to connect from Android to most chips. Unfortunately, Windows LE Explorer still locks-up on connecting.

I don't have a windows system, so I'm not sure how to debug that. If you some kind of a packet trace, that would be helpful.

Also, for some chips (ESP32-C2, ESP32-C6 and ESP32-H2) it seems that it never gets to start the advertising. The example stops at

I (23) boot: ESP-IDF v5.1-beta1-378-gea5e0ff298-dirt 2nd stage bootloader
I (24) boot: compile time Jun  7 2023 08:03:28
I (25) boot: chip revision: v0.1
I (29) boot.esp32h2: SPI Speed      : 32MHz
I (33) boot.esp32h2: SPI Mode       : DIO
I (38) boot.esp32h2: SPI Flash Size : 4MB
I (43) boot: Enabling RNG early entropy source...
I (48) boot: Partition Table:
I (52) boot: ## Label            Usage          Type ST Offset   Length
I (59) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (67) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (74) boot:  2 factory          factory app      00 00 00010000 003f0000
I (82) boot: End of partition table
I (86) esp_image: segment 0: paddr=00010020 vaddr=40800000 size=04ba4h ( 19364) load
I (100) esp_image: segment 1: paddr=00014bcc vaddr=40824958 size=00030h (    48) load
I (103) esp_image: segment 2: paddr=00014c04 vaddr=00000000 size=0b3f4h ( 46068)
I (124) esp_image: segment 3: paddr=00020000 vaddr=42000000 size=4f258h (324184) map
I (212) esp_image: segment 4: paddr=0006f260 vaddr=00000000 size=03ae8h ( 15080)
I (217) esp_image: segment 5: paddr=00072d50 vaddr=42052d50 size=0adc0h ( 44480) map
I (231) boot: Loaded app from partition at offset 0x10000
I (231) boot: Disabling RNG early entropy source...
INFO - esp-wifi configuration Config { rx_queue_size: 5, tx_queue_size: 3, static_rx_buf_num: 10, dynamic_rx_buf_num: 32, static_tx_buf_num: 0, dynamic_tx_buf_num: 32, ampdu_rx_enable: 0, ampdu_tx_enable: 0, amsdu_tx_enable: 0, rx_ba_win: 6, max_burst_size: 1, country_code: "CN", country_code_operating_class: 0, mtu: 1492, heap_size: 65536, tick_rate_hz: 100, listen_interval: 3, beacon_timeout: 6, ap_beacon_timeout: 300, failure_retry_cnt: 1, scan_method: 0 }
INFO - Starting advertising and GATT service

What all these chips have in common is that they are using the newer (Nimble based) driver under the hood - so might be something on our side. Haven't looked into this yet

I don't have any other esp32 to test on, so I'm not sure what that could be. I tested the apache-nimble controller integration on nrf, which does work, but that controller is perhaps different to the one used in esp32?

@bjoernQ
Copy link
Contributor

bjoernQ commented Aug 27, 2024

Here are captures for ESP32-C3 with Windows BLE Explorer and for ESP32-C6

captures.zip

The first three packets on ESP32-C6 look the same for Trouble and Bleps - but then there is silence in the Trouble example

Compared to ESP32-C3 there is an initial CommandComplete which is ignored by Bleps but might cause trouble for Trouble:

image

@lulf
Copy link
Contributor Author

lulf commented Aug 28, 2024

@bjoernQ You're right, it's the initial command complete that causes an error when bt-hci attempts to parse it. It's an interesting edge case, because all valid BLE command complete events corresponding to a command have an additional 'status' byte set, whereas this one is one byte short (you can see the Reset command for instance is 7 bytes), and not in response to a command.

An error like this will cause the ble.run() in the example to exit, which is probably why everything hangs.

Here is the alternatives I think:

  1. Change bt-hci event parser to not require the status byte to be present. It feels a bit wrong to deal with it in the bt-hci crate though, since this is specific to a controller and I'm not sure if it's really allowed or not.
  2. Change trouble to ignore parsing errors. I don't like this one, because it masks potential real bugs.
  3. Change the esp-hal bt-hci integration to check for this case when parsing the HCI command.

I've gone with 3. and pushed a fix that should ignore this event,, it would be great if you could try it out.

@bjoernQ
Copy link
Contributor

bjoernQ commented Aug 28, 2024

Thanks! I agree option 3 is the best way here

I can confirm it's now working with ESP32-C6 and nrf-Connect on Android!

I got the example to crash when closing nrf-Connect - not an issue / just mentioning:

image

@lulf
Copy link
Contributor Author

lulf commented Aug 28, 2024

Thanks! I agree option 3 is the best way here

I can confirm it's now working with ESP32-C6 and nrf-Connect on Android!

Great, thanks for testing!

I got the example to crash when closing nrf-Connect - not an issue / just mentioning:

Ah yes, it could happen if trying to notify a host that was disconnected. I've modified the example to just ignore that for now.

@bjoernQ
Copy link
Contributor

bjoernQ commented Sep 5, 2024

I think this looks good and works fine for me with an Android central - would love to get this in - do you know if using Windows as central is a general known problem in Trouble currently? (I don't think it's an issue with the integration if Android and iOS are working fine)

@lulf
Copy link
Contributor Author

lulf commented Sep 5, 2024

Regarding that trouble PR, I'll see if I can get hold on some windows pc one day to reproduce, but it might not be very soon. It should probably be looked into, I don't think the intersection of 'windows BLE connector' and trouble users are that big yet for anyone to notice. Whether or not it should block the PR I dunno.

@MabezDev
Copy link
Member

MabezDev commented Sep 5, 2024

Whether or not it should block the PR I dunno.

I don't think it should, this is really nice to have, so let's get this in now. Would you mind rebasing?

@lulf
Copy link
Contributor Author

lulf commented Sep 5, 2024

@MabezDev Done. I'll raise an issue in trouble repo regarding the Windows LE explorer so it's not forgotten.

Copy link
Member

@MabezDev MabezDev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! ❤️

@jessebraham
Copy link
Member

Feel free to bump the MSRV to 1.77 in order to get this green. Or if you'd prefer I can do so in a separate PR.

@lulf
Copy link
Contributor Author

lulf commented Sep 5, 2024

@jessebraham I wasn't sure where to bump that, I set it on esp-wifi, is that ok?

@MabezDev
Copy link
Member

MabezDev commented Sep 5, 2024

@lulf You'll have to bump the version in CI too, I suppose for simplicity we should also just bump esp-hal MSRV so we don't do the check on two different toolchains

@lulf
Copy link
Contributor Author

lulf commented Sep 6, 2024

Finally green 🎉 😂

Copy link
Member

@jessebraham jessebraham left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks again for your work on this!

@jessebraham jessebraham added this pull request to the merge queue Sep 6, 2024
Merged via the queue into esp-rs:main with commit 93f1012 Sep 6, 2024
25 checks passed
SergioGasquez added a commit to SergioGasquez/esp-hal that referenced this pull request Sep 9, 2024
* Add self-testing mode for `TWAI` peripheral. (esp-rs#1929)

* Add self-testing mode for `TWAI` peripheral

* changelog entry

* fix docs build

* fix async example

* Restore example to original state

fix comment

* `NoAck` -> `SelfTest`

* DMA: Don't require implementors of Read/WriteBuffer to be Sealed (esp-rs#1921)

* DMA: Don't require implementors of Read/WriteBuffer to be Sealed

* CHANGELOG

* mark dma::ReadBuffer and dma::WriteBuffer traits unsafe

* Reset peripherals on driver construction (where missing) (esp-rs#1893)

* Reset peripherals on driver contruction (where missing)

* Don't enable and reset SHA in HMAC ctor

* changelog

* Don't reset the TIMG0

* Deny missing docs at the package level, adding exceptions for relevant modules (esp-rs#1931)

* Fix an infinite loop in interrupt executors (esp-rs#1936)

* Add failing test

Fix the name of the test fn

* Fix interrupt executor looping

* Fix formatting

* Fix changelog reference

* Move changelog to the right crate

* Remove dead code

* Fix `i2c` + get rid of unused constants/enums (esp-rs#1940)

* Slightly clean up embassy HIL tests (esp-rs#1937)

* Implemented queue_msg_waiting. (esp-rs#1925)

* Implemented queue_msg_waiting.

* Fmt.

* Adjusted changelog.

* Fixed CI.

* Fixed pointer mutability.

* Update to latest release (`0.6.0`) for `embassy-executor` in `esp-embassy-hal` (fixes esp-rs#1941) (esp-rs#1942)

* Updated to latest release (`0.6.0`) for `embassy-executor`

* update changelog

* update hil-test version of embassy-executor to 0.6.0

* update embassy-executor in `examples`

* reflect esp_hal change in `OneShotTimer` to not have a lifetime.

* update changelog

* revert OneShotTimer changes

* ESP32C6: Make `ADC` usable after `TRNG` deinitialization (esp-rs#1945)

* Make `ADC` usable after `TRNG` deinicialization (esp32c6)

* Changelog entry

* Adding `TWAI` HIL test (esp-rs#1946)

* Adding `TWAI` HIL test

* add `Frame` trait

* mutability

* Update probe-rs, prebuild xtask for HIL tests (esp-rs#1939)

* Update probe-rs

* Differentiate jobs

* Explicitly print that probe-rs's execution failed

* Do not capture stdin/stderr

* Pre-build xtask binary

* Use current_directory

* Print more info when a file can't be read

* Do not erase flash after a failure

* get_time: fail faster

* Make xtask runnable

* Removing raw addresses manipulations - part 3 (esp-rs#1892)

* WIP state

* More fixes

* Roll back `esp-storage` changes

* Small fixes

Will not work, needs another patch for PACs

* update pacs dep

* Lint

* Get rid of unnecessary if-else

fix

* New pacs version

* make contribution docs more visible (esp-rs#1947)

* Clean up i2s_async test, add option to repeat (esp-rs#1951)

* Simplify I2S async test

* Allow running tests repeatedly

* Fail at the first mismatch

* Clean up

* Further clean up timers/executors test (esp-rs#1953)

* Further clean up embassy_timers_executors

* Do not delay for so long

* Print timer values on assert failure

* Clean up some more

* Retry test a few times to counteract probe-rs halting us

* Fix formatting

* Fix GPIO Touch pin I/O (esp-rs#1956)

* Do not reset `UsbSerialJtag` peripheral (esp-rs#1961)

* Fix typos

* Add a function to detect debugger connection

* Do not reset USB peripheral

* Changelog

* Fix different register names

* Reuse xtensa_lx::is_debugger_attached

* Improve SYSTIMER API (esp-rs#1871)

* Improve SYSTIMER API

* Remove config object

* fix things

* Allow erasure of unit and comparator numbers

* Merge fail

---------

Co-authored-by: Dominic Fischer <[email protected]>

* Simplify initialization APIs (esp-rs#1957)

* Accept more types in embassy::init

* Apply the same treatment to esp-wifi

* Changelog

* Clean up

* Add doc examples

* Fix Alarm generic parameters

* Some xtask/metadata cleanups (esp-rs#1965)

* Clean up almost all clippy violations

* Remove redundant variable from context

* Do not clone configs

* Do not collect all config symbols into a vec needlessly

* Do not allocate so many strings

* Implement Sniffer API (esp-rs#1935)

* Implemented queue_msg_waiting.

* Fmt.

* Adjusted changelog.

* Fixed CI.

* Fixed pointer mutability.

* Implemented experimental sniffer api.

* Fixed CI..

* Added safety comment.

* Featured gated, PromiscuousPkt

* Format.

* Adjusted imports.

* Added injection example.

* Made RxControlInfo::from_raw public.

* Format.

* Added sniffer example.

* Add more SPI DMA (full-duplex) HIL tests (blocking and async) (esp-rs#1952)

* Add more SPI DMA HIL tests (blocking and async)

* move test repetitions into loops instead, add a description about why PCNT is used, import embedded_hal_async::spi

* clean up

* Add basic HIL test for GPIO that can be configured as  pin for (esp-rs#1963)

* Patch typo in debug assist register name and used patched esp-pacs (esp-rs#1968)

* Disable RTT polling in HIL tests by default (esp-rs#1960)

* Disable defmt-rtt by default

* Update i2s test based on changes done to async

* fmt

* Update readme

* Update more tests

* Refactor SHA to use trait. Implement Digest traits for SHA (esp-rs#1908)

* feat(SHA): Refactor SHA to use trait. Implement Digest traits for SHA

* Fix CI. Fix wrong sha mode for esp32

* Save hash register for interleaving operation

An example (wip) `sha_fuzz.rs` was added to test different functionalities of the SHA driver and to ensure proper functionning under all cases.

* Use random data when testing SHA

* fix(SHA): Buffer words until a full block before writing to memory

This fixes interleaving operations by buffering words into the SHA context until a full block can be processed.

* Fix(SHA): Use correct length padding for SHA384 and SHA512.

- This fixes a long running issue with SHA384 and SHA512, where some digest of specific sizes wouldn't compute correctly, by changing the padding length of the size field.

* Re-export digest for convenience

* Remove completed TODO

* Remove SHA peripheral requirement.

- Document safety of the SHA driver.

---------

Co-authored-by: Scott Mabin <[email protected]>

* Fix 1GB elfs (esp-rs#1962)

* [3/3] DMA Move API: Introduce DMA buffer objects (esp-rs#1856)

* [3/3] DMA Move API: Introduce DMA buffer objects

* Remove FlashSafeDma

* Add async HIL test

* Handle set_length(0) correctly

* Fix tx/rx booleans

* Unlucky

* Preserve previous blocking semantics

* Add delay between starting DMA TX and SPI driver

* Update CHANGELOG

* merge tidy

* Add with_buffers builder

---------

Co-authored-by: Dominic Fischer <[email protected]>

* Run HIL tests as part of PR checks (esp-rs#1959)

* Run HIL tests as part of PR checks

* Cancel pending HIL runs

* Only run for ready PRs

* Remove `free(self)` in HMAC which goes against esp-hal API guidelines (esp-rs#1972)

* Remove `free(self)` which goes against esp-hal API guidelines

* changelog

* correct changelog sections (esp-rs#1974)

* Remove redundant WithDmaSpi traits (esp-rs#1975)

Co-authored-by: Dominic Fischer <[email protected]>

* Fix S2 systimers (esp-rs#1979)

* Add basic systimer interrupt tests

* Remove unnecessary condition

* Fix edge interrupt bitmasks

* Modify target_conf in critical section

* Remove unnecessary fn call

* Fix test

* Add failing test case

* Fix S2 systimer interrupts being fired unexpectedly

* Add changelog entry

* Format

* Fix C2 delays (esp-rs#1981)

* Re-enable delay tests on S2 and C2

* Systimer: use fn instead of constant to retrieve tick freq

* Reformulate delay using current_time

* Take actual XTAL into account

* Re-enable tests

* Fix changelog

* Disable defmt

* Remove unused esp32 code

* Update esp-hal/src/delay.rs

Co-authored-by: Jesse Braham <[email protected]>

---------

Co-authored-by: Jesse Braham <[email protected]>

* Get rid of `missing docs` in a number of modules (esp-rs#1967)

* Get rid of missing docs in a number of modules

* address reviews

* Address the rest of reviews

* remove all remaining `allows`

* are you serious?

* Add tests to ensure that we don't reset current_time drivers (esp-rs#1978)

* tell cargo about all our custom cfgs (esp-rs#1988)

* tell cargo about all our custom lints

* fixup the unexpected cfg lints, including remove clic

* HIL: Multiple featuresets & conditionally enable generic-queue feature (esp-rs#1989)

* Conditionally enable generic-queue feature

* Allow specifying multiple feature sets and run all of them

* parl_io: use ReadBuffer/WriteBuffer for async DMA (esp-rs#1996)

* parl_io: use ReadBuffer/WriteBuffer for async DMA

* CHANGELOG

* Use uhubctl to disable and enable usb ports (esp-rs#1997)

* Remove files after test (esp-rs#1993)

* Refactor SPI tests & re-enable S3 and some S2 (esp-rs#1990)

* Deduplicate spi_full_duplex_dma_async

* Refactor SPI tests

* Separate out PCNT tests

* Re-enable test on S3

* Re-enable some S2 tests

* gpio: Make AnyPin, AnyInputOnlyPin, DummyPin available from gpio module (esp-rs#1918)

Making these available straight from `gpio` aligns it with other Embassy
implementations (mainly nrf and stm32).

Signed-off-by: Priit Laes <[email protected]>

* Clean up SHA, RSA, mandate `#[must_use]` on Futures (esp-rs#2000)

* Janitor go brr

* Clean up SHA

* Use max CPU speed

* RSA cleanup part 1

* Clean up nonsense comments

* Mark all futures as must_use

* Prefer `cfg_if` (esp-rs#2003)

* SPI DMA: use `State` for both blocking and async operations (esp-rs#1985)

* use `State` for both blocking and async operations, remove async version of SpiDmaBus in favour of being generic over the mode

* reuse wait_for_idle more

* changelog

* rename generic params for consistency

* Add duplex mode to SpiDmaBus

* implement HalfDuplexReadWrite for SpiDmaBus

* Docs on new async APIs

* Limit half duplex transfers to the capacity of the DmaBuf

* docs

* rebase tests

* address review comments

* remove duplex traits from spi

* fix tests

* spi docs rejig

* s/InUse/TemporarilyRemoved/g

* Re-add feature gate for software_interrupt3 (esp-rs#2011)

* Fix (esp-rs#2013)

* Implement timer conversion for some arrays (esp-rs#2012)

* Test and fix async RSA (esp-rs#2002)

* RSA cleanup & API consistency change, part 2

* RSA cleanup & API consistency change, part 3

* Add async tests

* Fix async for ESP32

* Merge impl blocks

* Backtrack on some mutability changes

* Use Acquire/Release ordering

* Fwd to write_multi_start instead of duplicating impl

* Only reserve the interrupt when executors are needed (esp-rs#2014)

* forward spi methods to SpiDmaBus (esp-rs#2016)

* forward spi methods to SpiDmaBus

* changelog

* Fix defmt compatibility (esp-rs#2017)

* Fix defmt compatibility

* Update tests to cover macros

* Remove unneeded logs (esp-rs#2022)

* HIL: Don't skip cleanup (esp-rs#2024)

* Don't skip cleanup

* Make sure the power is off for a short while

* Use newly published versions of all PACs in `esp-hal` (esp-rs#2025)

* Use newly published versions of all PACs in `esp-hal`

* Address additional review comments

* Version 0.20.0 (esp-rs#2038)

* Update package dependencies and bump version numbers

* Update `CHANGELOG.md` for each package to be published

* Remember to update `xtensa-lx-rt` too :)

* Add and use TrapFrame::new() in esp-wifi

* Bump `xtensa-lx-rt` by minor instead of patch, as there are breaking changes

---------

Co-authored-by: Dániel Buga <[email protected]>

* Fix before_snippet failing in release (esp-rs#2040)

* Fix before_snippet failing in release

* Fix esp-hal-embassy comment

* Prepare v0.20.1 release (esp-rs#2046)

* Try to be more helpful (esp-rs#2044)

* Begin next release cycle (esp-rs#2039)

Co-authored-by: Scott Mabin <[email protected]>

* fix: Fix nightly errors (esp-rs#1934)

* Disable object's unnecessary features in proc macro that loads LP code (esp-rs#2018)

* Disable object/decompress

* Only enable elf support in object

* Random cleanups in non-checked packages (esp-rs#2034)

* Deduplicate feature check macros

* Re-enable rust-analyzer for most of the workspace

* Cargo fix

* Turn off defmt

* Only build xtask

* Clippy pls

* Fix CI

* Fix paths

* Always create doc directory first

* Revert r-a

* Update esp-hal-procmacros/src/lp_core.rs

Co-authored-by: Dominic Fischer <[email protected]>

---------

Co-authored-by: Dominic Fischer <[email protected]>

* QSPI tests (esp-rs#2015)

* Add QSPI tests

* Simplify

* Add qspi_write_read test

* Clean up gigantic GPIO eyesore (esp-rs#2048)

* Save/restore coprocessor state on stack (esp-rs#2057)

* Whitespace

* Save and restore coprocessor enable state

* release prep [email protected] (esp-rs#2060)

* Protect SYSTIMER/TIMG shared registers (esp-rs#2051)

* Protect SYSTIMER/TIMG shared registers

* some review comments

* more review comments

* more review comments

* bring back portable_atomic

---------

Co-authored-by: Dominic Fischer <[email protected]>

* automatically apply status:needs-attention to new esp-hal issues (esp-rs#2030)

* Improve CP0-disabled error message (esp-rs#2061)

* Improve CP0-disabled error message

* CHANGELOG.md

* Rework hal initialization (esp-rs#1970)

* Rework hal initialization

* Turn sw interrupt control into a virtual peripheral

* Return a tuple instead of a named struct

* Fix docs

* Remove SystemClockControl

* Move software interrupts under interrupt

* Re-document what's left in system

* Update time docs

* Update sw int docs

* Introduce Config

* Fix tests

* Remove redundant inits

* Doc

* Clean up examples&tests

* Update tests

* Add changelog entry

* Start migration guide

* Restore some convenience-imports

* Remove Config from prelude

* Fix hil-test xtask instruction (esp-rs#2062)

* Fix hil-test xtask instruction

* Fix another mention

* [esp-metadata] Make clap dependency optional (esp-rs#2055)

* Provide ehal impls for DummyPin (esp-rs#2019)

Co-authored-by: Scott Mabin <[email protected]>

* storage: Clean up ROM function declarations (esp-rs#2058)

* Clean up external function declarations

* Tweak syntax

* Fix various SPI/DMA issues (esp-rs#2065)

* Add failing test

* Fix enabled interrupt

* Fix using the correct waker

* Changelog

* Enable test on more devices that have SPI3

* WPA2 ENTERPRISE (esp-rs#2004)

* WPA2 ENTERPRISE

* Defmt, Clippy, Changelog

* Defmt, again

* Clippy, again

* Mention corresponding JIRA ticket

* Rename

* fmt

* Use Mutex in scheduler

* Adapt wifi_delete_queue

* Adapt log level

* Bump to esp-wifi 0.9.0 (esp-rs#2066)

* Remove NoPinType (esp-rs#2068)

* Make esp-wifi build on stable, again. Bump to 0.9.1 (esp-rs#2067)

* Make esp-wifi build on stable, again. Bump to 0.9.1

* CHANGELOG.md

* MSRV check esp-wifi

* ESP32-S2 doesn't support Bluetooth

* Remove lazy_static in favor of OnceLock (esp-rs#2063)

* [esp-metadata] Remove lazy_static in favor of OnceLock

* [esp-wifishark] Remove lazy_static in favor of normal initialisation

* [ieee802154-sniffer] Shorten SelectorConfig initialisation

* [ieee802154-sniffer] Remove lazy_static in favor of normal initialisation

* Remove most trait implementation features from `esp-hal` (esp-rs#2070)

* Eliminate esp-hal's `ufmt` feature

* Eliminate esp-hal's `embedded-hal-02` feature

* Eliminate esp-hal's `embedded-hal` feature

* Eliminate esp-hal's `embedded-io` feature

* Eliminate esp-hal's `async` feature

* Update `CHANGELOG.md`

* Remove `async` from required features for HIL tests

* Update migration guide

* Adding `I2C` HIL test (esp-rs#2023)

* i2c hil test

* pin

* fmt

* Test

* WIP (gpio test left)

* Finalize the CODE part (to be cleaned up)

fmt

* Smaller cleanup

* cleanup

* rebase

* fix

* getting last chips ready

* Addressing reviews

* Remove Gpio type aliasses (esp-rs#2073)

* Remove Gpio type aliasses

* Clean up examples

* Remove the need to manually pass clocks around (esp-rs#1999)

* Clean up passing clocks to drivers

* Update changelog

* Initialise Clocks in a critical section

* Fix calling now() before init

* Fix doc

* Fix esp-wifi migration guide

* Add safety comment

* Update tests

* Remove gpio dispatch macro-defining proc macro (esp-rs#2069)

* Keep a single PinType trait

* Merge impl blocks

* Deduplicate usb pad workaround

* Deduplicate some bit manipulation

* Remove gpio dispatch proc macro

* Inline PinType into GpioProperties

* Remove AnyInputOnlyPin (esp-rs#2071)

* Remove AnyInputOnlyPin

* Add section to migration guide

* Remove unnecessary enum

Co-authored-by: Dominic Fischer <[email protected]>

---------

Co-authored-by: Dominic Fischer <[email protected]>
Co-authored-by: Jesse Braham <[email protected]>

* Accept ErasedPin in AnyPin (esp-rs#2072)

Co-authored-by: Jesse Braham <[email protected]>

* fix issue handler, don't rebuild on main the merge queue checks this for us (esp-rs#2077)

* Fix nightly warnings (esp-rs#2082)

* Build examples in debug mode (esp-rs#2078)

* Build examples in debug mode

* Allow building psram examples in debug mode in CI

* Don't rebuild tests, try to avoid rebuilding dependencies

* Improve SHA driver API (esp-rs#2049)

Co-authored-by: Dominic Fischer <[email protected]>

* [esp-hal-procmacros] Update to proc-macro-error2 (esp-rs#2090)

* lcd_cam: fix wrong buffer length used if 16bit and len<=8192 (esp-rs#2085)

* lcd_cam: fix wrong buffer length used if 16bit and len<=8192

* changelog

* Implement sleep and wakeup functionalities for ESP32C2 esp-rs#1920 (esp-rs#1922)

* i2c: fix embedded-hal transactions (esp-rs#2028)

* i2c: fix embedded-hal transactions

* changelog+fmt

* small naming cleanup

* i2c: fix 1 byte reads

* typo

* small cleanup and add a few internal docs

* update changelog

* rebase & CHANGELOG

* extract next op conversion

* fix `setup_read()` logic for 0 length reads.

* return error for 0 length reads and 0 length  writes where start=false

* comment about max_len in setup_write()

* filter out 0 length read operations in `transaction()`

* Short circuit for problematic 0 lengths in read_operation and write_operation

* don't short circuit a 0 length write operation if stop=true

* handle write_read when the read bufer is empty

* Optionally type-erased GPIO drivers (esp-rs#2075)

* Remove type erased gpio structs

* Implement Peripheral for ErasedPin

* Simpler type erasing, accept ErasedPin in pin drivers, remove type erased drivers

* Reformulate pin drivers using Flex

* Erase gpio types by default

* Accept any pin in AnyPin

* Add changelog and migration guide

* Fix tests and examples

* Undo rename of clone_unchecked

* Rename `esp_hal::time::current_time` to `esp_hal::time::now` (esp-rs#2091)

* rename esp_hal::time::current_time to esp_hal::time::uptime

* changelog

* move more things to init

* s/uptime/now/g

* Add missing #[doc(hidden)] in xtensa-lx-rt-proc-macros (esp-rs#2097)

* Enable ESP32 HIL (esp-rs#1977)

* Enable ESP32 HIL

* RMT fixed

* SPI DMA partially works, _pcnt tests not working

* bckup

* finish

* readme and cleanup

* rebase + cleanup

* RMT S2 pin typo + clean forgotten comments

* review comments

* update 10000

* indentation

* replace cfg gate with cfg_if

* esp-wifi: other crates also provide `strchr` (littlefs2-sys) (esp-rs#2096)

* esp-wifi: other crates also provide strchr (littlefs2-sys)

* esp-wifi: other crates also provide strchr (littlefs2-sys)

* changelog

* fmt :-(

* Reordered RX-TX pairs to be consistent (esp-rs#2074)

* feat: Update rx-tx order in i2s

* feat: Update rx-tx order in dma macros

* feat: Update rx-tx order in spi

* feat: Update rx-tx order in aes

* feat: Update rx-tx order in mem2mem

* feat: Update rx-tx order in twai and split methods

* feat: Update rx-tx order in twai

* feat: Update rx-tx order in twai and uart docs

* docs: Add sentence about order

* docs: Update changelog

* feat: Update rx-tx order in embassy_interrupt_spi_dma tests

* style: Rustfmt

* docs: Migrating guide

* fix: Typo

Co-authored-by: Dániel Buga <[email protected]>

* fix: Diff

Co-authored-by: Dániel Buga <[email protected]>

* fix: Tests rx-tx order

* fix: Update new_with_default_pins order

* feat: Update rx/tx order in hil_test::common_test_pins!

* feat: Update dma_extmem2mem example

* fix: Revert deleted input arg

* style: rustfmt

* feat: Disable test_asymmetric_dma_transfer for S2

---------

Co-authored-by: Dániel Buga <[email protected]>

* Random additional GPIO cleanups, implement Peripheral for drivers (esp-rs#2094)

* Reuse enable_iomux_clk_gate

* Remove public functions

* Remove set_to_input

* Deduplicate constructor

* Deduplicate is_listening

* Hide PinFuture better

* Deduplicate set_int_enable

* Align macro indentation

* Typo

* Slightly simplify the touch_into macro

* Implement the AnalogPin trait directly

* Provide default impls for simple forwarding methods

* Newtype ErasedPin

* Merge rtc_pin macros

* Fmt

* Changelog

* Fix migration guide

* Fix example

* Fix ETM

* Make additional memory available as `dram2_uninit` (esp-rs#2079)

* Make additional memory available as `dram2_uninit`

* CHANGELOG.md

* Update esp-println version in usage section (esp-rs#2100)

* Add integration with bt-hci crate (esp-rs#1971)

* Add integration with bt-hci crate

Implementing traits from bt-hci allows the BleConnector to
be used with the Trouble BLE stack.

* use packed based read interface

* Improve example to allow another connection after disconnect

* update trouble version

* Workaround for spurious command complete events

* fix formatting

* ignore notify errors in example

* fix clippy warnings

* remove async feature from hal dependency

* remove deprecated feature from example

* Adopt to api changes

* Api fix for esp32

* Set rust-version of esp-wifi

* bump MSRV to 1.77 for CI and esp-hal

* Add changelog entry

* ensure that clock init happens after rtc domain is initialized (esp-rs#2104)

* Prepare esp-backtrace 0.14.1 (esp-rs#2107)

* esp-wifi uses global allocator, esp-alloc supports multiple regions (esp-rs#2099)

* esp-wifi uses global allocator, esp-alloc supports multiple regions

* CHANGELOG.md

* Apply suggestions

* Use `alloc` when linting esp-wifi

* Make coex example build for ESP32

* Re-enable some wifi examples for ESP32-S2

* Optionally depend on `esp-alloc` (by default)

* Rename INSTANCE -> HEAP

* feat: Add issue templates

---------

Signed-off-by: Priit Laes <[email protected]>
Co-authored-by: Kirill Mikhailov <[email protected]>
Co-authored-by: liebman <[email protected]>
Co-authored-by: Juraj Sadel <[email protected]>
Co-authored-by: Jesse Braham <[email protected]>
Co-authored-by: Dániel Buga <[email protected]>
Co-authored-by: Frostie314159 <[email protected]>
Co-authored-by: Sycrosity <[email protected]>
Co-authored-by: Scott Mabin <[email protected]>
Co-authored-by: Fan Jiang <[email protected]>
Co-authored-by: Dominic Fischer <[email protected]>
Co-authored-by: Dominic Fischer <[email protected]>
Co-authored-by: Anthony Grondin <[email protected]>
Co-authored-by: Priit Laes <[email protected]>
Co-authored-by: Björn Quentin <[email protected]>
Co-authored-by: Gnome! <[email protected]>
Co-authored-by: M4tsuri <[email protected]>
Co-authored-by: Szybet <[email protected]>
Co-authored-by: Ulf Lilleengen <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants