驱动GPIO操作归纳

IO内存操作可以使用ioremap映射再使用指针操作对应的寄存器,但是比较少使用,一般使用内核提供GPIO操作函数。

一、内核提供的通用GPIO操作的API接口,其文件是gpio.h (include\linux),Gpiolib.c (linux-3.5\drivers\gpio)。

**1.获取IO口的状态函数 **

int gpio_get_value(unsigned int gpio) 

功能:获取IO口的状态
参数:gpio 要获取的IO口编号
返回:IO口状态(高或者低)
2.设置IO口的状态函数

void gpio_set_value(unsigned int gpio, int value)  

功能:设置IO口的状态
参数:gpio 要获取的IO口编号 ,
value:要设置的值 ,0或1
返回:无
3.判断IO是否可以休眠函数 (比较少用)

 int gpio_cansleep(unsigned int gpio)

功能:判断IO是否可以休眠
参数:gpio要获取的IO口编号
返回:非0,可以休眠;0,不可休眠
4.通过Io口编号转换成对应的外部中断编号函数(很常用 )

int gpio_to_irq(unsigned int gpio)  

功能:通过Io口编号转换成对应的外部中断编号
参数:gpio 要获取的IO口编号
返回:成功:中断编号; 失败:- EINVAL
5.gpio设置为输出功能

int gpio_direction_output(unsigned gpio, int value)

功能:指定IO口gpio设置为输出功能,并且输出指定电平value。
参数:gpio 指定哪个IO口,这里是io的编号
Value 指定输出电平,高还是低。
返回值:成功返回0;失败返回-1
6.读取gpio电平状态

int gpio_direction_input(unsigned gpio)

功能:读取指定IO口gpio电平状态
参数:gpio – io口的编号
返回:高电平返回1;低电平返回0。
7.向向内核申请指定IO

int gpio_request(unsigned gpio, const char *label)

功能:向内核申请指定IO,所申请的IO口会被内核记录。 已经被申请的IO,在没有释放前再次申请将会失败。
参数:
gpio:申请IO口编号;
label:申请者的名字,随便。
返回:成功:0;失败:负数
重要说明:使用IO时候可以申请也可以不申请;建议申请,这样对IO是来说是一种保护。
8.释放向内核已经申请的指定IO

void gpio_free(unsigned gpio)  

功能:释放向内核已经申请的指定IO。所释放的IO口会在内核记录消除。
释放的io可以再次被申请。
参数:所要释放的io口编号。
此函数和 gpio_request配对使用,功能相反。

二、芯片厂家一般会提供一个芯片级io配置的代码

三星公司提供的函数: Gpio-samsung.c (drivers\gpio)
//Gpio-cfg.h (arch\arm\plat-samsung\include\plat)
1.指定IO口配置函数

int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)

功能:把指定IO口配置为指定功能
参数:
pin:管脚编号,和前面的函数相同的定义方式
config:功能对应的数值,这个需要查看具体芯片手册对应的IO功能配置说明。
如:EXYNOS4412芯片, 0x0是输入,0x1输出,其他复用功能(具体看手册)。
在gpio-cfg.h文件中有如下定义:

      /* Defines for generic pin configurations */
#define S3C_GPIO_INPUT	(S3C_GPIO_SPECIAL(0))
#define S3C_GPIO_OUTPUT	(S3C_GPIO_SPECIAL(1))
#define S3C_GPIO_SFN(x)	(S3C_GPIO_SPECIAL(x))

返回值:成功返回0;失败返回负数。
2.连续指定IO口配置函数

int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr,   unsigned int cfg)

功能:把指定范围IO口配置为指定功能, 其实这个函数内部实现就多次调用s3c_gpio_cfgpin函数。
参数:
start:管脚编号,和前面的函数相同的定义方式
nr:连续io数量
cfg:功能对应的数值,这个需要查看具体芯片手册对应的IO功能配置说明。
返回值:成功返回0;失败返回负数。
3.获取指定IO的功能函数

unsigned s3c_gpio_getcfg(unsigned int pin)

功能:获取指定IO的功能对应的配置值(查询IO功能)
参数pin:管脚编号,和前面的函数相同的定义方式
返回 :功能值

三、GPIO编号

要使用上面函数,还需要解决函数的参数 unsigned gpio 到底应该是什么 ??
1)不是看芯片手册上芯片管脚编号
2)使用编号是由Linux源码中头文件所定义的编号。
不同芯片,IO编号,功能都不一样,这个定义头文件一般在存放和具体芯片类型相关的文件夹中。

以下是EXYNOS芯片的部分gpio定义:

/* EXYNOS4 GPIO number definitions */
#define EXYNOS4_GPA0(_nr)	(EXYNOS4_GPIO_A0_START + (_nr))
#define EXYNOS4_GPA1(_nr)	(EXYNOS4_GPIO_A1_START + (_nr))
#define EXYNOS4_GPB(_nr)	(EXYNOS4_GPIO_B_START + (_nr))
#define EXYNOS4_GPC0(_nr)	(EXYNOS4_GPIO_C0_START + (_nr))
#define EXYNOS4_GPC1(_nr)	(EXYNOS4_GPIO_C1_START + (_nr))
#define EXYNOS4_GPD0(_nr)	(EXYNOS4_GPIO_D0_START + (_nr))
#define EXYNOS4_GPD1(_nr)	(EXYNOS4_GPIO_D1_START + (_nr))

#define EXYNOS4210_GPE0(_nr)	(EXYNOS4210_GPIO_E0_START + (_nr))
#define EXYNOS4210_GPE1(_nr)	(EXYNOS4210_GPIO_E1_START + (_nr))
#define EXYNOS4210_GPE2(_nr)	(EXYNOS4210_GPIO_E2_START + (_nr))
#define EXYNOS4210_GPE3(_nr)	(EXYNOS4210_GPIO_E3_START + (_nr))
#define EXYNOS4210_GPE4(_nr)	(EXYNOS4210_GPIO_E4_START + (_nr))

#define EXYNOS4_GPF0(_nr)	(EXYNOS4_GPIO_F0_START + (_nr))
#define EXYNOS4_GPF1(_nr)	(EXYNOS4_GPIO_F1_START + (_nr))
#define EXYNOS4_GPF2(_nr)	(EXYNOS4_GPIO_F2_START + (_nr))
#define EXYNOS4_GPF3(_nr)	(EXYNOS4_GPIO_F3_START + (_nr))
#define EXYNOS4_GPJ0(_nr)	(EXYNOS4_GPIO_J0_START + (_nr))
#define EXYNOS4_GPJ1(_nr)	(EXYNOS4_GPIO_J1_START + (_nr))
#define EXYNOS4_GPK0(_nr)	(EXYNOS4_GPIO_K0_START + (_nr))
#define EXYNOS4_GPK1(_nr)	(EXYNOS4_GPIO_K1_START + (_nr))
#define EXYNOS4_GPK2(_nr)	(EXYNOS4_GPIO_K2_START + (_nr))
#define EXYNOS4_GPK3(_nr)	(EXYNOS4_GPIO_K3_START + (_nr))
#define EXYNOS4_GPL0(_nr)	(EXYNOS4_GPIO_L0_START + (_nr))
#define EXYNOS4_GPL1(_nr)	(EXYNOS4_GPIO_L1_START + (_nr))
#define EXYNOS4_GPL2(_nr)	(EXYNOS4_GPIO_L2_START + (_nr))

#define EXYNOS4X12_GPM0(_nr)	(EXYNOS4X12_GPIO_M0_START + (_nr))
#define EXYNOS4X12_GPM1(_nr)	(EXYNOS4X12_GPIO_M1_START + (_nr))
#define EXYNOS4X12_GPM2(_nr)	(EXYNOS4X12_GPIO_M2_START + (_nr))
#define EXYNOS4X12_GPM3(_nr)	(EXYNOS4X12_GPIO_M3_START + (_nr))
#define EXYNOS4X12_GPM4(_nr)	(EXYNOS4X12_GPIO_M4_START + (_nr))

#define EXYNOS4_GPX0(_nr)	(EXYNOS4_GPIO_X0_START + (_nr))
#define EXYNOS4_GPX1(_nr)	(EXYNOS4_GPIO_X1_START + (_nr))
#define EXYNOS4_GPX2(_nr)	(EXYNOS4_GPIO_X2_START + (_nr))
#define EXYNOS4_GPX3(_nr)	(EXYNOS4_GPIO_X3_START + (_nr))
#define EXYNOS4_GPY0(_nr)	(EXYNOS4_GPIO_Y0_START + (_nr))
#define EXYNOS4_GPY1(_nr)	(EXYNOS4_GPIO_Y1_START + (_nr))
#define EXYNOS4_GPY2(_nr)	(EXYNOS4_GPIO_Y2_START + (_nr))
#define EXYNOS4_GPY3(_nr)	(EXYNOS4_GPIO_Y3_START + (_nr))
#define EXYNOS4_GPY4(_nr)	(EXYNOS4_GPIO_Y4_START + (_nr))
#define EXYNOS4_GPY5(_nr)	(EXYNOS4_GPIO_Y5_START + (_nr))
#define EXYNOS4_GPY6(_nr)	(EXYNOS4_GPIO_Y6_START + (_nr))
#define EXYNOS4_GPZ(_nr)	(EXYNOS4_GPIO_Z_START + (_nr))

/* the end of the EXYNOS4 specific gpios */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小坚学Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值