前言:
參考自正點原子和部落格:
正文:chosen 並不是乙個真實的裝置, chosen 節點主要是為了 uboot 向 linux 核心傳遞資料,重點是 bootargs 引數。一般.dts 檔案中 chosen 節點通常為空或者內容很少。
但是,當我們進入到/proc/device-tree/chosen 目錄裡面,會發現多了 bootargs 這個
屬性:
檢視裡面的內容:
由此,我們可以推出:
chosen這個節點就是將uboot裡面的bootargs環境變數值,傳遞給linux核心,作為命令列引數,cmd line.
現在有兩個疑點:
①、我們並沒有在裝置樹中設定 chosen 節點的 bootargs 屬性,那麼chosen中 bootargs
這個屬性是怎麼產生的?
②、為何 bootargs 檔案的內容和 uboot 中 bootargs 環境變數的值一樣?它們之間有什麼關係。
解答這個問題:
通過在uboot原始碼裡面,進行全域性查詢,最後在在uboot原始碼裡面,有個函式fdt_chosen(),用到了chosen這個變數。對這個函式進行分析,我們可以知道,這個函式的內容是:
1)、呼叫函式 fdt_find_or_add_subnode 從裝置樹(.dtb)中找到 chosen 節點,如果沒有
找到的話就會自己建立乙個 chosen 節點。
2)、讀取 uboot 中 bootargs 環境變數的內容。
3)、呼叫函式 fdt_setprop 向 chosen 節點新增 bootargs 屬性,並且 bootargs 屬性的值
就是環境變數 bootargs 的內容。
對函式fdt_chosen()繼續進行查詢,發現他的呼叫關係是這個樣子的:
框起來的部分就是函式 do_bootm_linux 函式的執行流程,也就是說:
do_bootm_linux 函式會通過一系列複雜的呼叫,最終通過 fdt_chosen 函式在 chosen 節點中加入了 bootargs 屬性。而我們通過 bootz 命令啟動 linux 核心的時候會執行 do_bootm_linux 函式,至此,真相大白,一切事情的源頭都源於如下命令:
bootz 80800000 – 83000000
當我們輸入上述命令並執行以後, do_bootz 函式就會執行,然後一切就按照上圖中所示的流程開始執行。
裝置樹中的特殊節點
裝置樹用來描述乙個平台上的裝置資訊,不僅包括soc上的裝置,還可以新增乙個外設資訊,簡單記錄一下裝置樹中的特殊節點的理解 裝置樹中的位址資訊一般用 address cells和 size cells來修飾,address表示位址由幾個單元組成,乙個單元是乙個32位的值 在32位系統上 size ce...
關於篩選輸入裝置的裝置節點
對於一些輸入裝置,尤其是熱插拔的usb裝置,其會自動生成或者關聯裝置節點 dev input eventx x 0,1,2,這時候,我們需要找到我們要操作的目標裝置節點,下面是乙個示例,可以根據輸入裝置的name域判斷.如下 function this demo is to detect what ...
裝置節點的動態建立
我們在剛開始寫linux裝置驅動程式的時候,很多時候都是利用mknod命令手動建立裝置節點,實際上linux核心為我們提供了一組函式,可以用來在模組載入的時候自動在 dev目錄下建立相應裝置節點,並在解除安裝模組時刪除該節點,當然前提條件是使用者空間移植了udev。核心中定義了struct clas...