嵌入式LinuxLCD驱动程序开发_第1页
嵌入式LinuxLCD驱动程序开发_第2页
嵌入式LinuxLCD驱动程序开发_第3页
嵌入式LinuxLCD驱动程序开发_第4页
嵌入式LinuxLCD驱动程序开发_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第7章 嵌入式Linux驱动程序开发,嵌入式Linux LCD驱动程序开发实例,LCD显示原理 LCD驱动程序的设计 LCD驱动设计步骤 BMP文件显示,LCD显示原理,液晶显示器(Liquid Crystal Display )的物理特性:通电时液晶排列的有秩序,光线容易通过;不通电时液晶排列混乱,阻止光线通过。工作时使用外部光线,本身并不发光。 LCD分类:TFT、DSTN 两种照明方式:传送式、反射式。 实验用教学平台参数及技术 EP7312驱动LCD工作原理图(p263,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,灰度显示原理 LCD

2、显示屏的一个常用指标是它的反应时间。反应时间指的是一个像素从显示到关闭所花费的时间。 LCD 控制器内部有1个16周期计数器,用于产生16周期的间隔。当驱动像素时,它读帧缓冲数据所指的调色板寄存器中的半字节数据。该数据确定在16周期间隔里像素显示的次数。例如该值等于4,即认为该像素以最大亮度的1/4 进行显示,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,彩色显示原理: 彩色显示时,每个像素点有3 个子彩色像素(红、绿、蓝)。灰度显示的技术应用到彩色显示中,每个子彩色像素有15 种浓度的感觉效果。可用红、绿、蓝3 种颜色的15 种浓度中的一种去

3、驱动1个像素点。 另外一个显示特性是刷新率,指的是整个数据帧被重新写到显示屏的频率。如果数据写得太慢,将影响显示质量;太快,则显示器的反应时间跟不上像素驱动状态的改变。推荐的大部分显示屏的速率是7080Hz,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,EP7312对液晶屏幕的支持: EP7312 的LCD接口部分为单板多像素,其接口特性为: 1-2-4 bpp ; 可编程屏幕面板尺寸,在4bpp 时最大值为1024 256; 可编程刷新率; 16 级灰度值; 彩色屏幕接口能力,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过

4、程,应用实例,LCD显示原理,LCD DMA控制器 DMA带宽计算公式:VGA比例分辨率刷新率每像素点位数 DMA延迟时间计算公式(字深数位宽)/DMA带宽 DMA延迟时间表示在最差的情况下,从DMA发出请求到可获取第一个DMA数据字,或者说DMA数据送到FIFO的延迟时间或总周期数,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,LCD控制寄存器: 视频缓冲区大小0:12,对应视频显示缓冲区总位数。视频缓冲区(缓冲区总位数/128)-1 线长度13:18:对应于一整行中的像素数。线长度(像素数/16)1 像素预订标19:24:像素预定标CPU频

5、率/(刷新率像素总数)1;像素数 CPU频率/(像素预定标1) AC预定标25:29:设置LCD AC偏移频率 GSEN30:灰度使能位 GSMD31:灰度级模式位,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,LCD调色板寄存器: 为了支持各种颜色和灰度级,LCD控制器有2 个32位调色板寄存器(PALLSW 和PALMSW)。每个调色板寄存器被分成8 个4 位的半字节(nibble),每个半字节被帧缓冲区中的数据寻址, 其格式如下,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,LCD调色板寄

6、存器: 当LCD控制器配置成每像素点4位时,帧缓冲区中4位数据代表1个像素,2个调色板寄存器中的半字节用该数据寻址,对应显示的像素。寻址结构用于将帧缓冲区中的数据映射到实际的灰度值,该值提供给显示接口。 当配置成每像素4位模式时,在调色板寄存器中的所有16个半字节都被用于映射。同理,每像素2位模式只用编程调色板寄存器低位有效字,每像素1位模式只用编程低位有效寄存器的前2个半字节。 两个调色板寄存器半字节可以编程为015。这16个值对应16 种不同的颜色深度级,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,LCD调色板寄存器: 内存中像素值和灰度

7、级的映射,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD显示原理,通过以上了解, 在lcd.c 中定义下面几个寄存器: #define LCDCON *(unsigned long *)0 xff0002c0 #define PALLSW *(unsigned long *)0 xff000580 #define PALMSW *(unsigned long *)0 xff000540 #define FBADDR *(unsigned long *)0 xff001000 #define SYSCON1 *(unsigned long *)0 xff0

8、00100,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动程序的设计,驱动程序的头文件 Linux/:module.h, kernal.h, fs.h, sched.h, config.h, Utsname.h, major.h, string.h, fcntl.h, Malloc.h, timer.h, init.h, asm/: pgtable.h, irq.h, io.h,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动程序的设计,系统调用分类 处理I/O请求:open、close、read、write

9、等 进程:fork、execve、kill等 时间:time、settimeofday等 内存:mmap、brk,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动程序的设计,系统内部,I/O设备的存取通过一组固定的入口点来进行。这组入口点由设备的驱动程序提供。由file_operations这个结构向系统进行说明 static struct file_operations LCDfops = read:ReadLCD, ioctl:LCDIoctl, open :OpenLCD, release:CloseLCD,第六章,1,2,3,嵌入式Linux的

10、设备管理,设备驱动程序开发过程,应用实例,LCD驱动程序的设计,寄存器设置 以1/4VGA显示为例,对LCD控制器复制操作进行计算 视频缓冲:0 x1c1f 画线长度:0 x3b 像素数预定标:1 AC预定标:0 x13 灰度使能位:1 灰度模式位:1,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动程序的设计,应用编程接口(API) 画点函数lcd_kernel_pixel:unsigned char * base 循环 320*240*3*4/8次。 每个像素使用1.5个字节表示。 各种颜色所对应的值,第六章,1,2,3,嵌入式Linux的设备管理

11、,设备驱动程序开发过程,应用实例,LCD驱动设计步骤,LCD模块化驱动 在自己的驱动程序文件中定义file_operations 结构,初始化设备需要的操作函数,对于设备不需要的操作函数用NULL来初始化或者采用标签格式来声明。这些操作函数将会被注册到内核,当应用程序对该设备相应的设备文件进行文件操作时,内核会找到相应的操作函数,并进行调用。如果操作函数注册成NULL,操作系统就默认的处理,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动设计步骤,LCD模块化驱动 关键函数: lcd_kernel_init(void) (模块被载入时执行) lcd_k

12、ernel_exit(void) (模块被移出内核空间时执行) lcd_kernel_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) (其他功能,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动设计步骤,LCD模块化驱动 lcd_kernel_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) 在file_ope ratio

13、ns结构中,把这个函数与ioctl操作联系在一起, 通过这个函数, 可以增加要提供的服务。 例如: switch (cmd) case 0: lcd_clear (); break; case 1: ellip se = (ell ipse_t *) arg; lcd_ellipse (el lipse-x, ellipse-y , ellipse-a, ellipse-b, ellipse-c, ellipse-xorm); break; . 当应用程序中调用 rt = ioct l(fd, 0); 或 rt = ioctl(fd, 1, 通过swit ch 选择, 就会分别去执行LCD 驱

14、动中的lcd_clear()和lcd_ellipse(.,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动设计步骤,LCD模块化驱动 下面是LCD 驱动所使用的Makefile: KERNELDIR = /usr/src/arm/linux CROSS_COMPILE = arm-linux- CC = $(CROSS_COMPILE)gcc CFLAGS = -D_KERNEL_ -DM ODULE -I$(KERNELDIR)/include -I/arm_linux_root/mod -O -Wall all: lcd.o demo demo:

15、arm-elf -gcc -o demo demo.c clean: rm -f *.o * core demo,第六章,1,2,3,嵌入式Linux的设备管理,设备驱动程序开发过程,应用实例,LCD驱动设计步骤,将LCD驱动加入内核配置系统 a) 将lcd.c 复制到linux/drivers/char目录下 b) 修改lcd.c中函数名init_module为LCDInit, cleanup_module为LCDCleanup c) 在lcd.c 最后加上下面两行: module_init(LCDInit); module_exit(LCDCleanup)。 d) 在linux/drivers/char/Makefile 中添加 obj- $(CONFIG_LCD)+=lcd.o e) 在linux/drivers/char/Config.in 中添加 Tristate LCD driver support CONFIG_LCD,第六章,1,2,3,嵌入式Lin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论