Qualcomm(高通)平台开发系列讲解-GPIO添加详细信息电平打印

QualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcommQualcomm

一、背景


系统组检查高通平台功耗,需要检查每个GPIO的输出电平。

二、原有方案


cat /sys/kernel/debug/gpio后并不能显示GPIO的输入输出电平值。
在这里插入图片描述

三、方案


修改文件:kernel/msm-4.4/drivers/pinctrl/qcom/pinctrl-msm.c,修改如下

static void msm_gpio_dbg_show_one(struct seq_file *s,
                                  struct pinctrl_dev *pctldev,
                                  struct gpio_chip *chip,
                                  unsigned offset,
                                  unsigned gpio)

{

        const struct msm_pingroup *g;
        struct msm_pinctrl *pctrl = container_of(chip, struct msm_pinctrl, chip);
        unsigned func;
        int is_out;
        int drive;
        int pull;
+       int level;
        u32 ctl_reg;
+       u32 io_reg;

        static const char * const pulls[] = {
                "no pull",
                "pull down",
                "keeper",
                "pull up"
        };

        g = &pctrl->soc->groups[offset];
        ctl_reg = readl(pctrl->regs + g->ctl_reg);
+       io_reg = readl(pctrl->regs + g->io_reg);

        is_out = !!(ctl_reg & BIT(g->oe_bit));
        func = (ctl_reg >> g->mux_bit) & 7;
        drive = (ctl_reg >> g->drv_bit) & 7;
        pull = (ctl_reg >> g->pull_bit) & 3;
+       level = is_out ? ((io_reg & 2) >> 1) : (io_reg & 1);

-       seq_printf(s, " %-8s: %-3s %d", g->name, is_out ? "out" : "in", func);
+       seq_printf(s, " %-8s: %-3s %d level[%d]", g->name, is_out ? "out" : "in", func, level);
        seq_printf(s, " %dmA", msm_regval_to_drive(drive));
        seq_printf(s, " %s", pulls[pull]);
}

修改后重新编译boot.img,烧写完成后执行cat /sys/kernel/debug/gpio结果如下:
在这里插入图片描述
in表示该gpio的方向是输入,out表示该gpio的方向是输出。in和out后面的数字表示pin-function,如果一个GPIO被用作普通GPIO,pin-function是0,如果被复用为i2c和spi等,pin-function就不是0。比如上图中的gpio-0和gpio-1,gpio-function是2,查看文档80-p7747-2x_d_sdm660_hardware_register_description.pdf,可知这2个gpio的pin-function被配置为2后,这2个gpio就被复用成了UART功能。
在这里插入图片描述
level后面的数字表示该gpio口当前的电平,[1]表示高电平,[0]表示低电平。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于高通平台上的 Android 9 驱动开发中的 GPIO,你可以按照以下步骤进行操作: 1. 首先,在设备树(Device Tree)中定义 GPIO 控制器和 GPIO 引脚。你需要在设备树文件中添加相关的节点来描述 GPIO 控制器的物理地址、中断信息等。同时,你还需要定义需要使用的 GPIO 引脚。 例如,你可以在设备树中添加以下节点来描述一个 GPIO 控制器: ``` gpio-controller { compatible = "vendor,controller-name"; reg = <0xaddress>; #gpio-cells = <2>; }; ``` 并且在需要使用的 GPIO 引脚节点中添加类似以下内容: ``` gpio_pin: gpio_pin { gpio-hog; gpios = <&gpio_controller gpio_number GPIO_ACTIVE_LOW>; output-low; }; ``` 2. 在驱动代码中获取 GPIO 控制器和 GPIO 引脚的句柄。你可以使用 `gpio_request()` 函数来请求一个 GPIO 引脚,并获得一个 GPIO 的句柄。这个函数需要传入 GPIO 引脚号和一个字符串标识符来描述这个 GPIO 引脚的用途。 例如,你可以使用以下代码来请求 GPIO 引脚: ``` struct gpio_desc *gpio_desc; int ret; gpio_desc = gpio_request(GPIO_NUMBER, "gpio_name"); if (IS_ERR(gpio_desc)) { ret = PTR_ERR(gpio_desc); // 处理错误 } ``` 3. 在驱动代码中对 GPIO 进行操作。一旦你获得了 GPIO 引脚的句柄,你可以使用一系列的函数来设置 GPIO 的方向(输入或输出)、读取或写入 GPIO 的电平状态等。 例如,你可以使用以下代码来设置 GPIO 引脚为输出,并将其设置为高电平: ``` ret = gpio_direction_output(gpio_desc, 1); if (ret < 0) { // 处理错误 } ret = gpio_set_value(gpio_desc, 1); if (ret < 0) { // 处理错误 } ``` 4. 最后,在驱动代码中释放 GPIO 引脚的句柄。当你不再需要使用 GPIO 引脚时,记得使用 `gpio_free()` 函数来释放它。 例如,你可以使用以下代码来释放 GPIO 引脚句柄: ``` gpio_free(gpio_desc); ``` 以上是在高通平台开发 Android 9 驱动中使用 GPIO 的一般步骤。具体的实现可能会因平台和硬件的差异而有所不同,你需要参考相关的文档和代码来进行开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alarmano

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值