Skip to content

Commit eecb962

Browse files
committed
Updated 'spi' module
- fixed bug in slave callback Updated 'pye' editor - removed mem_info on exit left from testing
1 parent 6f4a861 commit eecb962

File tree

7 files changed

+22
-17
lines changed

7 files changed

+22
-17
lines changed

firmware/MaixPy.bin

0 Bytes
Binary file not shown.

firmware/MaixPy.kfpkg

-61 Bytes
Binary file not shown.

firmware/MaixPy_firmware.zip

-140 Bytes
Binary file not shown.

firmware/MaixPy_sqlite.bin

0 Bytes
Binary file not shown.

firmware/MaixPy_sqlite.kfpkg

-39 Bytes
Binary file not shown.

k210-freertos/mpy_support/modules/pye.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,4 @@ def pye(file_name, tab_size=4, undo=50):
892892
edit.deinit_tty()
893893
edit.yank_buffer = []
894894
## close
895-
mem_info()
896895
edit = None
897-
gc.collect()

k210-freertos/mpy_support/standard_lib/machine/machine_spi.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ typedef struct _machine_hw_spi_obj_t {
128128
uint32_t buffer_size;
129129
uint32_t slave_ro_size;
130130
bool slave_buffer_allocated;
131-
uint32_t *slave_cb; // slave callback function
131+
mp_obj_t slave_cb; // slave callback function
132132
ws2812b_buffer_t ws2812_buffer;
133133
uint16_t ws2812_lo;
134134
uint16_t ws2812_hi;
@@ -232,7 +232,7 @@ STATIC void machine_hw_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_p
232232
mp_printf(print, "\r\n (pin value of -1 means the pin is not used)");
233233

234234
if (self->spi_num == SPI_SLAVE) mp_printf(print, "\r\n buffer_size=%u (%u read_only), callback: %s",
235-
self->buffer_size, self->slave_ro_size, (self->slave_cb == NULL) ? "False" : "True");
235+
self->buffer_size, self->slave_ro_size, (self->slave_cb == mp_const_none) ? "False" : "True");
236236

237237
if ((self->spi_num == SPI_MASTER_WS2812_0) || (self->spi_num == SPI_MASTER_WS2812_1)) {
238238
mp_printf(print, "\r\n ws2812: pixels=%u, buffer size=%u (needs=%u)", self->ws2812_buffer.num_pix, self->buffer_size, self->ws_needed_buf_size);
@@ -485,7 +485,12 @@ static void spi_slave_task(void *pvParameters)
485485
vTaskDelete(NULL);
486486
}
487487
}
488+
TaskHandle_t task_handle = (TaskHandle_t)pvParameters;
488489
spi_slave_command_t slv_cmd = {0};
490+
// if the task uses some MicroPython functions, we have to save
491+
// MicroPython state in local storage pointers
492+
vTaskSetThreadLocalStoragePointer(NULL, THREAD_LSP_STATE, pvTaskGetThreadLocalStoragePointer(task_handle, THREAD_LSP_STATE));
493+
vTaskSetThreadLocalStoragePointer(NULL, THREAD_LSP_ARGS, pvTaskGetThreadLocalStoragePointer(task_handle, THREAD_LSP_ARGS));
489494

490495
while (1) {
491496
// Check notification
@@ -520,7 +525,7 @@ static void spi_slave_task(void *pvParameters)
520525
}
521526
}
522527
if (slave_obj->state == MACHINE_HW_SPI_STATE_INIT) {
523-
if ((slave_obj) && (slave_obj->slave_cb)) {
528+
if ((slave_obj) && (slave_obj->slave_cb != mp_const_none)) {
524529
// schedule callback function
525530
mp_obj_t tuple[4];
526531
tuple[0] = mp_obj_new_int(slv_cmd.cmd);
@@ -561,10 +566,10 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
561566
{ MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
562567
{ MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
563568
{ MP_QSTR_firstbit, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = MICROPY_PY_MACHINE_SPI_MSB} },
564-
{ MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = -1} },
569+
{ MP_QSTR_sck, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
565570
{ MP_QSTR_mosi, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = -1} },
566571
{ MP_QSTR_miso, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
567-
{ MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = -1} },
572+
{ MP_QSTR_cs, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1} },
568573
{ MP_QSTR_duplex, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = true} },
569574
{ MP_QSTR_bits, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 8} },
570575
{ MP_QSTR_slave_buffer, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
@@ -618,11 +623,13 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
618623
bool flag = true;
619624
if ((args[ARG_mosi].u_int < 0) || (args[ARG_mosi].u_int >= FPIOA_NUM_IO)) flag = false;
620625
else if (self->spi_num == SPI_SLAVE) {
626+
// in SLAVE mode cs, sck & mosi are required
621627
if ((args[ARG_sck].u_int < 0) || (args[ARG_sck].u_int >= FPIOA_NUM_IO)) flag = false;
622628
else if ((args[ARG_cs].u_int < 0) || (args[ARG_cs].u_int >= FPIOA_NUM_IO)) flag = false;
623629
else if ((args[ARG_miso].u_int < -1) || (args[ARG_miso].u_int >= FPIOA_NUM_IO)) flag = false;
624630
}
625631
else if (self->spi_num <= SPI_MASTER_1) {
632+
// in MASTER mode sck & mosi are required
626633
if ((args[ARG_sck].u_int < 0) || (args[ARG_sck].u_int >= FPIOA_NUM_IO)) flag = false;
627634
else if ((args[ARG_cs].u_int < -1) || (args[ARG_cs].u_int >= FPIOA_NUM_IO)) flag = false;
628635
else if ((args[ARG_miso].u_int < -1) || (args[ARG_miso].u_int >= FPIOA_NUM_IO)) flag = false;
@@ -679,7 +686,7 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
679686
self->sck = args[ARG_sck].u_int;
680687
self->cs = args[ARG_cs].u_int;
681688
self->slave_buffer = NULL;
682-
self->slave_cb = NULL;
689+
self->slave_cb = mp_const_none;
683690
if (args[ARG_rolen].u_int < 0) self->slave_ro_size = 0;
684691
else self->slave_ro_size = args[ARG_rolen].u_int;
685692

@@ -727,12 +734,12 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
727734
else {
728735
// SPI Slave
729736
BaseType_t res = xTaskCreate(
730-
spi_slave_task, // function entry
731-
"spi_slave_task", // task name
732-
configMINIMAL_STACK_SIZE, // stack_deepth
733-
NULL, // function argument
734-
MICROPY_TASK_PRIORITY+1, // task priority
735-
&slave_task); // task handle
737+
spi_slave_task, // function entry
738+
"spi_slave_task", // task name
739+
configMINIMAL_STACK_SIZE, // stack_deepth
740+
(void *)xTaskGetCurrentTaskHandle(), // function argument
741+
MICROPY_TASK_PRIORITY+1, // task priority
742+
&slave_task); // task handle
736743
if (res != pdPASS) slave_task = NULL;
737744
vTaskDelay(2);
738745
if (slave_task == NULL) {
@@ -759,14 +766,15 @@ mp_obj_t machine_hw_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_
759766
self->slave_buffer_allocated = true;
760767
}
761768
else {
769+
// MPy buffer object is provided
762770
mp_buffer_info_t bufinfo;
763771
mp_get_buffer_raise(args[ARG_buffer].u_obj, &bufinfo, MP_BUFFER_RW);
764772
if (bufinfo.len < SLAVE_BUFFER_MIN_SIZE) {
765773
io_close(self->handle);
766774
spi_hard_deinit(self);
767775
mp_raise_ValueError("SPI slave buffer size out of range");
768776
}
769-
self->buffer_size = bufinfo.len - 8;
777+
self->buffer_size = ((bufinfo.len * 8) / 8) - 8;
770778
self->slave_buffer = (uint8_t *)bufinfo.buf;
771779
self->slave_buffer_allocated = false;
772780
}
@@ -1160,8 +1168,7 @@ STATIC mp_obj_t mp_machine_spi_slave_callback(mp_obj_t self_in, mp_obj_t func)
11601168
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "Function argument required"));
11611169
}
11621170

1163-
if (func == mp_const_none) self->slave_cb = NULL;
1164-
else self->slave_cb = func;
1171+
self->slave_cb = func;
11651172

11661173
return mp_const_none;
11671174
}

0 commit comments

Comments
 (0)