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+
118124LCD_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 )
159166void
160167ssd1306_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
182213void
183214ssd1306_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_
196227void
197228mynewt_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 ;
0 commit comments