DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 872|回复: 0
打印 上一主题 下一主题

[待整理] 嵌入式Linux下的LCD驱动程序设计与实现

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 08:46:02 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
随着嵌入式Linux的迅速发展,由于其没有昂贵的版权费,完全开放源代码,可裁减性与可移植性,因此是开发嵌入式产品的优秀操作系统平台。设备驱动程序是Linux内核的重要组成部分,运行在Linux内核底层,在内核源代码中占较大比例,驱动程序开发逐渐成为嵌入式软件开发中一项重要工作。应项目设计的需要完成了嵌入式Linux下的LCD驱动程序设计。
1 Linux下设备驱动程序

驱动程序从字面上可以理解为一类程序,这类程序的目的一般是驱动硬件正常工作,所以通常所说的驱动程序都是针对特定的硬件来编写的。Linux设备驱动程序是为特定的硬件提供给用户程序的一组标准化接口,它隐藏了设备工作的细节。Linux系统下驱动程序是运行在内核态的,是和内核连接在一起的程序。如果运行在用户态的应用程序想控制硬件设备,必须通过驱动程序来控制。

Linux系统的设备分为3种类型,分别是字符设备、块设备和网络设备。文中所涉及的LCD驱动属于字符型设备驱动程序。在对字符设备发出读、写请求时,实际的硬件I/O一般就紧接着发生了。Linux系统访问设备就像访问文件一样,例如打开关闭设备系统调用open()和close()函数。在Linux内核中,字符设备使用struct file_operations结构来定义设备的各种操作集合。编写字符设备驱动程序,主要是实现str-uct file_operations结构中的各个函数。
2 基于FFamebuffer的LCD驱动程序设计

2.1 LCD简介

设计中采用的嵌入式微处理器是Samsung公司的S3C2410,LCD控制器主要用于传输显示数据和产生控制信号,用户只需通过读写一系列寄存器即可完成配置和显示控制,图1是S3C2410平台LCD控制器的结构图。

其各个信号描述及功能如表1所示。


2.2 Framebutfvr概述

Framebuffer即帧缓冲,是图形设备的一个提取或抽象,他把一些视频设备描绘成一个缓冲区,允许应用程序通过Framebuffer所定义的良好接口访问图形设备。Framebuffer是出现在Linux2.2.xx内核当中的一种驱动程序接口。Linux工作在保护模式下,所以用户态进程无法像DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出Framebuffer这个设备供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象化,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象、统一的,用户不必关心物理显存的位置、换页机制等具体细节,这些由Framebuffer设备驱动完成。

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上显示彩色条纹,这就完成了驱动程序的设计要求。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-1-10 05:28 , 耗时 0.083227 秒, 22 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表