打印

linux系统中驱动drv和设备dev的匹配疑问

[复制链接]
1448|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lihaiping1603|  楼主 | 2013-6-28 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在linux中我定义了下面下面几个平台设备
struct platform_device s3c_device_i2c0 = {
.name           = "s3c2410-i2c",
#ifdef CONFIG_S3C_DEV_I2C1
.id           = 0,
#else
.id           = -1,
#endif
.num_resources          = ARRAY_SIZE(s3c_i2c_resource),
.resource          = s3c_i2c_resource,
};
struct platform_device s3c_device_i2c1 = {
.name           = "s3c2410-i2c",
.id           = 1,
.num_resources          = ARRAY_SIZE(s3c_i2c_resource),
.resource          = s3c_i2c_resource,
};

然后我在分析设备dev注册的时候,我可以看到设备名字的修改,
if (pdev->id != -1)/*处理platform_device里面设备平台定义的时候的id情况*/
dev_set_name(&pdev->dev, "%s.%d", pdev->name,  pdev->id);/*将名字进行修改为name.id*/
else
dev_set_name(&pdev->dev, "%s", pdev->name);

再来看我对驱动的定义:
static struct platform_device_id s3c24xx_driver_ids[] = {
{
.name         = "s3c2410-i2c",
.driver_data        = TYPE_S3C2410,
}, {
.name         = "s3c2440-i2c",
.driver_data        = TYPE_S3C2440,
}, { },
};
MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids);

static struct platform_driver s3c24xx_i2c_driver = {
.probe         = s3c24xx_i2c_probe,
.remove         = s3c24xx_i2c_remove,
.id_table        = s3c24xx_driver_ids,/*注意此处的定义,它的作用解释下面的名字为什么不一样*/
.driver         = {
.owner        = THIS_MODULE,
.name        = "s3c-i2c", /*注意此处的名称s3c-i2c,和我们先前注册设备的时候用的名字s3c2410-i2c不一样*/   
.pm        = S3C24XX_DEV_PM_OPS,
},
};
但当我分析dev和drv进行匹配的时候,靠id_table里面的drv名字与注册的时候的dev名字进行匹配的。
靠名字匹配,函数为:
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL;
然后调用platform_match_id函数,其源码为:
static const struct platform_device_id *platform_match_id(
const struct platform_device_id *id,
struct platform_device *pdev)
{
while (id->name[0]) {
if (strcmp(pdev->name, id->name) == 0) {
pdev->id_entry = id;
return id;
}
id++;
}
return NULL;
}
然后strcmp的源码又为:
int strcmp(const char *cs, const char *ct)
{
unsigned char c1, c2;

while (1) {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if (!c1)
break;
}
return 0;
}
现在问题来了,注册dev的时候因为id的原因,dev的名字做了修改,但drv的名字却没有修改,这样还能匹配吗?
求解决下小弟的笨问题。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

1

粉丝