From 5cdfcb08fbcaca99c92c157eb929a38ddf6415bb Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Mon, 15 Jun 2020 12:47:22 +0100 Subject: working 2nd display --- app/oled.c | 187 ++++++++++--------------------------------------------------- 1 file changed, 31 insertions(+), 156 deletions(-) (limited to 'app/oled.c') diff --git a/app/oled.c b/app/oled.c index dec54f2..e0c0bee 100644 --- a/app/oled.c +++ b/app/oled.c @@ -1,18 +1,8 @@ #include "project.h" -#define DMA_BUF_SZ (2 + (SSD1306_VRAM_SIZE)) - -uint8_t dma_buf[DMA_BUF_SZ]; -uint8_t update_buf[DMA_BUF_SZ]; -static int dma_in_progress = 0; -static int refresh_enabled = 0; -static uint32_t refresh_wdt = 0; -static int oled_sad = 0; - - int -ssd1306_cmds (uint8_t * buf, size_t len, int delay) +ssd1306_cmds (uint32_t i2c, uint8_t * buf, size_t len, int delay) { int ret = -1; @@ -22,17 +12,17 @@ ssd1306_cmds (uint8_t * buf, size_t len, int delay) do { - if (i2cp_start_transaction (SSD1306_I2C_ADDRESS, I2C_WRITE)) + if (i2cp_start_transaction (i2c, SSD1306_I2C_ADDRESS, I2C_WRITE)) break; - if (i2cp_send (SSD1306_COMMAND)) + if (i2cp_send (i2c, SSD1306_COMMAND)) break; while (len--) - if (i2cp_send (*(buf++))) + if (i2cp_send (i2c, *(buf++))) break; - i2cp_stop (); + i2cp_stop (i2c); if (delay) delay_us (delay); @@ -48,141 +38,47 @@ ssd1306_cmds (uint8_t * buf, size_t len, int delay) } int -ssd1306_cmd (uint8_t cmd, int delay) +ssd1306_cmd (uint32_t i2c, uint8_t cmd, int delay) { - return ssd1306_cmds (&cmd, 1, delay); -} - - - -static void -start_dma (void) -{ - uint8_t cmds[] = { - SSD1306_SET_PAGE_ADDR, 0, 0xff, - SSD1306_SET_COLUMN_ADDR, 0, SSD1306_WIDTH - 1 - }; - - if (dma_in_progress) - return; - - - memcpy (dma_buf, update_buf, DMA_BUF_SZ); - - if (ssd1306_cmds (cmds, sizeof (cmds), 0)) - { - oled_sad++; - return; - } - - if (i2cp_start_transaction (SSD1306_I2C_ADDRESS, I2C_WRITE)) - { - oled_sad++; - return; - } - - refresh_wdt = 0; - dma_in_progress = 1; - - i2cp_start_dma (dma_buf, DMA_BUF_SZ); + return ssd1306_cmds (i2c, &cmd, 1, delay); } void -dma1_channel6_isr (void) -{ - if (dma_in_progress) - { - i2cp_stop_dma (); - - i2cp_stop (); - dma_in_progress = 0; - } - - if (refresh_enabled) - start_dma (); -} - -void -oled_refresh_wdt (void) -{ - if (!refresh_enabled) - return; - - - - refresh_wdt++; - - - if ((refresh_wdt < 1000) && (!oled_sad)) - return; - - refresh_wdt = 0; - -/*No refresh for 1s, restart everything */ - - i2cp_stop_dma (); - i2cp_stop (); - dma_in_progress = 0; - - if (oled_sad) - { - oled_sad = 0; - i2cp_reset_sm (); - } - - start_dma (); - -} - -static void -dma_generate_stream (void) +oled_generate_stream (uint8_t * vram) { - memset (update_buf, 0, DMA_BUF_SZ); - update_buf[0] = SSD1306_DATA_CONTINUE; + memset (vram, 0, DMA_BUF_SZ); + vram[0] = SSD1306_DATA_CONTINUE; } -void -oled_enable_refresh (void) -{ - refresh_enabled = 1; - start_dma (); -} - void -oled_disable_refresh (void) +oled_cls (uint8_t * vram) { - refresh_enabled = 0; - while (dma_in_progress); -} - -void -oled_cls (void) -{ - memset (update_buf + 1, 0, SSD1306_VRAM_SIZE); + memset (vram + 1, 0, SSD1306_VRAM_SIZE); } void -oled_on (void) +oled_on (uint32_t i2c) { - ssd1306_cmd (SSD1306_DISPLAY_ON, 0); + ssd1306_cmd (i2c, SSD1306_DISPLAY_ON, 0); } void -oled_off (void) +oled_off (uint32_t i2c) { - ssd1306_cmd (SSD1306_DISPLAY_OFF, 0); + ssd1306_cmd (i2c, SSD1306_DISPLAY_OFF, 0); } +#if 0 void oled_squirt (void) { @@ -206,9 +102,10 @@ oled_squirt (void) i2c_unlock (); } +#endif void -oled_reset (void) +oled_reset (uint32_t i2c) { uint8_t init[] = { SSD1306_DISPLAY_OFF, @@ -231,25 +128,26 @@ oled_reset (void) SSD1306_DISPLAY_ON, }; - ssd1306_cmds (init, sizeof (init), 0); + ssd1306_cmds (i2c, init, sizeof (init), 0); } void -oled_const_strip (int x, int xe, uint8_t and, uint8_t or) +oled_const_strip (uint8_t * vram, int x, int xe, uint8_t and, uint8_t or) { uint8_t r; for (x++; x <= xe; ++x) { - r = update_buf[x] & and; - update_buf[x] = r | or; + r = vram[x] & and; + vram[x] = r | or; } } void -oled_blit_strip (int x, int xe, uint8_t mask, int shift, uint8_t * src) +oled_blit_strip (uint8_t * vram, int x, int xe, uint8_t mask, int shift, + uint8_t * src) { uint8_t r, s; @@ -261,8 +159,8 @@ oled_blit_strip (int x, int xe, uint8_t mask, int shift, uint8_t * src) s = *(src++); s <<= shift; s &= mask; - r = update_buf[x] & ~mask; - update_buf[x] = r | s; + r = vram[x] & ~mask; + vram[x] = r | s; } } @@ -274,8 +172,8 @@ oled_blit_strip (int x, int xe, uint8_t mask, int shift, uint8_t * src) s = *(src++); s >>= shift; s &= mask; - r = update_buf[x] & ~mask; - update_buf[x] = r | s; + r = vram[x] & ~mask; + vram[x] = r | s; } } else @@ -284,31 +182,8 @@ oled_blit_strip (int x, int xe, uint8_t mask, int shift, uint8_t * src) { s = *(src++); s &= mask; - r = update_buf[x] & ~mask; - update_buf[x] = r | s; + r = vram[x] & ~mask; + vram[x] = r | s; } } } - - - -void -oled_init () -{ - oled_reset (); - - delay_us (100); - - dma_generate_stream (); - - nvic_enable_irq (NVIC_DMA1_CHANNEL6_IRQ); - oled_enable_refresh (); -} - - -void -oled_shutdown (void) -{ - oled_disable_refresh (); - oled_off (); -} -- cgit v1.2.3