@@ -1222,42 +1222,51 @@ int common_hal_rp2pio_statemachine_get_pending_write(rp2pio_statemachine_obj_t *
12221222
12231223// =================================================================================
12241224
1225- bool common_hal_rp2pio_statemachine_background_read (rp2pio_statemachine_obj_t * self ,
1226- const sm_buf_info * once_read_buf , const sm_buf_info * loop_read_buf , const sm_buf_info * loop2_read_buf ,
1227- uint8_t stride_in_bytes , bool swap ) {
1225+ bool common_hal_rp2pio_statemachine_background_read (rp2pio_statemachine_obj_t * self , uint8_t stride_in_bytes , bool swap ) {
12281226
12291227 uint8_t pio_index = pio_get_index (self -> pio );
12301228 uint8_t sm = self -> state_machine ;
12311229
1232- int pending_buffers_read = (once_read_buf -> info .len != 0 ) + (loop_read_buf -> info .len != 0 ) + (loop2_read_buf -> info .len != 0 );
1230+ self -> switched_buffers = false;
1231+
1232+ 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 );
12331233
12341234 // If all buffer arguments have nonzero length, read once_read_buf, loop_read_buf, loop2_read_buf and repeat last two forever
12351235
1236- if (!once_read_buf -> info .len ) {
1237- if (!loop_read_buf -> info .len ) {
1236+ if (!( self -> once_read_buf_info . info .len ) ) {
1237+ if (!( self -> loop_read_buf_info . info .len ) ) {
12381238 // If once_read_buf and loop_read_buf have zero length, read loop2_read_buf forever
1239- once_read_buf = loop2_read_buf ;
1240- loop_read_buf = loop2_read_buf ;
1239+ self -> once_read_buf_info = self -> loop2_read_buf_info ;
1240+ self -> once_read_buf_obj = self -> loop2_read_buf_obj ;
1241+ self -> loop_read_buf_info = self -> loop2_read_buf_info ;
1242+ self -> loop_read_buf_obj = self -> loop2_read_buf_obj ;
12411243 } else {
1242- if (!loop2_read_buf -> info .len ) {
1244+ if (!( self -> loop2_read_buf_info . info .len ) ) {
12431245 // If once_read_buf and loop2_read_buf have zero length, read loop_read_buf forever
1244- once_read_buf = loop_read_buf ;
1245- loop2_read_buf = loop_read_buf ;
1246+ self -> once_read_buf_info = self -> loop_read_buf_info ;
1247+ self -> once_read_buf_obj = self -> loop_read_buf_obj ;
1248+ self -> loop2_read_buf_info = self -> loop_read_buf_info ;
1249+ self -> loop2_read_buf_obj = self -> loop_read_buf_obj ;
12461250 } else {
12471251 // If only once_read_buf has zero length, read loop_read_buf, loop2_read_buf, and repeat last two forever
1248- once_read_buf = loop_read_buf ;
1249- loop_read_buf = loop2_read_buf ;
1250- loop2_read_buf = once_read_buf ;
1252+ self -> once_read_buf_info = self -> loop_read_buf_info ;
1253+ self -> once_read_buf_obj = self -> loop_read_buf_obj ;
1254+ self -> loop_read_buf_info = self -> loop2_read_buf_info ;
1255+ self -> loop_read_buf_obj = self -> loop2_read_buf_obj ;
1256+ self -> loop2_read_buf_info = self -> once_read_buf_info ;
1257+ self -> loop2_read_buf_obj = self -> once_read_buf_obj ;
12511258 }
12521259 }
12531260 } else {
1254- if (!loop_read_buf -> info .len ) {
1261+ if (!( self -> loop_read_buf_info . info .len ) ) {
12551262 // 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
1256- loop_read_buf = loop2_read_buf ;
1263+ self -> loop_read_buf_info = self -> loop2_read_buf_info ;
1264+ self -> loop_read_buf_obj = self -> loop2_read_buf_obj ;
12571265 } else {
1258- if (!loop2_read_buf -> info .len ) {
1266+ if (!( self -> loop2_read_buf_info . info .len ) ) {
12591267 // 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
1260- loop2_read_buf = loop_read_buf ;
1268+ self -> loop2_read_buf_info = self -> loop_read_buf_info ;
1269+ self -> loop2_read_buf_obj = self -> loop_read_buf_obj ;
12611270 }
12621271 }
12631272 }
@@ -1278,9 +1287,12 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
12781287 }
12791288
12801289 common_hal_mcu_disable_interrupts ();
1281- self -> next_read_buf_1 = * once_read_buf ;
1282- self -> next_read_buf_2 = * loop_read_buf ;
1283- self -> next_read_buf_3 = * loop2_read_buf ;
1290+ self -> next_read_buf_1 = self -> once_read_buf_info ;
1291+ self -> next_read_buf_1_obj = self -> once_read_buf_obj ;
1292+ self -> next_read_buf_2 = self -> loop_read_buf_info ;
1293+ self -> next_read_buf_2_obj = self -> loop_read_buf_obj ;
1294+ self -> next_read_buf_3 = self -> loop2_read_buf_info ;
1295+ self -> next_read_buf_3_obj = self -> loop2_read_buf_obj ;
12841296 self -> pending_buffers_read = pending_buffers_read ;
12851297
12861298 if (self -> dma_completed_read && self -> next_read_buf_1 .info .len ) {
@@ -1307,10 +1319,15 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13071319
13081320 dma_channel_config c_read ;
13091321
1310- self -> current_read_buf = * once_read_buf ;
1311- self -> next_read_buf_1 = * loop_read_buf ;
1312- self -> next_read_buf_2 = * loop2_read_buf ;
1313- self -> next_read_buf_3 = * loop_read_buf ;
1322+ self -> current_read_buf = self -> once_read_buf_info ;
1323+ self -> current_read_buf_obj = self -> once_read_buf_obj ;
1324+ self -> next_read_buf_1 = self -> loop_read_buf_info ;
1325+ self -> next_read_buf_1_obj = self -> loop_read_buf_obj ;
1326+ self -> next_read_buf_2 = self -> loop2_read_buf_info ;
1327+ self -> next_read_buf_2_obj = self -> loop2_read_buf_obj ;
1328+ self -> next_read_buf_3 = self -> loop_read_buf_info ;
1329+ self -> next_read_buf_3_obj = self -> loop_read_buf_obj ;
1330+
13141331 self -> pending_buffers_read = pending_buffers_read ;
13151332 self -> dma_completed_read = false;
13161333
@@ -1321,9 +1338,9 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13211338 channel_config_set_write_increment (& c_read , true);
13221339 channel_config_set_bswap (& c_read , swap );
13231340 dma_channel_configure (channel_read , & c_read ,
1324- once_read_buf -> info .buf ,
1341+ self -> once_read_buf_info . info .buf ,
13251342 rx_source ,
1326- once_read_buf -> info .len / stride_in_bytes ,
1343+ self -> once_read_buf_info . info .len / stride_in_bytes ,
13271344 false);
13281345
13291346 common_hal_mcu_disable_interrupts ();
@@ -1339,9 +1356,13 @@ bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *s
13391356void rp2pio_statemachine_dma_complete_read (rp2pio_statemachine_obj_t * self , int channel_read ) {
13401357
13411358 self -> current_read_buf = self -> next_read_buf_1 ;
1359+ self -> current_read_buf_obj = self -> next_read_buf_1_obj ;
13421360 self -> next_read_buf_1 = self -> next_read_buf_2 ;
1361+ self -> next_read_buf_1_obj = self -> next_read_buf_2_obj ;
13431362 self -> next_read_buf_2 = self -> next_read_buf_3 ;
1363+ self -> next_read_buf_2_obj = self -> next_read_buf_3_obj ;
13441364 self -> next_read_buf_3 = self -> next_read_buf_1 ;
1365+ self -> next_read_buf_3_obj = self -> next_read_buf_1_obj ;
13451366
13461367 if (self -> current_read_buf .info .buf ) {
13471368 if (self -> pending_buffers_read > 0 ) {
@@ -1353,6 +1374,8 @@ void rp2pio_statemachine_dma_complete_read(rp2pio_statemachine_obj_t *self, int
13531374 self -> dma_completed_read = true;
13541375 self -> pending_buffers_read = 0 ; // should be a no-op
13551376 }
1377+
1378+ self -> switched_buffers = true;
13561379}
13571380
13581381bool common_hal_rp2pio_statemachine_stop_background_read (rp2pio_statemachine_obj_t * self ) {
@@ -1399,7 +1422,11 @@ mp_obj_t common_hal_rp2pio_statemachine_get_rxfifo(rp2pio_statemachine_obj_t *se
13991422}
14001423
14011424mp_obj_t common_hal_rp2pio_statemachine_get_last_read (rp2pio_statemachine_obj_t * self ) {
1402- return mp_const_none ;
1425+ if (self -> switched_buffers ) {
1426+ self -> switched_buffers = false;
1427+ return self -> next_read_buf_1_obj ;
1428+ }
1429+ return mp_const_empty_bytes ;
14031430}
14041431
14051432mp_obj_t common_hal_rp2pio_statemachine_get_last_write (rp2pio_statemachine_obj_t * self ) {
0 commit comments