设为首页 加入收藏

TOP

Linux 内核层和 用户层 配置 GPIO 引脚(一)
2017-11-13 14:55:47 】 浏览:472
Tags:Linux 内核 用户 配置 GPIO 引脚

Linux BSP 开发的基础就是和GPIO打交道, 下面总结下这几天对某家开发板的GPIO控制的知识。公司的开发板用的是 DTB  模式 ,首先,进入 dts,dtsi文件查看关于GPIO 的模块。


soc {
                .
                .
                .
        gpio0: gpio@****addr {
            compatible = "**********";
            reg = <0 0x****addr 0 0x50>;
            interrupts = <SPI 4 IRQ_TYPE_LEVEL_HIGH>;
            #gpio-cells = <2>;
            gpio-controller;
            gpio-ranges = <&pfc 0 0 16>;
            #interrupt-cells = <2>;
            interrupt-controller;
            clocks = <&cpg CPG_MOD 912>;
            power-domains = <*****>;
        };
              .
              .
              .


};


 可以看到 GPIO 节点 挂在 SOC node 下 ,手上这块开发板 把GPIO分成了8个 bank  :  gpio0 - gpio7


    reg =<0 地址 0 长度> 


         #gpio-cells  =<2> 表示 要用2个cell描述一个 GPIO引脚 


    如 I2C中定义 :  pwd-gpios  = <&gpio6 7 GPIO_ACTIVE_HIGH>;


    表示 bank 6 的gpio  用 2个cell 描述  :7,GPIO_ACTIVE_HIGH (7表示bank 6 下的第七个引脚一般是 GP 6_07表示  ;GPIO_ACTIVE_HIGH则为高电平有效)     


    gpio-controller;  interrupt-controller; 表示 bank 0 下的引脚 既可以作为中断引脚 ,也可以作为 通用的GPIO引脚 


         gpio-ranges = <&pfc 0 0 16>;  表示 bank 0下有16个 GPIO引脚 



 


   GPIO 使用 pinctrl 方式来驱动 ,pin control subsystem 会 :


    1. 枚举所有可用的pin 脚   ,于是每个引脚就有的唯一的 ID (num) ,这个ID 很关键,对于以后的操作。


enum {
    PINMUX_RESERVED = 0,


    PINMUX_DATA_BEGIN,
    GP_ALL(DATA), /* add GP_0_1_DATA  ,GP_0_1_DATA..... */
    PINMUX_DATA_END,


#define F_(x, y)


.....
}


    2.管理 这些Pin脚的, 由于pin 可以复用 比如 SPI 和GPIO 复用一个pin脚 如:  GP2_08 / MISO,于是引申出 pin group 和 pin functon 两个概念:


    在dts 中如上所示 ,其中 i2c2_a 在 pinctl 源码中 如下所示,i2c的两根引脚使用 GP5_0 ,GP5_4. 


    function 如下 : 


struct sh_pfc_function {
    const char *name;
    const char * const *groups;
    unsigned int nr_groups;
};
#define SH_PFC_FUNCTION(n = i2c2)                \
    {                        \
        .name = #n,                \
        .groups = n##_groups,            \
        .nr_groups = ARRAY_SIZE(n##_groups),    \
    }


好了 ,基本概念就先写这么多  。


 


在 写内核驱动的时候 如果希望配置某个GPIO引脚 , 可以在dts中 添加:  pwd-gpios  = <&gpio0 7 GPIO_ACTIVE_HIGH>;


 在 driver 代码中 ,  需要包含 #include <linux/gpio.h>使用 : 


    gpio_id = of_get_named_gpio(your_driver->dev->of_node,"pwd-gpios", 0);


获取 GP0_07的 ID号 ,然后申请 一个GPIO 操作对象。


    if (gpio_is_valid(gpio_id))  //判断一个IO是否合法


      devm_gpio_request_one(&p

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇String、StringBuilder和StringBu.. 下一篇OpenCV 图像细化

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目