整理--platform平台总线

知识整理–platform平台总线

何为平台总线–为了方便管理扩展到CPU32位地址空间的设备

个人认为总线只是一种机制,一种管理方式,真正的起关键作用的是某一具体设备的驱动框架。platform_driver_register内部调用的是某一具体设备的驱动框架开放出来的注册接口

关键点:

  • platform平台总线的目的、意义
  • platform自己本身的构建和工作原理
  • 如何使用平台总线来组织设备和驱动

platform平台总线介绍

何为平台总线

(1)相对于usb、pci、i2c等物理总线来说,platform总线是虚拟的、抽象出来的
(2)CPU与外部通信的2种方式:地址总线式连接(LED 串口 DM9000等可以直接通过寄存器操控)和专用接口式连接(USB Nand等)。 平台总线对应地址总线式连接设备

专用接口其实就是对应usb、pci、i2c等物理总线,就是通过这些物理总线跟外部连接的。那么扩展到CPU32位地址空间的设备
怎么办?扩展到CPU32位地址空间的设备是不对应具体的一种的这种物理总线,所以就给他发明了平台总线

总线一开始是为了USB、I2C、PCI这些设备设计的,扩展到CPU32位地址空间的设备并没有总线这种概念。为了避免有一部分设备有总线有一部分设备没有总线的管理不便,所以给所有的设备规定都有总线。即平台总线的发明其实就是为了给那些本来不需要总线的设备来连接

平台总线下的两个主要结构体

p.5-3-191
p.5-3-192

(1)platform工作体系都定义在drivers/base/platform.c
(2)两个结构体:platform_deviceplatform_driver
(3)两个接口函数:platform_device_registerplatform_driver_register

platform平台总线工作原理

第一、系统启动时在bus系统中注册platform,主要内容是platform_bus_type中的match方法的注册;
第二、我们注册写好的设备和驱动;
第三、platform的match函数发现driver和device匹配后,调用driver的probe函数来完成驱动的初始化和安装

启动时注册platform总线

platform总线的注册是由platform_bus_init函数完成的,主要的内容是注册一个bus_type结构体类型的变量

![p.5-3-193)

详细分析点击这里系统启动时在bus系统中注册platform

(1)每种总线(不光是platform,usb、i2c那些也是)都会带一个match方法,match方法用来对总线下的device和driver进行匹配

理论上每种总线的匹配算法是不同的,但是实际上一般都是看name

(2)platform_match函数就是平台总线的匹配方法。该函数的工作方法是:如果有id_table就说明驱动可能支持多个设备。所以这时候要去对比id_table中所有的name,只要找到一个相同的就匹配上了不再找了,如果找完id_table都还没找到就说明每匹配上;如果没有id_table或者每匹配上,那就直接对比device和driver的name,如果匹配上就匹配上了,如果还没匹配上那就匹配失败

可能先有驱动再有设备,也有可能先有设备再装的驱动
platform设备和驱动的注册过程

以led为例

两个主要结构体:
(1)platform_device
(2)platform_driver

两个主要函数:
(1)platform_device_register
(2)platform_driver_register

platform设备注册过程

p.5-3-194

(1)platdata:平台设备的特有平台数据,就是设备注册时提供的设备有关的一些数据(譬如设备对应的gpio、使用到的中断号、设备名称等)
(2)这些数据在设备和驱动match之后,会由设备方转给驱动方。驱动拿到这些数据后,通过这些数据得知设备的具体信息,然后来操作设备
(3)这样做的好处是:驱动源码中不携带数据,只负责算法(对硬件的操作方法)。一些简单驱动可以单独运行是因为单独的驱动就包含了硬件信息,这样设计是不适宜的。现代驱动设计理念就是算法和数据分离,这样最大程度保持驱动的独立性和适应性

platform驱动注册过程

到代码实践环节中再分析

(1)match函数
(2)probe函数

总结(1)

  • 从意义上看,platform总线的发明为了便于管理扩展到CPU32位地址空间的设备,也为了能够统一管理系统中的所有设备(总线其实就是为了USB、I2C、PCI这些设备设计的,扩展到CPU32位地址空间的设备其实是没有总线这种概念的)
  • 从代码层次上看,platform总线是以kset和kobject为代表的设备驱动模型底层构建起来的的上层,对应的结构体为platform_bus_type,platform_device和platform_driver
  • 如何实现:platform平台总线工作原理

platform平台总线代码实践

照猫画虎,以自带的leds-s3c24xx.c为猫

添加led设备和平台设备特有平台数据
根据前面platform设备注册过程的分析添加设备抽象

分析并移植leds-s3c24xx.c(即led驱动):
led驱动程序框架:

暂略,也可以看了下面的代码理解了之后自己回顾

leds-s5pv210.c

p.5-3-195

s5pv210_led_probe:

p.5-3-196


总结(2)

  • 写驱动需要熟悉设备驱动模型,熟悉各种数据结构的成员变量和成员方法的意义,以及各种东西之间的关联。还有就是如果接触到一种新的驱动,要能够分析源代码找到要编写的这个驱动所涉及到的驱动框架是怎么样的,这是需要具备的能力
  • 理解并使用数据和算法分离的思想
  • 总线这种方式虽然重要,但是它只是一种机制,一种管理方式。真正的起关键作用的是LED驱动框架(就是内核实现一部分,驱动实现一部分)
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值