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.


_______________________________________________
bugs mailing list
[email protected]
http://lists.rtems.org/mailman/listinfo/bugs

Reply via email to