VID & PID
每一个设备都有一个设备id和厂商id,设备管理器–>硬件属性–>详细信息–>属性–>硬件id,
驱动和设备分离
从Linux 2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。Linux中大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_driver进行注册。
Linux platform driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。
1、设备(platform_device)注册的过程中会调用platform总线的match函数去寻找目前已经挂接在platform总线上与设备(paltform_device)名字对应的驱动(platform_driver)。相反的驱动(platform_driver)注册的时候一样去寻找挂接在总线上名字对应的设备(platform_device)
2、匹配上后,会执行驱动(platform_driver)的probe函数
3、probe函数中会实现控制器的初始化和其他的一些准备工作,并且会有注册实际的设备(比如eeprom)
实现platform模型的过程就是总线对设备和驱动的匹配过程 。打个比方,就好比相亲,总线是红娘,设备是男方,驱动是女方:
a – 红娘(总线)负责男方(设备)和女方(驱动)的撮合;
b – 男方(女方)找到红娘,说我来登记一下,看有没有合适的姑娘(汉子)—— 设备或驱动的注册;
c – 红娘这时候就需要看看有没有八字(二者的name 字段)匹配的姑娘(汉子)——match 函数进行匹配,看name是否相同;
d – 如果八字不合,就告诉男方(女方)没有合适的对象,先等着,别急着乱做事 —— 设备和驱动会等待,直到匹配成功;
e – 终于遇到八字匹配的了,那就结婚呗!接完婚,男方就向女方交代,我有多少存款,我的房子在哪,钱放在哪等等( struct resource *resource),女方说好啊,于是去房子里拿钱,去给男方买菜啦,给自己买衣服、化妆品、首饰啊等等(int (*probe)(struct platform_device *) 匹配成功后驱动执行的第一个函数),当然如果男的跟小三跑了(设备卸载),女方也不会继续待下去的( int (*remove)(struct platform_device *))。
设备和驱动没有谁先谁后,谁先安装模块,谁就等待谁。
platform_device
定义在:include/linux/platform_device.h中
这是内核3.0.0中的定义
struct platform_device {
const char * name;//设备名称 重要
int id; //设备号,相当于次设备号
struct device dev; //所有设备通用的属性部分
u32 num_resources;//设备使用到的resource的个数
struct resource * resource;//设备使用到的资源数组的首地址
const struct platform_device_id *id_entry;//设备ID表
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata; //自留地,用来提供扩展性的
};
设备模块先初始化后,注册设备端的设备
__init platdev_init:
platform_device_register(&platform_d