关键词:
LCD驱动也是字符设备驱动,也遵循字符设备驱动的流程:
a. 分配主设备号
b. 构建file_operations结构体中的open,write,read...等函数
c. 调用register_chrdev()函数注册字符设备
d. 调用class_register()注册类
e. 调用device_create()创建设备,linux会在sysfs目录下自动创建字符设备。
以上的步骤同样适用于分析输入子系统,只不过上面的各个步骤可能分散在不同的文件与函数中完成。
1.linux/drivers/video/fbmem.c中的fbmem_init()函数完成a,b,c,d完成以上四步。
1 static const struct file_operations fb_fops = { 2 .owner = THIS_MODULE, 3 .read = fb_read, 4 .write = fb_write, 5 .unlocked_ioctl = fb_ioctl, 6 .mmap = fb_mmap, 7 .open = fb_open, 8 .release = fb_release, 9 .llseek = default_llseek, 10 }; 11 static int __init fbmem_init(void) 12 { 13 proc_create("fb", 0, NULL, &fb_proc_fops); 14 15 if (register_chrdev(FB_MAJOR,"fb",&fb_fops)) 16 printk("unable to get major %d for fb devs ", FB_MAJOR); 17 18 fb_class = class_create(THIS_MODULE, "graphics"); 19 if (IS_ERR(fb_class)) { 20 printk(KERN_WARNING "Unable to create fb class; errno = %ld ", PTR_ERR(fb_class)); 21 fb_class = NULL; 22 } 23 return 0; 24 }
2. 那么谁来调用device_create()创建设备?这里直接给出结论,后面再分析过程。
fbmem.c中定义的fb_info结构体的全局指针数组,fb_info结构体是LCD驱动的关键。register_framebuffer()函数中会调用device_create()函数创建设备节点。
struct fb_info *registered_fb[FB_MAX] __read_mostly; //FB_MAX=32
int register_framebuffer(struct fb_info *fb_info)
-->ret = do_register_framebuffer(fb_info);
-->找到空的registered_fb[i]
-->fb_info->dev = device_create(fb_class, fb_info->device, MKDEV(FB_MAJOR, i), NULL, "fb%d", i);
-->设置fb_info
-->registered_fb[i] = fb_info;
3. 如何打开设备?
fb_open(struct inode *inode, struct file *file)
-->int fbidx = iminor(inode);
-->struct fb_info *info=get_fb_info(fbidx);//根据此设备号找到fb_info结构体
-->fb_info = registered_fb[fbidx];
--> file->private_data = info;
--> if (info->fbops->fb_open) res = info->fbops->fb_open(info,1);//如果结构体中定义了open函数,执行新的open函数
4.如何读取设备?这里的关键是info->screen_base,设置为LCD控制器帧缓冲区的起始地址。
fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
-->struct fb_info *info = file_fb_info(file);//找到打开的fb_info结构体
--> if (info->fbops->fb_read)//如果fb_info中定义的读函数,则执行新的读函数
return info->fbops->fb_read(info, buf, count, ppos);
//没有定义新的读函数则执行下面
-->src = (u8 __iomem *) (info->screen_base + p);//设置源地址
-->buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);//设置目的地址
-->dst = buffer;
-->fb_memcpy_fromfb(dst, src, c);//读到用户空间
-->copy_to_user(buf, buffer, c)
lcd驱动分析时序分析
参考:S3C2440LCD驱动(FrameBuffer)实例开发<一> S3C2440LCD驱动(FrameBuffer)实例开发<二> 查看详情
lcd驱动源码分析(s3cfb.c)(代码片段)
1、驱动源码分析大致思路(1)分析LCD驱动首先需要分析内核的帧缓冲子系统,因为LCD驱动就是按照帧缓冲子系统提供的注册接口来注册的;(2)内核帧缓冲子系统参考博客:《Linux帧缓冲子系统详解:LCD介绍、framebuffe... 查看详情
1.摄像头v4l2驱动框架分析
学习目标:学习V4L2(V4L2:vidioforlinuxversion2)摄像头驱动框架,分析vivi.c(虚拟视频硬件相关)驱动源码程序,总结V4L2硬件相关的驱动的步骤; 一、V4L2架构1.字符类驱动V4L2(V4L2:vidioforlinuxversion2)摄像头驱动属于字符类驱动... 查看详情
lcd驱动分析
转自:http://blog.csdn.net/hanmengaidudu/article/details/215591531.S3C2440上LCD驱动(FrameBuffer)实例开发讲解其中的代码也可直接参考:drivers/video/s3c2410fb.c以下为转载文章,文章原地址:http://blog.csdn.net/jianyun123/archive/2010/04/24/55 查看详情
lcd驱动端与设备端名称匹配过程分析(tiny4412)
LCD驱动端与设备端名称匹配过程在tiny4412提供的内核下,LCD屏的平台设备名字和平台驱动名字不匹配也能驱动屏点亮,这是怎么回事的呢?下面我们来分析这是如何实现的。硬件平台Cpu:exynos4412板子:tiny4412Linux内... 查看详情
结合app分析lcd驱动程序(代码片段)
结合APP分析LCD驱动程序本节视频对应源码在GIT仓库中,位置如下(这2个文件是完全一样的):doc_and_source_for_drivers\\STM32MP157\\source\\A7\\03_LCD\\04_fb_test或:doc_and_source_for_drivers\\IMX6ULL\\source\\03_LCD\\04_fb_ 查看详情
linux内核lcd驱动分析与换屏方法(tiny4412)
...核的。对tiny4412提供的内核,可以通过修改bootargs实现驱动不同的LCD屏。21.5.2分析bootargs中的lcd参数再启动uboot的时候会有如下的环境参数:bootargs=noinitrdroot=/dev/nfsn 查看详情
七linuxlcd驱动代分析
LCD驱动分析原文地址:http://blog.csdn.net/woshidahuaidan2011/article/details/520547951、对LCD驱动添加设备信息对lcd驱动程序,跟之前分析的方式一样,还是先看设备信息,其定义在Mach-smdk2440.c(arch\\arm\\mach-s3c24xx)文件中,在该文... 查看详情
全志平台boot框架中增加设备驱动过程分析
在boot启动阶段,大家都知道他的主要目的就是引导uboot,uboot在引导内核,从而让整个系统运作起来。全志的boot阶段,对应平板这一块,它会驱动LCD,显示一些开机LOGO,这个过程很快,也就1-2秒钟... 查看详情
一个清晰的lcd驱动编写思路(附代码分析)
关注「嵌入式大杂烩」,选择「星标公众号」一起进步!来源|屋脊雀网络上配套STM32开发板有很多LCD例程,主要是TFTLCD跟OLED的。从这些例程,大家都能学会如何点亮一个LCD。但这代码都有下面这些问题:分层... 查看详情
9x25led驱动框架分析2016.07.13
9x25LED驱动框架分析2016.07.13进入内核makemenuconfig输入/led回车搜索到 │Location:│ │->DeviceDrivers│ │->LEDSupport(NEW_LEDS[=y])进入LEDSupport发现有这一项[]LEDSupportforGPIOconnectedLEDs 在内核搜索该字符串grep"LEDSupportforGP 查看详情
分析内核自带的lcd驱动程序\_基于imx6ull(代码片段)
分析内核自带的LCD驱动程序_基于IMX6ULL参考资料,GIT仓库里:IMX6ULL\\开发板配套资料\\datasheet\\Core_board\\CPU\\IMX6ULLRM.pdf《Chapter34EnhancedLCDInterface(eLCDIF)》IMX6ULL的LCD裸机程序IMX6ULL\\source\\03_LCD\\05_参考的裸机源码\\ 查看详情
块设备驱动框架分析
参考:块设备驱动之一 块设备驱动之二 块设备驱动之三总结上一篇的块设备驱动的步骤:1.分配gendisk:alloc_diskstaticstructgendisk*ramblock_disk= alloc_disk(16);/*次设备号个数:分区个数+1*/2.设置2.1分配/设置队列://它提... 查看详情
linuxlcd驱动实验(代码片段)
目录Linux下LCD驱动简析1Framebuffer设备LCD驱动简析硬件原理图分析LCD驱动程序编写运行测试LCD屏幕基本测试设置LCD作为终端控制台LCD背光调节从LCD自动关闭解决方法LCD是很常用的一个外设,在裸机篇中我们讲解了如何编写LCD裸... 查看详情
i2c协议和驱动框架分析
3、从设备驱动分析 总线驱动一般由主控芯片厂商(高通海思MTK展讯全志瑞芯微等等)已经做好了,驱动工程师就需要完成I2C设备驱动。I2C的设备驱动框架只是一款芯片(I2C接口)驱动的基础,通常还... 查看详情
平台设备驱动注册及使用分析
...则为platform_device,而驱动则为platform_driver。Linux 2.6的设备驱动模型中,把I2C、RTC、LCD等都归纳为platform_device。总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动... 查看详情
驱动程序实例:mpu6050(iic+cdev)(代码片段)
...,I2C总线驱动一般芯片原厂会提供,我们开发一般是设计设备驱动。本文结合之前对Linux内核的IIC子系统的分析,以及对字符设备的cdev接口的分析,本文将编写基于IIC总线与cdev接口的MPU6050设备的实例代码并对其进行分析。IIC子... 查看详情
9x25pps驱动框架分析2016.07.14
9x25PPS驱动框架分析2016.07.14DeviceDrivers---> PPSsupport---> [*]GPIOsupport [*]PPSkernelconsumersupport <>PPSlinediscipline(NEW)在内核搜索grep"PPSkernelconsumersupport" *-nR drivers/pps/Kcon 查看详情