gpio子系统和pinctrl子系统(上) - rongpmcu - 博客园 (cnblogs.com)
gpio子系统和pinctrl子系统(下) - rongpmcu - 博客园 (cnblogs.com)
【linux】驱动-10-pinctrl子系统 - 李柱明 - 博客园 (cnblogs.com)
设备树中pinctrl的使用 - 码农教程 (manongjc.com)
内核层配置 GPIO
在 写内核驱动的时候 如果希望配置某个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(&platform_device->dev, gpio_id,GPIOF_OUT_INIT_LOW, name);
设置GPIO的方向,如果是输出同时设置电平:
/* set as input or output, returning 0 or negative errno */
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
获取输入引脚的电平:
/* GPIO INPUT: return zero or nonzero */
int gpio_get_value(unsigned gpio);
设置输出:
void gpio_set_value(unsigned gpio, int value);
释放申请的GPIO对象
void gpio_free(unsigned gpio);
将GPIO映射为IRQ中断:
/* map GPIO numbers to IRQ numbers */
int gpio_to_irq(unsigned gpio);
/* map IRQ numbers to GPIO numbers (avoid using this) */
int irq_to_gpio(unsigned irq);
设置GPIO IRQ中断类型:
set_irq_type(gpio_to_irq( gpio), IRQ_TYPE_EDGE_FALLING);
用户层配置 GPIO
需要确认 内核 menuconfig 中 Device Drivers -》 GPIO Support 设 y .
在 /sys/class/gpio 目录下如下所示 :
root@salvator-x:/sys/class/gpio# ls export gpiochip361 gpiochip419 gpiochip453 gpiochip496 gpiochip357 gpiochip393 gpiochip437 gpiochip468 unexport
gpiochip 后面的数字 是每个bank 的基地址 也就是 GP0 对应 gpiochip468
那么 GP0_07 的 ID 就是 468 + 7 ;(可能不同的内核版本,或者 开发板不一样 )通过 :
root@salvator-x:/sys/class/gpio# echo 475 > export
会对应生成 gpio475 目录
root@salvator-x:/sys/class/gpio/gpio475# ls active_low device direction edge power subsystem uevent value
通过
root@salvator-x:/sys/class/gpio/gpio475# echo 1 >value root@salvator-x:/sys/class/gpio/gpio475# echo 0 >value root@salvator-x:/sys/class/gpio/gpio475# echo "in" > direction root@salvator-x:/sys/class/gpio/gpio475# echo "out" > direction
来控制输出输入 ,电平高低 。