在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的名字却没有修改,这样还能匹配吗?
求解决下小弟的笨问题。
|