u-boot字符显示原理
u-bootu-boot 字符显示原理字符显示原理 在 u-boot 源码的头文件 include/video_font_data.h中定义了 ASCII 码的 8*16 像素点阵字 库,以无符号字符数组形式保存,其中的每个字符相关元素的顺序与 ASCII 码的顺序一致, 在访问每个字符的时候,可以通过字符的ASCII 值与每个字符编码所占的空间来进行偏移量 计算,从而得到相关的数据, 字库中每个字符信息都包含十六个数据, 且每个数据都是一个 八位无符号整数,展开成二进制后,他们每一位都对应了实际显示一个像素, 其中为 1 的位 代表亮,为 0 的位代表暗,这样就完成了一个字符从外形到抽象的数据的转换保存。 如字符 A 的点阵数据如下 /* 65 0 x41 A */ 0 x00, /* 00000000 */第 1 行的 8 个像素点 0 x00, /* 00000000 */ 0 x10, /* 00010000 */红色表示显示有效的像素点 0 x38, /* 00111000 */ 0 x6c, /* 01101100 */ 0 xc6, /*11000110 */ 0 xc6, /*11000110 */ 0 xfe, /*11111110 */ 0 xc6, /*11000110 */ 0 xc6, /*11000110 */ 0 xc6, /*11000110 */ 0 xc6, /*11000110 */ 0 x00, /* 00000000 */ 0 x00, /* 00000000 */ 0 x00, /* 00000000 */ 0 x00, /* 00000000 */第 16 行的 8 个像素点 A 的 ASCII 码为 65,可以通过65*16 的偏移量来访问,而实际显示时,仍然需要根 据每像素颜色位数进行映射, 并且配合前景色和背景色显示。 下面通过代码进行详细分 析。 首先,介绍几个相关数据结构。 1)用来生成前景色和背景色的参考值(include/video_fb.h) define CONSOLE_BG_COL0 x00 1 define CONSOLE_FG_COL0 xa0 2)前景色和背景色的数值表示(drivers/video/cfb_console.c) static u32 eorx, fgx, bgx; /* color pats */ 我们以 RGB565 彩色模式为例(一个像素占两个字节, 其中,低字节的前 5 位用来 表示 BLUE,低字节的后三位高字节的前三位用来表示Green,高字节的后 5 位用来表 示 RED) case GDF_16BIT_565RGB fgx CONSOLE_FG_COL 3 3 2 3 3 2 6] 4 bgx; bgx; } u32 * dest[1] SHORTSWAP32video_font_draw_table16[bits 4 u32 * dest[2] SHORTSWAP32video_font_draw_table16[bits 2 /*移动绘制的指针*/ dest0 VIDEO_FONT_WIDTH * VIDEO_PIXEL_SIZE; /*准备处理下个字符*/ s; break; 下面对如下代码进行补充说明 u32 * dest[0] SHORTSWAP32video_font_draw_table16[bits 6] u32 * dest[1] SHORTSWAP32video_font_draw_table16[bits 4 u32 * dest[2] SHORTSWAP32video_font_draw_table16[bits 2 u32 * dest[3] SHORTSWAP32video_font_draw_table16 [bits 这里首先将每行 8 位二进制数分成 4 组, 以字符 A 的第三行为例, 也就是 01111110 (表示 8 个像素点) ,分成四组 01B,11B,11B,10B。然后依次使用它们作为数组 video_font_draw_table16[]的下标查询对应颜色值,该数组定义如下 static const int video_font_draw_table16[] {0 x00000000,0 x0000ffff,0 xffff0000,0 xffffffff}; 5 此数组中保存的十六进制数以四四分组,0 x0000 对应传递进来的 0B(表示 RGB 分 量全为最小值) ,0 xffff 对应传递进来的 1B(表示 RGB 分量全为最大值) 。那么,01B 就 映射成了 0 x0000ffff,11B 映射成了 0 xffffffff,10B 映射成了 0 xffff0000。01B 对应两个像 素点,第一个像素无效(需要设置为背景色) ,第二个像素有效(需要设置成前景色) , 将该值先与 eorx 进行按位与操作 312721161150 00000000000000001111111111111111(01B) 10100101000101001010110100010100(eorx) 得到 00000000000000001010110100010100 再与背景色 bgx 做异或操作 00000000000000000000000000000000(bgx) 得到 00000000000000001010110100010100 这样便将 01B(0 x0000ffff)的有效(第二个)像素设置为前景色,无效(第一个) 像素设置为背景色。然后将像素这两个像素信息写入frambuffer中,即 u32 * dest[0] SHORTSWAP32video_font_draw_table16[bits 6] 接下来的 3 组,共 6 个像素也是同样的处理。将点阵信息写入framebuffer 也就是 写入显存中后,对应的图像就能显示出来了。 6