diff options
-rw-r--r-- | firmware/drivers/lcd-h100.c | 55 |
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 | */ |
114 | void lcd_init (void) | 123 | void 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 | ||
208 | void lcd_set_contrast(int val) | 239 | void 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 | ||
213 | void lcd_set_invert_display(bool yesno) | 244 | void lcd_set_invert_display(bool yesno) |