嵌入式Linux下的LCD驱动程序设计与实现

分享到:

 随着嵌入式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上显示彩色条纹,这就完成了驱动程序的设计要求。

继续阅读
Microchip 针对LCD应用推出新款MCU PIC16F19197

全球领先的整合单片机、混合信号、模拟器件和闪存专利解决方案的供应商——Microchip Technology Inc.(美国微芯科技公司)日前推出了用于驱动液晶显示器(LCD)、集成独立于内核的外设(CIP)与智能模拟的全新低功耗单片机(MCU)系列产品。由9款器件组成的PIC16F19197家族包含了电池友好型LCD驱动电荷泵、带计算功能的12位模拟数字转换器(ADC2)、低功耗比较器以及高频振荡器的有源时钟调谐功能。

基于ATmega64的显示控制系统设计

介绍了如何使用AVR单片机ATmega64和液晶模块CM320240-7进行显示控制系统的设计,分析了其硬件平台的设计要点,给出了应用软件的架构,介绍了其中最主要的菜单选择程序的设计流程,分析了一种树状菜单结构的设计方法。设计的终端显控系统在实际系统中运行稳定可靠,证明了设计方法的正确性。

linux kernel工作队列及源码详细讲解

工作队列(workqueue)的Linux内核中的定义的用来处理不是很紧急事件的回调方式处理方法.以下代码的linux内核版本为2.6.19.2, 源代码文件主要为kernel/workqueue.c.

基于ARM处理器的LCD控制及触摸屏接口设计

S3C44B0X是三星公司生产的基于ARM7TDMI内核的RISC微处理器,主频可达66MHz[3]。它集成了包括LCD控制器在内的等外围器件。LM7M632是Sharp公司推出的分辨率为640×240的STN型彩色LCD显示屏,支持256色显示[4]。本文重点讨论了S3C44B0X与LM7M632及ADS7843的接口设计以及LCD和触摸屏的驱动过程。

实时嵌入式操作系统VxWorks设备驱动程序的设计

在嵌入式实时系统中进行软硬件开发的关键是编写高效可靠的设备驱动程序,而VxWorks下END网口驱动程序是设备驱动程序中较为复杂的一类。首先从整体上分析了VxWorks操作系统的特点与结构,然后介绍了VxWorks中设备驱动程序的功能、结构和开发方法,并给出了END网口驱动程序的设计实例。

©2019 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss