设为首页 加入收藏

TOP

基于Linux 3.10.49内核的pinctrl流程分析(二)
2017-10-18 09:07:44 】 浏览:10846
Tags:基于 Linux 3.10.49 内核 pinctrl 流程 分析
bsp; xxx,group = "uart1_pos_0";
            };
            wdt {
                    xxx,function = "wdt";
                    xxx,group = "wdt";
            };
        };


 9. drivers/pinctrl/pinctrl-xxxxxx.c : xxxxxx_pinctrl_dt_subnode_to_map(...)
    在这里有:
    ret = of_property_read_string(np, "xxx,function", &function);  // 哈哈, 解析dts node设备属性
    ret = of_property_read_string(np, "xxx,group", &group);
    reserve_map(...) // allocate map内存
    最后调用 add_map_mux(...);


 10. drivers/pinctrl/pinctrl-xxxxxx.c : add_map_mux(...)
    (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;  //特别注意这个type, 后续用到
    (*map)[*num_maps].data.mux.group = group;        // group只是个字符串, 如:i2c0_pos_0
    (*map)[*num_maps].data.mux.function = function;  // function只是个字符串, 如:i2c
    (*num_maps)++;


 11. 回调ops->dt_node_to_map完成, 回到第6步继续运行.
    drivers/pinctrl/devicetree.c : 运行dt_remember_or_free_map(...);


 12. drivers/pinctrl/devicetree.c : dt_remember_or_free_map(...)
    dt_remember_or_free_map(...) --> pinctrl_register_map(...)


 13. drivers/pinctrl/core.c : pinctrl_register_map(...)
    判断一下PIN_MAP_TYPE_MUX_GROUP
    pinctrl_register_map(...) --> list_add_tail(&maps_node->node, &pinctrl_maps)  // pinctrl_maps 是全局变量: LIST_HEAD(pinctrl_maps);


 ######### 到这里, create_pinctrl(...) 的 pinctrl_dt_to_map(...) 函数已运行完成. #########


14. 回调pinctrl_dt_to_map完成, 回到第4步继续运行. 还是在create_pinctrl(...)函数里.
    create_pinctrl(...) --> add_setting(...)


 15. drivers/pinctrl/core.c : add_setting(...)
    switch (map->type) {
    case PIN_MAP_TYPE_MUX_GROUP:
        ret = pinmux_map_to_setting(map, setting);
        break;
        }
    add_setting(...) --> pinmux_map_to_setting(...)


 16. drivers/pinctrl/pinmux.c : pinmux_map_to_setting(...)
    pinmux_map_to_setting(...) --> pmxops->get_function_groups(...)


 17. pmxops->get_function_groups(...) 就是 drivers/pinctrl/pinctrl-xxxxxx.c 中 struct pinmux_ops 的 get_function_groups成员函数指针,
    也就是struct pinmux_ops xxxxxx_pinmux_ops->get_function_groups  = xxxxxx_get_groups;
    在xxxxxx_get_groups(...)函数里:可以取到 xxxxx_groups[] = {...};的字符串数值.


    ret = pinmux_func_name_to_selector(pctldev, map->data.mux.function);
    // pinmux_func_name_to_selector(...) {  // 函数实现
    // ...
    //    while (selector < nfuncs) {
    //        const char *fname = ops->get_function_name(pctldev,
    //                selector);            // ops->get_function_name 就是struct pinmux_ops的get_function_name 取到 i2c


    //        if (!strcmp

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇基于Linux 3.10.49内核添加字符驱.. 下一篇基于Linux 3.10.49内核从dts文件..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目