@@ -1205,42 +1205,51 @@ int common_hal_rp2pio_statemachine_get_pending_write(rp2pio_statemachine_obj_t *
12051205
12061206// =================================================================================
12071207
1208- bool common_hal_rp2pio_statemachine_background_read (rp2pio_statemachine_obj_t * self ,
1209- const sm_buf_info * once_read_buf , const sm_buf_info * loop_read_buf , const sm_buf_info * loop2_read_buf ,
1210- uint8_t stride_in_bytes , bool swap ) {
1208+ bool common_hal_rp2pio_statemachine_background_read (rp2pio_statemachine_obj_t * self , uint8_t stride_in_bytes , bool swap ) {
12111209
12121210 uint8_t pio_index = pio_get_index (self -> pio );
12131211 uint8_t sm = self -> state_machine ;
12141212
1215- int pending_buffers_read = (once_read_buf -> info .len != 0 ) + (loop_read_buf -> info .len != 0 ) + (loop2_read_buf -> info .len != 0 );
1213+ self -> switched_buffers = false;
1214+
1215+ int pending_buffers_read = (self -> once_read_buf_info .info .len != 0 ) + (self -> loop_read_buf_info .info .len != 0 ) + (self -> loop2_read_buf_info .info .len != 0 );
12161216
12171217 // If all buffer arguments have nonzero length, read once_read_buf, loop_read_buf, loop2_read_buf and repeat last two forever
12181218
1219- if (!once_read_buf -> info .len ) {
1220- if (!loop_read_buf -> info .len ) {
1219+ if (!( self -> once_read_buf_info . info .len ) ) {
1220+ if (!( self -> loop_read_buf_info . info .len ) ) {
12211221 // If once_read_buf and loop_read_buf have zero length, read loop2_read_buf forever
1222- once_read_buf = loop2_read_buf ;
1223- loop_read_buf = loop2_read_buf ;
1222+ self -> once_read_buf_info = self -> loop2_read_buf_info ;
1223+ self -> once_read_buf_obj = self -> loop2_read_buf_obj ;
1224+ self -> loop_read_buf_info = self -> loop2_read_buf_info ;
1225+ self -> loop_read_buf_obj = self -> loop2_read_buf_obj ;
12241226 } else {
1225- if (!loop2_read_buf -> info .len ) {
1227+ if (!( self -> loop2_read_buf_info . info .len ) ) {
12261228 // If once_read_buf and loop2_read_buf have zero length, read loop_read_buf forever
1227- once_read_buf = loop_read_buf ;
1228- loop2_read_buf = loop_read_buf ;
1229+ self -> once_read_buf_info = self -> loop_read_buf_info ;
1230+ self -> once_read_buf_obj = self -> loop_read_buf_obj ;
1231+ self -> loop2_read_buf_info = self -> loop_read_buf_info ;
1232+ self -> loop2_read_buf_obj = self -> loop_read_buf_obj ;
12291233 } else {
12301234 // If only once_read_buf has zero length, read loop_read_buf, loop2_read_buf, and repeat last two forever
1231- once_read_buf = loop_read_buf ;
1232- loop_read_buf = loop2_read_buf ;
1233- loop2_read_buf = once_read_buf ;
1235+ self -> once_read_buf_info = self -> loop_read_buf_info ;
1236+ self -> once_read_buf_obj = self -> loop_read_buf_obj ;
1237+ self -> loop_read_buf_info = self -> loop2_read_buf_info ;
1238+ self -> loop_read_buf_obj = self -> loop2_read_buf_obj ;
1239+ self -> loop2_read_buf_info = self -> once_read_buf_info ;
1240+ self -> loop2_read_buf_obj = self -> once_read_buf_obj ;
12341241 }
12351242 }
12361243 } else {
1237- if (!loop_read_buf -> info .len ) {
1244+ if (!( self -> loop_read_buf_info . info .len ) ) {
12381245 // If once_read_buf has nonzero length and loop_read_buf has zero length, read once_read_buf, loop2_read_buf and repeat last buf forever
1239- loop_read_buf = loop2_read_buf ;
1246+ self -> loop_read_buf_info = self -> loop2_read_buf_info ;
1247+ self -> loop_read_buf_obj = self -> loop2_read_buf_obj ;
12401248 } else {
1241- if (!loop2_read_buf -> info .len ) {
1249+ if (!( self -> loop2_read_buf_info . info .len ) ) {
12421250 // If once_read_buf has nonzero length and loop2_read_buf have zero length, read once_read_buf, loop_read_buf and repeat last buf forever
1243- loop2_read_buf = loop_read_buf ;
1251+ self -> loop2_read_buf_info = self -> loop_read_buf_info ;
1252+ self -> loop2_read_buf_obj = self -> loop_read_buf_obj ;
12441253 }
12451254 }
12461255 }
@@ -1261,9 +1270,12 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
12611270 }
12621271
12631272 common_hal_mcu_disable_interrupts ();
1264- self -> next_read_buf_1 = * once_read_buf ;
1265- self -> next_read_buf_2 = * loop_read_buf ;
1266- self -> next_read_buf_3 = * loop2_read_buf ;
1273+ self -> next_read_buf_1 = self -> once_read_buf_info ;
1274+ self -> next_read_buf_1_obj = self -> once_read_buf_obj ;
1275+ self -> next_read_buf_2 = self -> loop_read_buf_info ;
1276+ self -> next_read_buf_2_obj = self -> loop_read_buf_obj ;
1277+ self -> next_read_buf_3 = self -> loop2_read_buf_info ;
1278+ self -> next_read_buf_3_obj = self -> loop2_read_buf_obj ;
12671279 self -> pending_buffers_read = pending_buffers_read ;
12681280
12691281 if (self -> dma_completed_read && self -> next_read_buf_1 .info .len ) {
@@ -1290,10 +1302,15 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
12901302
12911303 dma_channel_config c_read ;
12921304
1293- self -> current_read_buf = * once_read_buf ;
1294- self -> next_read_buf_1 = * loop_read_buf ;
1295- self -> next_read_buf_2 = * loop2_read_buf ;
1296- self -> next_read_buf_3 = * loop_read_buf ;
1305+ self -> current_read_buf = self -> once_read_buf_info ;
1306+ self -> current_read_buf_obj = self -> once_read_buf_obj ;
1307+ self -> next_read_buf_1 = self -> loop_read_buf_info ;
1308+ self -> next_read_buf_1_obj = self -> loop_read_buf_obj ;
1309+ self -> next_read_buf_2 = self -> loop2_read_buf_info ;
1310+ self -> next_read_buf_2_obj = self -> loop2_read_buf_obj ;
1311+ self -> next_read_buf_3 = self -> loop_read_buf_info ;
1312+ self -> next_read_buf_3_obj = self -> loop_read_buf_obj ;
1313+
12971314 self -> pending_buffers_read = pending_buffers_read ;
12981315 self -> dma_completed_read = false;
12991316
@@ -1304,9 +1321,9 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13041321 channel_config_set_write_increment (& c_read , true);
13051322 channel_config_set_bswap (& c_read , swap );
13061323 dma_channel_configure (channel_read , & c_read ,
1307- once_read_buf -> info .buf ,
1324+ self -> once_read_buf_info . info .buf ,
13081325 rx_source ,
1309- once_read_buf -> info .len / stride_in_bytes ,
1326+ self -> once_read_buf_info . info .len / stride_in_bytes ,
13101327 false);
13111328
13121329 common_hal_mcu_disable_interrupts ();
@@ -1322,9 +1339,13 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13221339void rp2pio_statemachine_dma_complete_read (rp2pio_statemachine_obj_t * self , int channel_read ) {
13231340
13241341 self -> current_read_buf = self -> next_read_buf_1 ;
1342+ self -> current_read_buf_obj = self -> next_read_buf_1_obj ;
13251343 self -> next_read_buf_1 = self -> next_read_buf_2 ;
1344+ self -> next_read_buf_1_obj = self -> next_read_buf_2_obj ;
13261345 self -> next_read_buf_2 = self -> next_read_buf_3 ;
1346+ self -> next_read_buf_2_obj = self -> next_read_buf_3_obj ;
13271347 self -> next_read_buf_3 = self -> next_read_buf_1 ;
1348+ self -> next_read_buf_3_obj = self -> next_read_buf_1_obj ;
13281349
13291350 if (self -> current_read_buf .info .buf ) {
13301351 if (self -> pending_buffers_read > 0 ) {
@@ -1336,6 +1357,8 @@ void rp2pio_statemachine_dma_complete_read(rp2pio_statemachine_obj_t *self, int
13361357 self -> dma_completed_read = true;
13371358 self -> pending_buffers_read = 0 ; // should be a no-op
13381359 }
1360+
1361+ self -> switched_buffers = true;
13391362}
13401363
13411364bool common_hal_rp2pio_statemachine_stop_background_read (rp2pio_statemachine_obj_t * self ) {
@@ -1382,7 +1405,11 @@ mp_obj_t common_hal_rp2pio_statemachine_get_rxfifo(rp2pio_statemachine_obj_t *se
13821405}
13831406
13841407mp_obj_t common_hal_rp2pio_statemachine_get_last_read (rp2pio_statemachine_obj_t * self ) {
1385- return mp_const_none ;
1408+ if (self -> switched_buffers ) {
1409+ self -> switched_buffers = false;
1410+ return self -> next_read_buf_1_obj ;
1411+ }
1412+ return mp_const_empty_bytes ;
13861413}
13871414
13881415mp_obj_t common_hal_rp2pio_statemachine_get_last_write (rp2pio_statemachine_obj_t * self ) {
0 commit comments