蓝天-彭 发表于 2014-9-25 11:06:16

平台总线

1 设备驱动模型– 平台总线
分析之前LED代码。发现这个驱动可移植性非常差。需要修改大量代码。
驱动程序由两部分组成:硬件相关的内容和纯软件(对硬件进行操作)的通用部分。

一Linux内核分离思想。
就是将硬件相关的内容和纯软件(对硬件进行操作)的通用部分分离开。
让驱动开发者关注硬件相关的部分。而通用的操作流程基本不需要维护和修改

平台总线platform_bus.虚拟的。而非硬件真实存在的总线。
平台总线维护着两个链表:dev,   drv


二 分离的具体实现
dev链表里存放硬件相关的信息
drv链表里面存放对硬件操作的流程。(纯软件部分)
平台总线里面有一个match函数。它进行dev和drv链表的两两匹配工作。通过dev的name和drv的name匹配。如果匹配成功会调用drv里面probe函数。probe函数的实现由驱动开发作者实现。而具体的硬件信息在匹配时候已经得到。
匹配过程:
当向总线注册dev信息(添加节点到dev链表)同时会从drv链表里取出每一个drv节点。跟自己dev的name进行匹配。如果匹配成功调用drv的probe函数。

当向总线注册drv信息(添加节点到drv链表)同时会从dev链表里取出每一个dev节点。跟自己drv的name进行匹配。如果匹配成功调用drv的probe函数。

1 dev和drv链表对应的结构是??
2 如何注册dev和drv?
3 probe如何获得硬件的资源?

Sudo apt-get insall ctags
Vim插件 ctags 和cscope
ctags:
ctrl + ] 跳到定义
ctrl + t 跳回来
grep
find




1 dev和drv链表对应的结构是??
dev 对应结构:struct platform_device
里面至少有个name信息
里面有硬件相关的信息struct reource
drv对应结构: struct platform_driver
有probe函数,remove(卸载)函数
2 如何注册dev和drv?
platform_device_register向内核注册一个platform_device
platform_driver_register向内核注册一个platform_driver
3 probe如何获得硬件的资源?
例如:
static int sw_rfkill_probe(struct platform_device *pdev)
可得:probe函数的行参数pdev指针就是指向开始注册的platform_device结构。这个结构体本身在初始化时候包含了硬件相关的信息(struct resource可用这个来存放自己特定的硬件信息)。后续工作自己需求的实现。比如:注册一个字符设备。


Tll
cubieplayer
soforace
页: [1]
查看完整版本: 平台总线