zoukankan      html  css  js  c++  java
  • 《驱动学习 —— 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 

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

  • 相关阅读:
    STL--set_difference
    priority_queue和sort应用
    16进制转化8进制---map
    LeetCode62. 不同路径
    LeetCode209. 长度最小的子数组
    LeetCode第29场双周赛题解
    LeetCode61. 旋转链表
    LeetCode60. 第k个排列
    LeetCode59. 螺旋矩阵 II
    LeetCode58. 最后一个单词的长度
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/15500204.html
Copyright © 2011-2022 走看看