分析内种LCD驱动程序框架
LCD在fbmem.c文件中
1.找到init.函数
static int __initfbmem_init(void)
{
做的工作: (1).if (register_chrdev(FB_MAJOR,"fb",&fb_fops))注册字符处理函数结构体,以及生成设备号,
(2)fb_class = class_create(THIS_MODULE, "graphics");生成一个类
}
2.打开注册设备中的字符函数结构体fb_fops

static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.ioctl = fb_ioctl,
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
};
APP层如果要打开这个设备,就会执行经过系统调用执行fb_open函数
3.分析这个函数
static int fb_open(struct inode *inode, struct file *file)
{
int fbidx = iminor(inode);生成一个次设备号
struct fb_info *info;定义一个fb_info结构体
if (!(info = registered_fb[fbidx]))把registered_fb[]结构体数组中以这个设备的次设备号为索引,把数组中的值赋值给info

}
4.如果应用程序要对这个驱动进行读写操作,就会调用read函数
static ssize_t
fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
那么读函数主要做的工作:

int fbidx = iminor(inode);获得设备的次设备号
struct fb_info *info = registered_fb[fbidx];在fb_info结构体中以此设备号为索引找到一个成员赋值给info变量。
if (info->fbops->fb_read)如果字符结构体函数定义fb_read,则执行相应处理
return info->fbops->fb_read(info, buf, count, ppos);
total_size = info->screen_size; 虚拟屏的大小
buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count,分配页大小的缓冲区
src = (u32 __iomem *) (info->screen_base + p);//显存基地址,作为源地址
dst = buffer;把分配的缓冲区作为目的地址
*dst++ = fb_readl(src++);把源地址中的数据拷贝到目的地址中
if (copy_to_user(buf, buffer, c))把数据传递到应用程序
kfree(buffer);释放缓冲区

}
不管是读还是写都用到了registered_fb[];
5.那么这个结构体数组是怎么赋值的呢registered_fb[];
在这个函数中有对这个结构体进行赋值
int register_framebuffer(struct fb_info *fb_info)
{
分析这个函数
fb_info->dev = device_create(fb_class, fb_info->device,
MKDEV(FB_MAJOR, i), "fb%d", i);在fb_class类下面创建一个类的设备,
fb_init_device(fb_info);初始化这个设备
......对fb_info进行初始化操作
registered_fb[i] = fb_info;把这个传进来的变量存入数组中,那么是由谁调用这个函数,并传进参数的呢
可以发现有很多不同厂家的触摸屏.c函数都会调用这个函数,这说明这个函数是抽象出来的,大家都在用它,那么根据什么来区别他们呢,那就根据registered_fb数组中的成员,
}
6.比如打开s3c2410fb.c这个函数,
找到init函数
int __devinit s3c2410fb_init(void)
{
return platform_driver_register(&s3c2410fb_driver);
}
进入到int platform_driver_register(struct platform_driver *drv)里面
{
drv->driver.bus = &platform_bus_type;
....
return driver_register(&drv->driver);
}
}
进入int driver_register(struct device_driver * drv)函数里面
{....
return bus_add_driver(drv);
int bus_add_driver(struct device_driver *drv)
error = driver_attach(drv);
bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);
driver_probe_device(drv, dev);
if (drv->bus->match && !drv->bus->match(dev, drv))
return ret;如果设备和驱动的名字匹配,那么就会调用probe函数,也就是会调用
.probe = s3c2410fb_probe,这个函数
7.分析这个函数static int __init s3c2410fb_probe(struct platform_device *pdev)
{
主要工作:struct fb_info *fbinfo;定义一个fb_info结构体指针变量
fbinfo = framebuffer_alloc(sizeof(struct s3c2410fb_info), &pdev->dev);为这个结构体指针变量分配大小
....初始化这个结构体
ret = register_framebuffer(fbinfo);注册这个结构体,就把这个结构体注册到内核中,也就是存在registered_fb数组中去,
}
总结:整个LCD驱动架构就是设备和驱动分离
驱动是对所有的LCD抽出来的共性
设备是根据不同厂家的LCD来进注册,如果设备的名字和驱动的名字相同,那么就可以调用probe函数对着设备进行注册;从而达到了设备和驱动分离的目的。

LCD内核自带驱动分析的更多相关文章

  1. linux内核SPI总线驱动分析(一)(转)

    linux内核SPI总线驱动分析(一)(转) 下面有两个大的模块: 一个是SPI总线驱动的分析            (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) ...

  2. linux内核SPI总线驱动分析(二)(转)

    简而言之,SPI驱动的编写分为: 1.spi_device就构建并注册  在板文件中添加spi_board_info,并在板文件的init函数中调用spi_register_board_info(s3 ...

  3. s3c2440液晶屏驱动 (非内核自带) linux-4.1.24

    对于,不想逐一检查内核自带驱动,想自己编写驱动. 1,make menuconfig 去掉 编译到内核,改为 M 编译为 模块(因为要用到里面的3个.ko 驱动) Device Drivers --- ...

  4. Linux驱动之内核自带的S3C2440的LCD驱动分析

    先来看一下应用程序是怎么操作屏幕的:Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出FrameBuffer这个设备来供用户 ...

  5. Linux的LCD驱动分析及移植

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...

  6. 高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  7. S3C6410 LCD驱动分析(转)

    一. 理论分析1. 几个概念:FIMC :    Fully Interactive Mobile Camera (完全交互式移动摄像机)FIMD:     Fully Interactive Mob ...

  8. mini2440触摸屏驱动分析

    mini2440驱动分析系列之 ---------------------------------------Mini2440触摸屏程序分析 By JeefJiang July,8th,2009 这是 ...

  9. 19.Linux-USB总线驱动分析

    如下图所示,以windows为例,我们插上一个没有USB设备驱动的USB,就会提示你安装驱动程序 为什么一插上就有会提示信息? 是因为windows自带了USB总线驱动程序, USB总线驱动程序负责: ...

随机推荐

  1. eclipse绘制activiti无法生成图形

    今天使用eclipse绘制acitiviti,发现无法绘制图形,设置里面勾选也勾选了,同时activiti插件也是最新的,最后发现同时打开了两个eclipse窗口就不支持生成图形,看来只能开一个窗口了 ...

  2. 网页qq客服代码并自定义图片

    <script>var online= new Array();</script> <script src="http://webpresence.qq.com ...

  3. laravel select 传参

    传值: $params['select'] = 'taobao_id,title,image,price,coupon_deduct,coupon_condition'; 接受参数 $result = ...

  4. 初识App安全性测试

    目前手机App测试还是以发现bug为主,主要测试流程就是服务器接口测试,客户端功能性覆盖,以及自动化配合的性能,适配,压测等,对于App安全性测试貌似没有系统全面统一的标准和流程,其实安全性bug也可 ...

  5. Software Engineering: 3. Project planning

    recourse: "Software Engineering", Ian Sommerville Keywords for this chapter: planning sche ...

  6. cocos2d-x 图片性能测试

    本文是原创文章,如需转载,请注明文章出处 本次测试使用的cocos2d-x版本是3.9,测试环境是XCode7自带的iphone5 一.JPG格式与PVR.CCZ格式对比 1.占用空间对比 a)不透明 ...

  7. Python学习笔记之字典

    一.创建和使用字典 1.创建字典 phonebook={'Alice':'2341','Beth':'9102','Cecil':'3258'} 2.dict,通过映射创建字典 >>> ...

  8. setWinldowRgn

    CRgn(HRGN) SetWindowRgn setRgn{ CRgn rgnRect; CRgn rgnHole; //获取窗口大小 CRect rcWnd; GetWindowRect(& ...

  9. 突破php的imagecopyresampled 和imagecopyresized 实现图片马JPG

    编辑器加载中...之前有人发布了 利用PNG 图片上述压缩函数的方法 原理利用 PNG的结构IDAT chunks填充一句话webshell,并进行一套取模运算 详见: https://www.ido ...

  10. SAP验证

    需求:财务录费用凭证,检查科目6601001-6601999 & 成本中心为1000R001 - 1000R999,工单不能为空 GGB0 1.选择财务凭证->行项目->新建确认' ...