在設備樹中有一個叫做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