我是靠谱客的博主 超级金毛,最近开发中收集的这篇文章主要介绍Linux内核中gpiolibgpiolib库,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

gpiolib库

Linux中的gpio属于资源型外设,所以内核要统一管理它的申请和释放。当一个以上的驱动
同时使用某个gpio时,gpiolib避免一个io同时被几个驱动和设备使用。


s5pv210中的gpiolib分析

函数s5pv210_gpiolib_init();分析

kernelarcharmmach-s5pv210gpiolib.c

s5pv210_gpiolib_init();

结构体 s3c_gpio_chip

kernelarcharmplat-samsungincludeplatgpio-core.h

struct s3c_gpio_chip 
{
	struct gpio_chip	chip;        //记录gpio设置方法和信息
	struct s3c_gpio_cfg	*config;     //记录gpio配置信息
	struct s3c_gpio_pm	*pm;         //电源管理
	void __iomem    *base;           //gpio对于的虚拟地址
	int	    eint_offset;
	spinlock_t	 lock;
#ifdef CONFIG_PM
	u32	 pm_save[7];
#endif
};

kernelincludeasm-genericgpio,h

struct gpio_chip 
{
	const char	 *label;
	struct device   *dev;
	struct module   *owner;
	int		(*request)(struct gpio_chip *chip,unsigned offset);
	void	(*free)(struct gpio_chip *chip,unsigned offset);
	int		(*direction_input)(struct gpio_chip *chip,unsigned offset);
	int		(*get)(struct gpio_chip *chip,unsigned offset);
	int		(*direction_output)(struct gpio_chip *chip,unsigned offset, int value);
	int		(*set_debounce)(struct gpio_chip *chip,unsigned offset, unsigned debounce);
	void	(*set)(struct gpio_chip *chip,unsigned offset, int value);
	int		(*to_irq)(struct gpio_chip *chip,unsigned offset);
	void	(*dbg_show)(struct seq_file *s,struct gpio_chip *chip);
	int		base;
	u16		ngpio;
	const char	*const *names;
	unsigned	can_sleep:1;
	unsigned	exported:1;
};

函数指针: 申请使用gpio

int		(*request)(struct gpio_chip *chip,unsigned offset);

函数指针: 释放gpio

void	(*free)(struct gpio_chip *chip,unsigned offset);

函数指针: gpio方向设置成输入模式

int		(*direction_input)(struct gpio_chip *chip,unsigned offset);

函数指针: gpio方向设置成输出模式

int		(*direction_output)(struct gpio_chip *chip,unsigned offset, int value);

函数指针: gpio中断

int		(*to_irq)(struct gpio_chip *chip,unsigned offset);

==================================================================

struct s3c_gpio_cfg 
{
	unsigned int	cfg_eint;
	s3c_gpio_pull_t	(*get_pull)(struct s3c_gpio_chip *chip, unsigned offs);
	int		(*set_pull)(struct s3c_gpio_chip *chip, unsigned offs, s3c_gpio_pull_t pull);
	int		(*set_pin)(struct s3c_gpio_chip *chip, unsigned offs, s3c_gpio_pull_t level);
	unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs);
	int	 (*set_config)(struct s3c_gpio_chip *chip, unsigned offs,unsigned config);
};

结构体数组s5pv210_gpio_4bit

static struct s3c_gpio_chip s5pv210_gpio_4bit[] = {
	{
		.chip	= {
			.base	= S5PV210_GPA0(0),
			.ngpio	= S5PV210_GPIO_A0_NR,
			.label	= "GPA0",
			.to_irq = s5p_gpiolib_gpioint_to_irq,
		},
	}, {
		.chip	= {
			.base	= S5PV210_GPA1(0),
			.ngpio	= S5PV210_GPIO_A1_NR,
			.label	= "GPA1",
			.to_irq = s5p_gpiolib_gpioint_to_irq,
		},
	}, {
	}

最后

以上就是超级金毛为你收集整理的Linux内核中gpiolibgpiolib库的全部内容,希望文章能够帮你解决Linux内核中gpiolibgpiolib库所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部