summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c58
1 files changed, 28 insertions, 30 deletions
diff --git a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
index a44a482324..1e4bb85de6 100644
--- a/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
+++ b/firmware/target/arm/tms320dm320/mrobe-500/lcd-mr500.c
@@ -97,7 +97,7 @@ void lcd_awake(void)
97/* Note this is expecting a screen size of 480x640 or 240x320, other screen 97/* Note this is expecting a screen size of 480x640 or 240x320, other screen
98 * sizes need to be considered for fudge factors 98 * sizes need to be considered for fudge factors
99 */ 99 */
100#define LCD_FUDGE LCD_NATIVE_WIDTH%32 100#define LCD_FUDGE LCD_NATIVE_WIDTH%32
101 101
102/* LCD init - based on code from ingenient-bsp/bootloader/board/dm320/splash.c 102/* LCD init - based on code from ingenient-bsp/bootloader/board/dm320/splash.c
103 * and code by Catalin Patulea from the M:Robe 500i linux port 103 * and code by Catalin Patulea from the M:Robe 500i linux port
@@ -160,7 +160,7 @@ void lcd_init_device(void)
160 /* Used for 565 RGB */ 160 /* Used for 565 RGB */
161 IO_OSD_OSDWINMD0 = 0x30C0; 161 IO_OSD_OSDWINMD0 = 0x30C0;
162 162
163 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 16; 163 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH *2 / 32;
164 164
165 IO_OSD_OSDWINADH = addr >> 16; 165 IO_OSD_OSDWINADH = addr >> 16;
166 IO_OSD_OSDWIN0ADL = addr & 0xFFFF; 166 IO_OSD_OSDWIN0ADL = addr & 0xFFFF;
@@ -189,17 +189,19 @@ void lcd_init_device(void)
189 IO_OSD_OSDWIN1XL = LCD_NATIVE_WIDTH; 189 IO_OSD_OSDWIN1XL = LCD_NATIVE_WIDTH;
190 IO_OSD_OSDWIN1YL = LCD_NATIVE_HEIGHT; 190 IO_OSD_OSDWIN1YL = LCD_NATIVE_HEIGHT;
191 191
192 IO_OSD_VIDWINMD = 0x0002; 192 IO_OSD_VIDWINMD = 0x0000;
193 193
194 addr = ((int)FRAME2-CONFIG_SDRAM_START) / 32; 194 addr = ((int)FRAME2-CONFIG_SDRAM_START +
195 2*(LCD_NATIVE_WIDTH*(LCD_NATIVE_HEIGHT-320)/2+
196 (LCD_NATIVE_WIDTH-240)/2))/ 32;
195 197
196 /* This is a bit messy, the LCD transfers appear to happen in chunks of 32 198 /* This is a bit messy, the LCD transfers appear to happen in chunks of 32
197 * pixels. (based on OF) 199 * pixels. (based on OF)
198 */ 200 */
199#if LCD_NATIVE_WIDTH%32!=0 201#if LCD_NATIVE_WIDTH%32!=0
200 IO_OSD_VIDWIN0OFST = LCD_NATIVE_WIDTH / 32+1; 202 IO_OSD_VIDWIN0OFST = LCD_NATIVE_WIDTH * 2 / 32+1;
201#else 203#else
202 IO_OSD_VIDWIN0OFST = LCD_NATIVE_WIDTH / 32; 204 IO_OSD_VIDWIN0OFST = LCD_NATIVE_WIDTH * 2 / 32;
203#endif 205#endif
204 206
205 IO_OSD_VIDWINADH = addr >> 16; 207 IO_OSD_VIDWINADH = addr >> 16;
@@ -229,24 +231,22 @@ void lcd_init_device(void)
229#if defined(HAVE_LCD_MODES) 231#if defined(HAVE_LCD_MODES)
230void lcd_set_mode(int mode) 232void lcd_set_mode(int mode)
231{ 233{
232 if(mode==LCD_MODE_YUV) 234 if(mode==LCD_MODE_YUV) {
233 { 235 /* Turn off the RGB buffer and enable the YUV buffer with zoom */
234 /* Turn off the RGB buffer and enable the YUV buffer */ 236 IO_OSD_OSDWINMD0 |= 0x04;
235 IO_OSD_OSDWINMD0 |= 0x04; 237 IO_OSD_VIDWINMD |= 0x01;
236 IO_OSD_VIDWINMD |= 0x01; 238#if LCD_NATIVE_WIDTH > 240
237 memset16(FRAME2, 0x0080, LCD_NATIVE_HEIGHT*(LCD_NATIVE_WIDTH+LCD_FUDGE)); 239 IO_OSD_VIDWINMD |= (0x05<<2); /* This does a 2x zoom */
238 } 240#endif
239 else if(mode==LCD_MODE_RGB565) 241 memset16(FRAME2, 0x0080, LCD_NATIVE_HEIGHT*(LCD_NATIVE_WIDTH+LCD_FUDGE));
240 { 242 } else if(mode==LCD_MODE_RGB565) {
241 /* Turn on the RGB window, set it to 16 bit and turn YUV window off */ 243 /* Turn on the RGB window, set it to 16 bit and turn YUV window off */
242 IO_OSD_VIDWINMD &= ~(0x01); 244 IO_OSD_VIDWINMD &= ~(0x01);
243 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 16; 245 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 16;
244 IO_OSD_OSDWINMD0 |= (1<<13); 246 IO_OSD_OSDWINMD0 |= (1<<13);
245 IO_OSD_OSDWINMD0 &= ~0x04; 247 IO_OSD_OSDWINMD0 &= ~0x04;
246 lcd_clear_display(); 248 lcd_clear_display();
247 } 249 } else if(mode==LCD_MODE_PAL256) {
248 else if(mode==LCD_MODE_PAL256)
249 {
250#if LCD_NATIVE_WIDTH%32!=0 250#if LCD_NATIVE_WIDTH%32!=0
251 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 32+1; 251 IO_OSD_OSDWIN0OFST = LCD_NATIVE_WIDTH / 32+1;
252#else 252#else
@@ -255,8 +255,8 @@ void lcd_set_mode(int mode)
255 255
256 IO_OSD_VIDWINMD &= ~(0x01); 256 IO_OSD_VIDWINMD &= ~(0x01);
257 IO_OSD_OSDWINMD0 &= ~(1<<13); 257 IO_OSD_OSDWINMD0 &= ~(1<<13);
258 IO_OSD_OSDWINMD0 |= 0x01; 258 IO_OSD_OSDWINMD0 |= 0x01;
259 } 259 }
260} 260}
261#endif 261#endif
262 262
@@ -416,10 +416,8 @@ void lcd_blit_yuv(unsigned char * const src[3],
416 if (!lcd_on) 416 if (!lcd_on)
417 return; 417 return;
418 418
419 /* y has to be at multiple of 2 or else it will mess up the HW 419 /* y has to be on a 16 pixel boundary */
420 * (interleaving) 420 y &= ~0xF;
421 */
422 y &= ~1;
423 421
424 if( ((y | x | height | width ) < 0) 422 if( ((y | x | height | width ) < 0)
425 || y>LCD_NATIVE_HEIGHT || x>LCD_NATIVE_WIDTH ) 423 || y>LCD_NATIVE_HEIGHT || x>LCD_NATIVE_WIDTH )