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

发布者:科技驿站最新更新时间:2013-11-01 来源: 21ic关键字:设备驱动程序  LCD  Linux内核 手机看文章 扫描二维码
随时随地手机看文章
随着嵌入式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设备驱动完成。[page]

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

关键字:设备驱动程序  LCD  Linux内核 引用地址:嵌入式Linux下的LCD驱动程序设计与实现

上一篇:一种嵌入式系统升级的设计和实现
下一篇:嵌入式应用中的能耗调试

推荐阅读最新更新时间:2024-03-16 13:29

量子点技术能够加强LCD在市场中的霸主地位吗?
多年来,消费者只对一种电子显示器比较熟悉:即电视机发明以后,一直在电视机中使用的阴极射线管(CRT)。尽管这些显示器比较沉重和笨拙,但在90年代以前一直普遍使用,之后才过渡到轻而薄的新型显示器,如液晶显示器(LCD)。除了对等离子具有短暂青睐之外,消费者还是更接受液晶电视,而且目前液晶技术也占了90%的市场。 这也就是说,没有任何事物是完美的——包括LCD技术和过去十年中替代LCD的有机发光二极管(OLED)。每种技术都有其优点和缺点,对在电视中的应用和其他显示应用都会造成一定影响。然后就是量子点——如果你还没听说过,我想很快你就能听到了。 LCD最主要的不足是在色域方面,或者说是图像中各种颜色的显示方法。LCD显示屏中,光要穿过
[家用电子]
荣耀Magic4 Lite渲染图与规格曝光:6.81英寸LCD
采用了高通骁龙 8 Gen 1 芯片组和强大摄像头模组的荣耀 Magic4 / Magic4 Pro 智能机,已经给不少人留下深刻的印象。但是对于预算有限的消费者来说,900 / 1100 欧元的定价还是让人望而生畏。好消息是,你对外形设计和硬件配置的要求不高,那传说中的   由分享的消息可知,Magic4 Lite 将沿用 6.81 英寸的屏幕,面板从 OLED(LTPO)换成 LCD、分辨率也稍低一些(1080×2388 像素),但仍支持 120Hz 高刷新率。   此外由 @Sudhanshu1414 分享的推测渲染图可知,Magic4 Lite 也可能沿用环形后摄模组,但规格也低了不少。   除了 16MP 前
[手机便携]
以汇编语言写的PIC18Fxxxx的LCD驱动程序
;************************************************ ;* 18F_LCD.asm * ;* Microchip Taiwan * ;* Date : Sept. 24 2002 * ;* Version : v1.00 * ;************************************************ ;* Contains subroutines to control an external * ;* lcd panel in 4-bit mode. These routines * ;* were designed s
[单片机]
s3c2440裸机-LCD编程(二、LCD控制器)
1.LCD控制器框图 从上图看出,S3C2440 LCD控制器用于传输视频数据并且生成必要的控制信号,如VFRAME,VLINE,VCLK,VM等。除了控制信号,S3C2440还有视频数据端口,即VD 。通过设置REGBANK(寄存器组),LCDCDMA会自动(无需CPU参与)把内存上FrameBuffer里的数据,通过VIDPRCS发送到引脚VD 数据总线上,再配合VIDEOMUX引脚的控制信号,正确的显示出来。 REGBANK:具有17个可编程寄存器组和256x16调色板存储器,用于配置LCD控制器。 TIMEGEN:产生控制信号,例如 VSYNC、HSYNC、VCLK等信号 LCDCDMA:可以自动从FrameBuff中
[单片机]
s3c2440裸机-<font color='red'>LCD</font>编程(二、<font color='red'>LCD</font>控制器)
如何辨别LCD显示器的坏点和亮点
1.用桌面背景检查    商家在展示液晶显示器时常会用各种绚丽的图片来给你展示,其不仅开起来好看,而且也能让你不能看到LCD上的点缺馅。    在挑选液晶显示器时对这坏点、亮点、暗点三样点缺陷的检测很简单。最常见的方法是-鼠标在桌面上单击右键,选择"属性",在打开的窗口中选择"外观",然后在"颜色"一栏中选择"黑色"或"白色",再点"应用"。    在桌面全黑或全白或红、绿、蓝的背景下仔细观察液晶屏上有无异色点或发光的亮点,如有则该液晶屏存在点缺陷问题。最好在付款前要求另换一台完全没有这种缺陷或点缺陷在屏幕四边的产品。   2.常见软件检测    当然,在对液晶显示器的
[电源管理]
STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
Nokia5110 LCD 有片很早以前买的Nokia5110 LCD一直在纸箱里吃灰. 可能是买其它配件时送的? 没有合适的用途一直扔在那里, 偶尔见到总会想什么时候有空给它点一下. 外观长这样. 其实市面上这种模块有几个不同的版本, 另一种版本是上下有两排排针, 方便不同的PCB布局, 功能是一样的. 单色LCD, 84x48像素, 带4颗蓝色LED灯珠作为背光. 显示芯片是Philips PCD8544. 因为是Nokia5110手机的显示屏, 所以一般都叫它Nokia5110 LCD. 在2014年大屏手机还没流行的年代, 这是个相当不错的显示输出设备, 相对于1602和2004LCD, 体积小分辨率高, 便宜
[单片机]
STC8H开发(十): SPI驱动Nokia5110 <font color='red'>LCD</font>(PCD8544)
STM8L探索套件学习笔记-LCD液晶显示(三)
学习板上带有字符型LCD显示,特点是24段4位,驱动方式是复用1/4占空比,1/3基准,工作电压3V,如下图所示 我们先分析下官方给的范例关于LCD的驱动函数 void LCD_GLASS_Init(void)//使能LCD时钟,并设置相应参数 void LCD_contrast()//通过按键调节对比度 void LCD_bar()//将bar值写道LCD缓存中 static void LCD_Conv_Char_Seg(uint8_t* c,bool point,bool column, uint8_t* digit)//将ASCII码转换为LCD显示,第一个参数是要显示的字符比如 c ,第二个参数是设置POINT是否显示,第
[单片机]
2011年Q3 LED背光面板出货量续增,大尺寸LED面板佔比达43%
业内统计显示,因为订单缺乏和下游降低库存的缘故,出现供大于求的局面。大尺寸LCD的出货量在2010年Q3较Q2下降4%,较2009年同期成长7%,约16300万片。但是,LED背光模组的面板的出货量仍持续成长。 由于品牌厂商针对2010年底销售旺季度促销机种寻找低成本方案所达成的特殊交易量增加,使得Q3液晶电视面板出货量仍呈现上升,特别是40吋以上机种与LED背光机种。40吋及以上尺寸液晶电式面板出货量达到1810万片,较Q21增长了13%;其中LED背光面板出货量达到了780万片,佔比达到43%,较Q2增长200万片。
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved