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

 / {#address-cells = <1>;#size-cells = <1>;aliases {fimc0 = &fimc0;fimc1 = &fimc1;fimc2 = &fimc2;     i2c0 = &i2c0;i2c1 = &i2c1;i2c2 = &i2c2;······};......
};

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

start_kernelsetup_archunflatten_device_treeof_alias_scanvoid of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
{struct property *pp;/* 找到/aliases节点对应的device_node */of_aliases = of_find_node_by_path("/aliases");/*  找到/chosen节点对应的device_node */of_chosen = of_find_node_by_path("/chosen");/* 如果没有/chosen的话,就找/chosen@0节点 */if (of_chosen == NULL)of_chosen = of_find_node_by_path("/chosen@0");/* 遍历/aliases节点的属性 */for_each_property_of_node(of_aliases, pp) {const char *start = pp->name;            // 属性的名字const char *end = start + strlen(start); // 名字的结尾,*end是'\0'struct device_node *np;struct alias_prop *ap;int id, len;/* Skip those we do not want to proceed *//* 忽略名字是name、phandle、linux,phandle的属性 */if (!strcmp(pp->name, "name") ||!strcmp(pp->name, "phandle") ||!strcmp(pp->name, "linux,phandle"))continue;/* 根据属性的值获得这个值对应的节点 *//* 比如这个这个属性,fimc2 = "/soc/camera/fimc@fb400000"通过路径来找到节点 */np = of_find_node_by_path(pp->value);if (!np)continue;/* 正常一个属性名字是fimc1,i2c0,这样,这里是把end指针指向数字前面那一个位置,* 比如fimc2的c字符的地址 */while (isdigit(*(end-1)) && end > start)end--;len = end - start;    /* 这个len就是名字除去数字的长度 *//* 把end字符串后面的数字,由字符串转换成数字复制给id,比如fimc2的,数子2 */if (kstrtoint(end, 10, &id) < 0)        continue;/* Allocate an alias_prop with enough space for the stem *//* 分配内存,多分配的"len+1"用于存放stem的名字 */ap = dt_alloc(sizeof(*ap) + len + 1, __alignof__(*ap));if (!ap)continue;memset(ap, 0, sizeof(*ap) + len + 1);ap->alias = start;        /*  ap->alias指向字符串"fimc2 */of_alias_add(ap, np, id, start, len);}
}static void of_alias_add(struct alias_prop *ap, struct device_node *np,int id, const char *stem, int stem_len)
{ap->np = np;        // np是"/soc/camera/fimc@fb400000";"对应的节点device_nodeap->id = id;        // id的值是2,代表设备序号,使用的时候要用到//由于stem_len是名字除去数字的长度,所以ap->stem被赋值为"fimc"strncpy(ap->stem, stem, stem_len);    ap->stem[stem_len] = 0;list_add_tail(&ap->link, &aliases_lookup);    //将这个ap加入到全局aliases_lookup链表中pr_debug("adding DT alias:%s: stem=%s id=%i node=%pOF\n",ap->alias, ap->stem, ap->id, np);
}

在注册i2c控制器时:

int i2c_add_adapter(struct i2c_adapter *adapter)
{struct device *dev = &adapter->dev;int id;if (dev->of_node) {
//获取与这个device_node对应的alias_prop的id。如果以 i2c2 = &i2c2;节点为例,这里得到的id就是2id = of_alias_get_id(dev->of_node, "i2c");if (id >= 0) {adapter->nr = id;return __i2c_add_numbered_adapter(adapter);}}id = idr_alloc(&i2c_adapter_idr, adapter,__i2c_first_dynamic_bus_num, 0, GFP_KERNEL);adapter->nr = id;return i2c_register_adapter(adapter);
}int of_alias_get_id(struct device_node *np, const char *stem)
{struct alias_prop *app;int id = -ENODEV;mutex_lock(&of_mutex);/* 遍历全局链表aliases_lookup */list_for_each_entry(app, &aliases_lookup, link) {/* 找到 stem 是 "i2c" 的alias_prop */if (strcmp(app->stem, stem) != 0)continue;/* 所有的i2c控制的stem都叫"i2c",所以要保证设备节点一致 */if (np == app->np) {id = app->id;        /* 最终返回找到的编号名字 */break;}}mutex_unlock(&of_mutex);return id;
}

从上面的分析可知alias节点的作用:

比如SoC上有多个i2c控制器,alias相当于给每个i2c控制器分配一个唯一的编号,如上面的i2c2对应的alias是i2c2,那么这个编号就是2,将来就可以在/dev下看到名为i2c-2的设备节点。

参考文档:

设备树学习(二十三、aliases节点分析)_奔跑的小刺猬的博客-CSDN博客_设备树aliases的作用

aliases节点分析相关推荐

  1. 设备树学习(二十三、aliases节点分析)

    在设备树中有一个叫做aliases的节点: / {#address-cells = <1>;#size-cells = <1>;aliases {csis0 = &cs ...

  2. aliases节点解析

    在设备树中有一个叫做aliases的节点: / {... ...chosen {stdout-path = "/serial@13800000";bootargs = " ...

  3. 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

    文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...

  4. JBPM节点分支之Group节点分析

    JBPM节点分支之Group节点分析 JBPM的众多节点类型中,唯独Group节点比较有个性:Group节点作为众多的节点中的一员,其并不能完成业务功能,但其作为一种节点的容器,可以对现有的节点类型进 ...

  5. Y形电路与三角电路转换,网孔和节点分析法

    Y形电路与三角电路转换,网孔和节点分析法 Y形电路与三角电路转换 推导过程与之前的电压源和电流源的转换类似,用系数相等即可等价转换.此处直接给出结论与记法. 网孔分析法 自电阻:在这个网孔中所有电阻的 ...

  6. 两个链表的第一个公共节点分析

    示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Refer ...

  7. 改进的节点分析法(Modified Nodal Analysis)

    文章目录 Modified Nodal Analysis 一.Generating the MNA matrices The A matrix Rules for making the G matri ...

  8. B-spline Curves 学习之B样条曲线的移动控制点、修改节点分析(7)

    B-spline Curves: Moving Control Points B-样条曲线:移动控制点 移动控制点是改变B-样条曲线形状的最明显的方法.在前面页讨论的局部修改方案说明了修改控制点 Pi ...

  9. 关于网络关键节点分析的经典论文(一)

    <Identifying sets of key players in a social network>阅读笔记 引用:[1] Borgatti S P . Identifying se ...

最新文章

  1. 2021年3月19日 百度开发实习面试(质量效能研发部)(一面)
  2. 关于bat中使用rar压缩命令
  3. iOS开发-面试总结(十四)
  4. date javascript 时区_第23节 Datejs 日期库-Web前端开发之Javascript-零点程序员-王唯
  5. ollyice的学习
  6. 第 13 章 MEncoder的基础用法
  7. Css/Js推荐类库
  8. Odoo与ERP传统软件有什么不同?
  9. Visual Basic 2012 借助DataGridView控件将Excel 2010数据导入到SQL server 2012
  10. Spring中使用的九种设计模式
  11. 局域网限速软件_8款Windows实用软件推荐,纯干货,总有一款是你必备的
  12. 倒车检测线怎么接图解_倒车影像摄像头3根线安装图解 这是倒车影像的电源线...
  13. 简述微型计算机的发展历程,1.1 计算机的发展历程
  14. python70行代码爬取链家网上万条租房数据——北京各地区租房信息
  15. 在升序排序的数组中插入一个元素 用函数编程实现在一个按升序排序的数组中查找x应插入的位置,将x插入数组中,使数组元素仍按升序排列。 提示:插入(Insertion)是数组的基本操作之一。插入法排序算法
  16. 基于Word的论文多级标题与图表题注的解决办法
  17. UE4 Engine Fix-找回4.24后失去的Matinee
  18. while循环语句初学
  19. 认准魔趣吧唯一网址https://www.moqu8.com,谨防上当受骗!
  20. Python—numpy模块下函数介绍(一)numpy.ones、empty等

热门文章

  1. Android Studio初学者实例:Fragment学习--仿美团外卖界面
  2. XV6实验-Lab1 Syscalls
  3. 【金猿案例展】上海市儿童基金会——管理会计云平台建设
  4. [生存志] 第43节 齐文姜齐宣姜争艳
  5. 第二篇第十一章灭火救援设施
  6. 2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势(上)...
  7. 代码片段plus ??? 打工神器: 飞冰物料库
  8. ETH 或者 ERC20 如何通过 TxID 查询充值状态
  9. 沉病孩子留遗嘱 父疏申请接济劫持红十字员农
  10. 防火墙、路由器、交换机+模拟软件+流控