高通LK中GPIO的配置和使用

高通 LK中的GPIO配置函数定义:
void gpio_tlmm_config(uint32_t gpio, uint8_t func,
uint8_t dir , uint8_t pull,
uint8_t drvstr, uint32_t enable)
{
uint32_t val = 0;
val |= pull; //bit1-0配置上下拉
val |= func << 2; //bit5-2功能配置,GPIO功能是0
val |= drvstr << 6; //bit8-6驱动能力配置
val |= enable << 9; //输出使能配置
writel(val, (uint32_t )GPIO_CONFIG_ADDR(gpio));
return;
}
#define GPIO_CONFIG_ADDR(x) (TLMM_BASE_ADDR + (x)0x1000)
GPIO_CONFIG_ADDR这个宏定义是和下图的地址一致的:0x01000000+ 0x1000
n
即第n个GPIO的地址是0x01000000+ 0x1000
n
这个函数的功能是对GPIO进行配置,其中第3个参数dir 是无效的。
在这里插入图片描述
(OE: output enable)

#define GPIO_ENABLE 0
#define GPIO_DISABLE 1

void gpio_set(uint32_t gpio, uint32_t dir)
{
writel(dir, (uint32_t *)GPIO_IN_OUT_ADDR(gpio));
return;
}
#define GPIO_IN_OUT_ADDR(x) (TLMM_BASE_ADDR + 0x00000004 + (x)*0x1000)

这个函数是配置GPIO脚的输出高低或者输入使能。
在这里插入图片描述
参考《80-NP408-2X MSM8909-MSM8609-MSM8209-MSM8208-APQ8009 HARDWARE REGISTER DESCRIPTION DOCUMENT FOR OEMS》

一般输入是这么配置的:
//config LCD Glass ID pin as input
gpio_tlmm_config(LCD_GLASS_GPIO_ID0, 0, GPIO_INPUT, GPIO_NO_PULL, GPIO_2MA, GPIO_ENABLE);
//Wait for the configuration to complete. delay 5ms
//gpio_set(LCD_GLASS_GPIO_ID0, 1); //允许读
mdelay(5);
lcd_glass_id0 = gpio_status(LCD_GLASS_GPIO_ID0);

一般输出是这么配置的:
gpio_tlmm_config(88, 0, GPIO_OUTPUT, GPIO_PULL_DOWN, GPIO_8MA, GPIO_DISABLE);
gpio_set(88, 0); //输出低 bit1=0
或者gpio_set(88, 2); //输出高 bit1=1

读取gpio状态:
#cat /sys/kernel/debug/gpio
GPIOs 0-112, platform/1000000.pinctrl, 1000000.pinctrl:
gpio0 : in 0 2mA no pull //输入 功能是0(gpio) 上下拉能力
gpio1 : in 0 2mA no pull
gpio2 : in 0 2mA pull down
gpio3 : in 0 2mA pull down
gpio4 : out 2 8mA no pull //输出
gpio5 : out 2 8mA no pull

猜你喜欢

转载自blog.csdn.net/cornerstone1/article/details/112463209