主题 : 【分享】LCD设备驱动程序 复制链接 | 浏览器收藏 | 打印
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
楼主  发表于: 2012-03-10 21:42

 【分享】LCD设备驱动程序

图片:
LCD设备驱动程序
最近学习了韦东山的lcd驱动视频,分享给大家
一.引入
lcd设备驱动的核心文件是fbmem.c,它实现了一个普通字符设备(老版本)的主设备号、file_operations、register_chrdev(FB_MAJOR,"fb",&fb_fops)、创建类(但是没有创建设备节点)等
分析fbmem.c:
复制代码
  1. 1.
  2. app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0
  3. --------------------------------------------------------------
  4. kernel调用fbmem.c中的fb_open():
  5.        int fbidx = iminor(inode);//获得次设备号
  6.   struct fb_info *info = = registered_fb[fbidx];//根据次设备号从registered_fb[]数组中
  7. 拿到对应的fb_info
  8.        if (info->fbops->fb_open) //如果用户的fb_info里实现open函数,则调用用户的open函数
  9.         info->fbops->fb_open(info,1);//否则执行默认的操作
  10. --------------------------------------------------------------

2:
复制代码
  1. app: read()
  2. ---------------------------------------------------------------
  3. kernel调用fbmem.c中的fb_read():
  4.        int fbidx = iminor(inode);//获得次设备号
  5.        struct fb_info *info = registered_fb[fbidx];//根据次设备号从registered_fb[]数组中
  6. 拿到对应的fb_info
  7.        if (info->fbops->fb_read)//如果用户的fb_info里实现read函数,则调用用户的read函数
  8.               return info->fbops->fb_read(info, buf, count, ppos);
  9.   src = (u32 __iomem *) (info->screen_base + p);//获得源:帧缓冲的起始地址+偏移值
  10.        dst = buffer;//获得目的:帧缓冲的数据需要被拷贝到这里
  11.        *dst++ = fb_readl(src++);//开始拷贝
  12.        copy_to_user(buf, buffer, c)//提交给应用层

3.
复制代码
  1. app:  write()
  2. ---------------------------------------------------------------
  3. kernel调用fbmem.c中的fb_write():
  4.        int fbidx = iminor(inode);//获得次设备号
  5.        struct fb_info *info = registered_fb[fbidx];//根据次设备号从registered_fb[]数组中
  6. 拿到对应的fb_info
  7.        if (info->fbops->fb_write)//如果用户的fb_info里实现write函数,则调用用户的write函数
  8.               return info->fbops->fb_write(info, buf, count, ppos);
  9.        total_size =info->screen_size;//获得长度
  10.        if (total_size == 0)
  11.               total_size =info->fix.smem_len;
  12.        dst = (u8 __iomem *)(info->screen_base + p);//获得目的:帧缓冲的起始地址+偏移值
  13. src =buffer;//获得源:src中的数据将被拷贝到帧缓冲中
  14.        fb_memcpy_tofb(dst, src, c);//开始拷贝


可以看出,fb_open(),fb_read()和fb_write()都依赖于registered_fb[]数组中的fb_info,那么是谁构造了该数组,搜索代码可知:
复制代码
  1. register_framebuffer(fb_info)
  2.        do_register_framebuffer()
  3.               for (i = 0 ; i < FB_MAX; i++)
  4.                      if (!registered_fb) break;//先找出一个空项
  5.               device_create()//创建设备节点
  6.               registered_fb = fb_info;//填充 registered_fb[]数组


所以可以看出lcd驱动的框架如图:


各种各样的lcd驱动程序都会通过register_framebuffer()注册一个fb_info结构体给我们的fbmem.c。这种分层的思想贯穿于所有设备驱动。

二.编写代码
lcd硬件具体操作请看《完全手册》,下面只讲基于linux的驱动框架。

阅读s3c2410fb.c,我们可以总结出硬件相关的驱动的编写框架如下所示:
1. 分配一个fb_info结构体: framebuffer_alloc()
2. 设置fb_info
3. 硬件相关的操作,具体如下:
(1)配置gpio引脚用于lcd
(2)设置lcd控制器相关寄存器
   (3)分配显存,并把地址告诉lcd控制器
4.注册fb_info: register_framebuffer()
具体lcd驱动代码框架请看代码xxxfb.c

三.测试
1. make menuconfig去掉原来的驱动程序
-> Device Drivers
-> Graphics support
           <N> S3C2410 LCD framebuffer support
2. make uImage
3.echo hello > /dev/tty1 // 可以在LCD上看见hello
4.cat lcd.ko > /dev/fb0 // 花屏

PS:韦东山的第二期驱动视频学习群,志同道合者可加:158382593
[ 此帖被wuweidong在2012-03-10 22:03重新编辑 ]
好好学习,天天鲁管
级别: 风云使者
UID: 36096
精华: 3
发帖: 2513
金钱: 14075 两
威望: 2815 点
综合积分: 5086 分
注册时间: 2011-01-11
最后登录: 2015-11-15
1楼  发表于: 2012-03-10 21:53
不错,帮顶……
极度缺钱,求捐赠……支付宝兼邮箱:huming2207@qq.com
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
2楼  发表于: 2012-03-10 22:01
让大家见笑了
好好学习,天天鲁管
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2012-03-10 23:25
总结地不错,再接再厉:)
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
畅游在知识的海洋...
级别: 论坛版主
UID: 33629
精华: 4
发帖: 554
金钱: 3075 两
威望: 615 点
综合积分: 1188 分
注册时间: 2010-12-03
最后登录: 2015-09-22
4楼  发表于: 2012-03-11 00:31
打打广告
试看了韦东山老师的视频,的确是比其他视频好N倍啊,想组织个团购视频,这样优惠些,有想法的学友一起参加啊
QQ群: 158382593


第1期下载地址:
http://dl.dbank.com/c03o1ebwlo
第2期下载地址:
http://dl.dbank.com/c06bbt0sxp
第1期视频目录:
第1课 环境搭建及工具、概念介绍.avi
第2课 GPIO实验.avi
第3课 存储管理器实验.avi
第4课 MMU实验.avi
第5课 NAND FLASH控制器.avi
第6课 中断控制器.avi
第7课 系统时钟和UART实验.avi
第8课 LCD实验.avi
第9课第1节 u-boot分析之编译体验.avi
第9课第2节 u-boot分析之Makefile结构分析.avi
第9课第3节 u-boot分析之源码第1阶段.avi
第9课第3节 u-boot分析之源码第2阶段.avi
第9课第4节 u-boot分析之u-boot命令实现.avi
第9课第5节 u-boot分析_uboot启动内核.avi
第10课第1节 内核启动流程分析之编译体验.avi
第10课第2节 内核启动流程分析之配置.avi
第10课第3节 内核启动流程分析之Makefile.avi
第10课第4节 内核启动流程分析之内核启动.avi
第11课第1节 构建根文件系统之启动第1个程序.avi
第11课第2节 构建根文件系统之init进程分析.avi
第11课第3节 构建根文件系统之busybox.avi
第11课第4节 构建根文件系统之构建根文件系统.avi
第12课第1节 字符设备驱动程序之概念介绍.avi
第12课第2.1节 字符设备驱动程序之LED驱动程序_编写编译.avi
第12课第2.2节 字符设备驱动程序之LED驱动程序_测试改进.avi
第12课第2.3节 字符设备驱动程序之LED驱动程序_操作LED.avi
第12课第3节 字符设备驱动程序之查询方式的按键驱动程序.avi
第12课第4.1节 字符设备驱动程序之中断方式的按键驱动_Linux异常处理结构.avi
第12课第4.2节 字符设备驱动程序之中断方式的按键驱动_Linux中断处理结构.avi
第12课第4.3节 字符设备驱动程序之中断方式的按键驱动_编写代码.avi
第12课第5节 字符设备驱动程序之poll机制.avi
第12课第6节 字符设备驱动程序之异步通知.avi
第12课第7节 字符设备驱动程序之同步互斥阻塞.avi


第2期视频目录:
第12课第8节 字符设备驱动程序之定时器防抖动_P.wmv
第13课第1节 输入子系统概念介绍_P.wmv
第13课第2节 输入子系统第编写驱动程序_P.wmv
第14课 驱动程序分层分离概念_总线驱动设备模型_P.wmv
第15课第1节 LCD驱动程序之层次分析_P.wmv
第15课第2节 LCD驱动程序之硬件操作_P.wmv
第15课第3节 LCD驱动程序之编写代码之1初步编写_P.wmv
第15课第3节 LCD驱动程序之编写代码之2硬件设置_P.WMV
第15课第3节 LCD驱动程序之编写代码之3显存和调色板设置_P.WMV
第15课第4节 LCD驱动程序之编译测试_P.WMV
第16课第1节 触摸屏驱动程序之概念介绍_P.wmv
第16课第2节 触摸屏驱动程序之编写驱动_P.wmv
第16课第3节 触摸屏驱动程序之使用TSLIB测试_P.wmv
第17课第1节 USB驱动程序之概念介绍_P.wmv
第17课第2节 USB驱动程序之USB总线驱动程序_P.wmv
第17课第3节 USB驱动程序之USB设备驱动程序1简单编写_P.wmv
第17课第3节 USB驱动程序之USB设备驱动程序2鼠标用作键盘_P.WMV
第18课第1节 块设备驱动程序的引入_P.wmv
第18课第2节 块设备驱动程序的框架_P.wmv
第18课第3节 块设备驱动程序的编写驱动之用内存模拟磁盘_P.WMV
第19课第1节 NAND FLASH原理及硬件操作_P.WMV
第19课第2节 NAND FLASH驱动程序框架_P.WMV
第19课第3节 NAND FLASH驱动程序之编写代码之1简单编写_P.WMV
第19课第3节 NAND FLASH驱动程序之编写代码之2完善识别过程_P.WMV
第19课第3节 NAND FLASH驱动程序之编写代码之3添加MTD设备及测试_P.WMV
第20课第1节 NOR FLASH原理及硬件操作_P.WMV
第20课第2节 NOR FLASH驱动程序之框架_P.WMV
第20课第3节 NOR FLASH驱动程序之编写代码_P.WMV
第21课第1节 网卡驱动程序之框架_P.WMV
第21课第2节 网卡驱动程序之编写虚拟网卡_P.WMV
第22课第1节 移植DM9000C驱动程序之确定相异性_P.WMV
第22课第2节 移植DM9000C驱动程序之设置时序_P.WMV
第22课第3节 移植DM9000C驱动程序之测试及内存控制器简介_P.WMV
第23课第1节 I2C设备裸板程序之I2C总线介绍_P.WMV
第23课第2节 I2C设备裸板程序之编写代码_P.WMV
第23课第3节 I2C设备裸板程序之测试_P.WMV
第24课第1节 I2C驱动程序之框架_P.WMV
第24课第2节 I2C驱动程序之编写代码_P.WMV
第25课第1节 字符设备驱动程序概念纠正之另一种写法_P.WMV
第25课第2节 字符设备驱动程序概念纠正之RTC驱动分析_P.WMV
第26课第1节 声音采集播放及IIS接口介绍_P.WMV
第26课第2节 UDA1341芯片之L3接口介绍_P.WMV
第26课第3节 UDA1341声卡驱动程序分析及测试_P.WMV
第26课第4节 WM9876声卡驱动程序编写及测试_P.WMV
第26课第5节 使用madplay播放mp3文件_P.WMV

别说我没提醒啊,第1期下载即可观看,第2期是需要密码的,我就是想组团买第二期视频.

  
好好学习,天天鲁管
级别: 新手上路
UID: 81136
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2012-11-05
最后登录: 2013-07-30
5楼  发表于: 2012-11-30 11:27

 回 楼主(wuweidong) 的帖子

3.echo hello > /dev/tty1 // 可以在LCD上看见hello
4.cat lcd.ko > /dev/fb0 // 花屏
这个是怎么成功的呢,我的测试3没有反应,测试4的时候只有屏上面一小段是花屏的呢?