码迷,mamicode.com
首页 > 系统相关 > 详细

对设备树中平台信息的处理(选择machine_desc)

时间:2020-02-23 19:56:07      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:family   就是   处理   command   tar   需要   start   poi   src   

一个编译成uImage或zImage的内核映像文件,它可以支持多种单板。假设编译出来的uImage它可以支持多种单板的类型如下:
smdk2410
smdk2440
jz2440
smdk2410和smdk2440是三星公司出的公板,国内很多开发板厂家在他们的基础上做出了自己的开发板。这些板子的配置稍有不同,需要做一些单独的初始化,在内核中对于这些单板都有一个machine_desc结构体,里面有Init和nr。

uboot使用atags给内核传参数时,会传入一个机器ID,内核会使用这个机器ID找到最合适的machine_desc,它是如何找的呢?
机器ID用来和machine_desc中的nr进行比较,如果两者相等,表示找到了对应的machine_desc。
当uboot不使用atags传参数,使用设备树给内核传参数时,内核是如何选择对应的machine_desc的呢?

在设备树文件中,在根节点中有个compatible属性,这个属性是一系列字符串,内核就是使用这些字符串来找到合适的machine_desc。

注意这个属性的值是一系列字符串:

比如说
/ {
.......
compatible = "samsung,smdk2440","samsung,smdk2410","samsung,smdk24xx";
.......

}
(1)用户在设备树中声明这块板子想要什么样的machine_desc,可以是一系列的字符串。但是这个地方会有个优先级:
    最好内核支持samsung,smdk2440。如果实在找不到支持smdk2440的内核,那么选择次之samsung,smdk2410。如           果连这个都找不到,那么选择samsung,smdk24xx。

(2)内核中的每个machine_desc,需要表明它能支持哪些单板。如何进行表明呢?
         使用字符串进行表明machine_desc来表明它可以支持哪些单板。

    在内核中MACHINE_START定义一个结构体,里面有各项成员,在这里面其中有一项dt_compat。该项表明                           machine_desc这个结构体它所支持的单板类型。它指向一个字符串数组。

(3)有多个machine_desc跟dts吻合,究竟选择哪个呢?代码是如何实现的?

技术图片

函数调用过程:
start_kernel // init/main.c
    setup_arch(&command_line);  // arch/arm/kernel/setup.c
        mdesc = setup_machine_fdt(__atags_pointer);  //_atags_pointer保存的可能是atags的地址,也可能是dtb的地址。 arch/arm/kernel/devtree.c。
                    early_init_dt_verify(phys_to_virt(dt_phys)  // 判断是否有效的dtb, drivers/of/ftd.c
                                    initial_boot_params = params;
                    mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);  // 找到最匹配的machine_desc, drivers/of/ftd.c
                                    while ((data = get_next_compat(&compat))) {
                                        score = of_flat_dt_match(dt_root, compat);
                                        if (score > 0 && score < best_score) {
                                            best_data = data;
                                            best_score = score;
                                        }
                                    }
                    
        machine_desc = mdesc;

以上就是根据设备树中的平台设备信息选择machine_desc的过程

对设备树中平台信息的处理(选择machine_desc)

标签:family   就是   处理   command   tar   需要   start   poi   src   

原文地址:https://www.cnblogs.com/-glb/p/12353316.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!