参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>

     S3C2440 LCD驱动(FrameBuffer)实例开发<二>

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完成以上四步。

 static const struct file_operations fb_fops = {
.owner = THIS_MODULE,
.read = fb_read,
.write = fb_write,
.unlocked_ioctl = fb_ioctl,
.mmap = fb_mmap,
.open = fb_open,
.release = fb_release,
.llseek = default_llseek,
};
static int __init fbmem_init(void)
{
proc_create("fb", , NULL, &fb_proc_fops); if (register_chrdev(FB_MAJOR,"fb",&fb_fops))
printk("unable to get major %d for fb devs\n", FB_MAJOR); fb_class = class_create(THIS_MODULE, "graphics");
if (IS_ERR(fb_class)) {
printk(KERN_WARNING "Unable to create fb class; errno = %ld\n", PTR_ERR(fb_class));
fb_class = NULL;
}
return ;
}

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驱动分析(一)字符设备驱动框架分析的更多相关文章

  1. Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

    /*********************************************************************************** * * 字符设备驱动基本操作及 ...

  2. Linux驱动开发2——字符设备驱动

    1.申请设备号 #include <linux/fs.h> int register_chrdev_region(dev_t first, unsigned int count, char ...

  3. 【Linux 驱动】简单字符设备驱动架构(LED驱动)

    本文基于icool210开发板,内核版本:linux2.6.35: 驱动代码: (1)头文件:led.h #ifndef __LED_H__ #define __LED_H__ #define LED ...

  4. Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】

    转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 阻塞 阻 ...

  5. Linux驱动开发之字符设备驱动模型之file_operations

    90%的驱动模型都是按照下图开发的 下面来说下设备描述结构是什么东西 打开Linux-2.6.32.2的Source Insight 工程,搜索cdev 比如一个应用程序需要调用read和write这 ...

  6. 【linux驱动笔记】字符设备驱动相关数据结构与算法

    欢迎转载,转载时需保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  7. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...

  8. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...

  9. linux学习--字符设备驱动

    目录 1.字符设备驱动抽象结构 2.设备号及设备节点 2.1 设备号分配与管理 2.2 设备节点的生成 3.打开设备文件 linux驱动有基本的接口进行注册和卸载,这里不再做详细说明,本文主要关注li ...

随机推荐

  1. 2017"百度之星"程序设计大赛 - 初赛(A)今夕何夕

    Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最 ...

  2. CATIA 各个版本代号详解

    一. 第几代(V-"version")简介 1982—1988年,catia相继发布了第一代—V1版本.第二代—V2版本.第三代—V3版本,并于1993年发布了功能强大的第四代—V ...

  3. StretchDIBits速度测试(HALFTONE)

    StretchDIBits速度测试(HALFTONE) 下面实验中显示窗口大小为1024*768,拉伸模式设为HALFTONE. 一.单通道图像 (1) 保持图像高度为1024,宽度从24到2024递 ...

  4. Nginx 开启目录浏览功能配置

    在server节点下添加 server { listen ; server_name default; #index index.php; # 目录浏览功能 autoindex on; # 显示文件大 ...

  5. PHP知识点总结4

    file1.php <?php namespace Foo\Bar\subnamespace; const FOO = 1; function foo() {} class foo { stat ...

  6. 绘制复杂的原理图元件库用于cadence(二)

    绘制Xilinx XC7K325TFFG900 kintex-7 FPGA元件 1.在官网搜索“pin out”往下拉一下就能看见 2.点击进入选择相应型号 3.打开之后是类似txt格式的FFG900 ...

  7. Sunday算法模板

    Sunday是一个线性字符串模式匹配算法.算法的概念如下: Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法.其核心思想是:在匹配过程中,模式串并不被要求一定要 ...

  8. jQuery和AJAX基础

    jQuery和AJAX基础 jQuery 基础: 1.jQuery 选择器: 元素选择器:$("p"): #id 选择器:$("#test"): .class ...

  9. Handler消息机制的一些原理(直接用code讲解)——Android开发

    package com.example.handlertest; import android.os.Bundle; import android.os.Handler; import android ...

  10. 倒计时器 CountDownTimer

    使用介绍 开发中经常会遇到一些和倒计时有关的场景,比如发送验证码的按钮,会在点击发送后,显示倒计时间,倒计时结束后才能够刷新按钮,再次允许点击.为了不阻塞软件的运行,又要实时刷新界面,我们通常会用到 ...