美文网首页
Linux内核gpio

Linux内核gpio

作者: 小田BSP | 来源:发表于2022-07-12 22:03 被阅读0次

    本文基于RockPI 4A单板Linux 4.4内核介绍RK3399 Linux GPIO功能。

    一、GPIO介绍

    GPIO(General Purpose Input/Output Port):通用输入输出端口。

    除作为一般的输入/输出功能外,还可以配置为中断和模拟PWM、I2C等接口功能。

    RK3399 GPIO属性如下:

    1、一共有5组GPIO(GPIO0~4),每组GPIO为一个Bank,共32个引脚。每个Bank包括4个Group (GPIOA(0~7) ~ D(0~7))。不是所有Bank都有GPIOA~D的编号,RK3399共122个GPIO引脚。

    2、所有GPIO都可被配置为CA55或CA53的中断功能,且GPIO0GPIO1可用于系统低功耗唤醒模式。

    3、在上电复位后,所有GPIO默认输入状态。

    4、软件可配置GPIO驱动强度。

    RK3399引脚在系统中显示如下:

    root@linaro-alip:/sys/kernel/debug/pinctrl/pinctrl# cat pins
    registered pins: 160
    ## GPIO 0_*包括的GPIO
    pin 0 (gpio0-0)
    pin 1 (gpio0-1)
    pin 2 (gpio0-2)
    pin 3 (gpio0-3)
    pin 4 (gpio0-4)
    pin 5 (gpio0-5)
    pin 6 (gpio0-6)
    pin 7 (gpio0-7)
    pin 8 (gpio0-8)
    pin 9 (gpio0-9)
    pin 10 (gpio0-10)
    ...
    pin 31 (gpio0-31)
    ...
    ## GPIO 2_*包括的GPIO
    pin 64 (gpio2-0)
    pin 65 (gpio2-1)
    pin 66 (gpio2-2)
    pin 67 (gpio2-3)
    pin 68 (gpio2-4)
    pin 69 (gpio2-5)
    pin 70 (gpio2-6)
    pin 71 (gpio2-7)  ## GPIO2_A7
    pin 72 (gpio2-8)
    pin 73 (gpio2-9)
    pin 74 (gpio2-10)
    ...
    pin 95 (gpio2-31)
    ...
    ## GPIO 4_*包括的GPIO
    pin 128 (gpio4-0)
    ...
    pin 159 (gpio4-31)
    

    RK3399 GPIO引脚号计算方式:

    pins = 32*bank + 8*group + x
    bank: 0 ~ 4,对应GPIO 0~4
    group: 0 ~ 3,对应GPIO A~D
    

    例:

    GPIO2_A7 = 32*2 + 8*0 + 7 = 71
    

    二、GPIO配置

    ROCKPI 4A单板WIFI 模块电源(GPIO0_B2)为例,介绍DTSGPIO配置。

    image.png
    配置文件:arch/arm64/boot/dts/rockchip/rockpi-4-linux.dtsi,内容如下:
        sdio_pwrseq: sdio-pwrseq {
            compatible = "mmc-pwrseq-simple";
            clocks = <&rk808 1>;
            clock-names = "ext_clock";
            ## 1、配置GPIO0_B2_d的pinmux功能
            pinctrl-names = "default";
            pinctrl-0 = <&wifi_enable_h>;
    
            /*
             * On the module itself this is one of these (depending
             * on the actual card populated):
             * - SDIO_RESET_L_WL_REG_ON
             * - PDN (power down when low)
             */
            ## 2、配置GPIO0_B2_d默认输出低电平
            reset-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>; 
        };
        ## 3、配置GPIO0_B2_d(WIFI_REG_ON_H)为GPIO功能
        sdio-pwrseq {
            wifi_enable_h: wifi-enable-h {
                rockchip,pins =
                    <0 10 RK_FUNC_GPIO &pcfg_pull_none>;
            };
        };
    

    在系统启动后,可以查看GPIO,命令如下:

    root@linaro-alip:/sys/kernel/debug# cat gpio
    GPIOs 0-31, platform/pinctrl, gpio0:
     gpio-4   (                    |bt_default_wake_host) out hi
     gpio-9   (                    |bt_default_reset    ) out hi
     gpio-10  (                    |reset               ) out lo    ## 该引脚就是GPIO0_B2_d
    
    GPIOs 32-63, platform/pinctrl, gpio1:
     gpio-35  (                    |vcc5v0_otg          ) out hi
     gpio-46  (                    |vsel                ) out lo
     gpio-49  (                    |vsel                ) out lo
    
    GPIOs 64-95, platform/pinctrl, gpio2:
     gpio-83  (                    |bt_default_rts      ) out lo
     gpio-90  (                    |vcc3v3_pcie         ) out hi
     gpio-91  (                    |bt_default_wake     ) out hi
    
    GPIOs 96-127, platform/pinctrl, gpio3:
     gpio-111 (                    |mdio-reset          ) out hi
     gpio-124 (                    |?                   ) out lo
     gpio-125 (                    |?                   ) out lo
    
    GPIOs 128-159, platform/pinctrl, gpio4:
     gpio-153 (                    |vcc5v0_host         ) out hi
    

    注:

    如果debugfs没有挂载,使用下面命令挂载

    mount -t debugfs none /sys/kernel/debug
    

    三、GPIO驱动

    Linux内核GPIO主要实现文件:

    drivers/gpio/gpiolib.c         ## 新版API,基于描述符(descriptor-based)
    drivers/gpio/gpiolib-legacy.c  ## 旧API
    include/linux/gpio.h
    

    GPIO子系统有两套API

    1、基于描述符(descriptor-based)

    前缀为:gpiod_

    参考:Documentation/gpio/consumer.txt

    2、老版本接口(legacy)

    前缀为:gpio_

    参考:Documentation/gpio/gpio-legacy.txt

    3、常用API

    功能 新版本接口 老版本接口
    获取GPIO gpiod_get() gpio_request()
    释放GPIO gpiod_put() gpio_free()
    GPIO方向 设置为输入:gpiod_direction_input()设置为输出:gpiod_direction_output()获取方向:gpiod_get_direction() 设置为输入:gpio_direction_input()设置为输出:gpio_direction_output()
    GPIO值 获取输入值:gpiod_get_value()设置输出值:gpiod_set_value() 获取输入值:gpio_get_value()设置输出值:gpio_set_value()

    GPIO还有很多接口,就不一一列举了。

    RK3399 GPIO控制器驱动实现文件:drivers/pinctrl/pinctrl-rockchip.c,涉及主要函数:

    static const struct gpio_chip rockchip_gpiolib_chip = {
            .request = gpiochip_generic_request,
            .free = gpiochip_generic_free,
            .set = rockchip_gpio_set,
            .get = rockchip_gpio_get,
            .get_direction  = rockchip_gpio_get_direction,
            .direction_input = rockchip_gpio_direction_input,
            .direction_output = rockchip_gpio_direction_output,
            .to_irq = rockchip_gpio_to_irq,
            .owner = THIS_MODULE,
    };
    

    所有GPIO子系统的API最终都会调到SOCGPIO控制器驱动函数。

    四、GPIO调试

    ROCKPi 4A单板有个40个引脚的扩展口,引用radxa图片,见下图。

    image.png
    GPIO2_A7为例,介绍GPIO的一般调试方法。

    1、进入测试目录

    root@linaro-alip:/sys/class/gpio# ls
    export  gpiochip0  gpiochip128  gpiochip32  gpiochip64  gpiochip96  unexport
    

    2、导出GPIO

    在使用GPIO2_A7前,需要导出该引脚。方法:配置export后,会出现gpio71节点。

    root@linaro-alip:/sys/class/gpio# echo 71 > export
    root@linaro-alip:/sys/class/gpio# ls
    export  gpiochip0    gpiochip32  gpiochip96
    gpio71  gpiochip128  gpiochip64  unexport
    

    测试时,注意不要使用在程序中已经申请过或配置为其它功能的GPIO引脚。

    3、配置GPIO方向

    设置GPIO2_A7的输入/输出方向。

    root@linaro-alip:/sys/class/gpio# cd gpio71/
    root@linaro-alip:/sys/class/gpio/gpio71# ls
    active_low  device  direction  edge  power  subsystem  uevent  value
    root@linaro-alip:/sys/class/gpio/gpio71# cat direction
    in
    root@linaro-alip:/sys/class/gpio/gpio71# echo out > direction
    root@linaro-alip:/sys/class/gpio/gpio71# cat direction
    out
    

    in:表示输入。

    out:表示输出。

    active_low:用于中断配置中高电平或低电平有效。

    edge:用于中断配置中上升沿或下降沿有效。

    4、配置GPIO输出值

    GPIO为输入时,通过value查询GPIO的输入电平(高或低电平)。

    GPIO为输出时,通过value配置GPIO的输出电平(高或低电平)。

    root@linaro-alip:/sys/class/gpio/gpio71# cat value
    0
    root@linaro-alip:/sys/class/gpio/gpio71# echo 1 > value
    root@linaro-alip:/sys/class/gpio/gpio71# cat value
    1
    root@linaro-alip:/sys/class/gpio/gpio71# echo 0 > value
    root@linaro-alip:/sys/class/gpio/gpio71# cat value
    0
    

    5、查看GPIO

    查看已经导出的GPIO71

    root@linaro-alip:/sys/kernel/debug# cat gpio
    GPIOs 0-31, platform/pinctrl, gpio0:
     gpio-4   (                    |bt_default_wake_host) out hi
     gpio-9   (                    |bt_default_reset    ) out hi
     gpio-10  (                    |reset               ) out lo
    
    GPIOs 32-63, platform/pinctrl, gpio1:
     gpio-35  (                    |vcc5v0_otg          ) out hi
     gpio-46  (                    |vsel                ) out lo
     gpio-49  (                    |vsel                ) out lo
    
    GPIOs 64-95, platform/pinctrl, gpio2:
     gpio-71  (                    |sysfs               ) in  hi   ## GPIO71
     gpio-83  (                    |bt_default_rts      ) out lo
     gpio-90  (                    |vcc3v3_pcie         ) out hi
     gpio-91  (                    |bt_default_wake     ) out hi
    
    GPIOs 96-127, platform/pinctrl, gpio3:
     gpio-111 (                    |mdio-reset          ) out hi
     gpio-124 (                    |?                   ) out lo
     gpio-125 (                    |?                   ) out lo
    
    GPIOs 128-159, platform/pinctrl, gpio4:
     gpio-153 (                    |vcc5v0_host         ) out hi
    

    6、取消导出

    使用完GPIO2_A7后,需要进行释放。方法:配置unexport后,gpio71节点会消失。

    root@linaro-alip:/sys/class/gpio/gpio71# cd ..
    root@linaro-alip:/sys/class/gpio# ls
    export  gpiochip0    gpiochip32  gpiochip96
    gpio71  gpiochip128  gpiochip64  unexport
    root@linaro-alip:/sys/class/gpio# echo 71 > unexport
    root@linaro-alip:/sys/class/gpio# ls
    export  gpiochip0  gpiochip128  gpiochip32  gpiochip64  gpiochip96  unexport
    

    注:转载请标注出处。

    相关文章

      网友评论

          本文标题:Linux内核gpio

          本文链接:https://www.haomeiwen.com/subject/kkaabrtx.html