summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/s5l8700.h4
-rw-r--r--firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c95
2 files changed, 70 insertions, 29 deletions
diff --git a/firmware/export/s5l8700.h b/firmware/export/s5l8700.h
index 940f47f7f2..353690398a 100644
--- a/firmware/export/s5l8700.h
+++ b/firmware/export/s5l8700.h
@@ -459,6 +459,10 @@
459#define PDAT7 (*(REG32_PTR_T)(0x3CF00074)) /* The data register for port 7 */ 459#define PDAT7 (*(REG32_PTR_T)(0x3CF00074)) /* The data register for port 7 */
460#define PCON10 (*(REG32_PTR_T)(0x3CF000A0)) /* Configures the pins of port 10 */ 460#define PCON10 (*(REG32_PTR_T)(0x3CF000A0)) /* Configures the pins of port 10 */
461#define PDAT10 (*(REG32_PTR_T)(0x3CF000A4)) /* The data register for port 10 */ 461#define PDAT10 (*(REG32_PTR_T)(0x3CF000A4)) /* The data register for port 10 */
462#define PCON13 (*(REG32_PTR_T)(0x3CF000D0)) /* Configures the pins of port 13 */
463#define PDAT13 (*(REG32_PTR_T)(0x3CF000D4)) /* The data register for port 13 */
464#define PCON14 (*(REG32_PTR_T)(0x3CF000E0)) /* Configures the pins of port 14 */
465#define PDAT14 (*(REG32_PTR_T)(0x3CF000E4)) /* The data register for port 14 */
462#define PCON_ASRAM (*(REG32_PTR_T)(0x3CF000F0)) /* Configures the pins of port nor flash */ 466#define PCON_ASRAM (*(REG32_PTR_T)(0x3CF000F0)) /* Configures the pins of port nor flash */
463#define PCON_SDRAM (*(REG32_PTR_T)(0x3CF000F4)) /* Configures the pins of port sdram */ 467#define PCON_SDRAM (*(REG32_PTR_T)(0x3CF000F4)) /* Configures the pins of port sdram */
464#define PCON11 (*(REG32_PTR_T)(0x3CF000F8)) /* Configures the pins of port 11 */ 468#define PCON11 (*(REG32_PTR_T)(0x3CF000F8)) /* Configures the pins of port 11 */
diff --git a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
index 74f2fca383..ad2e356b5e 100644
--- a/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
+++ b/firmware/target/arm/s5l8700/ipodnano2g/lcd-nano2g.c
@@ -40,9 +40,9 @@ static void s5l_lcd_write_data(int data)
40 while (LCD_STATUS&0x10); 40 while (LCD_STATUS&0x10);
41} 41}
42 42
43
44/** globals **/ 43/** globals **/
45 44
45static int lcd_type;
46static int xoffset; /* needed for flip */ 46static int xoffset; /* needed for flip */
47 47
48/*** hardware configuration ***/ 48/*** hardware configuration ***/
@@ -89,6 +89,15 @@ void lcd_on(void)
89/* LCD init */ 89/* LCD init */
90void lcd_init_device(void) 90void lcd_init_device(void)
91{ 91{
92 /* Detect lcd type */
93
94 PCON13 &= ~0xf; /* Set pin 0 to input */
95 PCON14 &= ~0xf0; /* Set pin 1 to input */
96
97 if (((PDAT13 & 1) == 0) && ((PDAT14 & 2) == 2))
98 lcd_type = 0;
99 else
100 lcd_type = 1;
92} 101}
93 102
94 103
@@ -127,36 +136,64 @@ void lcd_update(void) ICODE_ATTR;
127void lcd_update(void) 136void lcd_update(void)
128{ 137{
129 int x,y; 138 int x,y;
130 fb_data* p; 139 fb_data* p = &lcd_framebuffer[0][0];
131 fb_data pixel; 140 fb_data pixel;
132 141
133 s5l_lcd_write_cmd(0x3a); 142 if (lcd_type==0) {
134 s5l_lcd_write_data(0x65); 143 s5l_lcd_write_cmd(0x50);
135 144 s5l_lcd_write_data(0); /* Start column */
136 s5l_lcd_write_cmd(0x2a); 145 s5l_lcd_write_cmd(0x51);
137 s5l_lcd_write_data(0); 146 s5l_lcd_write_data(LCD_WIDTH-1); /* End column */
138 s5l_lcd_write_data(0); 147 s5l_lcd_write_cmd(0x52);
139 s5l_lcd_write_data(0); 148 s5l_lcd_write_data(0); /* Start row */
140 s5l_lcd_write_data(LCD_WIDTH-1); 149 s5l_lcd_write_cmd(0x53);
141 150 s5l_lcd_write_data(LCD_HEIGHT-1); /* End row */
142 s5l_lcd_write_cmd(0x2b); 151
143 s5l_lcd_write_data(0); 152 s5l_lcd_write_cmd(0x20);
144 s5l_lcd_write_data(0); 153 s5l_lcd_write_data(0);
145 s5l_lcd_write_data(0); 154 s5l_lcd_write_cmd(0x21);
146 s5l_lcd_write_data(LCD_HEIGHT-1); 155 s5l_lcd_write_data(0);
147 156 s5l_lcd_write_cmd(0x22);
148 s5l_lcd_write_cmd(0x2c); 157
149 158 /* Copy display bitmap to hardware */
150 /* Copy display bitmap to hardware */ 159 for (y = 0; y < LCD_HEIGHT; y++) {
151 160 for (x = 0; x < LCD_WIDTH; x++) {
152 p = &lcd_framebuffer[0][0]; 161 pixel = *(p++);
153 for (y = 0; y < LCD_HEIGHT; y++) { 162
154 for (x = 0; x < LCD_WIDTH; x++) { 163 while (LCD_STATUS&0x10);
155 pixel = *(p++); 164
156 165 LCD_WDATA = pixel & 0xff;
157 while (LCD_STATUS&0x10); 166 LCD_WDATA = (pixel & 0xff00) >> 8;
158 LCD_WDATA = (pixel & 0xff00) >> 8; 167 }
159 LCD_WDATA = pixel & 0xff; 168 }
169 } else {
170 s5l_lcd_write_cmd(0x3a);
171 s5l_lcd_write_data(0x65);
172
173 s5l_lcd_write_cmd(0x2a);
174 s5l_lcd_write_data(0); /* Start column, high byte */
175 s5l_lcd_write_data(0); /* Start column. low byte */
176 s5l_lcd_write_data(0); /* End column, high byte */
177 s5l_lcd_write_data(LCD_WIDTH-1); /* End column, low byte */
178
179 s5l_lcd_write_cmd(0x2b);
180 s5l_lcd_write_data(0); /* Start row, high byte */
181 s5l_lcd_write_data(0); /* Start row, low byte */
182 s5l_lcd_write_data(0); /* End row, high byte */
183 s5l_lcd_write_data(LCD_HEIGHT-1); /* End row, low byte */
184
185 s5l_lcd_write_cmd(0x2c);
186
187 /* Copy display bitmap to hardware */
188 for (y = 0; y < LCD_HEIGHT; y++) {
189 for (x = 0; x < LCD_WIDTH; x++) {
190 pixel = *(p++);
191
192 while (LCD_STATUS&0x10);
193
194 LCD_WDATA = (pixel & 0xff00) >> 8;
195 LCD_WDATA = pixel & 0xff;
196 }
160 } 197 }
161 } 198 }
162 199