115
115
#define SSD1306_PANEL_VCOM_DESEL_LEVEL 0x20
116
116
#define SSD1306_PANEL_PUMP_VOLTAGE SSD1306_SET_PUMP_VOLTAGE_90
117
117
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
+
118
124
LCD_SEQUENCE (init_cmds )
119
125
LCD_SEQUENCE_LCD_CS_INACTIVATE (),
120
126
LCD_SEQUENCE_LCD_DC_DATA (),
@@ -125,7 +131,7 @@ LCD_SEQUENCE(init_cmds)
125
131
2 , SSD1306_SET_DISPLAY_OFFSET , 0 ,
126
132
1 , SSD1306_SET_START_LINE + 0 ,
127
133
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 ,
129
135
1 , SSD1306_SET_SEGMENT_MAP_REMAPED ,
130
136
1 , SSD1306_SET_COM_OUTPUT_SCAN_FLIPPED ,
131
137
@@ -156,6 +162,7 @@ ssd1306_init(lv_disp_drv_t *driver)
156
162
lcd_command_sequence (init_cmds );
157
163
}
158
164
165
+ #if MYNEWT_VAL_CHOICE (SSD1306_ADDRESSING_MODE , horizontal )
159
166
void
160
167
ssd1306_flush (lv_disp_drv_t * drv , const lv_area_t * area , lv_color_t * color_p )
161
168
{
@@ -178,6 +185,30 @@ ssd1306_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_p)
178
185
179
186
lv_disp_flush_ready (drv );
180
187
}
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
181
212
182
213
void
183
214
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_
196
227
void
197
228
mynewt_lv_drv_init (lv_disp_drv_t * driver )
198
229
{
230
+ if (MYNEWT_VAL (LCD_RESET_PIN ) >= 0 ) {
231
+ hal_gpio_init_out (MYNEWT_VAL (LCD_RESET_PIN ), 1 );
232
+ }
199
233
lcd_itf_init ();
200
234
driver -> flush_cb = ssd1306_flush ;
201
235
driver -> set_px_cb = ssd1306_set_px_cb ;
0 commit comments