以下文件目录都是以kernel为根目录的
1.头文件分析
1.需要包含头文件 include/linux/gpio.h
#ifdef CONFIG_GENERIC_GPIO //这里对应的处理器架构的GPIO头文件
#include <asm/gpio.h>
#else//
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/errno.h>
2. 这里使用的是arm体系,所以在arch/arm/include/asm/gpio.h
#ifndef _ARCH_ARM_GPIO_H
#define _ARCH_ARM_GPIO_H
/* not all ARM platforms necessarily support this API ... */
#include <mach/gpio.h>//找到对应产品系列的GPIO操作函数的头文件
#endif /* _ARCH_ARM_GPIO_H */
3.这里使用的是freescale的mxc系列,所以头文件是arch\arm\plat-mxc\include\mach\gpio.h
#ifndef __ASM_ARCH_MXC_GPIO_H__
#define __ASM_ARCH_MXC_GPIO_H__
#include <linux/spinlock.h>
#include <mach/hardware.h>
/*如果一个体系没有自己特殊的代码,则使用通用体系的代码*/
#include <asm-generic/gpio.h>
#define IMX_GPIO_NR(bank, nr) (((bank) - 1) * 32 + (nr))
/* use gpiolib dispatchers */
#define gpio_get_value __gpio_get_value
#define gpio_set_value __gpio_set_value
#define gpio_cansleep __gpio_cansleep
#define gpio_to_irq(gpio) (MXC_GPIO_IRQ_START + (gpio))
#define irq_to_gpio(irq) ((irq) - MXC_GPIO_IRQ_START)
struct mxc_gpio_port {
void __iomem *base;
int irq;
int irq_high;
int virtual_irq_start;
struct gpio_chip chip;
u32 both_edges;
spinlock_t lock;
};
#define DEFINE_IMX_GPIO_PORT_IRQ_HIGH(soc, _id, _hwid, _irq, _irq_high) \
{ \
.chip.label = "gpio-" #_id, \
.irq = _irq, \
.irq_high = _irq_high, \
.base = soc ## _IO_ADDRESS( \
soc ## _GPIO ## _hwid ## _BASE_ADDR), \
.virtual_irq_start = MXC_GPIO_IRQ_START + (_id) * 32, \
}
#define DEFINE_IMX_GPIO_PORT_IRQ(soc, _id, _hwid, _irq) \
DEFINE_IMX_GPIO_PORT_IRQ_HIGH(soc, _id, _hwid, _irq, 0)
#define DEFINE_IMX_GPIO_PORT(soc, _id, _hwid) \
DEFINE_IMX_GPIO_PORT_IRQ(soc, _id, _hwid, 0)
int mxc_gpio_init(struct mxc_gpio_port*, int);
#endif
4.通用代码目录include\asm-generic\gpio.h
extern int gpio_request(unsigned gpio, const char *label);
extern void gpio_free(unsigned gpio);
extern int gpio_direction_input(unsigned gpio);
extern int gpio_direction_output(unsigned gpio, int value);
extern int gpio_set_debounce(unsigned gpio, unsigned debounce);
extern int gpio_get_value_cansleep(unsigned gpio);
extern void gpio_set_value_cansleep(unsigned gpio, int value);
该文件中定义了对gpio的所以操作函数,这些函数是在/driver/gpio/gpiolib.c中实现的