gpio_request分析

以下文件目录都是以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中实现的

2.gpio_request

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值