📄 lcd.c
字号:
lcd_setcolreg (CONSOLE_COLOR_WHITE, 0xFF, 0xFF, 0xFF);#endif#ifndef CFG_WHITE_ON_BLACK lcd_setfgcolor (CONSOLE_COLOR_BLACK); lcd_setbgcolor (CONSOLE_COLOR_WHITE);#else lcd_setfgcolor (CONSOLE_COLOR_WHITE); lcd_setbgcolor (CONSOLE_COLOR_BLACK);#endif /* CFG_WHITE_ON_BLACK */#ifdef LCD_TEST_PATTERN test_pattern();#else /* set framebuffer to background color */ memset ((char *)lcd_base, COLOR_MASK(lcd_getbgcolor()), lcd_line_length*panel_info.vl_row);#endif /* Paint the logo and retrieve LCD base address */ debug ("[LCD] Drawing the logo...\n"); lcd_console_address = lcd_logo (); console_col = 0; console_row = 0; return (0);}U_BOOT_CMD( cls, 1, 1, lcd_clear, "cls - clear screen\n", NULL);/*----------------------------------------------------------------------*/static int lcd_init (void *lcdbase){ /* Initialize the lcd controller */ debug ("[LCD] Initializing LCD frambuffer at %p\n", lcdbase); lcd_ctrl_init (lcdbase); lcd_clear (NULL, 1, 1, NULL); /* dummy args */ lcd_enable (); /* Initialize the console */ console_col = 0;#ifdef LCD_INFO_BELOW_LOGO console_row = 7 + BMP_LOGO_HEIGHT / VIDEO_FONT_HEIGHT;#else console_row = 1; /* leave 1 blank line below logo */#endif lcd_is_enabled = 1; return 0;}/************************************************************************//* ** ROM capable initialization part - needed to reserve FB memory *//************************************************************************//* * This is called early in the system initialization to grab memory * for the LCD controller. * Returns new address for monitor, after reserving LCD buffer memory * * Note that this is running from ROM, so no write access to global data. */ulong lcd_setmem (ulong addr){ ulong size; int line_length = (panel_info.vl_col * NBITS (panel_info.vl_bpix)) / 8; debug ("LCD panel info: %d x %d, %d bit/pix\n", panel_info.vl_col, panel_info.vl_row, NBITS (panel_info.vl_bpix) ); size = line_length * panel_info.vl_row; /* Round up to nearest full page */ size = (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1); /* Allocate pages for the frame buffer. */ addr -= size; debug ("Reserving %ldk for LCD Framebuffer at: %08lx\n", size>>10, addr); return (addr);}/*----------------------------------------------------------------------*/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;}/*----------------------------------------------------------------------*//************************************************************************//* ** Chipset depending Bitmap / Logo stuff... *//************************************************************************/#ifdef CONFIG_LCD_LOGOvoid bitmap_plot (int x, int y){ ushort *cmap; ushort i, j; uchar *bmap; uchar *fb; ushort *fb16;#if defined(CONFIG_PXA250) struct pxafb_info *fbi = &panel_info.pxa;#elif defined(CONFIG_MPC823) volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm);#endif 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))); bmap = &bmp_logo_bitmap[0]; fb = (char *)(lcd_base + y * lcd_line_length + x); if (NBITS(panel_info.vl_bpix) < 12) { /* Leave room for default color map */#if defined(CONFIG_PXA250) cmap = (ushort *)fbi->palette;#elif defined(CONFIG_MPC823) cmap = (ushort *)&(cp->lcd_cmap[BMP_LOGO_OFFSET*sizeof(ushort)]);#endif 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 *cmap++ = 0xffff - colreg;#else *cmap++ = colreg;#endif } 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; } } else { /* true color mode */ fb16 = (ushort *)(lcd_base + y * lcd_line_length + x); for (i=0; i<BMP_LOGO_HEIGHT; ++i) { for (j=0; j<BMP_LOGO_WIDTH; j++) { fb16[j] = bmp_logo_palette[(bmap[j])]; } bmap += BMP_LOGO_WIDTH; fb16 += 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){ 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;#if defined(CONFIG_PXA250) struct pxafb_info *fbi = &panel_info.pxa;#elif defined(CONFIG_MPC823) volatile immap_t *immr = (immap_t *) CFG_IMMR; volatile cpm8xx_t *cp = &(immr->im_cpm);#endif 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; } debug ("Display-bmp: %d x %d with %d colors\n", (int)width, (int)height, (int)colors); if (bpix==8) {#if defined(CONFIG_PXA250) cmap = (ushort *)fbi->palette;#elif defined(CONFIG_MPC823) cmap = (ushort *)&(cp->lcd_cmap[255*sizeof(ushort)]);#else# error "Don't know location of color map"#endif /* Set color map */ for (i=0; i<colors; ++i) { bmp_color_table_entry_t cte = bmp->color_table[i]; ushort colreg = ( ((cte.red) << 8) & 0xf800) | ( ((cte.green) << 4) & 0x07e0) | ( (cte.blue) & 0x001f) ;#ifdef CFG_INVERT_COLORS *cmap = 0xffff - colreg;#else *cmap = colreg;#endif#if defined(CONFIG_PXA250) cmap++;#elif defined(CONFIG_MPC823) cmap--;#endif } } 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) { for (j = 0; j < width ; j++)#if defined(CONFIG_PXA250) *(fb++)=*(bmap++);#elif defined(CONFIG_MPC823) *(fb++)=255-*(bmap++);#endif 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; static int do_splash = 1; if (do_splash && (s = getenv("splashimage")) != NULL) { addr = simple_strtoul(s, NULL, 16); do_splash = 0; 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 CONFIG_MPC823#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) 2004 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 /* CONFIG_MPC823 */#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 + -