基于高通MSM 8x60的I2C驱动终极讲解(6)
来源:互联网 发布:网络银行的交易额 编辑:程序博客网 时间:2024/05/08 20:13
接着上一节分析,上一节讲到,把device_add(&pdev->dev);//把该设备注册到设备驱动模型中,接着该函数继续分析,看下设备驱动是怎么回事,设备是如何与驱动匹配绑定的。
int device_add(struct device *dev)
{
if (!dev->p) {//如果dev的私有数据为空,则继续相应的初始化
error = device_private_init(dev);
}
{
if (!dev->p) {//如果dev的私有数据为空,则继续相应的初始化
error = device_private_init(dev);
}
error = bus_add_device(dev);//把设备增加到设备依附的总线bus的devices链表上
bus_probe_device(dev);//设备探测总线上的驱动
}
bus_probe_device(dev);//设备探测总线上的驱动
}
void bus_probe_device(struct device *dev)
{
if (bus && bus->p->drivers_autoprobe) {//如果bus不为空,并且是自动探测,则device_attach.
ret = device_attach(dev);
}
}
{
if (bus && bus->p->drivers_autoprobe) {//如果bus不为空,并且是自动探测,则device_attach.
ret = device_attach(dev);
}
}
int device_attach(struct device *dev)
{
int ret = 0;
{
int ret = 0;
device_lock(dev);
if (dev->driver) {//如果该device的driver不为空的话,就把该dev和该driver绑定,也就是把dev加到driver的devices链表
} else {
ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);//否则,用改dev去探测bus上的每一个驱动
}
}
if (dev->driver) {//如果该device的driver不为空的话,就把该dev和该driver绑定,也就是把dev加到driver的devices链表
} else {
ret = bus_for_each_drv(dev->bus, NULL, dev, __device_attach);//否则,用改dev去探测bus上的每一个驱动
}
}
下面是探测的过程,针对dev和从总线上取到的每一个驱动做匹配,匹配的过程如下:
static int __device_attach(struct device_driver *drv, void *data)
{
struct device *dev = data;
{
struct device *dev = data;
if (!driver_match_device(drv, dev))//调用总线的match函数,去匹配该dev和driver
return 0;
return 0;
return driver_probe_device(drv, dev);//探测成功,试图绑定device和driver
}
}
下面就看下,总线的match函数
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);
{
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)//如果pdrv->id_table不为空,则用pdev的名字和该id_table列表中的名字匹配
return platform_match_id(pdrv->id_table, pdev) != NULL;
if (pdrv->id_table)//如果pdrv->id_table不为空,则用pdev的名字和该id_table列表中的名字匹配
return platform_match_id(pdrv->id_table, pdev) != NULL;
/* fall-back to driver name match */
return (strcmp(pdev->name, drv->name) == 0);//如果pdrv->id_table为空,则用pdev的名字和该drv的名字比较,看是否匹配
}
return (strcmp(pdev->name, drv->name) == 0);//如果pdrv->id_table为空,则用pdev的名字和该drv的名字比较,看是否匹配
}
下面接着分析driver_probe_device(drv, dev);函数。
该函数调用int driver_probe_device(struct device_driver *drv, struct device *dev)
{
ret = really_probe(dev, drv);
}
{
ret = really_probe(dev, drv);
}
really_probe()函数如下
static int really_probe(struct device *dev, struct device_driver *drv)
{
dev->driver = drv;//把drv赋值给dev的driver
if (dev->bus->probe) {//如果总线的probe函数存在,则先调用总线的probe函数
ret = dev->bus->probe(dev);
} else if (drv->probe) {//否则调用驱动的probe函数
ret = drv->probe(dev);
}
{
dev->driver = drv;//把drv赋值给dev的driver
if (dev->bus->probe) {//如果总线的probe函数存在,则先调用总线的probe函数
ret = dev->bus->probe(dev);
} else if (drv->probe) {//否则调用驱动的probe函数
ret = drv->probe(dev);
}
driver_bound(dev);//如果都探测通过,就把dev加入到该driver的device链表中
ret = 1;
}
ret = 1;
}
到此平台设备已经加入到总线上,并且找到了自己的驱动。
0 0
- 基于高通MSM 8x60的I2C驱动终极讲解(6)
- 基于高通MSM 8x60的I2C驱动终极讲解(8)
- 基于高通MSM 8x60的I2C驱动终极讲解(1)
- 基于高通MSM 8x60的I2C驱动终极讲解(2)
- 基于高通MSM 8x60的I2C驱动终极讲解(3)
- 基于高通MSM 8x60的I2C驱动终极讲解(4)
- 基于高通MSM 8x60的I2C驱动终极讲解(5)
- 基于高通MSM 8x60的I2C驱动终极讲解(7)
- 基于高通MSM 8x60的I2C驱动终极讲解(9)
- 基于高通MSM 8x60的I2C驱动终极讲解(10)
- 基于高通MSM 8x60的I2C驱动终极讲解(11)
- 基于高通MSM 8x60的I2C驱动终极讲解(12)
- 基于高通MSM 8x60的I2C驱动终极讲解(13)
- 基于高通MSM 8x60的I2C驱动终极讲解总结
- 基于高通MSM 8x60的I2C驱动终极讲解(1)
- 基于MSM平台的振动器驱动移植
- Linux的I2C驱动讲解
- 基于I2C子系统的I2C驱动编写
- BoundsChecker安装下载及使用教程攻略
- 约瑟夫问题
- 实现安卓中TextView,EditText中数字的数码管字体显示
- HTML5游戏在 Android 上性能不佳的解决方案
- POJ 1008 Edge detection
- 基于高通MSM 8x60的I2C驱动终极讲解(6)
- floyd两题:POJ1125 Stockbroker Grapevine 和VIJOS P1046 观光旅游
- magento 如何上传file/image/video
- ,就走在雨里,不快不慢,任其洗尽满心疲惫
- 基于高通MSM 8x60的I2C驱动终极讲解(7)
- 基于高通MSM 8x60的I2C驱动终极讲解(8)
- 【GamingAnywhere源码分析之知识补充一】静态链接库与动态链接库
- 解决Eclipse项目图标上的红色感叹号,红叉
- Magento调试模式 - 页面空白,打开错误报告的方法