设备树之aliases节点解析

在设备树中有一个叫做aliases的节点:

aliases {
        mxcfb0 = &mxcfb1;
        mxcfb1 = &mxcfb2;
        mxcfb2 = &mxcfb3;
        mxcfb3 = &mxcfb4;
    };

mxcfb1: fb@0 {
        compatible = "fsl,mxc_sdc_fb";
        disp_dev = "ldb";
        interface_pix_fmt = "RGB666";
        default_bpp = <16>;
        int_clk = <0>;
        late_init = <0>;
        status = "disabled";
    };

    mxcfb2: fb@1 {
        compatible = "fsl,mxc_sdc_fb";
        disp_dev = "hdmi";
        interface_pix_fmt = "RGB24";
        mode_str ="1920x1080M@60";
        default_bpp = <24>;
        int_clk = <0>;
        late_init = <0>;
        status = "disabled";
    };

    mxcfb3: fb@2 {
        compatible = "fsl,mxc_sdc_fb";
        disp_dev = "lcd";
        /*interface_pix_fmt = "BGR24";*/
        interface_pix_fmt = "BGR24";
        mode_str ="HUD-WVGA";
        default_bpp = <24>;
        int_clk = <0>;
        late_init = <0>;
        status = "disabled";
    };

    mxcfb4: fb@3 {
        compatible = "fsl,mxc_sdc_fb";
        disp_dev = "ldb";
        interface_pix_fmt = "RGB666";
        default_bpp = <16>;
        int_clk = <0>;
        late_init = <0>;
        status = "disabled";
    };

在Linux内核启动的时候会解析这个节点:

 

start_kernel
    ---> setup_arch
            ---> unflatten_device_tree
                    ---> of_alias_scan

 

在of_alias_scan中会扫描这个节点:

aliases: 别名

of_alias_get_id:

   1: int of_alias_get_id(struct device_node *np, const char *stem)
   2: {
   3:     struct alias_prop *app;
   4:     int id = -ENODEV;6:     mutex_lock(&of_mutex);

   7:     list_for_each_entry(app, &aliases_lookup, link) { // 遍历全局链表aliases_lookup

   8:         if (strcmp(app->stem, stem) != 0) // 找到 stem 是 "i2c" 的alias_prop

   9:             continue;
  10:  
  11:         if (np == app->np) { // 判断这个alias_prop指向的device_node是不是跟传入的匹配
  12:             id = app->id;  // 获得 id,2
  13:             break;
  14:         }
  15:     }
  16:     mutex_unlock(&of_mutex);
  17: 
  18:     return id;
  19: }

 

 

 

在內核中可以看到很多地方都會調用of_alias_get_id,他的作用就是根據傳入的device node(mxcfb),在alias中找到對應的唯一編號,如:

在driver/video/mxc/mxc_ipuv3_fb.c中有

pdev->id = of_alias_get_id(pdev->dev.of_node, "mxcfb");

这里就会解析:

设备节点mxcfb1对应的编号为mxcfb0

设备节点mxcfb2对应的编号为mxcfb1

设备节点mxcfb3对应的编号为mxcfb2

设备节点mxcfb4对应的编号为mxcfb3

posted @ 2017-11-27 10:54  大海中的一粒沙  阅读(4273)  评论(0编辑  收藏  举报