设为首页 加入收藏

TOP

基于Linux 3.10.49内核的pinctrl流程分析(一)
2017-10-18 09:07:44 】 浏览:10849
Tags:基于 Linux 3.10.49 内核 pinctrl 流程 分析

Linux kernel 3.10.49+
 pinctrl驱动的platform注册就不说了,
无非就是platform_driver_register这个入口,
最后匹配到合适的设备后调用struct platform_driver 的probe函数.


这里说说, pinctl io复用关系(pinmux)的是怎么通过device tree source(dts)设置的.
1. 首先,当然是看pinctrl驱动的probe函数(这相当于驱动初始化的入口):
    drivers/pinctrl/pinctrl-xxxxxx.c : xxxxxx_pinctrl_probe(...)
    xxxxxx_pinctrl_probe(...) --> pinctrl_register(...)


 2. drivers/pinctrl/core.c : pinctrl_register(...)
    pinctrl_register(...) --> pinctrl_get(...)


 3. drivers/pinctrl/core.c : pinctrl_get(...)
    pinctrl_get(...) --> create_pinctrl(...)


 4. drivers/pinctrl/core.c : create_pinctrl(...)
    create_pinctrl(...) --> pinctrl_dt_to_map(...)


 5. drivers/pinctrl/devicetree.c : pinctrl_dt_to_map(...)
    pinctrl_dt_to_map(...) --> dt_to_map_one_config(...)


 6. drivers/pinctrl/devicetree.c : dt_to_map_one_config(...)
    dt_to_map_one_config(...) --> ops->dt_node_to_map(...) // 回调函数. 第7~10步是进入到回调后的一系列初始化.


7. ops->dt_node_to_map 就是 drivers/pinctrl/pinctrl-xxxxxx.c 中 struct pinctrl_ops 的 dt_node_to_map成员函数指针,
    也就是struct pinctrl_ops xxxxxx_pinctrl_ops->dt_node_to_map  = xxxxxx_pinctrl_dt_node_to_map;


 8.  drivers/pinctrl/pinctrl-xxxxxx.c : xxxxxx_pinctrl_dt_node_to_map(...)
    xxxxxx_pinctrl_dt_node_to_map(...) --> 轮询调用 xxxxxx_pinctrl_dt_subnode_to_map(...)
    轮询的内容: struct device_node *np 其中一个就是 dts文件里pinmuxing node设备, 而pinmuxing node设备有7个子node(看例子):
    如: arm926u, i2c0, i2c1等.
        state_default: pinmuxing {
            arm926u {
                    xxx,function = "arm926u";
                    xxx,group = "arm926u";
            };
            i2c0 {
                    xxx,function = "i2c";
                    xxx,group = "i2c0_pos_0";
            };
            i2c1 {
                    xxx,function = "i2c";
                    xxx,group = "i2c1";
            };
            i2c2 {
                    xxx,function = "i2c";
                    xxx,group = "i2c2";
            };
            uart0 {
                    xxx,function = "uart";
                    xxx,group = "uart0_pos_0";
            };
            uart1 {
                    xxx,function = "uart";
                  &n

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目