linux驅(qū)動(dòng)開發(fā)中與設(shè)備樹相關(guān)的6種debug方法
[導(dǎo)讀]關(guān)注、星標(biāo)嵌入式云IOT技術(shù)圈,精彩及時(shí)送達(dá)來源|??Linux與SoC整理出了6種驅(qū)動(dòng)開發(fā)時(shí)與設(shè)備注冊、設(shè)備樹相關(guān)的調(diào)試方法,彼此間沒有優(yōu)先級之分,每種方法不一定是最優(yōu)解,但可以作為一種debug查找問題的手段,快速定位問題原因。例如在芯片驗(yàn)證時(shí),不同時(shí)鐘頻率下系統(tǒng)啟動(dòng)情況摸底...
關(guān)注、星標(biāo)嵌入式云IOT技術(shù)圈,精彩及時(shí)送達(dá)
來源 |??Linux與SoC
整理出了6種驅(qū)動(dòng)開發(fā)時(shí)與設(shè)備注冊、設(shè)備樹相關(guān)的調(diào)試方法,彼此間沒有優(yōu)先級之分,每種方法不一定是最優(yōu)解,但可以作為一種debug查找問題的手段,快速定位問題原因。例如在芯片驗(yàn)證時(shí),不同時(shí)鐘頻率下系統(tǒng)啟動(dòng)情況摸底時(shí),U-Boot fdt命令可以方便快捷的幫助我們完成這個(gè)實(shí)驗(yàn)。#1. dtdiff工具這個(gè)文件需要在宿主機(jī)安裝,在對比二進(jìn)制的dtb文件時(shí)比較方便。文本格式的dts文件對比并不需要這個(gè)工具。
對比以下兩個(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í),在不改變存儲設(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命令是針對內(nèi)存中的FDT而言的,因此,需要將存儲設(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í),需要使用絕對路徑進(jìn)行設(shè)備樹結(jié)點(diǎn)的索引。driver-test的設(shè)備樹定義在源文件中dts如下圖,dtb內(nèi)的信息是完全展開的,實(shí)際上和dts中信息完全一致。clocks = <0x00000005>是dtc編譯時(shí)對結(jié)點(diǎn)引用label重新插入的phandle值。
##3. 修改設(shè)備時(shí)鐘設(shè)備樹文件中driver_test的時(shí)鐘源為oscclk2,時(shí)鐘名為apb_clk?,F(xiàn)在將driver_test時(shí)鐘源設(shè)置為oscclk1,時(shí)鐘名改為ahb_clk。oscclk1在dtc編譯后的label編號時(shí)0x00000012。修改后如下圖:修改完之后,手動(dòng)加載kernel鏡像來啟動(dòng)系統(tǒng)。系統(tǒng)啟動(dòng)后查看設(shè)備樹信息是否修改成功??梢钥匆奵lock-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í)會檢查設(shè)備的可用性,若設(shè)備不可用,那么是不會創(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------





