歡迎您光臨本站 註冊首頁

對於linux驅動platform模型i2c匯流排驅動的疑問

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

在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的名字卻沒有修改,這樣還能匹配嗎?
求解決下小弟的笨問題。


後面個人再次閱讀源碼分析得知
if (pdev->id != -1)/*處理platform_device裡面設備平台定義的時候的id情況*/
dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id);/*將platform_device中嵌入device結構的的名字進行修改為平台設備pdev->(name+id)*/
else
dev_set_name(&pdev->dev, "%s", pdev->name);
這裡面的代碼其實不是修改平台設備驅動結構體pdev裡面的name,而是修改平台設備驅動結構體
裡面的設備驅動pdev->dev這個結構裡面的name,所以下面拿出來的名字匹配,是可以匹配上的。

那如果這樣的話,1個I2C匯流排驅動在註冊的時候不是可以全部和3個I2C埠全部匹配(都用的同一個名字)?
可他們的對於埠不一樣,I2C中斷號也不一樣,中斷服務函數也不一樣,那麼在哪裡開始發生分支?
應該從哪裡開始分析開始?

[火星人 ] 對於linux驅動platform模型i2c匯流排驅動的疑問已經有881次圍觀

http://coctec.com/docs/linux/show-post-183053.html