i2c驅動主要分為三部分:i2c總線驅動,i2c核心,i2c外設驅動。在學習宋寶華撰寫的<<設備驅動開發詳解>>,對于其總結的,主機和外設眼中的linux世界圖,如下圖所示,有以下幾點疑問:
問題1:i2c總線驅動和外設驅動中,注冊具體是指什么?
問題2:platform_device是什么時候,怎么注冊的?
問題3:platform_drive.probe函式的主要功能是什么?
問題4:platform_driver.probe函式是如何注冊i2c_adapter 的?
問題5:i2c_client是什么時候,怎么注冊的?
問題6:i2c_driver.probe()的作用是什么?
問題7:i2c_driver.probe()中呼叫register_chrdev注冊字符設備,這個注冊與i2c_client注冊有什么區別和聯系?
問題有點多,希望了解的前輩們可以解答一下,謝謝
uj5u.com熱心網友回復:
回答1:應該指的就是這個宏module_platform_driver(xxx_i2c_drv);回答2:那個平臺設備注冊我也沒找到原始碼在哪,應該是在設備樹中體現了這個設備的存在
回答3:probe就是用來探測對應的,并將匹配到的設備的私有資訊全部和驅動介面系結
這是我截取的某個probe介面里的內容:
platform_set_drvdata(pdev, id);
match = of_match_node(cdns_i2c_of_match, pdev->dev.of_node);
if (match && match->data) {
const struct cdns_platform_data *data = match->data;
id->quirks = data->quirks;
}
r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
id->membase = devm_ioremap_resource(&pdev->dev, r_mem);
if (IS_ERR(id->membase))
return PTR_ERR(id->membase);
id->irq = platform_get_irq(pdev, 0);
id->adap.dev.of_node = pdev->dev.of_node;
id->adap.algo = &cdns_i2c_algo;
id->adap.timeout = CDNS_I2C_TIMEOUT;
id->adap.retries = 3; /* Default retry value. */
id->adap.algo_data = id;
id->adap.dev.parent = &pdev->dev;
回答4:這個probe不能注冊adapter,只能將探測到的設備掛到adapter上去,上面這段代碼里也有體現
回答5:client也不是注冊出來的,只有設備和驅動可以注冊,client應該是抽象出來的一個物件,可以登記到檔案系統
中,我看到i2c-core.c中有登記的宏,你可以自己讀一下
回答6:你這個問題是不是和問題三重合了。應該區分一下platform_driver和i2c_driver,是直接與芯片相連的i2c控制
器的驅動,而platform_driver是先掛在了配接器上的i2c控制器,而配接器與總線相連。其中的probe介面應該沒
有功能上的差異
回答7:client對于系統來說就是一字符設備,client在虛擬檔案系統中登記為一個字符設備。
【注】:看到這我想說:我也是個菜鳥,希望回答引起樓主共鳴,但是有歧義的話我也不敢保證我說得對。哈哈哈
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/95710.html
標籤:驅動開發/核心開發
上一篇:有人接無線信號分析的小單嗎?
