设备树之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