基于SEP4O2O的Linux frame buffer驱动设计
完成可变参数和固定参数的填充之后,要为本驱动申请中断资源,具体函数为requestirq(irq,sep4020fb_irq,SA INTERRUPT,pdev一>name,info),irq为请求的中断号,sep4020fb_irq为中断处理服务子程序,SA_INTERRUPT表示为一个快速中断处理,在执行中断的过程中禁止所有在当前处理器上的其他中断。申请中断完毕之后,就要完成本驱动关键步骤,调用sep4020fb_map_video_memory()函数申请显示缓冲区。在该函数中,首先调用PAGE_ALIGN()函数对齐申请的缓冲区的大小,使即将申请的显示缓冲区大小为页的整数倍;然后调用函数dma_all oc_writecombine(fbi->dev,fbi一>map_size,&fbi一>map_dma,GFP_KERNEL), 分配一块写合并的内存区域作为帧缓存,函数返回值为申请的帧缓存的起始位置的虚拟地址,fbi一>map_dma代表的是该位置的物理地址,fbi一>map_si ze为此内存区的大小。
完成上面的工作之后,驱动程序在就有了一块内存区域作为帧缓冲,向此区域写入数据就能显示在液晶屏上。后面还要调用sep4020fb_init_registers(info)函数初始化L C D控制器的寄存器;然后调用sep4020fb_check_var(&fbinfo一>var,fbinfo)检查可变参数,最后调用register_framebuffer(fbinfo)注册帧缓冲设备。
3.3 提供给应用程序的接口
本驱动设计定义了如下几个接口供应用程序调用:fb_ioctl,fb_blank,fb_fillrect.
部分代码如下:本文引用地址:https://www.eepw.com.cn/article/202630.htm
sep4020_blank函数主要实现了将液晶屏清屏的功能。
sep4020fb_fillrect函数实现了填充液晶屏一块矩形区域的功能。
sep4020fb_ioctl函数则为上层应用提供了更多的功能,部分可供上层调用的命令如下:
FBIOGET_VSCREENINFO表示用户获取屏幕的可变参数;
FBIOPUT_VSCREENINFO表示用户设置可变的屏幕参数;
FBIOGET_FSCREENINFO表示用户获得屏幕的固定参数;
FBIOBLANK表示调用sep4020fb_blank函数清空液晶屏;
FBIOPUTCMAP表示设置屏幕的颜色表;
FBIOGETCMAP表示获得颜色表。
3.4 用户空间对帧缓冲设备进行访问
驱动程序经过编译并加载为模块后,成为/dev/fb0设备,在应用程序中,操作/dev/fb0一般遵循如下步骤:1)打开/dev/fb0设备文件;2)调用ioctl()操作取得屏幕的参数,如屏幕分辨率和每个像素所占的比特数,进而计算出显示缓冲区的大小;3)将屏幕缓冲区映射到用户空间;4)映射之后就可以向缓冲区写入或者读出数据,进行绘图了。
4 测试与结论
根据前面论述的步骤向屏幕缓冲区写入数据,将每个像素的值设为0xF0F0,在屏幕上显示如下图像:
测试结果显示,在本课题驱动模块的支持下,可以向屏幕缓冲区写入数据并正确地在屏幕上显示出来,工作完全正常。本文所提出的设计方案已经应用在本单位某产品上。
评论