我無法理解設備樹如何工作,或者特別是爲什麼這個驅動程序不會啓動。這是瑞芯供應商內核爲Android,版本號爲3.10設備樹不匹配:.probe從來沒有調用過
司機/看門狗/ rk29_wdt.c(減少可讀性)
static const struct of_device_id of_rk29_wdt_match[] = {
{ .compatible = "rockchip,watch dog" }
};
static struct platform_driver rk29_wdt_driver = {
.probe = rk29_wdt_probe,
[..]
.of_match_table = of_rk29_wdt_match,
.name = "rk29-wdt",
},
};
static int __init watchdog_init(void)
{
printk("watchdog_init\n");
return platform_driver_register(&rk29_wdt_driver);
}
,這是SOC DTSI
弓/臂/引導/ DTS/rk3288.dtsi
watchdog: [email protected] {
compatible = "rockchip,watch dog";
reg = <0xff800000 0x100>;
clocks = <&pclk_pd_alive>;
clock-names = "pclk_wdt";
interrupts = <GIC_SPI 79 IRQ_TYPE_LEVEL_HIGH>;
rockchip,irq = <0>;
rockchip,timeout = <2>;
rockchip,atboot = <1>;
rockchip,debug = <0>;
status = "okay";
};
然而,.PROBE噸的功能他的司機永遠不會被叫到。它被編譯並調用__init函數。我懷疑它有什麼巫婆設備樹條目不匹配?也許空間是一個問題?
或者還有其他的東西在.probe之前運行,它決定驅動程序是否應該繼續?
而且我不知道如何扁平樹的作品,所以這也許是相關的:
弓/ ARM /馬赫 - 瑞芯微/ RK3288
DT_MACHINE_START(RK3288_DT, "Rockchip RK3288 (Flattened Device Tree)")
.smp = smp_ops(rockchip_smp_ops),
.map_io = rk3288_dt_map_io,
.init_time = rk3288_dt_init_timer,
.dt_compat = rk3288_dt_compat,
.init_late = rk3288_init_late,
.reserve = rk3288_reserve,
.restart = rk3288_restart,
MACHINE_END
我假設真正的代碼'of_rk29_wdt_match []'初始化器在末尾有一個sentinel元素?它看起來應該是匹配的,假設''rockchip,watch dog''中的空間確實是設備樹和驅動程序中的空間。 –
雖然在設備名稱中有一個空格是很少見的。我不認爲我以前見過。如果您在兩個位置(驅動程序和設備樹)中刪除空間,它會更好嗎? –
請注意,單獨使用.dtsi並不足以推斷 - 在板級.dts中,應該是一個壓倒性的'status =「disabled」;或者DTB甚至可能會被引導加載程序重新繪製。就我個人而言,我會首先檢查/ proc/device-tree /並在/ sys /中找出錯誤,以便在瞭解驅動程序可能不會出現的原因之前,確定DT節點,驅動程序和設備本身是否真實無誤。綁定到設備。 – Notlikethat