全部博文(160)
分类: LINUX
2011-04-11 17:48:15
一些关键的概念
像素:pixel,点阵,就是屏幕上的一个点。
Bpp: 每个像素所占的bit数。bit数越大,一个像素能表现颜色数越多。8bpp,能表现256种颜色。16Bpp能表现65536种颜色。
分辨率:一个屏幕x方向和y方向所能排列的像素数。比如240*320,240代表x方向的像素个数,320代表y方向的像素个数,整个屏幕所能占有的像素个数为240*320=76800。
Frame buffer:帧缓冲区,显示一帧所占的内存存储空间,可以认为是显存。帧缓冲区的内容和屏幕上的点空间一般是行对应的。每行存储着这行的每个像素的颜色信息,像素的信息大小由bpp决定。
framebuffer设备:是Linux内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。可以将它看成是显示内存的一个映像,将其映射到进程空间之后,就可以直接进行读写操作,而写操作可以立即反映在屏幕上。(基于PC上wmware虚拟机,提供了VGA的仿真;基于s3c2410上:skyeye虚拟机,提供了LCD仿真;基于pxa上:skyeye虚拟机,提供了LCD仿真)。
Console:控制台,指可以显示内核信息,并且允许用户登录的设备。
terminal:终端,指有显示器或者LCD作为输出,键盘作为输入的设备。
Virtual terminal:虚拟终端,简称VT。指在一个标准终端可以虚拟多个终端设备。在PC上,各个虚拟终端可以用ALT+功能键切换。
Console和VT的关系。
Framebuffer driver驱动程序编写
(1)重要数据结构
在include/linux/fb.h中定义:
struct fb_fix_screeninfo:描述framebuffer设备在使用过程中,固定不变的一些属性。用户和内核空间可见。
struct fb_var_screeninfo:描述framebuffer设备在之用过程中,需要改变或设定的一些属性。用户和内核空间可见。
struct fb_ops:framebuffer设备的一些操作函数。只在内核空间可见。
struct fb_info:描述一个framebuffer设备。上面三个嵌入在这个结构中。只在内核空间可见。
struct fb_fix_screeninfo介绍:
id:字符串表示的字符标识。
smem_start:framebuffer使用的内存起始地址,表示的是物理地址。
smem_line:framebuffer所占用的内存的大小,字节为单位。
type:Framebuffer的类型。多用FB_TYPE_PACKED_PIXELS_。
visual:表示可见颜色。4,8bpp用FB_VISUAL_PSEUDOCOLOR和FB_VISUAL_STATIC_PSEUDOCOLOR;16,24,32使用FB_VISUAL_TRUCOLOR。
line_length:一行所占内存的长度,以字节为单位。
accel:是否使用硬件加速,一般为FB_ACCEL_NONE,表示没有使用。
struct fb_var_screeninfo介绍:
xres,yres:x,y方向的可见分辨率。表示可以看见的屏幕大小。
xres_virtual,yres_virtual:x和y方向的虚拟分辨率。表示可以显示的屏幕大小。
xoffset,yoffset:x和y方向的可见分辨率和虚拟分辨率的偏移。
bits_perl_pixel:bpp,每个点阵或者象素所占bit数。
struct fb_ops介绍:
fb_get_fix:获取struct fb_fix_screeninfo结构
fb_get_var:获取struct fb_var_screeninfo结构
fb_set_var:设置struct fb_var_screeninfo
struct fb_info结构介绍:
char modename[40]:framebuffer设备名称。在/proc/fb可查看。
Struct fb_var_screeninfo var
srtuct fb_fix_screeninfo fix
struct fb_ops *fbops
char *screen_base:虚拟地址
char fontname[40]:使用的字体名字。
(2)编写驱动程序
xxxfb_setup:解析命令行参数
在video_setup(driver/video/fmem.c)中调用。解析类似video=xxx:opt1,opt2的命令行参数。
xxxfb_init:驱动程序初始化函数
xxxfb_init_fbinfo:初始化xxxfb_info结构。
xxxfb_map_video_memory:分配系统内存给显示设备。
xxxfb_hw_init:初始化显示硬件
xxxfb_set_var:设定参数,根据xxxfb_init_fbinfo初始化的参数设备fb_var_screeninfo。
register_framebuffer:注册fb_info结构,成为framebuffer设备
实现xxxfb_ops结构和它的函数。
Framebuffer应用程序编程
打开framebuffer设备
int fd = open(“/dev/fb0”, O_RDWR);
关闭framebuffer设备
close(fd);
读取framebuffer信息
struct fb_fix_screeninfo fb_fix;
struct fb_var_screeninfo fb_var;
if(ioctl(fd, FBIOGET_FSCREENINFO, &fb_fix) == -1 || ioctl(fd, FBIOGET_VSCEERNINFO, &fb_var) == -1)
{
printf(“Error reading screen info:\n”);
}
设置framebuffer设备信息
ioctl(fd, FBIOPUT_VSCREENINFO, &fb_var);
读写设备文件
lseek定位要写的点
write写相应的值到此点
read读相应的点
映射显示区域到应用程序空间
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
addr,映射起始地址。0表示由系统指定地址。
Length, 映射空间长度。为framebuffer所占显示内存空间大小。
prot:内存保护标志,表示读写和执行权限。PROT_READ和PROT_WRITE,表示可读可写。
Flags, 标志位。使用MAP_SHARED表示写内存就同时写入文件中。
Fd, 要映射的文件句柄。
offset:要映射的文件的起始偏移。