BootLoader阶段
BootLoader阶段可以调用gpio_tlmm_config()函数完成GPIO_CFGn寄存器的配置,举例如下:
#define TLMM_VOL_UP_BTN_GPIO 85
gpio_tlmm_config(TLMM_VOL_UP_BTN_GPIO, 0,GPIO_INPUT, GPIO_PULL_UP, GPIO_2MA, GPIO_ENABLE)
gpio_tlmm_config()定义如下:
void gpio_tlmm_config(uint32_t gpio,uint8_t func,
uint8_tdir, uint8_t pull,
uint8_tdrvstr, uint32_t enable)
{
uint32_tval = 0;
val|= pull;
val|= func << 2;
val|= drvstr << 6;
val|= enable << 9;//如果func=0,enable=1为输出,enable=0为输出
writel(val,(uint32_t *)GPIO_CONFIG_ADDR(gpio));
return;
}
其中驱动强度的可用定义如下:
/* GPIO TLMM: Drive Strength */
#define GPIO_2MA 0
#define GPIO_4MA 1
#define GPIO_6MA 2
#define GPIO_8MA 3
#define GPIO_10MA 4
#define GPIO_12MA 5
#define GPIO_14MA 6
#define GPIO_16MA 7
GPIOLIB架构
使用gpiolib实现框架的平台可选择配置一个GPIO的sysfs用户接口,这不同于debugfs接口,因为它提供GPIO方向和值的控制,而不仅是显示gpio状态摘要,另外,它可在没有调试支持的产品级系统中使用。
GPIO在Sysfs的路径/sys/class/gpio中有三类入口:
1)用来获取GPIO用户控件控制的控制接口
控制接口是只写的,有export和unexport,用于请求内核导出GPIO的控制,成功的话会创建GPION节点。2)GPIO本身
即/sys/class/gpio/gpioN节点
3)GPIO控制器(gpiochip实例)
这里的label包含的设备信息(如1000000和modalias的值)对应于msm8937-pinctrl.dtsi中的内容。
内核代码中还可以直接完成GPIO导出到sysfs的功能:
1)首先通过gpio_request()申请GPIO
2)内核驱动成功申请一个GPIO后,可通过gpiod_export()使它在sysfs接口可见(如gpio19)
3)在GPIO被导出之后,gpiod_export_link()允许在sysfs文件系统的任何地方创建一个到该GPIO sysfs节点的符号链接。这样驱动就可以通过一个描述性名字,在sysfs中他们所拥有的设备下提供一个接口(到该GPIO sysfs节点的)。
本文介绍了GPIO在BootLoader阶段的配置,如gpio_tlmm_config()函数的使用,并讲解了GPIO驱动强度的不同定义。此外,还阐述了GPIOLIB架构中的sysfs用户接口,包括GPIO在Sysfs的路径中的三种入口,以及如何通过内核代码导出GPIO到sysfs并创建符号链接。

1万+

被折叠的 条评论
为什么被折叠?



