Skip to content

Commit 3f2fee4

Browse files
committed
add last_read property
1 parent eda524f commit 3f2fee4

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
@@ -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
13221339
void 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

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

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

13881415
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)