spi_buffer can be modified from both thread. it should be protected with exclusive lock.

pull/38/head
cho45 7 years ago
parent 0b885f2640
commit a46291c4e1

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

@ -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);

@ -24,6 +24,7 @@
*/
extern float measured[2][101][2];
extern mutex_t spi_buffer_mutex;
#define CAL_LOAD 0
#define CAL_OPEN 1

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

Loading…
Cancel
Save

Powered by TurnKey Linux.