Skip to content

Commit 1e8f045

Browse files
committed
add last_read property
1 parent 6ff3fe8 commit 1e8f045

File tree

4 files changed

+82
-38
lines changed

4 files changed

+82
-38
lines changed

ports/raspberrypi/bindings/rp2pio/StateMachine.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,11 @@ static mp_obj_t rp2pio_statemachine_background_write(size_t n_args, const mp_obj
572572
fill_buf_info(&once_info, args[ARG_once].u_obj, &stride_in_bytes, MP_BUFFER_READ);
573573
fill_buf_info(&loop_info, args[ARG_loop].u_obj, &stride_in_bytes, MP_BUFFER_READ);
574574
fill_buf_info(&loop2_info, args[ARG_loop2].u_obj, &stride_in_bytes, MP_BUFFER_READ);
575+
576+
self->once_write_buf_obj = args[ARG_once].u_obj;
577+
self->loop_write_buf_obj = args[ARG_loop].u_obj;
578+
self->loop2_write_buf_obj = args[ARG_loop2].u_obj;
579+
575580
if (!stride_in_bytes) {
576581
return mp_const_none;
577582
}
@@ -690,19 +695,21 @@ static mp_obj_t rp2pio_statemachine_background_read(size_t n_args, const mp_obj_
690695
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
691696
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
692697

693-
sm_buf_info once_read_info;
694-
sm_buf_info loop_read_info;
695-
sm_buf_info loop2_read_info;
696698
size_t stride_in_bytes = 0;
697-
fill_buf_info(&once_read_info, args[ARG_once].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
698-
fill_buf_info(&loop_read_info, args[ARG_loop].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
699-
fill_buf_info(&loop2_read_info, args[ARG_loop2].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
699+
700+
self->once_read_buf_obj = args[ARG_once].u_obj;
701+
self->loop_read_buf_obj = args[ARG_loop].u_obj;
702+
self->loop2_read_buf_obj = args[ARG_loop2].u_obj;
703+
704+
fill_buf_info(&self->once_read_buf_info, args[ARG_once].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
705+
fill_buf_info(&self->loop_read_buf_info, args[ARG_loop].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
706+
fill_buf_info(&self->loop2_read_buf_info, args[ARG_loop2].u_obj, &stride_in_bytes, MP_BUFFER_WRITE);
707+
700708
if (!stride_in_bytes) {
701709
return mp_const_none;
702710
}
703711

704-
bool ok = common_hal_rp2pio_statemachine_background_read(self, &once_read_info, &loop_read_info, &loop2_read_info,
705-
stride_in_bytes, args[ARG_swap].u_bool);
712+
bool ok = common_hal_rp2pio_statemachine_background_read(self, stride_in_bytes, args[ARG_swap].u_bool);
706713

707714
if (mp_hal_is_interrupted()) {
708715
return mp_const_none;

ports/raspberrypi/bindings/rp2pio/StateMachine.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ bool common_hal_rp2pio_statemachine_background_write(rp2pio_statemachine_obj_t *
5656
uint8_t stride_in_bytes, bool swap);
5757

5858
bool common_hal_rp2pio_statemachine_background_read(rp2pio_statemachine_obj_t *self,
59-
const sm_buf_info *once_read_buf, const sm_buf_info *loop_read_buf, const sm_buf_info *loop2_read_buf,
6059
uint8_t stride_in_bytes, bool swap);
6160

6261
bool common_hal_rp2pio_statemachine_stop_background_write(rp2pio_statemachine_obj_t *self);

ports/raspberrypi/common-hal/rp2pio/StateMachine.c

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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
13391356
void 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

13581381
bool 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

14011424
mp_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

14051432
mp_obj_t common_hal_rp2pio_statemachine_get_last_write(rp2pio_statemachine_obj_t *self) {

ports/raspberrypi/common-hal/rp2pio/StateMachine.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,19 @@ typedef struct {
5555
sm_buf_info write_buf[RP2PIO_STATEMACHINE_N_BUFS];
5656
sm_buf_info read_buf[RP2PIO_STATEMACHINE_N_BUFS];
5757

58-
sm_buf_info current_write_buf, next_write_buf_1, next_write_buf_2, next_write_buf_3;
58+
mp_obj_t once_read_buf_obj, loop_read_buf_obj, loop2_read_buf_obj;
59+
sm_buf_info once_read_buf_info, loop_read_buf_info, loop2_read_buf_info;
60+
5961
sm_buf_info current_read_buf, next_read_buf_1, next_read_buf_2, next_read_buf_3;
62+
mp_obj_t current_read_buf_obj, next_read_buf_1_obj, next_read_buf_2_obj, next_read_buf_3_obj;
63+
64+
mp_obj_t once_write_buf_obj, loop_write_buf_obj, loop2_write_buf_obj;
65+
sm_buf_info once_write_buf_info, loop_write_buf_info, loop2_write_buf_info;
66+
67+
mp_obj_t current_write_buf_obj, next_write_buf_1_obj, next_write_buf_2_obj, next_write_buf_3_obj;
68+
sm_buf_info current_write_buf, next_write_buf_1, next_write_buf_2, next_write_buf_3;
69+
70+
bool switched_buffers;
6071

6172
int background_stride_in_bytes;
6273
bool dma_completed_write, byteswap;

0 commit comments

Comments
 (0)