《驱动学习 —— GPIO子系统和pinctl子系统》

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 

来控制输出输入  ,电平高低 。 

原文地址:https://www.cnblogs.com/zhuangquan/p/15500204.html