summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/lcd-h100.c55
1 files changed, 43 insertions, 12 deletions
diff --git a/firmware/drivers/lcd-h100.c b/firmware/drivers/lcd-h100.c
index 4330a5d8ca..82537e439b 100644
--- a/firmware/drivers/lcd-h100.c
+++ b/firmware/drivers/lcd-h100.c
@@ -34,7 +34,14 @@
34/*** definitions ***/ 34/*** definitions ***/
35 35
36/* LCD command codes */ 36/* LCD command codes */
37#define LCD_CNTL_POWER_CONTROL 0x25
38#define LCD_CNTL_VOLTAGE_SELECT 0x2b
39#define LCD_CNTL_LINE_INVERT_DRIVE 0x36
40#define LCD_CNTL_GRAY_SCALE_PATTERN 0x39
41#define LCD_CNTL_TEMP_GRADIENT_SELECT 0x4e
42#define LCD_CNTL_OSC_FREQUENCY 0x5f
37#define LCD_CNTL_ON_OFF 0xae 43#define LCD_CNTL_ON_OFF 0xae
44#define LCD_CNTL_OSC_ON_OFF 0xab
38#define LCD_CNTL_OFF_MODE 0xbe 45#define LCD_CNTL_OFF_MODE 0xbe
39#define LCD_CNTL_REVERSE 0xa6 46#define LCD_CNTL_REVERSE 0xa6
40#define LCD_CNTL_ALL_LIGHTING 0xa4 47#define LCD_CNTL_ALL_LIGHTING 0xa4
@@ -42,7 +49,9 @@
42#define LCD_CNTL_COLUMN_ADDRESS_DIR 0xa0 49#define LCD_CNTL_COLUMN_ADDRESS_DIR 0xa0
43#define LCD_CNTL_NLINE_ON_OFF 0xe4 50#define LCD_CNTL_NLINE_ON_OFF 0xe4
44#define LCD_CNTL_DISPLAY_MODE 0x66 51#define LCD_CNTL_DISPLAY_MODE 0x66
45#define LCD_CNTL_ELECTRIC_VOLUME 0x81 52#define LCD_CNTL_DUTY_SET 0x6d
53#define LCD_CNTL_ELECTRONIC_VOLUME 0x81
54#define LCD_CNTL_DATA_INPUT_DIR 0x84
46#define LCD_CNTL_DISPLAY_START_LINE 0x8a 55#define LCD_CNTL_DISPLAY_START_LINE 0x8a
47 56
48#define LCD_CNTL_PAGE 0xb1 57#define LCD_CNTL_PAGE 0xb1
@@ -113,10 +122,18 @@ void lcd_init(void)
113 */ 122 */
114void lcd_init (void) 123void lcd_init (void)
115{ 124{
116 /* GPO35 is the LCD A0 pin, GPO46 is LCD RESET */ 125 /* GPO35 is the LCD A0 pin
126 GPO46 is LCD RESET */
117 GPIO1_OUT |= 0x00004008; 127 GPIO1_OUT |= 0x00004008;
118 GPIO1_FUNCTION |= 0x00004008;
119 GPIO1_ENABLE |= 0x00004008; 128 GPIO1_ENABLE |= 0x00004008;
129 GPIO1_FUNCTION |= 0x00004008;
130
131 /* Reset LCD */
132 sleep(1);
133 GPIO1_OUT &= ~0x00004000;
134 sleep(1);
135 GPIO1_OUT |= 0x00004000;
136 sleep(1);
120 137
121 lcd_write_command(LCD_CNTL_ON_OFF | 1); /* LCD ON */ 138 lcd_write_command(LCD_CNTL_ON_OFF | 1); /* LCD ON */
122 lcd_write_command(LCD_CNTL_COLUMN_ADDRESS_DIR | 0); /* Normal */ 139 lcd_write_command(LCD_CNTL_COLUMN_ADDRESS_DIR | 0); /* Normal */
@@ -126,8 +143,22 @@ void lcd_init (void)
126 lcd_write_command(LCD_CNTL_OFF_MODE | 1); /* OFF -> VCC on drivers */ 143 lcd_write_command(LCD_CNTL_OFF_MODE | 1); /* OFF -> VCC on drivers */
127 lcd_write_command(LCD_CNTL_NLINE_ON_OFF | 1); /* N-line ON */ 144 lcd_write_command(LCD_CNTL_NLINE_ON_OFF | 1); /* N-line ON */
128 145
129 lcd_write_command_ex(LCD_CNTL_DISPLAY_MODE, 1); /* Monochrome mode */ 146 lcd_write_command_ex(LCD_CNTL_DUTY_SET, 0x20, 1);
130 147 lcd_write_command_ex(LCD_CNTL_VOLTAGE_SELECT, 3, -1);
148 lcd_write_command_ex(LCD_CNTL_ELECTRONIC_VOLUME, 0x1c, -1);
149 lcd_write_command_ex(LCD_CNTL_TEMP_GRADIENT_SELECT, 0, -1);
150 lcd_write_command_ex(LCD_CNTL_LINE_INVERT_DRIVE, 0x10, -1);
151 lcd_write_command_ex(LCD_CNTL_OSC_FREQUENCY, 3, -1);
152 lcd_write_command(LCD_CNTL_OSC_ON_OFF | 1); /* Oscillator ON */
153 lcd_write_command_ex(LCD_CNTL_POWER_CONTROL, 0x17, -1);
154
155 sleep(1);
156
157 lcd_write_command_ex(LCD_CNTL_DISPLAY_START_LINE, 0, -1);
158 lcd_write_command_ex(LCD_CNTL_GRAY_SCALE_PATTERN, 0x42, -1);
159 lcd_write_command_ex(LCD_CNTL_DISPLAY_MODE, 1, -1); /* Monochrome mode */
160 lcd_write_command(LCD_CNTL_DATA_INPUT_DIR | 0); /* Column mode */
161
131 lcd_clear_display(); 162 lcd_clear_display();
132 lcd_update(); 163 lcd_update();
133 164
@@ -144,8 +175,8 @@ void lcd_blit (const unsigned char* p_data, int x, int y, int width,
144 /* Copy display bitmap to hardware */ 175 /* Copy display bitmap to hardware */
145 while (height--) 176 while (height--)
146 { 177 {
147 lcd_write_command_ex(LCD_CNTL_PAGE, y++ & 0xf); 178 lcd_write_command_ex(LCD_CNTL_PAGE, y++ & 0xf, -1);
148 lcd_write_command_ex(LCD_CNTL_COLUMN, x+xoffset); 179 lcd_write_command_ex(LCD_CNTL_COLUMN, x+xoffset, -1);
149 180
150 lcd_write_command(LCD_CNTL_DATA_WRITE); 181 lcd_write_command(LCD_CNTL_DATA_WRITE);
151 lcd_write_data(p_data, width); 182 lcd_write_data(p_data, width);
@@ -166,8 +197,8 @@ void lcd_update (void)
166 /* Copy display bitmap to hardware */ 197 /* Copy display bitmap to hardware */
167 for (y = 0; y < LCD_HEIGHT/8; y++) 198 for (y = 0; y < LCD_HEIGHT/8; y++)
168 { 199 {
169 lcd_write_command_ex(LCD_CNTL_PAGE, y); 200 lcd_write_command_ex(LCD_CNTL_PAGE, y, -1);
170 lcd_write_command_ex(LCD_CNTL_COLUMN, 0); 201 lcd_write_command_ex(LCD_CNTL_COLUMN, 0, -1);
171 202
172 lcd_write_command(LCD_CNTL_DATA_WRITE); 203 lcd_write_command(LCD_CNTL_DATA_WRITE);
173 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH); 204 lcd_write_data (lcd_framebuffer[y], LCD_WIDTH);
@@ -197,8 +228,8 @@ void lcd_update_rect (int x_start, int y,
197 /* Copy specified rectange bitmap to hardware */ 228 /* Copy specified rectange bitmap to hardware */
198 for (; y <= ymax; y++) 229 for (; y <= ymax; y++)
199 { 230 {
200 lcd_write_command_ex(LCD_CNTL_PAGE, y); 231 lcd_write_command_ex(LCD_CNTL_PAGE, y, -1);
201 lcd_write_command_ex(LCD_CNTL_COLUMN, x_start+xoffset); 232 lcd_write_command_ex(LCD_CNTL_COLUMN, x_start+xoffset, -1);
202 233
203 lcd_write_command(LCD_CNTL_DATA_WRITE); 234 lcd_write_command(LCD_CNTL_DATA_WRITE);
204 lcd_write_data (&lcd_framebuffer[y][x_start], width); 235 lcd_write_data (&lcd_framebuffer[y][x_start], width);
@@ -207,7 +238,7 @@ void lcd_update_rect (int x_start, int y,
207 238
208void lcd_set_contrast(int val) 239void lcd_set_contrast(int val)
209{ 240{
210 lcd_write_command_ex(LCD_CNTL_ELECTRIC_VOLUME, val); 241 lcd_write_command_ex(LCD_CNTL_ELECTRONIC_VOLUME, val, -1);
211} 242}
212 243
213void lcd_set_invert_display(bool yesno) 244void lcd_set_invert_display(bool yesno)