『壹』 linux dts status status 做什麼用
設備在啟動的時候,status定義陪前擾為蘆旦disabled為不注冊;
定義為ok/okay或者為悔州賦值,默認為解析該設備節點
『貳』 編譯linux內核設備樹文件使用什麼命令
Linux源碼的arch/powerpc/boot/dts/目錄下存放了很多dts文件,可以作為參考文件。另外dtc編譯器在內核回源碼2.6.25版本之後已經答被包含進去。在2.6.26版本之後,生成blob的簡單規則已經加入makefile,如下命令:
$ make ARCH=powerpc canyonlands.dtb
也可以根據自己的硬體修改好dts文件後,用下面類似命令生成dtb文件。
$ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts > mpc836x_mds.dtb
$ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu
『叄』 Linux內核watchdog
本文基於 RockPi 4A 單板 Linux 4.4 內核介紹 RK3399 看門狗( watchdog )的調試方法。
一、驅動文件
RK3399 watchdog 用的是新思( Synopsys )的 IP ,在 watchdog 驅動程序載入時,會注冊 misc 設備,節點為 /dev/watchdog 。
驅動文件: drivers/watchdog/dw_wdt.c
二、DTS配置
配置文件: arch/arm64/boot/dts/rockchip/rk3399.dtsi
watchdog 具體配置如下:
三、調試方法
1、關閉看門狗
寫入除大寫 V 以外的任意字元,不再喂狗,一段時間後系統會重啟。
例:
2、打開卡門狗
寫入大寫 V ,繼續喂狗,系統不再重啟。
例:
3、CONFIG_WATCHDOG_NOWAYOUT
如果配置了 CONFIG_WATCHDOG_NOWAYOUT ,通過 echo 命令寫入任何字元,都不會關閉喂狗。
例:
註:
使用 ./build/mk-kernel.sh rockpi4a 編譯內核時,即使修改了 rockchip_linux_defconfig 文件,編譯時,相關配置也不會生效。需要在編譯前 make distclean 或刪除內核根目錄下的 .config 文件後,重新編譯內核。
『肆』 Linux內核中斷之中斷調用流程
本文基於 RockPI 4A 單板Linux4.4內核介紹中斷調用流程。
ARMv8包括兩種運行狀態:AArch64和AArch32。
AArch64中不再使用AArch32中的7種特權模式,而是提出了Exception Levels的概念,包括:
1)EL0:用於用戶態程序,許可權最低
2)EL1:給內核使用,許可權稍高
3)EL2:虛擬化相關,許可權更高
4)EL3:安全相關,許可權最高
Linux內核中一般只使用EL0和EL1。
AArch64異常向量表中的異常包括:
1)Synchronous exception(同步異常)
2)SError
3)IRQ
4)FIQ
註:SError、IRQ和FIQ屬於非同步異常。
在Linux內核中,在 arch/arm64/kernel/entry.S 文件中定義了異常向量表,內容如下:
選取 el1_irq() 函數介紹Linux內核中斷的調用流程。
文件: arch/arm64/kernel/entry.S ,調用流程如下:
1、handle_irq()初始化
在 DTS 解析階段完成 handle_irq() 函數的初始化,流程如下:
gic_irq_domain_map() 函數中完成了 handle_irq() 函數的賦值,具體執行如下:
2、handle_irq()實現
以共享外設中斷 SPI 的中斷處理函數 handle_fasteoi_irq() 為例,繼續跟蹤中斷的執行過程。
handle_irq_event_percpu() 函數會調用已經注冊的中斷處理函數,同時喚醒 irq_thread 線程。
3、中斷處理線程
在使用 request_threaded_irq() 函數申請中斷時,會創建一個 irq_thread 線程,調用流程如下:
irq_thread 線程平時在睡眠狀態,等待 handle_irq_event_percpu() 函數喚醒,進一步執行已注冊的中斷處理線程函數。
使用 DRM 框架中 HDMI 中斷驗證中斷調用流程。
文件: driversgpudrmridgesynopsysdw-hdmi.c
在中斷處理函數 dw_hdmi_hardirq() 和中斷處理線程函數 dw_hdmi_irq 中增加 mp_stack() 調用( 註:僅限於調試驗證 )。
插入 HDMI 線,系統啟動後,顯示中斷調用流程的日誌如下:
和
『伍』 Linux內核中斷之獲取中斷號
Linux內核中可使用 platform_get_irq() 函數獲取 dts 文件中設置的中斷號。
函數原型: int platform_get_irq(struct platform_device *dev, unsigned int num)
定義文件: driversaseplatform.c
中斷號獲取函數 platform_get_irq() 調用流程如下:
rk3399 使用的是 GICv3 ,對應 irq_domain->name 。
文件: drivers/irqchip/irq-gic-v3.c 。
translate() 函數實現如下:
以 RockPI 4A 單板 Debian 系統Linux 4.4內核中的獲取 HDMI 中斷號為例。
1、查找中斷號
從手冊「Rockchip RK3399 TRM V1.3 Part1.pdf」中,可以查到 HDMI_IRQ 中斷號,即55。
2、 dts 配置
文件: arch/arm64/boot/dts/rockchip/rk3399.dtsi
hdmi 使用的是 GIC_SPI 中斷,按照 gic_irq_domain_translate() 函數中處理,需要將中斷號55減去32,得到 dts 中的中斷號23。
註: interrupts = <中斷類型 中斷號 中斷觸發類型 中斷分區(對應哪個CPU cluster,PPI類型中斷特有)>
3、驅動函數
文件: driversgpudrm ockchipdw_hdmi-rockchip.c
此時, irq 返回值為55。
後續會介紹 GIC 和中斷注冊等實現函數。
『陸』 arm linux dts鎬庝箞閰嶇疆ddr3
FDT鏄疉RM Linux鏈鏂扮殑璁懼囬┍鍔ㄧ▼搴忎俊鎮琛錛屼嬌鐢‵DT鐨勫唴鏍革紝灝變笉鐢ㄥ儚榪囧幓鐨勫唴鏍擱偅鏍鳳紝涓涓鏉垮瓙鍔犱竴涓猰ach鐨凜鏂囦歡錛屾墍鏈夌殑璁懼囦俊鎮鍙浠ヨ板綍鍦ㄤ竴涓鏍戠姸淇℃伅鏂囦歡閲岄潰銆 鐩鍓嶈繖鏂歸潰璧勬枡姣旇緝灝戱紝鎴戜互AM335x澶勭悊鍣ㄤ負渚嬫傛嫭涓涓婩DT鐨勪嬌鐢錛 FDT浠呬粎鏄涓涓淇℃伅鐨勭洰褰曞拰鍙傛暟琛錛岃佷嬌鐢ㄦ煇涓鍔熻兘鍐呮牳涓榪樺繀欏繪湁鐩稿簲鐨勯┍鍔ㄧ▼搴忎唬鐮 FDT鐨勬簮鏂囦歡浣嶇疆鍦錛歛rch/arm/boot/dts錛屼緥濡傦紝TI鐨凚eagle bone black錛屾簮鏂囦歡鏄痑rch/arm/boot/dts/am335x_boneblack.dts FDT鍦╩ake ARCH=arm鐨勬椂鍊欏氨浼氳嚜鍔ㄧ敓鎴愶紝涔熷彲鐢╩ake ARCH=arm dtbs鏉ョ敓鎴愶紝渚嬪俆I鐨凚eagle bone black鐢熸垚鐨勬枃浠舵槸arch/arm/boot/dts/am335x_boneblack.dtb錛岃繖鏄涓涓浜岃繘鍒舵枃浠 瑕佹兂鏂板炰綘鑷瀹氫箟鐨凢DT錛岃蜂慨鏀筧rch/arm/boot/dts/Makefile錛屽苟鍦ㄧ浉搴旂殑Kconfig涓澧炲姞config閫夐」錛屼緥濡
『柒』 openwrt怎麼修改linux的dts文件
在linux下要修改文件,一般較常用的命令是vi,格式如下:vi
[文件]。
以樓主的文件為例,vi
/etc/passwd
『捌』 瀹夊崜dts涓巐inuxdts
瀹夊崜dts涓巐inuxdts鏄涓や釜涓嶅悓鐨勬傚康銆傚敖綆′袱鑰呴兘浣跨敤dts浣滀負鏂囦歡鎵╁睍鍚嶏紝騫朵笖閮界敤浜庢弿榪扮‖浠惰懼囩殑淇℃伅錛屼絾Androiddts鍜孡inuxdts鏄閽堝逛笉鍚屾搷浣滅郴緇熺殑涓嶅悓瀹炵幇銆侫ndroiddts涓昏佺敤浜庢弿榪癆ndroid璁懼囩‖浠朵笌Android鎿嶄綔緋葷粺涔嬮棿鐨勫叧緋伙紝鑰孡inuxdts涓昏佺敤浜庢弿榪癓inux鍐呮牳涓庣‖浠朵箣闂寸殑鍏崇郴銆