lcd驱动分析字符设备驱动框架分析

天地有大美而不言 天地有大美而不言     2022-08-13     739

关键词:

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​板子:tiny4412​Linux内... 查看详情

结合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 查看详情