RTEMS | bsp/aarch64/raspberrypi: Add I2C interrupt support (!682)
Christian Mauderer (@c-mauderer)
gitlab at rtems.org
Tue Aug 26 09:30:39 UTC 2025
Christian Mauderer commented on a discussion on bsps/aarch64/raspberrypi/i2c/raspberrypi-i2c.c: https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/682#note_129455
> bool read_transfer;
> } raspberrypi_i2c_bus;
>
> -static int i2c_polling_read( raspberrypi_i2c_bus *bus )
> +static int rpi_i2c_bus_transfer( raspberrypi_i2c_bus *bus )
> {
> - while ( !( S_REG( bus ) & S_DONE ) && ( bus->remaining_bytes > 0 ) ) {
> - while ( ( S_REG( bus ) & S_RXD ) && ( bus->remaining_bytes > 0 ) ) {
> + while ( bus->remaining_bytes > 0 ) {
> + if ( bus->read_transfer ) {
> + while ( ( S_REG( bus ) & S_RXD ) == 0 ) {
> + }
Do you know how the clock stretching feature works? Basically, a slave is allowed to just keep the clock line on low if the master is too fast. That can happen during a transfer. So it's quite possible that instead of a S_RXD, you get a S_CLKT. In that case, you will never receive the S_RXD and your code will hang here. So instead of the `while ( ( S_REG( bus ) & S_RXD ) == 0 )` you need something like a `while ( ( S_REG( bus ) & (S_RXD | S_CLKT) ) == 0 )` and then you have to check whether the status is S_RXD or S_CLKT to decide whether you continue or abort the transfer.
--
View it on GitLab: https://gitlab.rtems.org/rtems/rtos/rtems/-/merge_requests/682#note_129455
You're receiving this email because of your account on gitlab.rtems.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/bugs/attachments/20250826/bd1deb23/attachment.htm>
More information about the bugs
mailing list