DTS裝置進入probe前的過程

2021-08-20 20:35:09 字數 1548 閱讀 6652

使用device tree後,驅動需要與.dts中描述的裝置結點進行匹配,從而引發驅動的probe()函式執行。

對於i2c和spi從裝置而言,同樣也可以透過of_match_table新增匹配的.dts中的相關結點的compatible屬性

.dts檔案是一種ascii 文字格式的device tree描述,此文字格式非常人性化,適合人類的閱讀習慣。基本上,在arm linux在,乙個.dts檔案對應乙個arm的machine,一般放置在核心的arch/arm/boot/dts/目錄。

由於乙個soc可能對應多個machine(乙個soc可以對應多個產品和電路板),勢必這些.dts檔案需包含許多共同的部分,linux核心為了簡化,把soc公用的部分或者多個machine共同的部分一般提煉為.dtsi,類似於c語言的標頭檔案。其他的machine對應的.dts就include這個.dtsi。

進入probe:module_init()-->of_match_table --> ".compatible" --> 進入probe()

新增裝置:class_create()  --> alloc_chrdev_region()  --> device_create(class…majorno…)  --> cdev_init() -->cdev_add()

裝置號

動態申請函式為alloc_chrdev_region,相對應的釋放函式為unregister_chrdev_region。

/*下面兩行是建立了乙個匯流排型別,會在/sys/class下生成cdevdemo目錄 

這裡的還有乙個主要作用是執行device_create後會在/dev/下自動生成

cdevdemo裝置節點。而如果不呼叫此函式,如果想通過裝置節點訪問裝置

需要手動mknod來建立裝置節點後再訪問。*/

cdevdemo_class = class_create(this_module, "cdevdemo");

device_create(cdevdemo_class, null, mkdev(cdevdemo_major, 0), null, "cdevdemo");

/*初始化乙個字元裝置,裝置所支援的操作在cdevdemo_fops中*/     

cdev_init(&dev->cdev, &cdevdemo_fops);

printk(kern_notice "*****=== cdevdemo_setup_cdev 3");

dev->cdev.owner = this_module;

dev->cdev.ops = &cdevdemo_fops;

printk(kern_notice "*****=== cdevdemo_setup_cdev 4");

err = cdev_add(&dev->cdev, devno, 1);

printk(kern_notice "*****=== cdevdemo_setup_cdev 5");

裝置驅動以及probe的思考

最近無意中有看了一遍platform機制,發現之前對它的理解有誤,以及對probe探測函式的困擾。特此梳理一下。linux驅動模型中的三個基本概念是 驅動 裝置 匯流排。無論是裝置還是驅動在註冊是都會掛在匯流排上。匯流排負責驅動和裝置的匹配。但是有一些裝置是沒有匯流排這種概念的,比如led,於是li...

pci裝置probe函式的呼叫時機

int init wwinit void else ret pci register driver wwcodec if ret else return 0 以上3處列印資訊,在安裝wwcode.ko模組的時候,列印出來的資訊顯示 wwcodec 0.1.1 dev 14 03 12 1405 ww...

配置裝置前的準備工作

連線永不中斷 console連線時,一段時間沒有操作就會退出 還要重新連線。全域性模式下 config line con 0 在輸入 config line exec timeout 0 0 注 是輸入 後邊的命令 第乙個 0 代表分鐘 第二個 0 代表秒 0是永不超時的意思 不顯示日誌提示資訊 在...