快捷搜索:  汽车  科技

linux怎么主动给gpio一个中断(Linux内核gpio)

linux怎么主动给gpio一个中断(Linux内核gpio)RK3399引脚在系统中显示如下:4、软件可配置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的中断功能,且GPIO0和GPIO1可用于系统低功耗唤醒模式。3、在上电复位后,所有GPIO默认输入状态。

本文基于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的中断功能,且GPIO0和GPIO1可用于系统低功耗唤醒模式。

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)为例,介绍DTS中GPIO配置。

linux怎么主动给gpio一个中断(Linux内核gpio)(1)

RockPI 4A WIFI_REG_ON_H

配置文件: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最终都会调到SOC的GPIO控制器驱动函数。

四、GPIO调试

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

linux怎么主动给gpio一个中断(Linux内核gpio)(2)

RockPI 4A扩展口

以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

注:转载时请标注出处。

猜您喜欢: