summaryrefslogtreecommitdiffstats
path: root/app/oled.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/oled.c')
-rw-r--r--app/oled.c187
1 files changed, 31 insertions, 156 deletions
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 ();
-}