gpio_get_value等一系列函数,并非linux标准函数,而是跟硬件相关的。 通常我们说的driver都是跟外围设备相关的,所以需要我们自己开发,但是这次我们说到的gpio是跟soc相关的,其实也是需要自己定义的,只不过这个自己变成了soc的provider,比如高通,intel等等
a)接口定义在.h文件
有每个cpu平台都有自己定义的gpio_get_value,要继续查看到底是哪个.h文件,要看你现在用的是哪个cpu平台
例如:intel:就是x86
Gpio.h (z:\jb_intel\hardware\intel\linux-2.6\arch\x86\include\asm)
b)具体实现在drivers\gpio里面
==============>
gpio driver:
drivers\gpio
里面有各种平台的gpio.c文件,查看makefile,
gpiolib.c
int __gpio_get_value(unsigned gpio)
{
struct gpio_chip*chip;
int value;
chip = gpio_to_chip(gpio);
WARN_ON(chip->can_sleep);
value = chip->get ? chip->get(chip, gpio - chip->base) : 0;
我们最终要进入到get函数中,去进一步查看。但是首先要知道,是哪个chip的get 函数, 这个由上面的红色语句gpio_to_chip(gpio);得出
trace_gpio_value(gpio, 1, value);
return value;
}
EXPORT_SYMBOL_GPL(__gpio_get_value);
其中语句:chip = gpio_to_chip(gpio);是为了得到当前的chip,进入她的函数定义里面查看
static inline struct gpio_chip *gpio_to_chip(unsigned gpio)
{
return gpio_desc[gpio].chip;
}
继续查看gpio_desc 是从哪里来的,发现有个gpiochip_add 函数 有如下语句:
gpio_desc[id].chip = chip;
继续查看gpiochip_add被谁调用, 发现很多个gpio文件中有gpiochip_add,但是由于我们通过config文件已经知道,是:
obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o
langwell_gpio.c
发现调用gpiochip_add的地方有2处:
1: platform_driver wp_gpio_driver (name=wp_gpio) 的probe函数
2: pci_driver lnw_gpio_driver (name=langwell_gpio) 的probe函数
因为是x86平台我们可以猜想,应该是2,但是我们还是可以验证一下
把设备连上pc,adb 进入
sys/bus/pci/drivers/ 下有个langwell_gpio
sys/bus/platform/drivers/下没有wp_gpio
可以证实,我们用的是2
继续查看probe 2 发现:lnw->chip.get = lnw_gpio_get;
由此得知:
gpio_get_value在intel平台上 最终调用了 lnw_gpio_get 来说实现。
========================================================================================================
以上部分仍然处于 对接口的定义阶段,下面我们来看看具体 是怎么实现的
static int lnw_gpio_get(struct gpio_chip *chip, unsigned offset)
{
void __iomem *gplr = gpio_reg(chip, offset, GPLR);//应该是映射 gpio对应的要操作的寄存器GPLR 的地址空间: GPLR, refer to intel的spec, 一个寄存器:Monitor Pin State。
return readl(gplr) & BIT(offset % 32);//读取GPLR寄存器之后,由于每个bit都代表一个gpio,所以与上BIT(该位gpio);
//通过spec可知,Note: There are a total of 94 configurable Always-On GPIOs on GPIO controller 0. There is no gp_aon_15.
//There are a total of 69 configurable GPIOs on GPIO controller 1. There is no gp_core[5..0],
GP_Core[11..8], gp_core_[25..23] and gp_core[34]
}
=======================================================================================
动态更改 gpio function:
lnw_gpio_set_alt