4xx: Update esd's common LCD code for 405 boards
PATCH 1/5 4xx: Update esd's common LCD code for 405 boards
- Coding style cleanup (long lines)
- Add s1d13505 support
- Make some functions return a result code instead of void
--- board/esd/common/lcd.c | 123 ++++++++++++++++++++--------- board/esd/common/s1d13505_640_480_16bpp.h | 66 +++++++++++++++ 2 files changed, 151 insertions(+), 38 deletions(-) create mode 100644 board/esd/common/s1d13505_640_480_16bpp.h
board/esd/common/lcd.c +85 -38
@@ -44,37 +44,57 @@ void lcd_setup(int lcd, int config)/* * Set endianess and reset lcd controller 0 (small) */ -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD0_RST );/* set reset to low */ + +/* set reset to low */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD0_RST );udelay (10 );/* wait 10us */ -if (config ==1 ) -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) |CFG_LCD_ENDIAN );/* big-endian */ -else -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD_ENDIAN );/* little-endian */ +if (config ==1 ) { +/* big-endian */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) |CFG_LCD_ENDIAN ); + }else { +/* little-endian */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD_ENDIAN ); + }udelay (10 );/* wait 10us */ - out_be32((void*)GPIO0_OR, in_be32((void*)GPIO0_OR) | CFG_LCD0_RST); /* set reset to high */ +/* set reset to high */ +out_be32 ((void *)GPIO0_OR , + in_be32((void*)GPIO0_OR) | CFG_LCD0_RST); }else {/* * Set endianess and reset lcd controller 1 (big) */ -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD1_RST );/* set reset to low */ + +/* set reset to low */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD1_RST );udelay (10 );/* wait 10us */ -if (config ==1 ) -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) |CFG_LCD_ENDIAN );/* big-endian */ -else -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD_ENDIAN );/* little-endian */ +if (config ==1 ) { +/* big-endian */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) |CFG_LCD_ENDIAN ); + }else { +/* little-endian */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) & ~CFG_LCD_ENDIAN ); + }udelay (10 );/* wait 10us */ -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) |CFG_LCD1_RST );/* set reset to high */ +/* set reset to high */ +out_be32 ((void *)GPIO0_OR , +in_be32 ((void *)GPIO0_OR ) |CFG_LCD1_RST ); }/* * CFG_LCD_ENDIAN may also be FPGA_RESET, so set inactive */ -out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) |CFG_LCD_ENDIAN );/* set reset high again */ +out_be32 ((void *)GPIO0_OR ,in_be32 ((void *)GPIO0_OR ) |CFG_LCD_ENDIAN ); }#endif /* CFG_LCD_ENDIAN */ -void lcd_bmp (uchar *logo_bmp) +int lcd_bmp (uchar *logo_bmp) {int i;uchar *ptr;
@@ -99,13 +119,18 @@ void lcd_bmp(uchar *logo_bmp) len =CFG_VIDEO_LOGO_MAX_SIZE ; dst =malloc (CFG_VIDEO_LOGO_MAX_SIZE );if (dst ==NULL ) { -printf ("Error: malloc in gunzip failed!\n" ); -return ; +printf ("Error: malloc for gunzip failed!\n" ); +return 1 ; + } +if (gunzip (dst,CFG_VIDEO_LOGO_MAX_SIZE , + (uchar *)logo_bmp, &len) !=0 ) { +free (dst); +return 1 ; + } +if (len ==CFG_VIDEO_LOGO_MAX_SIZE ) { +printf ("Image could be truncated" +" (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n" ); } -if (gunzip (dst,CFG_VIDEO_LOGO_MAX_SIZE , (uchar *)logo_bmp, &len) !=0 ) -return ; -if (len ==CFG_VIDEO_LOGO_MAX_SIZE ) -printf ("Image could be truncated (increase CFG_VIDEO_LOGO_MAX_SIZE)!\n" );/* * Check for bmp mark 'BM'
@@ -113,7 +138,7 @@ void lcd_bmp(uchar *logo_bmp)if (*(ushort *)dst !=0x424d ) {printf ("LCD: Unknown image format!\n" );free (dst); -return ; +return 1 ; } }else {/*
@@ -150,7 +175,7 @@ void lcd_bmp(uchar *logo_bmp)printf ("LCD: Unknown bpp (%d) im image!\n" , bpp);if ((dst !=NULL ) && (dst != (uchar *)logo_bmp))free (dst); -return ; +return 1 ; }printf (" (%d*%d, %dbpp)\n" , width, height, bpp);
@@ -180,23 +205,28 @@ void lcd_bmp(uchar *logo_bmp)if (bpp ==24 ) {for (x =0 ; x < width; x++) {/* -* Generate epson 16bpp fb-format from 24bpp image +* Generate epson 16bpp fb-format +* from 24bpp image */ b = *bmp++ >>3 ; g = *bmp++ >>2 ; r = *bmp++ >>3 ; - val = ((r &0x1f ) <<11 ) | ((g &0x3f ) <<5 ) | (b &0x1f ); + val = ((r &0x1f ) <<11 ) | + ((g &0x3f ) <<5 ) | + (b &0x1f ); *ptr2++ = val; } }else if (bpp ==8 ) {for (x =0 ; x < line_size; x++) {/* query rgb value from palette */ - ptr = (unsigned char *)(dst +14 +40 ) ; + ptr = (unsigned char *)(dst +14 +40 ); ptr += (*bmp++) <<2 ; b = *ptr++ >>3 ; g = *ptr++ >>2 ; r = *ptr++ >>3 ; - val = ((r &0x1f ) <<11 ) | ((g &0x3f ) <<5 ) | (b &0x1f ); + val = ((r &0x1f ) <<11 ) | + ((g &0x3f ) <<5 ) | + (b &0x1f ); *ptr2++ = val; } }
@@ -208,11 +238,12 @@ void lcd_bmp(uchar *logo_bmp)if ((dst !=NULL ) && (dst != (uchar *)logo_bmp))free (dst); +return 0 ; } -void lcd_init (uchar *lcd_reg,uchar *lcd_mem,S1D_REGS *regs,int reg_count, -uchar *logo_bmp,ulong len) +int lcd_init (uchar *lcd_reg,uchar *lcd_mem,S1D_REGS *regs,int reg_count, +uchar *logo_bmp,ulong len) {int i;ushort s1dReg;
@@ -263,8 +294,22 @@ void lcd_init(uchar *lcd_reg, uchar *lcd_mem, S1D_REGS *regs, int reg_count, lcd_reg +=0x10000 ;/* add offset for 705 regs */ puts ("LCD: S1D13705" ); }else { -puts ("LCD: No controller detected!\n" ); -return ; +out_8 (&lcd_reg[0x1a ],0x00 ); +udelay (1000 ); +if (in_8 (&lcd_reg[1 ]) ==0x0c ) { +/* +* S1D13505 detected +*/ + reg_byte_swap = TRUE; + palette_index =0x25 ; + palette_value =0x27 ; + lcd_depth =16 ; + +puts ("LCD: S1D13505" ); + }else { +puts ("LCD: No controller detected!\n" ); +return 1 ; + } }/*
@@ -279,7 +324,7 @@ void lcd_init(uchar *lcd_reg, uchar *lcd_mem, S1D_REGS *regs, int reg_count, s1dReg &= ~0x0001 ; } s1dValue = regs[i].Value; - lcd_reg[s1dReg] = s1dValue; +out_8 (&lcd_reg[s1dReg], s1dValue); }/*
@@ -291,15 +336,15 @@ void lcd_init(uchar *lcd_reg, uchar *lcd_mem, S1D_REGS *regs, int reg_count,/* * Display bmp image */ -lcd_bmp (logo_bmp); +return lcd_bmp (logo_bmp); } -#if defined(CONFIG_VIDEO_SM501 )int do_esdbmp (cmd_tbl_t *cmdtp,int flag,int argc,char *argv[]) {ulong addr; +#ifdef CONFIG_VIDEO_SM501 char *str; - +#endif if (argc !=2 ) {printf ("Usage:\n%s\n" , cmdtp->usage);return 1 ;
@@ -307,19 +352,22 @@ int do_esdbmp(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) addr =simple_strtoul (argv[1 ],NULL ,16 ); +#ifdef CONFIG_VIDEO_SM501 str =getenv ("bd_type" );if ((strcmp (str,"ppc221" ) ==0 ) || (strcmp (str,"ppc231" ) ==0 )) {/* * SM501 available, use standard bmp command */ -return (video_display_bitmap (addr,0 ,0 )); +return video_display_bitmap (addr,0 ,0 ); }else {/* * No SM501 available, use esd epson bmp command */ -lcd_bmp ((uchar *)addr); -return 0 ; +return lcd_bmp ((uchar *)addr); } +#else +return lcd_bmp ((uchar *)addr); +#endif } U_BOOT_CMD(
@@ -327,4 +375,3 @@ U_BOOT_CMD("esdbmp - display BMP image\n" ,"<imageAddr> - display image\n" ); -#endif
board/esd/common/s1d13505_640_480_16bpp.h new file +66 -0
66 lines not on this page · raw message
Signature · 1 line
1.5.3
PATCH 1/5 4xx: Update esd's common LCD code for 405 boards
Quoted 5 lines · Matthias Fuchs
- Coding style cleanup (long lines)
- Add s1d13505 support
- Make some functions return a result code instead of voidSigned-off-by Matthias Fuchs <[email protected]>
Applied to u-boot-ppc4xx. Thanks.
Best regards,
Stefan
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
=====================================================================