Linux驱动开发中与设备树相关的6种debug方法
整理出了6種驅(qū)動(dòng)開發(fā)時(shí)與設(shè)備注冊、設(shè)備樹相關(guān)的調(diào)試方法,彼此間沒有優(yōu)先級(jí)之分,每種方法不一定是最優(yōu)解,但可以作為一種debug查找問題的手段,快速定位問題原因。例如在芯片驗(yàn)證時(shí),不同時(shí)鐘頻率下系統(tǒng)啟動(dòng)情況摸底時(shí),U-Boot fdt命令可以方便快捷的幫助我們完成這個(gè)實(shí)驗(yàn)。
#1. dtdiff工具
這個(gè)文件需要在宿主機(jī)安裝,在對(duì)比二進(jìn)制的dtb文件時(shí)比較方便。文本格式的dts文件對(duì)比并不需要這個(gè)工具。
對(duì)比以下兩個(gè)dtb文件的結(jié)果如下:
#2. kernel device-tree base
系統(tǒng)啟動(dòng)后進(jìn)入到/sys/firmware/devicetree/base目錄可以看到當(dāng)前已注冊設(shè)備的設(shè)備樹信息,通過相關(guān)命令可以查看當(dāng)前設(shè)備的結(jié)點(diǎn)信息、狀態(tài)等。
上面各個(gè)子目錄里顯示的信息和設(shè)備樹dts文件中定義的條目數(shù)是一樣的。
#3. U-Boot fdt command
驅(qū)動(dòng)代碼在debug期間,若希望更改外設(shè)模塊的設(shè)備樹屬性時(shí),在不改變存儲(chǔ)設(shè)備中dtb文件的前提下,進(jìn)入到U-Boot的命令行界面,通過U-Boot的fdt命令來實(shí)現(xiàn)。例如修改外設(shè)時(shí)鐘源、修改外設(shè)時(shí)鐘名、status屬性等。為了使U-Boot支持fdt命令需要打開CONFIG_OF_LIBFDT。
U-Boot提供的fdt命令是針對(duì)內(nèi)存中的FDT而言的,因此,需要將存儲(chǔ)設(shè)備中的dtb文件加載到內(nèi)存RAM中。然后再告知FDT設(shè)備樹在內(nèi)存中的地址。
將dtb文件從mmc中加載到DDR的0x61000000地址處,并告知U-Boot FDT文件在內(nèi)存中所在的位置為0x61000000。
通過fdt print查看測試驅(qū)動(dòng)driver-test的設(shè)備樹信息,當(dāng)查看某一個(gè)設(shè)備樹結(jié)點(diǎn)的信息時(shí),需要使用絕對(duì)路徑進(jìn)行設(shè)備樹結(jié)點(diǎn)的索引。
driver-test的設(shè)備樹定義在源文件中dts如下圖,dtb內(nèi)的信息是完全展開的,實(shí)際上和dts中信息完全一致。clocks = <0x00000005>是dtc編譯時(shí)對(duì)結(jié)點(diǎn)引用label重新插入的phandle值。
##3. 修改設(shè)備時(shí)鐘
設(shè)備樹文件中driver_test的時(shí)鐘源為oscclk2,時(shí)鐘名為apb_clk。現(xiàn)在將driver_test時(shí)鐘源設(shè)置為oscclk1,時(shí)鐘名改為ahb_clk。oscclk1在dtc編譯后的label編號(hào)時(shí)0x00000012。
修改后如下圖:
修改完之后,手動(dòng)加載kernel鏡像來啟動(dòng)系統(tǒng)。系統(tǒng)啟動(dòng)后查看設(shè)備樹信息是否修改成功。可以看見clock-names已經(jīng)由原來的apb_clk更改為ahb_clk。
##3. 修改設(shè)備status狀態(tài)
設(shè)備樹里status可以決定設(shè)備使能狀態(tài),status狀態(tài)支持以下幾種格式,若設(shè)置了status為disable,那么設(shè)備是不可用的。若不設(shè)置status,默認(rèn)設(shè)備可用。
在platform_device創(chuàng)建時(shí)會(huì)檢查設(shè)備的可用性,若設(shè)備不可用,那么是不會(huì)創(chuàng)建platform_device的。of_device_is_available用于檢查status屬性。
driver-test的設(shè)備樹里定義了status = “disable”,查看設(shè)備結(jié)點(diǎn)的status信息也顯示為disable。
加載driver-test驅(qū)動(dòng)以后設(shè)備未創(chuàng)建成功,當(dāng)然也就無法執(zhí)行驅(qū)動(dòng)的probe函數(shù)。這是除compatible不匹配之外的另一個(gè)無法執(zhí)行驅(qū)動(dòng)probe函數(shù)的原因。
現(xiàn)在重啟系統(tǒng)進(jìn)入到U-Boot的命令行模式,通過fdt修改status的值為okay。
啟動(dòng)系統(tǒng),再次確認(rèn)設(shè)備樹結(jié)點(diǎn)信息是否修改成功以及驅(qū)動(dòng)是否執(zhí)行了probe函數(shù)。通過系統(tǒng)啟動(dòng)的log信息可以看到,當(dāng)修改完status狀態(tài)值之后,driver_test的probe函數(shù)得到了執(zhí)行。
driver_test設(shè)備也正常的注冊進(jìn)platform設(shè)備中。
##3. fdt 其他功能
fdt print可以打印整個(gè)的dtb FDT信息
fdt header查看dtb的頭部信息,通過size大小也可以間接的判斷當(dāng)前加載的設(shè)備樹文件是否為所需的設(shè)備樹。
#4. dtc工具
dtc可以使用宿主機(jī)提供的亦可以使用kernel提供的。這個(gè)工具是將已編譯的dtb文件反匯編。
#5. 查看kernel fdt文件
這個(gè)fdt是未解壓縮的dtb文件,里面的內(nèi)容和dtb完全一樣。在kernel系統(tǒng)中執(zhí)行hexdump查看:
通過UE查看原始的dtb文件,與fdt文件內(nèi)容完全一致。
#6. of_property_xxx
在代碼中可以調(diào)用of.h中提供的API來檢查或這獲取device node的信息。
例如下面的調(diào)用方式
------END------
總結(jié)
以上是生活随笔為你收集整理的Linux驱动开发中与设备树相关的6种debug方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雷神台式计算机配置,雷神新用户手册:拿到
- 下一篇: 嵌入式Linux操作UART实例