关于platform_device和platform_driver的匹配【转】
转自:http://blog.csdn.net/dfysy/article/details/5959451
版权声明:本文为博主原创文章,未经博主允许不得转载。 说句老实话,我不太喜欢现在Linux .6这套bus, platform, device,device driver 的模式。我觉得这种模式破坏了Linux的“简单就是美”的哲学,原来那套驱动已经可以包容所有驱动,也可以直接注册驱动文件和管理,而且以前的驱动在现在的结构上也还可以使用,把它在注册到bus这棵树上又有什么用呢?虽然可以看到一点对于移植性和平台管理方面的优点,但是我认为现在这种驱动编程的风格越来越像Windows的风格,很不直观和简约,让人理解起来相当的困惑。 牢骚发完了,bus结构还得继续,说说platform_device和platform_driver的匹配吧!一般来说系统上来在init_init_machine的对应函数ap_init中注册一些这个平台的设备,如下: static struct resource cbp_sdmmc_resource[]=
{
[]={
.start=HWD_MMC_BASE,
.end=HWD_MMC_BASE+0xff0,
.flags=IORESOURCE_MEM
},
[]={
.start=IRQ_SDMMC,
.end=IRQ_SDMMC,
.flags=IORESOURCE_IRQ
},
[]={
.start=IRQ_SDMMC_CD,
.end=IRQ_SDMMC_CD,
.flags=IORESOURCE_IRQ
}
}; struct platform_device cbp_device_sdmmc = {
.name = "cbp-sdmmc",
.id = -,
.num_resources = ARRAY_SIZE(cbp_sdmmc_resource),
.resource = cbp_sdmmc_resource,
.dev = {
.coherent_dma_mask = 0xffffffffUL
}
};
static struct platform_device * cbp_devices[] __initdata = {
&cbp_device_sdmmc
};
static void __init ap_init(void)
{
platform_add_devices(cbp_devices,ARRAY_SIZE(cbp_devices)); }
说明这个平台使用的SD/MMC驱动的名字叫"cbp-sdmmc",然后在驱动中用platform_driver_register声明对应的platform_driver来使用上面声明的平台资源,如下: static int __init cbpmci_init(void)
{
return platform_driver_register(&cbpmci_driver);
}
platform_driver和platform_driver的匹配方式有两种: )直接根据名字来进行匹配,这种方式是比较常用的方式,比如如下申明cbpmci_driver: static struct platform_driver cbpmci_driver = {
.probe = cbpmci_probe,
.driver = {
.name = "cbp-sdmmc",
},
};
)通过id_talbe来实现,这种实现的最终还是通过名字对应来匹配,但是匹配的名字被列在一个表中,platform_device的name和这个表中的每一个值进行比较,知道找到相同的那一个,如下申明: static struct platform_device_id cbpmci_driver_ids[] = {
{
.name = "other-sdmmc",
.driver_data = ,
},
{
.name = "cbp-sdmmc",
.driver_data = ,
},
{ }
}; static struct platform_driver cbpmci_driver = {
.driver = {
.name = "vtc_sdmmc",
.owner = THIS_MODULE,
.pm = &cbpmci_pm_ops,
},
.id_table = cbpmci_driver_ids,
.probe = cbpmci_probe,
.remove = __devexit_p(cbpmci_remove),
.shutdown = cbpmci_shutdown,
};
当id_table不为空的时候,.driver.name中的名字“vtc_sdmmc”就不管用了,会按照id_table中的内容进行匹配,同时匹配后的会把匹配上的platform_device_id保存在platform_device结构的id_entry中,在probe的时候就可以通过id_entry中的driver_data判断匹配的到底是cbpmci_driver_ids中的哪一组ID, 比如上面例子中的"cbp-sdmmc"中匹配的是第二组,这样就可以再Probe的判断到底是什么平台了 if(platform_get_device_id(pdev)->driver_data==) printk("cgp SD/MMC support/n"); 这种匹配方式在三星的SD/MMC中有使用,由于2412和2440的地址是一样的,而2410不一样,所以通过driver_data 是否为1来区分。 static struct platform_device_id s3cmci_driver_ids[] = {
{
.name = "s3c2410-sdi",
.driver_data = ,
}, {
.name = "s3c2412-sdi",
.driver_data = ,
}, {
.name = "s3c2440-sdi",
.driver_data = ,
},
{ }
}; 一下是Linux匹配的源代码,在platform.c中,一看就一目了然了,当然要跟到这步,中间还有好多指针要走: static int platform_match(struct device *dev, struct device_driver *drv)
{
struct platform_device *pdev = to_platform_device(dev);
struct platform_driver *pdrv = to_platform_driver(drv); /* match against the id table first */
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL; /* fall-back to driver name match */
return (strcmp(pdev->name, drv->name) == );
} 此外platform_add_devices最终会调用platform_device_register,而platform_device_register和platform_driver_register应该先调用哪一个理论上讲是先调用device然后driver,但其实是无所谓的,最后都会调用device_attach()来probe。
关于platform_device和platform_driver的匹配【转】的更多相关文章
- platform_device与platform_driver
转自:http://blog.csdn.net/zhandoushi1982/article/details/5130207 做Linux方面也有三个多月了,对代码中的有些结构一直不是很明白,比如pl ...
- 内核驱动中常见的miscdevice、platform_device、platform_driver
最近在看驱动模型,是越看越糊涂,以前接触比较多的都是一些字符驱动,对字符驱动的框架有一定的了解.后来因为想在驱动中实现设备文件的创建,又了解了一下,sysfs文件系统和udev设备文件系统(这两个是两 ...
- Resouce, platform_device 和 platform_driver 的关系【转】
转自:http://blog.csdn.net/uruita/article/details/7278313 從2.6版本開始引入了platform這個概念,在開發底層驅動程序時,首先要確認的就是設備 ...
- platform_device和platform_driver的注册过程,及probe函数何时调用的分析 ⭐⭐⭐
add platform_device之后,需要注意的一个地方是这里,add是通过系统初始化里边调用platform_add_devices把所有放置在板级platform_device数组中的所有 ...
- 两年前实习时的文档——Platform学习总结
1 概述 驱动程序实际上是硬件与应用程序之间的中间层.在Linux操作系统中,设备驱动程序对各种不同的设备提供了一致的訪问接口,把设备映射成一个特殊的设备文件,用户程序能够像其它文件一样对设备文件进 ...
- 两年前实习时的文档——MMC学习总结
1概述 驱动程序实际上是硬件与应用程序之间的中间层.在Linux操作系统中,设备驱动程序对各种不同的设备提供了一致的訪问接口,把设备映射成一个特殊的设备文件,用户程序能够像其它文件一样对设备文件进行操 ...
- 设备树..ing
.dts==>.dtb ==>device_node ==> platform_device ==> led_dev.c ==>匹配 led_drv.c (设备 ...
- 基于335X的Linux网口驱动分析
基于335X的linux网口驱动分析 一. 系统构成 1. 硬件平台 AM335X 2. LINUX内核版本 4.4.12 二. 网口驱动构架(mdio部分) mdio网口驱动部分 使用 总线.设 ...
- 08 在设备树里描述platform_device【转】
转自:https://blog.csdn.net/jklinux/article/details/78575281 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
随机推荐
- Linux下面自动清理超过指定大小的文件
Linux下面自动清理超过指定大小的文件 思路:1)查找test目录下的所有的文件2)判断是否大于100M3)大于100M则清空 以byte为单位显示文件大小,然后和100M大小做对比. 100M换算 ...
- PHP 对象基础知识
最近开始重新学习对象知识,其实也算是初步深入学习对象和设计模式,希望自己会坚持下去,保持更新 初识PHP对象 还记得,刚开始学习 PHP 的时候,学到到方法和对象时有一个很大的疑问,对象与方法相比较那 ...
- 科学计算库Numpy——数组形状
改变数组维数 给数组的shape属性赋值,改变数组的维数.数组的大小是不能改变的. 增加维度 使用np.newaxis增加维度. 删除维度 使用squeeze()删除维度是1的维度,也就是删除shap ...
- configParser模块详谈
前言 使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是configParser configPars ...
- python PEP8代码规范及问题
最近刚刚接触Python,为了养成好习惯,尽量保证自己写的代码符合PEP8代码规范,下面是过程中报出的警告及解决方法,英文有些翻译不太准确见谅,会不断更新: PEP 8: module level i ...
- 按位与&、或|、异或^等运算方法
(转载) 按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算. 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; ...
- MySQL基础3-SQL语言
1.DQL语句分类 重点在于Select语句 2.Sql语句的书写规则 3.怎样使用Navicat导入已经写好的sql文件 (1)在Navicat中右击选中的数据库 (2)将sql文件所在的路径添加进 ...
- python-day4-装饰器的使用
摘要:某公司的基础开发平台,有大概N多个函数,boss要求小A,为每个函数添加权限验证功能,而且要求不得修改函数内部结构,让小A尝试从代码外部入手,作为新手小A来讲,这无疑是一个巨大的工作量,难道TM ...
- 【bzoj2882】工艺 后缀自动机+STL-map
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
- BZOJ3129 [Sdoi2013]方程 【扩展Lucas】
题目 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A X2 < = A2 Xn1 < = An1 我们对第n1 + 1..n1+n2个 ...