gpio_request分析

以下文件目录都是以kernel为根目录的

1.头文件分析

1.需要包含头文件 include/linux/gpio.h

#ifdef CONFIG_GENERIC_GPIO //这里对应的处理器架构的GPIO头文件
#include 

#else//

#include 
#include 
#include 

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 //找到对应产品系列的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 
#include 
/*如果一个体系没有自己特殊的代码,则使用通用体系的代码*/
#include 

#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中实现的

2.gpio_request

你可能感兴趣的:(android学习)