一、背景
系统组检查高通平台功耗,需要检查每个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]表示低电平。