-
Notifications
You must be signed in to change notification settings - Fork 13.3k
SPI::transferBytes pending changes #4967
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
Comments
I would suggest supporting a simple alignment check and fix for transferBytes() because I believe it used to support unaligned transfers and libs like SDFat were using it that way. The simple fixup should decompse to an "AND" of the address and a jump-on-zero (2 or 3 insns total) addition to transferBytes() and make things easier for existing older libs. |
Specifically, transferBytes needs to handle misaligned pointers and non-by-4 lengths. |
Fixes esp8266#4967 Support any alignment of input and output pointers and transfer lengths in SPI::transferBytes. Use 32-bit transfers and FIFO as much as possible.
* Allow unaligned input/output to SPI::transferBytes Fixes #4967 Support any alignment of input and output pointers and transfer lengths in SPI::transferBytes. Use 32-bit transfers and FIFO as much as possible. * Refactor misaligned transfer, avoid RMW to FIFO The SPI FIFO can't properly do RMW (i.e. bytewise updates) because when you read the FIFO you are actually reading the SPI read data, not what was written into the write FIFO. Refactor the transferBytes to take account of this. For aligned input and outputs, perform as before (but handle non-x4 sizes properly). For misaligned inputs, if it's unidirectional then do bytewise until the direction data pointer is aligned and then do 32b accesses. Fod bidirectional and misaligned inputs, copy the output data to an aligned buffer, do the transfer, then copy the read back data from temp aligned buffer to the real input buffer. * Fix comments, clean condition checks, save stack Add more comments and adjust naming to be more informative in transferBytes_ and *aligned_. Save 64bytes of stack in double misaligned case. * Optimize misaligned transfers, reduce code size On any misaligned input or output, always use a temp buffer. No need for special casing and bytewise ::transfer(). This should be faster as bytewise ::transfer involves a significant number of IO register accesses and setup. Thanks to @devyte for the suggestion.
Basic Infos
Platform
Settings in IDE
Problem Description
This issue is meant to track pending changes to SPI::transferBytes, specifically a missing assert and some api optimizations.
Ref: #4925 #2677 .
edit 19/01/22 d-a-v: The API has to be clarified.
transfer(buffer)
andtransferBytes(buffer)
have the same signature, the first accepts unaligned buffer, not the second.The text was updated successfully, but these errors were encountered: