MTK平台通过adb获取GPIO状态

一、节点位置

    在MTK平台,我们可以通过cat节点(mt_gpio)来查看对应的状态。不同的平台,该管脚对应的位置也是不同的,建议直接进入手机目录查看:

 
  1. adb shell

  2. find -name "mt_gpio"

我这查看到对应的是:sys/devices/platform/1000b000.pinctrl/mt_gpio

然后直接cat这个节点会出现如下的信息:

 
  1. PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT] [DRIVE] ( [R1] [R0] )

  2. 0: 011110100 01

  3. 1: 000010100 01

  4. 2: 000111100 01

  5. 3: 000010100 01

  6. 4: 011100100 00

  7. 5: 000010100 01

  8. 6: 000100110

  9. ... ...

二、源码分析

    1、首先我们从创建该节点的位置开始分析,在kernel-4.4/drivers/pinctrl/mediatek/pinctrl-mtk-common.c

    static DEVICE_ATTR(mt_gpio, 0664, mt_gpio_show_pin, mt_gpio_store_pin);

    这里可以看到通过DEVICE_ATTR创建了mt_gpio节点,开了664的权限。

    2、再来看下当cat节点时的动作 mt_gpio_show_pin

 
  1. static ssize_t mt_gpio_show_pin(struct device *dev, struct device_attribute *attr, char *buf)

  2. {

  3. int len = 0;

  4. int bufLen = PAGE_SIZE;

  5. struct mtk_pinctrl *pctl = dev_get_drvdata(dev);

  6. struct gpio_chip *chip = pctl->chip;

  7. unsigned i;

  8. int mode, pull_val;

  9.  
  10. len += snprintf(buf+len, bufLen-len,

  11. "PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT] [DRIVE] ( [R1] [R0] )\n");

  12.  
  13. for (i = 0; i < chip->ngpio; i++) {

  14. pull_val = mtk_pullsel_get(chip, i);

  15.  
  16. mode = mtk_pinmux_get(chip, i);

  17. if (mode >= 0) {

  18. len += snprintf(buf+len, bufLen-len, "%4d: %x%d%d%d%d%d%d%d%x",

  19. i,

  20. mtk_pinmux_get(chip, i),

  21. !mtk_gpio_get_direction(chip, i),

  22. mtk_gpio_get_out(chip, i),

  23. mtk_gpio_get_in(chip, i),

  24. mtk_pullen_get(chip, i),

  25. (pull_val >= 0) ? (pull_val&1) : -1,

  26. mtk_ies_get(chip, i),

  27. mtk_smt_get(chip, i),

  28. mtk_driving_get(chip, i));

  29. if ((pull_val & 8) && (pull_val >= 0))

  30. len += snprintf(buf+len, bufLen-len, " %d%d", !!(pull_val&4), !!(pull_val&2));

  31. len += snprintf(buf+len, bufLen-len, "\n");

  32. } else {

  33. len += snprintf(buf+len, bufLen-len, "%4d: XXXXXXXXX\n", i);

  34. }

  35. }

  36. return len;

  37. }

    3、分解对应的项

    通过如上方法可以看到我们cat出来的信息分别对应的是:

    PIN: [MODE] [DIR] [DOUT] [DIN] [PULL_EN] [PULL_SEL] [IES] [SMT] [DRIVE] ( [R1] [R0] )

    PIN:即对应的GPIO管脚;

    MODE:该管脚对应的模式,即该管脚作为什么来用的,如作为普通的GPIO,或者int等,通过mtk_pinmux_get(chip, i)方法获取;

    DIR:输入还是输出,即该管脚对应的方向,通过mtk_gpio_get_direction方法获取;

    DOUT:如果是输出模式对应的值是多少,通过mtk_gpio_get_out方法获取,默认为0;

    DIN:如果是输入模式对应的值是多少,通过mtk_gpio_get_in方法获取,默认为0;

    PULL_EN:是否支持输入上下拉,通过mtk_pullen_get方法获取,如果不支持默认为0;

    PULL_SEL:如果支持上下拉,对应的值。通过pull_val的值来决定上拉还是下拉。如果不支持,默认为0;

    IES+SMT:输入翻转

你可能感兴趣的:(MTK,驱动)