Skip to content

Commit 95deb08

Browse files
committed
lvgl/ssd1306: Add support for page addressing
Only horizontal addressing mode was supported. There are many variants that only work with page addressing mode. Now addressing mode can be changed to page (which is less efficient from I2C point of view). Signed-off-by: Jerzy Kasenberg <[email protected]>
1 parent 348d9a1 commit 95deb08

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

hw/drivers/display/lvgl/oled/ssd1306/src/ssd1306.c

+35-1
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@
115115
#define SSD1306_PANEL_VCOM_DESEL_LEVEL 0x20
116116
#define SSD1306_PANEL_PUMP_VOLTAGE SSD1306_SET_PUMP_VOLTAGE_90
117117

118+
#if MYNEWT_VAL_CHOICE(SSD1306_ADDRESSING_MODE, horizontal)
119+
#define ADDRESSING_MODE SSD1306_SET_MEM_ADDRESSING_HORIZONTAL
120+
#else
121+
#define ADDRESSING_MODE SSD1306_SET_MEM_ADDRESSING_PAGE
122+
#endif
123+
118124
LCD_SEQUENCE(init_cmds)
119125
LCD_SEQUENCE_LCD_CS_INACTIVATE(),
120126
LCD_SEQUENCE_LCD_DC_DATA(),
@@ -125,7 +131,7 @@ LCD_SEQUENCE(init_cmds)
125131
2, SSD1306_SET_DISPLAY_OFFSET, 0,
126132
1, SSD1306_SET_START_LINE + 0,
127133
2, SDD1406_CHARGE_PUMP_SETTING, SDD1406_CHARGE_PUMP_SETTING_ENABLE,
128-
2, SSD1306_SET_MEM_ADDRESSING_MODE, SSD1306_SET_MEM_ADDRESSING_HORIZONTAL,
134+
2, SSD1306_SET_MEM_ADDRESSING_MODE, ADDRESSING_MODE,
129135
1, SSD1306_SET_SEGMENT_MAP_REMAPED,
130136
1, SSD1306_SET_COM_OUTPUT_SCAN_FLIPPED,
131137

@@ -156,6 +162,7 @@ ssd1306_init(lv_disp_drv_t *driver)
156162
lcd_command_sequence(init_cmds);
157163
}
158164

165+
#if MYNEWT_VAL_CHOICE(SSD1306_ADDRESSING_MODE, horizontal)
159166
void
160167
ssd1306_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
161168
{
@@ -178,6 +185,30 @@ ssd1306_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
178185

179186
lv_disp_flush_ready(drv);
180187
}
188+
#else
189+
void
190+
ssd1306_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
191+
{
192+
uint8_t page1 = area->y1 >> 3;
193+
uint8_t page2 = area->y2 >> 3;
194+
195+
uint8_t *buf = (uint8_t *)color_p;
196+
int width = area->x2 - area->x1 + 1;
197+
uint8_t b[3];
198+
199+
for (; page1 <= page2; ++page1, buf += width) {
200+
b[0] = SSD1306_SET_PAGE_START_ADDRESS + page1;
201+
lcd_ift_write_cmd(b, 1);
202+
b[0] = SSD1306_SET_LOWER_COL_ADDRESS + (area->x1 & 0xF);
203+
lcd_ift_write_cmd(b, 1);
204+
b[0] = SSD1306_SET_HIGHER_COL_ADDRESS + ((area->x1 >> 4) & 0xF);
205+
lcd_ift_write_cmd(b, 1);
206+
207+
lcd_itf_write_color_data(area->x1, area->x2, page1 << 3, ((page1 + 1) << 3) - 1, buf);
208+
}
209+
lv_disp_flush_ready(drv);
210+
}
211+
#endif
181212

182213
void
183214
ssd1306_set_px_cb(struct _lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
@@ -196,6 +227,9 @@ ssd1306_set_px_cb(struct _lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_
196227
void
197228
mynewt_lv_drv_init(lv_disp_drv_t *driver)
198229
{
230+
if (MYNEWT_VAL(LCD_RESET_PIN) >= 0) {
231+
hal_gpio_init_out(MYNEWT_VAL(LCD_RESET_PIN), 1);
232+
}
199233
lcd_itf_init();
200234
driver->flush_cb = ssd1306_flush;
201235
driver->set_px_cb = ssd1306_set_px_cb;

hw/drivers/display/lvgl/oled/ssd1306/syscfg.yml

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
#
1818

1919
syscfg.defs:
20+
SSD1306_ADDRESSING_MODE:
21+
description: Addressing mode.
22+
choices:
23+
- horizontal
24+
- page
25+
value: horizontal
2026

2127
syscfg.vals:
2228
LVGL_DISPLAY_HORIZONTAL_RESOLUTION: 128

0 commit comments

Comments
 (0)