搜索

116

主题

170

帖子

1922

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1922
发表于 2021-4-28 09:49:17 8222 浏览 0 回复

GPIO的调试

本帖最后由 星空 于 2021-9-26 21:06 编辑

1 gpio的状态调试
1.1 gpio状态查看
  1. adb 操作mt8788的gpio地址,每个平台不一样.
  2. cat sys/devices/platform/1000b000.pinctrl/mt_gpio
复制代码




1.2 gpio状态设置


  1. 设置模式:echo mode 14 0 > mt_gpio
  2. 设置输入/输出:echo dir 14 1  > mt_gpio
  3. 输出高/低:echo out 14 1 > mt_gpio
  4. 设置pullen:  echo pullen 14 1 > mt_gpio

  5. gpio 状态用adb 查看,可以定位gpio的复用等导致的一些问题.
复制代码


2 gpio的控制

2.1 pinctrl系统的方式LInux针对PIN的配置推出了pinctrl子系统,针对GPIO的配置推出了gpio子系统。如果 pinctrl 子系统将一个 PIN 复用为 GPIO ,那么接下来就要用到 gpio 子系
统了。2.1.1  简介
在许多soc内部都包含有pin控制器,通过pin控制器的寄存器,我们可以配置一个或者一组引脚的功能和特性。在软件方面,Linux内核提供了pinctrl子系统,目的是为了统一各soc厂商的pin脚管理。
比如有些I/O口具有不同的状态(state),在正常工作的时候这一组I/O口被配置成uart接口,休眠时配置成GPIO接口且输出为高电平
使用pinctrl的主要目标有两个:
    (1)设定该设备的功能复用。 (2)设定该device对应的pin的电气特性。

pinctrl子系统的优点:有了pinctrl子系统以后,驱动就可以操作pinctrl子系统的接口函数完成I/O操作了,而不需要自己去配置了。
使用场景: 建议所有pin脚定义都使用pinctrl(输入和对输出的速度有要求的gpio脚除外)
2.1.2 使用


2.1.3 实例
  1. &pio{
  2. gpio_pins_default:
  3.     gpiodefault {
  4.     };
  5. gpio_pins_eint6_as_int:
  6.     eint@00 {
  7.         pins_cmd_dat {
  8.             pinmux = <PINMUX_GPIO6__FUNC_GPIO6>;
  9.             slew-rate = <0>;
  10.             bias-disable;
  11.         };
  12.     };
  13. gpio_pins_eint17_as_int:
  14.     eint@1 {
  15.         pins_cmd_dat {
  16.             pinmux = <PINMUX_GPIO17__FUNC_GPIO17>;
  17.             slew-rate = <0>;
  18.             bias-disable;
  19.         };
  20.     };
  21. gpio_pins_eint18_as_int:
  22.     eint@2 {
  23.         pins_cmd_dat {
  24.             pinmux = <PINMUX_GPIO18__FUNC_GPIO18>;
  25.             slew-rate = <0>;
  26.             bias-disable;
  27.         };
  28.     };
  29. };

  30. &gpio_input
  31. {
  32.     compatible = "mediatek,gpio_input";
  33.     pinctrl-names = "pin_default","state_eint6_as_int","state_eint17_as_int","state_eint18_as_int";
  34.     pinctrl-0 = <&gpio_pins_default>;
  35.     pinctrl-1 = <&gpio_pins_eint6_as_int>;
  36.     pinctrl-2 = <&gpio_pins_eint17_as_int>;
  37.     pinctrl-3 = <&gpio_pins_eint18_as_int>;
  38.     interrupt-parent = <&pio>;
  39.     interrupts = <6 IRQ_TYPE_LEVEL_LOW 6 0>,<17 IRQ_TYPE_LEVEL_LOW 17 0>,<18 IRQ_TYPE_LEVEL_LOW 18 0>;
  40.     deb-gpios0 = <&pio 6 0>;
  41.     deb-gpios1 = <&pio 17 0>;
  42.     deb-gpios2 = <&pio 18 0>;
  43.     debounce = <1000>;
  44.     status = "okay";
  45. };

  46. static int gpio_input_dev_init(struct platform_device *pdev)
  47. {
  48.     int err = -1;
  49.     GPIO_LOG("%s  \n",__func__);

  50.     gpioInputDevice->pinctrl = devm_pinctrl_get(&pdev->dev);
  51.     if (IS_ERR(gpioInputDevice->pinctrl))
  52.     {
  53.         err = PTR_ERR(gpioInputDevice->pinctrl);
  54.         GPIO_LOG(" %s fwq Cannot find pinctrl! err=%d \n",__func__,err);
  55.         return err;
  56.     }

  57.     gpioInputDevice->eint6_as_int = pinctrl_lookup_state(gpioInputDevice->pinctrl, "state_eint6_as_int");
  58.     if (IS_ERR(gpioInputDevice->eint6_as_int))
  59.     {
  60.         err = PTR_ERR(gpioInputDevice->eint6_as_int);
  61.         GPIO_LOG(" %s Cannot find pinctrl eint6_as_int! err=%d \n",__func__,err);
  62.         return err;
  63.     }

  64.     gpioInputDevice->eint17_as_int = pinctrl_lookup_state(gpioInputDevice->pinctrl, "state_eint17_as_int");
  65.     if (IS_ERR(gpioInputDevice->eint17_as_int))
  66.     {
  67.         err = PTR_ERR(gpioInputDevice->eint17_as_int);
  68.         GPIO_LOG(" %s Cannot find pinctrl eint17_as_int! err=%d \n",__func__,err);
  69.         return err;
  70.     }
  71.     gpioInputDevice->eint18_as_int = pinctrl_lookup_state(gpioInputDevice->pinctrl, "state_eint18_as_int");
  72.     if (IS_ERR(gpioInputDevice->eint18_as_int))
  73.     {
  74.         err = PTR_ERR(gpioInputDevice->eint18_as_int);
  75.         GPIO_LOG(" %s Cannot find pinctrl eint18_as_int!err=%d \n",__func__,err);
  76.         return err;
  77.     }

  78.     pinctrl_select_state(gpioInputDevice->pinctrl, gpioInputDevice->eint6_as_int);
  79.     pinctrl_select_state(gpioInputDevice->pinctrl, gpioInputDevice->eint17_as_int);
  80.     pinctrl_select_state(gpioInputDevice->pinctrl, gpioInputDevice->eint18_as_int);


  81.     gpioInputDevice->node = of_find_compatible_node(NULL, NULL, "mediatek,gpio_input");

  82.     if (!gpioInputDevice->node)
  83.     {
  84.         GPIO_LOG(" %s can't find compatible gpioInputDevice->node\n", __func__);
  85.         return -1;
  86.     }
  87.     gpioInputDevice->gpiopin0 = of_get_named_gpio(gpioInputDevice->node, "deb-gpios0", 0);
  88.     gpioInputDevice->gpiopin1 = of_get_named_gpio(gpioInputDevice->node, "deb-gpios1", 0);
  89.     gpioInputDevice->gpiopin2 = of_get_named_gpio(gpioInputDevice->node, "deb-gpios2", 0);

  90.     err = of_property_read_u32(gpioInputDevice->node, "debounce", &gpioInputDevice->gpio_deb);
  91.     if (err < 0)
  92.     {
  93.         GPIO_LOG(" %s gpiodebounce not found,err:%d\n",
  94.                  __func__, err);
  95.         return err;
  96.     }
  97.     else
  98.     {
  99.         GPIO_LOG("[%s]  debounce=%d.\n",__func__,gpioInputDevice->gpio_deb);
  100.     }
  101.     gpio_set_debounce(gpioInputDevice->gpiopin0, gpioInputDevice->gpio_deb);
  102.     gpio_set_debounce(gpioInputDevice->gpiopin1, gpioInputDevice->gpio_deb);
  103.     gpio_set_debounce(gpioInputDevice->gpiopin2, gpioInputDevice->gpio_deb);

  104.     GPIO_LOG(" %s gpioInputDevice->gpiopin0:%d\n",__func__, gpioInputDevice->gpiopin0);

  105.     GPIO_LOG(" %s gpioInputDevice->gpiopin1:%d\n",__func__, gpioInputDevice->gpiopin1);
  106.     if (gpioInputDevice->node)
  107.     {

  108.         gpioInputDevice->irq6 = irq_of_parse_and_map(gpioInputDevice->node, 0);
  109.         GPIO_LOG("[%s]  request_irq irq6=%d.\n", __func__,gpioInputDevice->irq6);
  110.         err = request_irq(gpioInputDevice->irq6, gpio_input_irq6_thread_fn,
  111.                           IRQ_TYPE_LEVEL_LOW, "gpio_input_irq6", NULL);
  112.         if (err != 0)
  113.             printk(" request_irq IRQ6 LINE NOT AVAILABLE!.err=%d \n",err);

  114.         gpioInputDevice->irq17 = irq_of_parse_and_map(gpioInputDevice->node, 1);
  115.         GPIO_LOG("[%s]  request_irq irq17=%d.\n", __func__,gpioInputDevice->irq17);
  116.         err = request_irq(gpioInputDevice->irq17, gpio_input_irq17_thread_fn,
  117.                           IRQ_TYPE_LEVEL_LOW, "gpio_input_irq17", NULL);
  118.         if (err != 0)
  119.             printk(" request_irq IRQ17 LINE NOT AVAILABLE!.err=%d \n",err);

  120.         gpioInputDevice->irq18 = irq_of_parse_and_map(gpioInputDevice->node, 2);
  121.         GPIO_LOG("[%s]  request_irq irq18=%d.\n", __func__,gpioInputDevice->irq18);
  122.         err = request_irq(gpioInputDevice->irq18, gpio_input_irq18_thread_fn,
  123.                           IRQ_TYPE_LEVEL_LOW, "gpio_input_irq18", NULL);
  124.         if (err != 0)
  125.             printk(" request_irq IRQ18 LINE NOT AVAILABLE!.err=%d \n",err);

  126.     }
  127.     else
  128.     {
  129.         printk("[%s]  request_irq can not find touch eint device node!.", __func__);
  130.     }



  131.     return err;
  132. }

复制代码

2.2 gpio子系统的方式

gpio子系统的优点: 1 比pinctl 子系统要快 2 有api可以得到gpio输入的值
使用场景: gpio是输入引脚,或者输出的速度有要求的
  1. 1 Z:\H10\kernel-4.9\arch\arm64\boot\dts\mediatek\k65v1_64_bsp.dts

  2. &i2c1 {
  3.     pac7620@73 {
  4.          compatible = "mediatek,pac7620";
  5.          reg = <0x73>;
  6.         interrupt-parent = <&pio>;
  7.          interrupts = <4 IRQ_TYPE_EDGE_FALLING 4 0>;
  8.          gpio_vled_pac7620 = <&pio 2 0x0>;
  9.          
  10.          status = "okay";
  11.     };
  12. };

  13. 2  Z:\H10\kernel-4.9\arch\arm64\boot\dts\mediatek\mt6765.dts

  14.   pac7620: pac7620 {
  15.        compatible =  "mediatek,pac7620";
  16.     };
  17. 3  编写函数
  18. 头文件 #include <linux/of_gpio.h>

  19. static int pac7620_dev_init(struct platform_device *pdev)
  20. {
  21.      int ret = -1;

  22.      pac7620_log("%s\n",__func__);

  23.      pac7620Device->node = of_find_compatible_node(NULL, NULL,
  24.      "mediatek,pac7620");
  25.      if (pac7620Device->node) {
  26.          /*touch_irq = gpio_to_irq(tpd_int_gpio_number);*/
  27.          pac7620Device->irq = irq_of_parse_and_map(
  28.          pac7620Device->node, 0);
  29.          pac7620_log("[%s]  request_irq irq=%d.", __func__,
  30.          pac7620Device->irq);

  31.          ret = request_irq(pac7620Device->irq,
  32.          pac7620_irq_thread_fn,
  33.                            IRQF_TRIGGER_FALLING,
  34.                            "pac7620_irq", NULL);

  35.          if (ret > 0)
  36.              pac7620_err(" request_irq IRQ LINE NOT
  37.              AVAILABLE!.");
  38.      } else {
  39.          pac7620_log("[%s]  request_irq can not find touch
  40.          eint device node!.", __func__);
  41.      }

  42.      pac7620_log("%s\n",__func__);
  43.      pac7620Device->gpio_vled  = of_get_named_gpio(
  44.      pac7620Device->node, "gpio_vled_pac7620", 0);

  45.      ret = gpio_request(pac7620Device->gpio_vled,"vled");
  46.      if (ret) {
  47.          printk("error: pac7620Device gpio_request\n");
  48.          return -1;
  49.      }
  50.      ret = gpio_direction_output(pac7620Device->gpio_vled, 1);
  51.      if (ret) {
  52.          printk("error %s : pac7620Device gpio_vled
  53.          gpio_direction_output failed\n",__FILE__);
  54.          ret = -1;
  55.      }


  56.      INIT_WORK(&pac7620Device->work, pac7620_work_handler);

  57.      return 1;

  58. }

  59. struct pac7620 {

  60.      unsigned int gpio_vled;

  61.      struct device_node *node ;
  62.      struct platform_device *pdev;
  63.      struct device *dev;

  64.      struct i2c_client *client;
  65.      struct input_dev *keyboard_input_dev;
  66.      int irq;
  67.      bank_e bank;

  68.      struct work_struct work;

  69.      void (*work_handler)(struct work_struct *work);
  70. };
复制代码



3 gpio 状态不对        
        驱动初始化的时候把gpio口的状态初始化下
        dws里gpio配置是否有配对
        设备树里查看是否有复用.
        代码里是否有复用,这种是接申请的,搜索gpio_request或者平台自带的操作函数




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


登录或注册
快速回复 返回顶部 返回列表