官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 540|回复: 1

[已解决] 驱动设备分层分离和总线驱动设备模型

[复制链接]

41

主题

139

帖子

1225

积分

金牌会员

Rank: 6Rank: 6

积分
1225
发表于 2017-2-27 10:03:58 | 显示全部楼层 |阅读模式
本帖最后由 决狐疑 于 2017-2-28 15:42 编辑

对于输入子系统的模型和总线驱动设备模型是如何实现的我都能理解,
比较疑惑的是这两个模型有什么区别和关系
输入子系统是input.c作为中转,下面的input_dev和input_handler分别向上注册,并且这两者通过hendle来建立连接
总线驱动设备模型是虚拟的bus总线下面的device和driver分别向上注册,通过probe来建立连接
疑惑:
1:对我感觉而言这两者只不过是结构体的名字不一样罢了,这两者有什么联系呢?

在内核的Gpio_keys.c文件里面可以看到里面有probe的等函数,并且在probe函数里面又是输入子系统的操作步骤:分配了input_dev结构体,然后初始化,注册等等,
疑惑:
2:这是不是说明输入子系统的模型可以套用在bus_drv_dev模型里面呢?

3:如果是可以这样套用,那么反过来套用行不行呢?为什么
4:分层和分离的和这两者又是什么关系呢?
我在网上有看到说:
分层即把硬件相关和相对稳定的东西给抽出来,并向上提供统一的接口,每一层专注于自己的事情,比如输入子系统。
分离即把硬件相关和相对稳定的东西给分离开来,实际上即是bus-dev-drv模型
没理解这两者有什么区别,不都是把驱动分成了硬件部分和纯软件部分么?
5:在看到LCD的驱动的时候,由于LCD是帧缓冲设备,所以又引出了一个帧缓冲设备的框架,其中的file_operations 结构体由 fbmem.c 中的 file_operations 提供,
而特定帧缓冲设备 fb_info结构体的注册、注销以及其中成员的维护的实现则由对应的 s3c2410fb.c 文件实现 .又由于LCD 控制器经常被集成在 SoC 上作为一个独立的硬件模块而存在(成为
platform_device),因此,LCD 驱动中也经常包含平台驱动 ,所以它又涉及到了总线驱动设备模型,之前我在看视频中知道总线驱动设备必须有两个文件,一个是drv.c一个是dev.c,通过s3c2410fb.c
中定义的platform_driver结构体的名字s3c2410-lcd,搜索整个文件,在 arch/arm/plat-s3c24xx/devs.c中找到了platform_deviece的定义 ,至此,这个LCD就有牵扯到了3个文件 fbmem.c , devs.c, s3c2410fb.c
每个文件中到底应该干些什么,我就有点迷茫了,如果要我自己写,我肯定不知道这三个文件分别写什么,而且对于这种框架直接的相互套用(我暂时这样理解是框架套用)是个什么逻辑呢?
总的来说还是对LCD的驱动框架不懂,为什么要这么多文件?
6:另外,是不是每个硬件基本上都会有不同的设备驱动框架呢?
  我看到后面每介绍一个硬件基本都要介绍下他的驱动框架,难道每个都不一样,还是说可以将所有的设备驱动的框架分成几类?
  到底什么硬件对应什么驱动框架是固定么,我们自己写驱动的时候到底应该按照哪个框架去写怎么确定?
以上6个问题,请按顺序回答下!谢谢!





回复

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2017-2-28 17:17:58 | 显示全部楼层
没有必要按顺序回答。你看看我给的例子, 真能理解了,那么这些问题就解决了。
假设你有JZ2440、MINI2440两个板子;
JZ2440使用GPB0作为按键,
MINI440使用GPB1作为按键;
现在给你一个任务,给这2个板子写一个按键驱动。

为了减少工作量,我会这样做:
1. 给JZ2440定义一个platform_device:
  1. stuct platform_device  jz2440 = {
  2.   资源 = GPB0,
  3.   name = keyboard,
  4. };
复制代码


2. 给MINI2440定义一个platform_device:
  1. stuct platform_device  mini2440 = {
  2.   资源 = GPB1,
  3.   name = keyboard,
  4. };
复制代码



3. 实现一个platform_driver:
  1. struct platform_driver my_input_drv = {
  2. .probe = my_probe,
  3. .name = keyboard,
  4. };
复制代码


4. 在my_probe中,
4.1 根据平台设备取出资源,确定是哪一个引脚
4.2 注册输入设备

你想想,这样写有何好处?
即使你增加一个新的开发板TQ2440,我也只需要修改对应的platform_device,指定它所用的引脚。
这就是bus-drv-dev的唯一作用。

这个驱动的核心在哪里?还是在probe函数中调用的register_input_device等等。

thisway.diy
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-11-18 14:39 , Processed in 0.288712 second(s), 20 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表