文章目录
Linux的GPIO子系统解析 ( 二 ) 之 gpio-samsung.c
绪论
前一章谈到,gpiolib.c需要依赖于gpio_chip,而gpio_chip由gpio-samsung.c提供,并由gpio-samsung.c负责调用gpiochip_add() 使得gpiolib.c可以感知到chip的存在 现在我们就来看看gpio-samsung是如何完成整个过程的
关于GPIO子系统库文件的gpiolib.c解析
samsung_gpio_chip 结构体
比如我的exynos4412的gpio_chip定义就在drivers/gpio/gpio-samsung.c中
可以看到这里并没有直接用gpio_chip 而是用另一个结构体,该.c文件中还定义了其他函数用来将这个samsung_gpio_chip最终转为gpio_chip
samsung_gpio_chip定义如下:
struct samsung_gpio_chip {
struct gpio_chip chip; //对应的gpio_chip结构
struct samsung_gpio_cfg *config; //设置GPIO功能寄存器的函数
struct samsung_gpio_pm *pm;
void __iomem *base; // gpio的基地址
int irq_base;
int group;
spinlock_t lock;
#ifdef CONFIG_PM
u32 pm_save[4];
#endif
};
samsung_gpio_cfg 结构体
samsung_gpio_cfg被用来获取设置配置寄存器的方法 比如怎么设置gpio为上下拉 怎么配置gpio的配置寄存器
struct samsung_gpio_cfg {
unsigned int cfg_eint;
samsung_gpio_pull_t (*get_pull)(struct samsung_gpio_chip *chip, unsigned offs);
int (*set_pull)(struct samsung_gpio_chip *chip, unsigned offs,
samsung_gpio_pull_t pull);
unsigned (*get_config)(struct samsung_gpio_chip *chip, unsigned offs);
int (*set_config)(struct samsung_gpio_chip *chip, unsigned offs,
unsigned config)