LCD内核自带驱动分析

分析内种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函数对着设备进行注册;从而达到了设备和驱动分离的目的。

时间: 2024-10-19 18:11:19

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

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

对于,不想逐一检查内核自带驱动,想自己编写驱动. 1,make menuconfig 去掉 编译到内核,改为 M 编译为 模块(因为要用到里面的3个.ko 驱动) Device Drivers --->    Graphics support --->        Support for frame buffer devices --->            <M> S3C2410 LCD framebuffer support 2,make uImage &&a

LInux LCD驱动分析

一.让LCD显示可爱的小企鹅还是先说说环境吧,处理器为S3C2410,linux的版本当然是2.6.20的.下面先说说怎样让LCD上显示出可爱的小企鹅.最直接的步骤如下(记住不要问为什么哈-_-,一步一步跟着走就行了):1.       添加s3c2410处理器的LCD控制寄存器的初始值,具体做法为在文件arch/arm/mach-s3c2410/mach-smdk2410.c中添加struct s3c2410fb_mach_info类型的寄存器描述讯息,如下所示:static struct s

S3C6410 LCD驱动分析(转)

一. 理论分析1. 几个概念:FIMC :    Fully Interactive Mobile Camera (完全交互式移动摄像机)FIMD:     Fully Interactive Mobile Display (完全交互式移动显示设备)2. 设置VCLK在VIDCON0中bit[3:2]-->Select the Video Clock source =00 --> HCLK=133MHZbit[13:6] --> CLKVAL_F = 13  (这个值是在驱动中计算出来的

蓝牙驱动分析 linux

蓝牙驱动分析 这个驱动分析的是OK6410开发板自带的内核版本是linux3.0.1,所支持的wifi和蓝牙一体芯片是marvell的8688和8787.根据开发板的设计,芯片与主机之间是通过sdio协议接口通信的,所以驱动也是通过sdio的方式写的. 个人分析驱动的过程是从插入设备驱动的动作开始的. 首先每次插入设备和拔出设备驱动都会通过终端打印相应的信息,判断在sd卡槽中肯定是触发中断的,通过看硬件原理图和数据手册中的SDMMC控制器可知用于mmc的中断号分别为56和57,回到代码中.在内核

Linux SD/MMC/SDIO驱动分析_转

转自:Linux SD/MMC/SDIO驱动分析    https://www.cnblogs.com/cslunatic/p/3678045.html#3053341 一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代.在维基百科上有相当详细的 SD/MMC 规格说明:[htt

20150311 NandFlash驱动分析

20150311 NandFlash驱动分析 2015-03-11 李海沿 一.结构体详解 MTD体系结构: 在linux中提供了MTD(Memory Technology Device,内存技术设备)系统来建立Flash针对linux的统一.抽象的接口 引入MTD后,linux系统中的Flash设备驱动及接口可分为4层: 设备节点 MTD设备层 MTD原始设备层 硬件驱动层 硬件驱动层:Flash硬件驱动层负责底层硬件设备实际的读.写.擦除,Linux MTD设备的NAND型Flash驱动位于

linux串口驱动分析

linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作.UART 使用系统时钟能够支持最高 115.2Kbps 的波特率.每一个 UART 通道对于接收器和发送器包含了 2 个 64 位的 FIFO. 寄存器 名称 地址 在linux中的描写叙述 (2410 和 2440 处理器对内存地址映射关系同样) UART 线性控制寄存器(ULCONn) ULC

Linux内核--网络栈实现分析(一)--网络栈初始化

本文分析基于内核Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7488828 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 以后的系列博文将深入分析Linux内核的网络栈实现原理,这里看到曹桂平博士的分析后,也决定选择Linux内核1.2.13版本进行分析. 原因如下: 1.功能和网络栈层次

atheros wifi 驱动分析

Ar6003 驱动文档摘要 1.  wmi : wireless module interface //无线模块结构 2.  bmi : bootloader message interface 3.  htc : host target communications 4.  wps:wifi protected setup 5.  CS:connection services module 6.  STA:station 7.  AP:access point Wireless applica