Skip to content

Implement SPI Flash driver and server#347

Open
lchiawei wants to merge 2 commits into
OpenPRoT:earlgrey-hwefrom
lchiawei:feature/spi-driver-server
Open

Implement SPI Flash driver and server#347
lchiawei wants to merge 2 commits into
OpenPRoT:earlgrey-hwefrom
lchiawei:feature/spi-driver-server

Conversation

@lchiawei

Copy link
Copy Markdown

This PR depends on #345 and #346. I will rebase this PR onto them after they are merged.

@lchiawei
lchiawei requested a review from cfrantz July 14, 2026 22:09
@lchiawei
lchiawei force-pushed the feature/spi-driver-server branch 6 times, most recently from 58c84b3 to bf0f941 Compare July 16, 2026 17:58
Comment thread target/earlgrey/tests/spi_flash/target.rs Outdated
Comment thread target/earlgrey/tests/spi_flash/combined_flash_server.rs Outdated
Comment thread target/earlgrey/tests/spi_flash/combined_flash_server.rs Outdated
Comment thread drivers/flash/spi_flash.rs Outdated
Comment thread drivers/flash/spi_flash.rs Outdated
@lchiawei
lchiawei force-pushed the feature/spi-driver-server branch from bf0f941 to 48d9416 Compare July 22, 2026 23:48
@lchiawei

lchiawei commented Jul 22, 2026

Copy link
Copy Markdown
Author

Resolved all of the comments. Please compare with 48d9416, which is for easy review. I will re-format the commits and rebase on my SPI Host later.

@lchiawei
lchiawei force-pushed the feature/spi-driver-server branch from 26120df to 754e644 Compare July 22, 2026 23:52
@lchiawei

Copy link
Copy Markdown
Author

The changes between 48d9416 and 754e644 are only reformatting. I will then rebase on my SPI Host.

@lchiawei
lchiawei marked this pull request as ready for review July 22, 2026 23:55
lchiawei added 2 commits July 23, 2026 07:58
Key modifications and fixes made during the port:
- Makes the driver explicitly enter "Global 4-byte" mode when flash size
  >= 16 MB, which includes:
  * Update the command config in `from_sfdp()` &
    `from_sfdp_conservative()`.
  * Explicitly enters the global 4-byte mode at the end of
    initialization.
- Skips the support of DUAL / QUAD in `SpiTxnWidth`. Also, inits the
  driver with non-conservative version for now.
- Moves `transfer_req_resp` from legacy SPI Host driver to SPI Flash
  driver, as a helper method.
- Moves `check_valid_size` from legacy Flash trait to SPI Flash
  driver, as a helper method.
- Adds `is_busy` helper method as what we did for `BlockingFlash` trait,
  although we didn't implement this trait directly now.
- Wraps legacy `page_size` and `size` into a `geometry` method required
  by `Flash` trait. Currently we hard-coded the erasable bitmap as 4KB
  and 64KB, and we may parse them in the future.
- For `erase()` method, the `Flash` trait only accepts the size declared
  in the erasable bitmap, but here we uses the legacy implementation
  which will loop over the size to erase. However, we still only accepts
  power of 2 as the erase size due to `Flash` trait's contract. Also
  removes the original `erase_page()` method.
- Drops `FlashStreamingRead` support (as we mentioned in SPI Host
  driver commit).

Mock SPI Device & Unit Test Refactoring:
- Ports the legacy `FakeSpiHost` to OpenPRoT, renaming it to `FakeSpiDevice`
  under `drivers/mock/spi_device_fake.rs` and implementing standard
  `embedded_hal::spi::SpiDevice` and `ErrorType` traits.
- Rewrites mock transmission logic to be stateless by removing `TxnState`,
  supporting multi-buffer transaction execution and automatic TX/RX clock
  log alignment and padding.
- Introduces `assert_all_expectations_met()` to strictly assert that all
  preprogrammed SPI responses are executed, preventing silent test leaks.
- Adapts unit tests to new `PowerOf2Usize` API constraints:
  * Erase lengths in mixed granularity and multiple page tests are changed
    to powers of 2 (e.g., 144KB -> 128KB, 12KB -> 16KB).
  * Obsolete `test_erase_zero_length` is removed as zero-length input is
    prevented at compile time.
- Aligns mock expectations with Global 4-byte address mode: expected
  opcodes are updated from 4-byte-specific ones (e.g. `OP_READ4B`) to
  standard opcodes (e.g. `OP_READ`) with 4-byte address streams.
- Removes obsolete unit tests for prefetch, FIFO draining, and
  Streaming Read.

Signed-off-by: Chia-Wei Liu <lchiawei@google.com>
@lchiawei
lchiawei force-pushed the feature/spi-driver-server branch from 754e644 to 3e68ba8 Compare July 23, 2026 00:02
@lchiawei

Copy link
Copy Markdown
Author

Rebased to the ToT and fixed the compilation error caused by the changes in our previous commits (we changed the way that we construct a SpiHost and introduce a new type for error code SpiError).

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.

2 participants