设为首页 加入收藏

TOP

基于Linux 3.10.49内核的pinctrl流程分析(五)
2017-10-18 09:07:44 】 浏览:10848
Tags:基于 Linux 3.10.49 内核 pinctrl 流程 分析
######### 到这里, pinctrl_register(...) 的 pinctrl_get(...) 函数已运行完成. #########


18. 回调pinctrl_get完成, 回到第2步继续运行. 还是在pinctrl_register(...)函数里.
    pinctrl_register(...) --> pinctrl_select_state(...)
    switch (setting->type) {
        case PIN_MAP_TYPE_MUX_GROUP:  // 用到了.
            ret = pinmux_enable_setting(setting);
            break;
            ...
            }


 19. drivers/pinctrl/pinmux.c : pinmux_enable_setting(...)
    pinmux_enable_setting(...) --> ops->enable(...) // 哈哈, 又是ops,回调函数,第19~20步是进入到回调后的一系列初始化.
    ret = ops->enable(pctldev, setting->data.mux.func,
              setting->data.mux.group); 


   
 20. ops->enable 就是 drivers/pinctrl/pinctrl-xxxxxx.c 中 struct pinmux_ops 的 enable成员函数指针,
    也就是struct pinmux_ops xxxxxx_pinmux_ops->enable  = xxxxxx_enable;
    在xxxxxx_enable(...)函数里:可以设置控制寄存器的值, 作为IO复用设置(这函数是内核运行完成后,应用程序修改时用到的.), 用作gpio, 还是i2c等.


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


 



 ##############################################################################################
重要结构体:
1). struct pinctrl_desc: struct platform_driver的probe函数的pinctrl_register需要使用到
                        struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
                                struct device *dev, void *driver_data);


 2). struct pinctrl_ops: struct pinctrl_desc结构体需要使用到.
    .get_groups_count = 需赋函数指针, --|
    .get_group_name = 需赋函数指针,    |  这三个函数, 需要生成一个全局变量的结构体, 指定gpio引脚控制寄存器的位移和组需要用到的引脚号.
    .get_group_pins = 需赋函数指针,  --|
    .dt_node_to_map = 需赋函数指针, ------|
    .dt_free_map = 需赋函数指针,    ------|  这两个是解析dts文件的复用信息pinmuxing到内存map 和 析构map



 3). struct pinmux_ops: struct pinctrl_desc结构体需要使用到.
    .gpio_request_enable = 需赋函数指针,
    .gpio_disable_free = 需赋函数指针,
    .request = 需赋函数指针,
    .free = 需赋函数指针,
    .get_functions_count = 需赋函数指针,  --|
    .get_function_name = 需赋函数指针,    --| 这三个函数, 是直接解析dts, 用到的function 和 group, 通过function名字, 找到 group的名字(可能有多个)
    .get_function_groups = 需赋函数指针,  --|                  再通过 group 的名字去找到gpio引脚控制寄存器的信息, 最后通过enable回调函数设置.
    .enable = 需赋函数指针,
    .disable = 需赋函数指针,


4). struct pinctrl_pin_desc 所有引脚号.
5). 自定义group结构体:
    5-1). group的名字(也就是io复用的名字)(dts编写时, 需要在这里找得到),
    5-2). 复用io数(如i2c, 需要使用两个io).
    5-3). 控制寄存器地址, 和使用哪几位.
6). 自定义function结构体:
    6-1). function的名字(dts编写时, 需要在这里找得到),
    6-2). group的名字(可以有很多个, 如i2c1, i2c2等, 但也必须在自定义group结构体里找得到)


 ##############################################################################################
pinctrl 运行原理:
1) 读取dts: 先读入dts的pinmuxing节点的信息到map;
 2) dts的子节点的function 和 自定义functio

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目