




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 u-boot字符显示原理在u-boot源码的头文件include/video_font_data.h中定义了ASCII码的8*16像素点阵字库,以无符号字符数组形式保存,其中的每个字符相关元素的顺序与ASCII码的顺序一致,在访问每个字符的时候,可以通过字符的ASCII值与每个字符编码所占的空间来进行偏移量计算,从而得到相关的数据,字库中每个字符信息都包含十六个数据,且每个数据都是一个八位无符号整数,展开成二进制后,他们每一位都对应了实际显示一个像素,其中为1的位代表亮,为0的位代表暗,这样就完成了一个字符从外形到抽象的数据的转换保存。如字符A的点阵数据如下:/*650 x41A*/0 x0
2、0,/*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,/*00000
3、000*/第16行的8个像素点A的ASCII码为65,可以通过65*16的偏移量来访问,而实际显示时,仍然需要根据每像素颜色位数进行映射,并且配合前景色和背景色显示。下面通过代码进行详细分析。首先,介绍几个相关数据结构。1)用来生成前景色和背景色的参考值(include/video_fb.h):#defineCONSOLE_BG_COL0 x00#defineCONSOLE_FG_COL0 xa02)前景色和背景色的数值表示(drivers/video/cfb_console.c):staticu32eorx,fgx,bgx;/*colorpats*/我们以RGB565彩色模式为例(一个像素占
4、两个字节,其中,低字节的前5位用来表示BLUE,低字节的后三位+高字节的前三位用来表示Green,高字节的后5位用来表示RED):caseGDF_16BIT_565RGB:fgx=(CONSOLE_FG_COL3)2)3)3)2)3);bgx=(CONSOLE_BG_COL3)2)3)3)2)3);break;eorx=fgx人bgx;可以得到,前景色fgx为(红色分量10100,绿色分量101000,蓝色分量为10100):10100101000101001010110100010100同样,背景色bgx为:00000000000000000000000000000000eorx即为前景色和
5、背景色的异或(混合),这里eorx实际就是前景色fgx的值。3)输出颜色索引表,用来实现字库中有效像素数据(每2位数据为一组)到实际像素数据(RGB565)的映射(drivers/video/cfb_console.c):staticconstintvideo_font_draw_table16=0 x00000000,0 x0000ffff,0 xffff0000,0 xffffffff;4)用来交换32位数的高低16位中的高低8位的顺序的宏(drivers/video/cfb_console.c):#defineSHORTSWAP32(x)(x)&0 x000000ff)8)|(x)&0
6、x00ff0000)8)5)相关字符数据(include/video_font_data.h):#defineVIDEO_FONT_CHARS256/*ASCII码字符总数*/#defineVIDEO_FONT_WIDTH8#defineVIDEO_FONT_WIDTH8/*字符宽度*/16/*字符高度16/*字符高度*/#defineVIDEO_FONT_SIZE(VIDEO_FONT_CHARS*VIDEO_FONT_HEIGHT)/*字#defineVIDEO_FONT_SIZE库所占内存空间大小*/6)ASCII码字符数据,每个字符16行,每个像素8位数据占一行(include/vid
7、eo_font_data.h):staticunsignedchar_maybe_unusedvideo_fontdataVIDEO_FONT_SIZE=/*00 x00嶂*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*000000
8、00*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/0 x00,/*00000000*/;在drivers/video/cfb_console.c文件中定义了video_drawchars函数,下面仍然以字符必(控制字符,键盘Ctrl组合扫描码)和RGB565彩色模式为例,分析其代码:staticvoidvideo_drawchars(intxx,intyy,unsignedchar*s,intcount)u8*cdat,*dest,*dest0;introws,offset,c;/*计算偏移量*/offset=yy*VIDEO_
9、LINE_LEN+xx*VIDEO_PIXEL_SIZE;/*设置绘制的基址*/dest0=video_fb_address+offset;switch(VIDEO_DATA_FORMAT)/*以16BIT_565RGB模式为例*/caseGDF_16BIT_565RGB:while(count-)/*count为需要显示的字符总数*/c=*s;/*提取单个字符*/*通过ASCII码字库获取点阵数据*/cdat=video_fontdata+c*VIDEO_FONT_HEIGHT;for(rows=VIDEO_FONT_HEIGHT,dest=dest0;rows-;dest+=VIDEO_L
10、INE_LEN)/*提取每行数据单独处理*/u8bits=*cdat+;/*将8位二进制数分成4组,每组两位,进行处理,这几行的分析在后面补充说明*/(u32*)dest)0=SHORTSWAP32(video_font_draw_table16bits6&eorx)Abgx);(u32*)dest)1=SHORTSWAP32(video_font_draw_table16bits4&3&eorx)Abgx);if(VIDEO_FONT_WIDTH=4)continue;(u32*)dest)2=SHORTSWAP32(video_font_draw_table16bits2&3&eorx)A
11、bgx);(u32*)dest)3=SHORTSWAP32(video_font_draw_table16bits&3&eorx)Abgx);/*移动绘制的指针*/dest0+=VIDEO_FONT_WIDTH*VIDEO_PIXEL_SIZE;/*准备处理下个字符*/s+;break;下面对如下代码进行补充说明:(u32*)dest)0=SHORTSWAP32(video_font_draw_table16bits6&eorx)Abgx);(u32*)dest)1=SHORTSWAP32(video_font_draw_table16bits4&3&eorx)Abgx);(u32*)dest
12、)2=SHORTSWAP32(video_font_draw_table16bits2&3&eorx)Abgx);(u32*)dest)3=SHORTSWAP32(video_font_draw_table16bits&3&eorx)Abgx);这里首先将每行8位二进制数分成4组,以字符A的第三行为例,也就是01111110(表示8个像素点),分成四组01B,11B,11B,10B。然后依次使用它们作为数组video_font_draw_table16口的下标查询对应颜色值,该数组定义如下:staticconstintvideo_font_draw_table16=0 x00000000,0
13、x0000ffff,0 xffff0000,0 xffffffff;此数组中保存的十六进制数以四四分组,0 x0000对应传递进来的0B(表示RGB分量全为最小值),0 xffff对应传递进来的1B(表示RGB分量全为最大值)。那么,01B就映射成了0 x0000ffff,11B映射成了0 xffffffff,10B映射成了0 xffff0000。01B对应两个像素点,第一个像素无效(需要设置为背景色),第二个像素有效(需要设置成前景色),将该值先与eorx进行按位与操作:31272116115000000000000000001111111111111111(01B)10100101000101001010110100010100(eorx)得到:00000000000000001010110100010100再与背景色bgx做异或操作:00000000000000000000000000000000(bgx)得到:000000000000000010101101000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 江苏省资金结转管理办法
- 吉林省吉林市蛟河市第一中学2025年物理高一下期末监测试题含解析
- 厂房租赁意向书房屋租赁合同
- 宁夏银川二中2025届物理高一第二学期期末综合测试试题含解析
- 医学生岗前培训心得总结
- 化妆品展会活动策划方案
- 初中语文教师个人教研工作计划
- 2025年浙江省交通事故赔偿标准
- 安全生产费用台账怎么做
- 安全生产教育的培训内容
- 热射病的诊断与治疗
- 期末考试成绩分析表
- JJF 1076-2020数字式温湿度计校准规范
- GB/T 9074.18-2017自攻螺钉和平垫圈组合件
- 长沙梅溪湖国际新城产业组织与西区土地一级开发
- GB/T 3768-2017声学声压法测定噪声源声功率级和声能量级采用反射面上方包络测量面的简易法
- 临床诊疗指南(急诊医学)
- GB 2811-2007安全帽
- 胸腔积液PPT.ppt 课件
- 断指再植术后的切口
- 曾国藩为官之道
评论
0/150
提交评论