diff --git a/ili9341.c b/ili9341.c index e42d6de..abf5a76 100644 --- a/ili9341.c +++ b/ili9341.c @@ -29,6 +29,7 @@ #define DC_DATA palSetPad(GPIOB, 7) uint16_t spi_buffer[1024]; +MUTEX_DECL(spi_buffer_mutex); void ssp_wait(void) @@ -278,6 +279,8 @@ void ili9341_bulk(int x, int y, int w, int h) uint8_t yy[4] = { y >> 8, y, (y+h-1) >> 8, (y+h-1) }; int len = w * h; + chMtxLock(&spi_buffer_mutex); + send_command(0x2A, 4, xx); send_command(0x2B, 4, yy); send_command(0x2C, 0, NULL); @@ -287,6 +290,8 @@ void ili9341_bulk(int x, int y, int w, int h) dmaStreamSetMode(dmatx, txdmamode | STM32_DMA_CR_MINC); dmaStreamEnable(dmatx); dmaWaitCompletion(dmatx); + + chMtxUnlock(&spi_buffer_mutex); } #endif @@ -340,6 +345,7 @@ ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg) uint16_t *buf = spi_buffer; uint16_t bits; int c, r; + chMtxLock(&spi_buffer_mutex); for(c = 0; c < 7; c++) { bits = x5x7_bits[(ch * 7) + c]; for (r = 0; r < 5; r++) { @@ -348,6 +354,7 @@ ili9341_drawchar_5x7(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg) } } ili9341_bulk(x, y, 5, 7); + chMtxUnlock(&spi_buffer_mutex); } void @@ -366,6 +373,7 @@ ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_ uint16_t *buf = spi_buffer; uint16_t bits; int c, r; + chMtxLock(&spi_buffer_mutex); for(c = 0; c < 7*size; c++) { bits = x5x7_bits[(ch * 7) + (c / size)]; for (r = 0; r < 5*size; r++) { @@ -376,6 +384,7 @@ ili9341_drawchar_size(uint8_t ch, int x, int y, uint16_t fg, uint16_t bg, uint8_ } } ili9341_bulk(x, y, 5*size, 7*size); + chMtxUnlock(&spi_buffer_mutex); } void @@ -438,6 +447,7 @@ ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint const uint32_t *bitmap = &font->bitmap[font->slide * ch]; int c, r, j; + chMtxLock(&spi_buffer_mutex); for (c = 0; c < font->slide; c++) { for (j = 0; j < font->scaley; j++) { bits = bitmap[c]; @@ -448,6 +458,7 @@ ili9341_drawfont(uint8_t ch, const font_t *font, int x, int y, uint16_t fg, uint } } ili9341_bulk(x, y, font->width, font->height); + chMtxUnlock(&spi_buffer_mutex); } #if 0 diff --git a/main.c b/main.c index b18f1bc..f691ec2 100644 --- a/main.c +++ b/main.c @@ -52,7 +52,6 @@ int8_t frequency_updated = FALSE; int8_t sweep_enabled = TRUE; int8_t cal_auto_interpolate = TRUE; uint16_t redraw_request = 0; // contains REDRAW_XXX flags -int8_t stop_the_world = FALSE; int16_t vbat = 0; @@ -63,11 +62,6 @@ static THD_FUNCTION(Thread1, arg) chRegSetThreadName("sweep"); while (1) { - if (stop_the_world) { - __WFI(); - continue; - } - if (sweep_enabled) { chMtxLock(&mutex); sweep(); @@ -140,6 +134,8 @@ transform_domain(void) // use spi_buffer as temporary buffer // and calculate ifft for time domain float* tmp = (float*)spi_buffer; + chMtxLock(&spi_buffer_mutex); + chMtxLock(&mutex); uint8_t window_size, offset; uint8_t is_lowpass = FALSE; @@ -204,6 +200,8 @@ transform_domain(void) } } } + chMtxUnlock(&mutex); + chMtxUnlock(&spi_buffer_mutex); } static void cmd_pause(BaseSequentialStream *chp, int argc, char *argv[]) @@ -505,13 +503,9 @@ static void cmd_capture(BaseSequentialStream *chp, int argc, char *argv[]) (void)argc; (void)argv; - // pause sweep - stop_the_world = TRUE; - - chThdSleepMilliseconds(1000); - // use uint16_t spi_buffer[1024] (defined in ili9341) for read buffer uint16_t *buf = &spi_buffer[0]; + chMtxLock(&spi_buffer_mutex); int len = 320 * 240; int i; ili9341_read_memory(0, 0, 320, 240, PART, buf); @@ -530,8 +524,7 @@ static void cmd_capture(BaseSequentialStream *chp, int argc, char *argv[]) len -= PART; } //*/ - - stop_the_world = FALSE; + chMtxUnlock(&spi_buffer_mutex); } #if 0 @@ -1929,6 +1922,7 @@ int main(void) chSysInit(); chMtxObjectInit(&mutex); + chMtxObjectInit(&spi_buffer_mutex); //palSetPadMode(GPIOB, 8, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN); //palSetPadMode(GPIOB, 9, PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN); diff --git a/nanovna.h b/nanovna.h index 6a14fe1..217ceb3 100644 --- a/nanovna.h +++ b/nanovna.h @@ -24,6 +24,7 @@ */ extern float measured[2][101][2]; +extern mutex_t spi_buffer_mutex; #define CAL_LOAD 0 #define CAL_OPEN 1 diff --git a/plot.c b/plot.c index a7167ed..bd348db 100644 --- a/plot.c +++ b/plot.c @@ -1153,6 +1153,8 @@ draw_cell(int m, int n) grid_mode |= GRID_RECTANGULAR; } + chMtxLock(&spi_buffer_mutex); + PULSE; /* draw grid */ if (grid_mode & GRID_RECTANGULAR) { @@ -1245,6 +1247,7 @@ draw_cell(int m, int n) cell_draw_refpos(m, n, w, h); ili9341_bulk(OFFSETX + x0off, OFFSETY + y0, w, h); + chMtxUnlock(&spi_buffer_mutex); } void @@ -1528,6 +1531,8 @@ draw_battery_status(void) uint16_t *buf = spi_buffer; uint8_t vbati = vbat2bati(vbat); uint16_t col = vbati == 0 ? RGB565(0, 255, 0) : RGB565(0, 0, 240); + + chMtxLock(&spi_buffer_mutex); memset(spi_buffer, 0, w * h * 2); // battery head @@ -1587,6 +1592,7 @@ draw_battery_status(void) buf[y * w + x++] = col; ili9341_bulk(0, 1, w, h); + chMtxUnlock(&spi_buffer_mutex); } void