mdesc的匹配过程

    xiaoxiao2021-03-25  102

    在setup_arch中调用setup_machine_fdt来匹配最合适的mdesc

    mdesc = setup_machine_fdt(__atags_pointer);__atags_pointer为dtb的地址

    其中调用of_flat_dt_match_machine--->of_flat_dt_match_machine 来匹配

    所有的mdesc都是用

    DT_MACHIE_START和MACHINE_END来定义

    比如

    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

    这里面有个很关键的匹配数据do_compat。这个是一个char*数组指向兼容的字符串。

    of_flat_dt_match_machine把所有的DT_MACHINE_START定义结构的dt_compat和传给内核的dtb中根节点下compatible属性的兼容字符串比较。得到分数最高的一个。

    最终确定这个mdesc

    比如.dt_compat = rk3288_dt_compat

    static const char * const rk3288_dt_compat[] __initconst = { "rockchip,rk3288", NULL, };

    并且在rk3288.dtsi中包含有

    / { compatible = "rockchip,rk3288"; rockchip,sram = <&sram>; interrupt-parent = <&gic>;

    所以如果是rk3288就会得到RK3288_DT的desc

    转载请注明原文地址: https://ju.6miu.com/read-18104.html

    最新回复(0)