对GPIO子系统使用的补充
gpio_request分析
函数原型如下
int gpio_request(unsigned gpio, const char *label)
{
struct gpio_desc *desc = gpio_to_desc(gpio);
/* Compatibility: assume unavailable "valid" GPIOs will appear later */
if (!desc && gpio_is_valid(gpio))
return -EPROBE_DEFER;
return gpiod_request(desc, label);
}
gpio_regquest会根据gpio的序号,尝试取获得gpio描述符,如果序号合法且描述符不为空则回去执行gpiod_request
gpiod_request分析
函数原型如下
int gpiod_request(struct gpio_desc *desc, const char *label)
{
int ret = -EPROBE_DEFER;
struct gpio_device *gdev;
VALIDATE_DESC(desc);
gdev = desc->gdev;
if (try_module_get(gdev->owner)) {
ret = gpiod_request_commit(desc, label);
if (ret)
module_put(gdev->owner);
else
get_device(&gdev->dev);
}
if (ret)
gpiod_dbg(desc, "%s: status %d\n", __func__, ret);
return ret;
}
对描述符合法性进行判断,然后常熟取获得gpio模块,获取成功则提交描述符和label,提交成功则会执行get_device,否侧放弃
如何获得这个gpio的序号
gpio序号是针对cpu的,和我们开发人员在板子上看到的如pa0,pc13没有关联,该如何找到对应的gpio对应的序号呢
进入源码路径
kernel/drivers/pinctrl/
我们可以看到诸多这样的文件夹,每个文件夹都是对应芯片的厂商写的,进入对应的芯片的文件夹下查看,看到诸多的.c文件。不用管,找到总的.h文件
这里提醒一下,虽然全志的英文是allwinner,但是他的文件夹名字叫sunxi(真的不理解)
这上面就是对应的总文件,其中这里开头的PA_BASE这类,就是定义GPIO的序号,如PA10的序号就是 PA_BASE+10,而我上次使用的是开发板上PC13,那么他的序号就是PC_BASE+13=77
GPIO的序号,如PA10的序号就是 PA_BASE+10,而我上次使用的是开发板上PC13,那么他的序号就是PC_BASE+13=77
结束