Chinaunix首页 | 论坛 | 博客
  • 博客访问: 531908
  • 博文数量: 174
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 1827
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-15 14:12
文章分类

全部博文(174)

文章存档

2018年(1)

2017年(1)

2013年(3)

2012年(9)

2010年(12)

2009年(5)

2008年(106)

2007年(37)

我的朋友

分类: LINUX

2008-12-10 11:46:23

framebuffer驱动全篇(五)(转载)


转载地址:   
                          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的字体比较单一,描述和使用也相对简单。主要是由于采用字模描述,只描述256ascii字符,故存储空间不大,从204811264不等。
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与颜色有什么关系呢?研究中….
阅读(702) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~