赞
踩
核心文件:/drivers/video/fbmem.c
18.2.3.Linux帧缓冲相关数据结构与函数
1. fb_info结构体(最关键)
2.fb_ops结构体
fb_info成员变量fb_ops为指向底层操作的函数指针,这些函数需要驱动程序猿自己编写。
3. fb_var_screeninfo 和 fb_fix_screeninfo 结构体
fb_var_screeninfo 记录用户可以修改的显示控制器参数,包括屏幕分辨率和每个像素点的比特数。
fb_fix_screeninfo 记录用户不能修改的显示控制器参数,包括屏幕缓冲区的物理地址、长度。当对帧缓冲舍内进行映射操作的时候,就是从fb_fix_screeninfo中取得缓冲区的物理地址。上述结构体都需要在驱动程序中初始化和设置。
fb_bitfield描述每一像素显示缓冲区的组织方式,包含位域偏移、位域长度和MSB(最高有效位)指示。
fb_cmap结构体记录设备无关的颜色表信息,用户空间可以通过 ioctl() 的 FBIOGETCMAP 和 FBIOPUTCMAP 命令读取或设定 颜色表。
7.文件操作结构体
int register_framebuffer(struct fb_info *fb_info); /* 注册成功返回0, 超过设备最大数目FB_MAX(32)返回-ENXIO */
int unregister_framebuffer(struct fb_info *fb_info);
18.3帧缓冲设备驱动结构
18.4帧缓冲设备驱动的模块加载与卸载函数
帧缓冲设备驱动的模块加载函数:
(1)申请FBI结构体的内存空间,初始化FBI结构体中固定和可变的屏幕参数。
(2)根据具体的LCD屏幕特点,完成LCD控制器硬件的初始化。
(3)申请帧缓冲设备的显示缓冲区空间。
(4)注册帧缓冲设备。
在帧缓冲设备驱动的模块加载函数中完成的工作只是注册平台驱动,初始化FBI结构体中的固定和可变参数、LCD控制器硬件的初始化、申请帧缓冲设备的显示缓冲区空间和注册帧缓冲设备的工作在平台驱动的探测函数中完成。
18.5 帧缓冲设备显示缓冲区的申请与释放
在分配缓冲区时一定要考虑cache的一致性问题,因为系统往往会通过DMA方式搬移显示数据。合适的方式是使用 dma_alloc_writecombine() 函数分配一段 writecombining 区域,对应的 writecombining 区域由 dma_free_writecombine() 函数释放。
writecombing 意味着“写合并”,它允许写入的数据被合并,并临时保存在写合并缓冲区(WCB)中,直到进行一次 burst 传输而不再需要多次 single 传输。通过 dma_alloc_writecombine() 分配的显示缓冲区不会出现 cache 一致性问题,这一点类似 dma_alloc_coherent()。
18.6.1 定时参数
FBI结构体可变参数var中的left_margin、right_margin、upper_margin、lower_margin、hsync_len和vsync_len直接查LCD数据手册就可以得到。
18.6.2 像素时钟
FBI可变参数var中的pixclock意味着像素时钟,例如,如果为28.37516MHz,那么画一个像素需要35242ps(皮秒):
1/(28.37516MHz) = 35.242E-9s
如果屏幕的分辨率是640*480,显示一行的时间是:640*35.242E-9s = 22.555E-6 s
每条扫描线是640,但是水平回扫和水平同步也需要时间,假设水平回扫和同步需要272个像素时钟,因此,画一条扫描线完整的时间是:(640+272)* 35.242E-9 s - 9 s = 32.141E-6 s
可以计算出水平扫描率大约是32kHz:1/(32.141E-6 s) = 31.113E3 Hz
完整的屏幕有480条线,但是垂直回扫和垂直同步也需要时间,假设垂直回扫和垂直同步需要49个像素时钟,因此,画一个完整的屏幕的时间是:(480+49)*32.141E-6 s = 17.002E-3 s
可以计算出垂直扫描率大约是59kHz:1/(17.002E-3 s) = 58.815 Hz
这意味着屏幕数据每秒钟大约刷新59次。
18.6.3 颜色位域
FBI可变参数var中的red、green、blue、位域的设置直接由显示缓冲区与显示点的对应关系决定,例如,对于RGB565模式,red占居5位,偏移11位,green占居6位,偏移5位,blue占居5位,偏移0位,即:
FBI固定参数 fix 中 smem_start 指示帧缓冲设备显示缓冲区的首地址,smem_len 为帧缓冲设备显示缓冲区的大小,计算公式为:
smem_len = max_xres * max_yres * max_bpp;
即:帧缓冲设备显示缓冲区的大小 = 最大的 x 解析度 * 最大的 y 解析度 * 最大的 BPP;
18.7 帧缓冲设备驱动的 fb_ops 成员函数
fb_check_var() 用于调整可变参数,并修正为硬件所支持的值;fb_set_par() 则根据屏幕参数设置具体读写LCD控制器的寄存器以使得LCD控制器进入相应的工作状态。
对于 fb_ops 中的 fb_fillrect() 、 fb_copyarea() 和 fb_imageblit() 成员函数,通常直接使用对应的通用的 cfb_fillrect() 、cfb_copyarea() 和 cfb_imageblit() 函数即可。cfb_fillrect() 函数定义在 drivers/video/cfbfillrect.c 文件中,cfb_copyarea() 定义在 /drivers/video/cfbcopyarea.c 文件中, cfb_imageblit() 定义在 /drivers/cfbimagblt.c 文件中。
(仔细分析)
18.9 帧缓冲设备的用户空间访问
通过/dev/fbn,应用程序可进行的针对帧缓冲设备的操作主要有:
(1)读/写 /dev/fbn : 相当于读写帧缓冲区。例如 cp /dev/fb0 tmp 可以将当前屏幕的内容复制到一个文件中。cp tmp > /dev/fb0则讲图像文件tmp显示在屏幕上。
(2)映射操作:对于帧缓冲设备,可通过 mmap() 映射操作将屏幕缓冲区的物理地址映射到用户控件的一段虚拟地址中,之后用户控件就可以通过读写这段虚拟地址访问屏幕缓冲区,在屏幕上绘图。而且若干个进程可以映射到同一个显示缓冲区。实际上,使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。
(3)I/O控制:对于帧缓冲设备,对设备文件的 ioctl() 操作可读取/设置显示设备及屏幕的参数,如分辨率、显示颜色数、屏幕大小等。
应用程序操作/dev/fbn的一般步骤:
(1)打开 /dev/fbn 设备文件。
(2)用 ioctl() 操作取得当前显示屏幕的参数,如分辨率、每个像素点的比特位数和偏移。根据屏幕参数课计算屏幕缓冲区的大小。
(3)将屏幕缓冲区映射到用户空间。
(4)映射后就可以直接读/写屏幕缓冲区进行绘图和图片显示了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。