📄 lcd.c.svn-base
字号:
*/ lchcr_hpc_tmp = (panel_info.vl_col * (panel_info.vl_tft ? 8 : (((2 - panel_info.vl_lbw) << /* 4 bit=2, 8-bit = 1 */ /* use << to mult by: single scan = 1, dual scan = 2 */ panel_info.vl_splt) * (panel_info.vl_bpix | 1)))) >> 3; /* 2/4 BPP = 1, 8/16 BPP = 3 */ lcdp->lcd_lchcr = LCHCR_BO | LCDBIT (LCHCR_AT_BIT, 4) | LCDBIT (LCHCR_HPC_BIT, lchcr_hpc_tmp) | panel_info.vl_wbl; lcdp->lcd_lcvcr = LCDBIT (LCVCR_VPW_BIT, panel_info.vl_vpw) | LCDBIT (LCVCR_LCD_AC_BIT, panel_info.vl_lcdac) | LCDBIT (LCVCR_VPC_BIT, panel_info.vl_row) | panel_info.vl_wbf;}/*----------------------------------------------------------------------*/#ifdef NOT_USED_SO_FARstatic voidlcd_getcolreg (ushort regno, ushort *red, ushort *green, ushort *blue){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm); unsigned short colreg, *cmap_ptr; cmap_ptr = (unsigned short *)&cp->lcd_cmap[regno * 2]; colreg = *cmap_ptr;#ifdef CFG_INVERT_COLORS colreg ^= 0x0FFF;#endif *red = (colreg >> 8) & 0x0F; *green = (colreg >> 4) & 0x0F; *blue = colreg & 0x0F;}#endif /* NOT_USED_SO_FAR *//*----------------------------------------------------------------------*/#if LCD_BPP == LCD_COLOR8static voidlcd_setcolreg (ushort regno, ushort red, ushort green, ushort blue){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm); unsigned short colreg, *cmap_ptr; cmap_ptr = (unsigned short *)&cp->lcd_cmap[regno * 2]; colreg = ((red & 0x0F) << 8) | ((green & 0x0F) << 4) | (blue & 0x0F) ;#ifdef CFG_INVERT_COLORS colreg ^= 0x0FFF;#endif *cmap_ptr = colreg; debug ("setcolreg: reg %2d @ %p: R=%02X G=%02X B=%02X => %02X%02X\n", regno, &(cp->lcd_cmap[regno * 2]), red, green, blue, cp->lcd_cmap[ regno * 2 ], cp->lcd_cmap[(regno * 2) + 1]);}#endif /* LCD_COLOR8 *//*----------------------------------------------------------------------*/#if LCD_BPP == LCD_MONOCHROMEstaticvoid lcd_initcolregs (void){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm); ushort regno; for (regno = 0; regno < 16; regno++) { cp->lcd_cmap[regno * 2] = 0; cp->lcd_cmap[(regno * 2) + 1] = regno & 0x0f; }}#endif/*----------------------------------------------------------------------*/static void lcd_setfgcolor (int color){ lcd_color_fg = color & 0x0F;}/*----------------------------------------------------------------------*/static void lcd_setbgcolor (int color){ lcd_color_bg = color & 0x0F;}/*----------------------------------------------------------------------*/#ifdef NOT_USED_SO_FARstatic int lcd_getfgcolor (void){ return lcd_color_fg;}#endif /* NOT_USED_SO_FAR *//*----------------------------------------------------------------------*/static int lcd_getbgcolor (void){ return lcd_color_bg;}/*----------------------------------------------------------------------*/static void lcd_enable (void){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile lcd823_t *lcdp = &immr->im_lcd; /* Enable the LCD panel */#ifndef CONFIG_RBC823 immr->im_siu_conf.sc_sdcr |= (1 << (31 - 25)); /* LAM = 1 */#endif lcdp->lcd_lccr |= LCCR_PON;#ifdef CONFIG_V37 /* Turn on display backlight */ immr->im_cpm.cp_pbpar |= 0x00008000; immr->im_cpm.cp_pbdir |= 0x00008000;#elif defined(CONFIG_RBC823) /* Turn on display backlight */ immr->im_cpm.cp_pbdat |= 0x00004000;#endif#if defined(CONFIG_LWMON) { uchar c = pic_read (0x60);#if defined(CONFIG_LCD) && defined(CONFIG_LWMON) && (CONFIG_POST & CFG_POST_SYSMON) /* Enable LCD later in sysmon test, only if temperature is OK */#else c |= 0x07; /* Power on CCFL, Enable CCFL, Chip Enable LCD */#endif pic_write (0x60, c); }#endif /* CONFIG_LWMON */#if defined(CONFIG_R360MPI) { extern void r360_i2c_lcd_write (uchar data0, uchar data1); unsigned long bgi, ctr; char *p; if ((p = getenv("lcdbgi")) != NULL) { bgi = simple_strtoul (p, 0, 10) & 0xFFF; } else { bgi = 0xFFF; } if ((p = getenv("lcdctr")) != NULL) { ctr = simple_strtoul (p, 0, 10) & 0xFFF; } else { ctr=0x7FF; } r360_i2c_lcd_write(0x10, 0x01); r360_i2c_lcd_write(0x20, 0x01); r360_i2c_lcd_write(0x30 | ((bgi>>8) & 0xF), bgi & 0xFF); r360_i2c_lcd_write(0x40 | ((ctr>>8) & 0xF), ctr & 0xFF); }#endif /* CONFIG_R360MPI */#ifdef CONFIG_RBC823 udelay(200000); /* wait 200ms */ /* Turn VEE_ON first */ immr->im_cpm.cp_pbdat |= 0x00000001; udelay(200000); /* wait 200ms */ /* Now turn on LCD_ON */ immr->im_cpm.cp_pbdat |= 0x00001000;#endif#ifdef CONFIG_RRVISION debug ("PC4->Output(1): enable LVDS\n"); debug ("PC5->Output(0): disable PAL clock\n"); immr->im_ioport.iop_pddir |= 0x1000; immr->im_ioport.iop_pcpar &= ~(0x0C00); immr->im_ioport.iop_pcdir |= 0x0C00 ; immr->im_ioport.iop_pcdat |= 0x0800 ; immr->im_ioport.iop_pcdat &= ~(0x0400); debug ("PDPAR=0x%04X PDDIR=0x%04X PDDAT=0x%04X\n", immr->im_ioport.iop_pdpar, immr->im_ioport.iop_pddir, immr->im_ioport.iop_pddat); debug ("PCPAR=0x%04X PCDIR=0x%04X PCDAT=0x%04X\n", immr->im_ioport.iop_pcpar, immr->im_ioport.iop_pcdir, immr->im_ioport.iop_pcdat);#endif}/*----------------------------------------------------------------------*/#if defined (CONFIG_RBC823)void lcd_disable (void){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile lcd823_t *lcdp = &immr->im_lcd;#if defined(CONFIG_LWMON) { uchar c = pic_read (0x60); c &= ~0x07; /* Power off CCFL, Disable CCFL, Chip Disable LCD */ pic_write (0x60, c); }#elif defined(CONFIG_R360MPI) { extern void r360_i2c_lcd_write (uchar data0, uchar data1); r360_i2c_lcd_write(0x10, 0x00); r360_i2c_lcd_write(0x20, 0x00); r360_i2c_lcd_write(0x30, 0x00); r360_i2c_lcd_write(0x40, 0x00); }#endif /* CONFIG_LWMON */ /* Disable the LCD panel */ lcdp->lcd_lccr &= ~LCCR_PON;#ifdef CONFIG_RBC823 /* Turn off display backlight, VEE and LCD_ON */ immr->im_cpm.cp_pbdat &= ~0x00005001;#else immr->im_siu_conf.sc_sdcr &= ~(1 << (31 - 25)); /* LAM = 0 */#endif /* CONFIG_RBC823 */}#endif /* NOT_USED_SO_FAR || CONFIG_RBC823 *//************************************************************************//* ** Chipset depending Bitmap / Logo stuff... *//************************************************************************/#ifdef CONFIG_LCD_LOGOstatic void bitmap_plot (int x, int y){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm); ushort *cmap; ushort i; uchar *bmap; uchar *fb; debug ("Logo: width %d height %d colors %d cmap %d\n", BMP_LOGO_WIDTH, BMP_LOGO_HEIGHT, BMP_LOGO_COLORS, sizeof(bmp_logo_palette)/(sizeof(ushort)) ); /* Leave room for default color map */ cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]); WATCHDOG_RESET(); /* Set color map */ for (i=0; i<(sizeof(bmp_logo_palette)/(sizeof(ushort))); ++i) { ushort colreg = bmp_logo_palette[i];#ifdef CFG_INVERT_COLORS colreg ^= 0xFFF;#endif *cmap++ = colreg; } bmap = &bmp_logo_bitmap[0]; fb = (char *)(lcd_base + y * lcd_line_length + x); WATCHDOG_RESET(); for (i=0; i<BMP_LOGO_HEIGHT; ++i) { memcpy (fb, bmap, BMP_LOGO_WIDTH); bmap += BMP_LOGO_WIDTH; fb += panel_info.vl_col; } WATCHDOG_RESET();}#endif /* CONFIG_LCD_LOGO */#if (CONFIG_COMMANDS & CFG_CMD_BMP) || defined(CONFIG_SPLASH_SCREEN)/* * Display the BMP file located at address bmp_image. * Only uncompressed */int lcd_display_bitmap(ulong bmp_image, int x, int y){ volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm); ushort *cmap; ushort i, j; uchar *fb; bmp_image_t *bmp=(bmp_image_t *)bmp_image; uchar *bmap; ushort padded_line; unsigned long width, height; unsigned colors,bpix; unsigned long compression; WATCHDOG_RESET(); if (!((bmp->header.signature[0]=='B') && (bmp->header.signature[1]=='M'))) { printf ("Error: no valid bmp image at %lx\n", bmp_image); return 1; } width = le32_to_cpu (bmp->header.width); height = le32_to_cpu (bmp->header.height); colors = 1<<le16_to_cpu (bmp->header.bit_count); compression = le32_to_cpu (bmp->header.compression); bpix = NBITS(panel_info.vl_bpix); if ((bpix != 1) && (bpix != 8)) { printf ("Error: %d bit/pixel mode not supported by U-Boot\n", bpix); return 1; } if (bpix != le16_to_cpu(bmp->header.bit_count)) { printf ("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", bpix, le16_to_cpu(bmp->header.bit_count)); return 1; } if (compression!=BMP_BI_RGB) { printf ("Error: compression type %ld not supported\n", compression); return 1; } debug ("Display-bmp: %d x %d with %d colors\n", width, height, colors); if (bpix==8) { /* Fill the entire color map */ cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]); /* Set color map */ for (i = 0; i < colors; ++i) { bmp_color_table_entry_t cte = bmp->color_table[i]; ushort colreg = ((cte.red>>4) << 8) | ((cte.green>>4) << 4) | (cte.blue>>4) ;#ifdef CFG_INVERT_COLORS colreg ^= 0xFFF;#endif *cmap-- = colreg; } WATCHDOG_RESET(); } padded_line = (width&0x3) ? ((width&~0x3)+4) : (width); if ((x + width)>panel_info.vl_col) width = panel_info.vl_col - x; if ((y + height)>panel_info.vl_row) height = panel_info.vl_row - y; bmap = (uchar *)bmp + le32_to_cpu (bmp->header.data_offset); fb = (uchar *) (lcd_base + (y + height - 1) * lcd_line_length + x); for (i = 0; i < height; ++i) { WATCHDOG_RESET(); for (j = 0; j < width ; j++) *(fb++)=255-*(bmap++); bmap += (width - padded_line); fb -= (width + lcd_line_length); } return (0);}#endif /* (CONFIG_COMMANDS & CFG_CMD_BMP) || CONFIG_SPLASH_SCREEN *//*----------------------------------------------------------------------*/static void *lcd_logo (void){#ifdef LCD_INFO DECLARE_GLOBAL_DATA_PTR; char info[80]; char temp[32];#endif /* LCD_INFO */#ifdef CONFIG_SPLASH_SCREEN char *s; ulong addr; if ((s = getenv("splashimage")) != NULL) { addr = simple_strtoul(s, NULL, 16); if (lcd_display_bitmap (addr, 0, 0) == 0) { return ((void *)lcd_base); } }#endif /* CONFIG_SPLASH_SCREEN */#ifdef CONFIG_LCD_LOGO bitmap_plot (0, 0);#endif /* CONFIG_LCD_LOGO */#ifdef LCD_INFO sprintf (info, "%s (%s - %s) ", U_BOOT_VERSION, __DATE__, __TIME__); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y, info, strlen(info)); sprintf (info, "(C) 2003 DENX Software Engineering"); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT, info, strlen(info)); sprintf (info, " Wolfgang DENK, wd@denx.de"); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 2, info, strlen(info));#ifdef LCD_INFO_BELOW_LOGO sprintf (info, "MPC823 CPU at %s MHz", strmhz(temp, gd->cpu_clk)); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 3, info, strlen(info)); sprintf (info, " %ld MB RAM, %ld MB Flash", gd->ram_size >> 20, gd->bd->bi_flashsize >> 20 ); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4, info, strlen(info));#else /* leave one blank line */ sprintf (info, "MPC823 CPU at %s MHz, %ld MB RAM, %ld MB Flash", strmhz(temp, gd->cpu_clk), gd->ram_size >> 20, gd->bd->bi_flashsize >> 20 ); lcd_drawchars (LCD_INFO_X, LCD_INFO_Y + VIDEO_FONT_HEIGHT * 4, info, strlen(info));#endif /* LCD_INFO_BELOW_LOGO */#endif /* LCD_INFO */#if defined(CONFIG_LCD_LOGO) && !defined(LCD_INFO_BELOW_LOGO) return ((void *)((ulong)lcd_base + BMP_LOGO_HEIGHT * lcd_line_length));#else return ((void *)lcd_base);#endif /* CONFIG_LCD_LOGO */}/************************************************************************//************************************************************************/#endif /* CONFIG_LCD */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -