嵌入式Linux下的LCD驱动程序设计与实现
2.3 驱动程序设计与实现
2.3.1 LCD驱动的模块加载与卸载
LCD作为一个相对独立的硬件单元,被认定为平台设备,在驱动模块加载和卸载函数中,就分别注册和注销对应的platform_driver。
2.3.2 LCD驱动的探测与移除函数
探测函数probe主要完成LCD控制器初始化的工作,包括对fb_info结构成员的初始化、内存分配、寄存器的配置、Framebuffer的注册等。模块卸载函数中对平台驱动的注销会导致其中移除函数的执行,这个函数释放显示缓冲区并注销帧缓冲设备。
2.3.3 LCD驱动的fb_ops成员函数
在程序设计里,定义LCD驱动的fb_ops结构体和相关函数功能如下所示

可以看出,fb_ops()结构体类似于file_opera tions()结构体,提供了一个帧缓冲设备的统一接口。s3c2410_ops()函数给出了标准接口到针对具体硬件操作函数的跳转指针。
2.3.4 Framebuffer设备驱动程序的设计
驱动程序主要完成的工作有以下5部分:
(1)编写初始化函数
Framebuffer驱动首先要初始化LCD控制器,通过相关寄存器来设置LCD相对应的显示模式和颜色数,然后分配显示缓冲区。通常用vmall-oc()函数分配一段连续空间,缓冲区的大小可以用“点阵行数×点阵列数×一个像素的位数/8”计算得到。
如果使用模块化加载方式,加载LCD驱动模块时,系统调用fb_init()函数。卸载LCD驱动模块时,系统首先调用unregister_framebuffer()取消注册,然后释放显示缓冲区的内存。
(2)编写成员函数
主要负责编写fb_ops()对应的底层操作函数。
(3)读/写(read/write)
完成对帧缓冲区的读写操作。
(4)映射(map)
Linux有内核空间和用户空间,平时工作在保护模式,每个应用程序进程都有自己的虚拟地址空间,应用程序不能直接访问物理缓冲地址。但是,Linux在文件操作接口(file_operations)中提供了地址映射(mmap)操作,它可以将文件的内容映射到用户空间,这样用户就可以通过读写这段地址来访问缓冲区,并在屏幕上绘图。
(5)输入/输出控制
设备文件的ioctl()调用可以读取和设置显示设备的参数,如分辨率、支持颜色数、屏幕大小等。
3 结束语
在编写完驱动程序后,将该驱动程序以加载模块的方式进行编译,并将编译好的LCD设备驱动下载到目标板上,通过编写一个简单的测试Framebuffer设备驱动的应用程序,实现了设备的打开、关闭、内存映射和iotcl等具体操作,完成了在LCD液晶屏不同行上绘制不同颜色,通过编译此程序,在目标板上运行,即可在LCD上显示彩色条纹,这就完成了驱动程序的设计要求。本文引用地址:https://www.eepw.com.cn/article/151000.htm
评论