免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 621 | 回复: 0
打印 上一主题 下一主题

framebuffer驱动全篇(五) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-11 19:09 |只看该作者 |倒序浏览

Fb console中的字体
/driver/video目录下:
font_6x11.c,font_8x8.c,font_8x16.c
font_acorn_8x8.c,font_pearl_8x8.c,
font_sun8x16.c,font_sun12x22.c
fonts.c
这些文件都是用来处理在fbcon中的字体显示问题。其中除最后一个文件fonts.c外,其他都是字模文件由cpi2fnt产生。
/include/video/目录下:
font.h
1.          首先介绍font.h文件
font.h文件中,定义了字体的描述结构
struct fbcon_font_desc {
    int idx;     /字体的索引号
    char *name;/字体的描述
    int width, height;/字模的宽和高
    void *data;/字模的起始指针
    int pref;    /额外信息,平台用
};
width的值不一定是8的整数倍,考虑到计算机存储的问题,即使width小于8的整数倍,存储时仍以字节为单位,不足的右补齐0。
Linux内核自带了7种字体,name依次为:
font_vga_8x8,
                            font_vga_8x16,
                            font_pearl_8x8,
                            font_vga_6x11,
                            font_sun_8x16,
                            font_sun_12x22,
                            font_acorn_8x8;
根据定义name长度不大于32字节。
2.          Font.c文件
/* 根据字体名返回该字体的描述结构 */
struct fbcon_font_desc *fbcon_find_font(char *name);

/*根据屏幕大小,获取默认字体描述 */
struct fbcon_font_desc *fbcon_get_default_font(int xres, int yres);

由此看来,linux中基于fbcon的字体比较单一,描述和使用也相对简单。主要是由于采用字模描述,只描述256个ascii字符,故存储空间不大,从2048到11264不等。
Fbcon中的颜色查找表
Fbcon-cfbx表示该console使用的是xbpp颜色描述。颜色数为2^x。
在此,我们仅以x=8,x=24举例,使用颜色分别是256色和真彩16M。
/driver/video/fbcon-cfb8.c
/driver/video/fbcon-cfb24.c
/include/video/fbcon-cfb8.h
/include/video/fbcon-cfb24.h
这4个文件实现的具体的操作,而fbcon的底层操作,参考前面的fbcon的介绍,不重复了:)
实现fbcon的颜色映射只需完成下面的功能,以fb8为例:
struct display_switch fbcon_cfb8;   
void fbcon_cfb8_setup(struct display *p);
void fbcon_cfb8_bmove(struct display *p, int sy, int sx, int dy, int dx, int height, int width);
void fbcon_cfb8_clear(struct vc_data *conp, struct display *p, int sy, int sx, int height, int width);
void fbcon_cfb8_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx);
void fbcon_cfb8_putcs(struct vc_data *conp, struct display *p, const unsigned short *s, int count, int yy, int xx);
void fbcon_cfb8_revc(struct display *p, int xx, int yy);
void fbcon_cfb8_clear_margins(struct vc_data *conp, struct display *p,int bottom_only);
fbcon_cfb8是系统的实现关键,具体解释参考fbcon介绍。
fbcon_cfb8_setup函数完成设定display结构中next_line和next_palne的值。
fbcon_cfb8_bmove函数完成当前坐标的移动。
fbcon_cfb8_clear函数通过调用rectfill函数清屏幕缓冲区。
fbcon_cfb8_putc函数向屏幕输出单字符,字体宽度必须小于等于16。
fbcon_cfb8_putcs函数向屏幕输出字符串。
fbcon_cfb8_revc函数从屏幕输入单个字符,并回显到fb上。
fbcon_cfb8_clear_margins函数和fbcon_cfb8_clear类似,调用rectfill清除区域。
其中,fb_writel函数和fb_readl函数实现输入输出的底层操作。这两个函数实际上实在fbcon_h中定义的宏操作,IOMEM操作而已。
关注一下“(nibbletab_cfb8[*cdat++ >> 4] & eorx) ^ bgx,”
这是所谓8bpp的具体实现,不同的位深就在写fb缓冲时体现了。让我们从后向前分析,
1.()^bgx,颜色和背景色异或,只有这样才能保证背景色改变时,文字一直显示。
2.~&eorx,eorx是前景色和背景色异或后的值,只有在前景色和背景色一致的时候,eorx才是0。
3. nibbletab_cfb8[~],根据字体的~值,调用查找表,取颜色值
4.~从字体文件中去读字模的值。

还有点疑问,就是这两句的作用,attr_fgcol在fbcon_h中定义:
fgx=attr_fgcol(p,c);
    bgx=attr_bgcol(p,c);
从前面的看,c应该是个字符的ascii码,ascii与颜色有什么关系呢?研究中….


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/62910/showart_527517.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP