一、概 述
总线设备驱动模型主要包含总线、设备、驱动三个部分。
现实总线:一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI等的设备而言(例如USB、I2C等典型的设备),这自然不是问题。
虚拟总线(platform总线):但是在嵌入式系统里面,对于一些设备(内部的设备)可能没有现成的总线,如SoC 系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总线。基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform_device,而驱动成为 platform_driver。
注意1:platform总线设备驱动模型与之前的三类驱动(字符、块设备、网络设备)没有必然的联系。设备只是搭载到了platform总线上,仅此而已。platform总线相比与常规的总线模型其优势主要是platform总线是由内核实现的,而不用自己定义总线类型,总线设备来加载总线。platform总线是内核已经实现好的。
注意2:所谓的platform_device并不是与字符设备、块设备和网络设备并列的概念,而是Linux系统提供的一种附加手段,例如,在 S3C6410处理器中,把内部集成的I2C、RTC、SPI、LCD、看门狗等控制器都归纳为platform_device,而它们本身就是字符设备。
二、实例分析(TP:platform 总线设备驱动 +++ I2C总线设备驱动)
/*linux 驱动模型----基础知识*/
///在内核中是怎么按照driver mode(驱动模型)来实现整个系统的设备和驱动注册的???
1. 注册总线bus类型:
在系统初始化阶段,会首先向内核注册各种常用的总线类型,比如pci, usb, spi, i2c, platform等等,当然你也可以自己发明一种总线类型注册上去。这部分代码一般放在./arch/arm/mach-xxx/board-xxx.c中。
有两个重要的链表挂在bus上,一个是设备device链表,一个是驱动driver链表。
它包含的最关键的函数:match()
2. 注册设备:在此之后,会将系统的设备列表,基本上整个系统的device都在这里了,一一地注册进内核,就是调用xxx_device_regisger注册的过程。
(xxx_device_regisger:将自己加到设备device链表,然后使用总线bus匹配对应