您的位置:首页 > 运维架构 > Linux

linux 中的GPIO操作

2013-05-11 15:36 513 查看
本文主要参考了linux源文件中的Gpio.txt以及GPIO.txt,查看以上两个文件使得自己对linux下面对GPIO的操作方式更加了解,将从以下几个方面进行分析

1、什么是GPIO?

2、GPIO规则

3、标识GPIO

4、使用GPIO

5、使用自旋锁安全访问GPIO

6、GPIO访问可能导致的睡眠

7、请求和释放GPIO

8、GPIO的中断映射

9、S3C2410中的GPIO控制

下面将从以上10个方面进行详细的介绍

1、什么是GPIO?

此问题我相信大家都已经很清楚了,GPIO即是我们可以对其进行配置输入输出、上拉下拉的一种通用输出输出口,公共特性有以下几点,有些都是自己还没了解的

-输出值可写(高=1,低=0)。有些芯片还可以设置输出值是如何驱动的,但是只有一个值输出,支持“wire-OR”功能,注意“open drain”信号

-输入任然是可以读(1,0)。有些芯片支持readback(读回功能),即当引脚配置为输出以后,任然可以对其进行读取,查看输出引脚电平,在“wire-OR”上面非常有用

-输入可以配置成为IRQ信号,可以是边沿触发或者电平触发方式

-有的GPIO口可以配置成在持有自旋锁(holding spinlocks)的时候还能访问,但是此种访问方式通过一个串行总线通常是不行的。有的系统两种方式都可以。

2、GPIO规则

该规则是可以用也可以不用,如果内部有定义好的gpio操作那么我们就才用已经定义好的进行,方便后期维护,如下所示

#include <asm/gpio.h>

3、标识GPIO

GPIO通过无符号整形进行标识,范围为0到MAX_INT,注意,保留负数编号是为了用于像标识该信号在本开发板上面不可用,或者表示错误等等。

4、使用GPIO

设置GPIO方向,函数如下所示

/* set as input or output, returning 0 or negative errno */
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);

调用这两个函数需要注意两个问题:第一、这两个函数会引起睡眠;第二、调用这两个函数需要检查返回值,即是否设置成功

5、使用自旋锁安全访问GPIO

大多数GPIO控制器可以通过内存读写指令进行访问,这不需要睡眠,并且可以从中断处理函数里面进行安全访问,函数如下所示

/* GPIO INPUT:  return zero or nonzero */
int gpio_get_value(unsigned gpio);
/* GPIO OUTPUT */
void gpio_set_value(unsigned gpio, int value);
此函数需要注意三个问题:第一、value的值是布尔类型(boolean),0表示低,非0表示高;第二:返回的值和输出值有可能不匹配,需要考虑wire-OR情况以及输出延时;第三、这两个函数不需要进行错误检查,因为前面已经检查了

6、GPIO访问可能导致睡眠情况

有些GPIO控制块可以通过I2C、SPI总线进行访问,因此、在读写命令的时候就会存在反应时间,这样就需要睡眠,此操作不能够在中断处理程序里面进行。区分这两种GPIO口的可以通过以下函数进行

int gpio_cansleep(unsigned gpio);

如果返回非0值,那么是可以睡眠的

访问这样的GPIO口,又重新定义了一套方式,如下所示

/* GPIO INPUT:  return zero or nonzero, might sleep */
int gpio_get_value_cansleep(unsigned gpio);
/* GPIO OUTPUT, might sleep */
void gpio_set_value_cansleep(unsigned gpio, int value);

7、请求和释放GPIO口

此功能现在在好多平台上还未实现,通过以下方式访问

/* request GPIO, returning 0 or negative errno.
* non-null labels may be useful for diagnostics.
*/ int gpio_request(unsigned gpio, const char *label);
/* release previously-claimed GPIO */
void gpio_free(unsigned gpio);
以上两个函数可能导致睡眠

8、GPIO的中断映射

GPIO的中断编号就想GPIO编号是一样的多是无符号整形,因此,就建立了两个不同的逻辑命名空间(GPIO0 不一定要使用IRQ0),通过以下方式可以映射其关系

/* map GPIO numbers to IRQ numbers */
int gpio_to_irq(unsigned gpio);
/* map IRQ numbers to GPIO numbers */
int irq_to_gpio(unsigned irq);
返回负数表示有错误

可以将gpio_to_irq()和request_irq()和free_irq()函数联合使用,也可以将irq_to_gpio()和gpio_get_value()函数联合使用;

9、S3C2416的GPIO控制

头文件主要包括以下几个

include/asm-arm/arch-s3c2410/regs-gpio.h
//GPIO 引脚列表

asm/arch/regs-gpio.h
//配置值

include/asm-arm/arch-s3c2410/hardware.h
//GPIO管理函数

asm/arch/hardware.h

引脚编号

每个引脚都有一个唯一的编号,文件是regs-gpio.h,该编号用于告诉配置函数配置哪个引脚

配置引脚,函数如下

void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);
Eg:
s3c2410_gpio_cfgpin(S3C2410_GPA0, S3C2410_GPA0_ADDR0); s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
which would turn GPA0 into the lowest Address line A0, and set
GPE8 to be connected to the SDIO/MMC controller's SDDAT1 line.

读取当前配置,函数如下

s3c2410_gpio_getcfg(unsigned int pin);
The return value will be from the same set of values which can be passed to s3c2410_gpio_cfgpin().

配置上拉电阻,函数如下

A large proportion of the GPIO pins on the S3C2410 can have weak
pull-up resistors enabled. This can be configured by the following function:
void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);
Where the to value is zero to set the pull-up off, and 1 to enable
the specified pull-up. Any other values are currently undefined.


获取引脚状态,函数如下

The state of a pin can be read by using the function:
unsigned int s3c2410_gpio_getpin(unsigned int pin);
This will return either zero or non-zero. Do not count on(期望) this function returning 1 if the pin is set.


设置引脚状态,函数如下

The value an pin is outputing can be modified by using the following:
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
Which sets the given pin to the value. Use 0 to write 0, and 1 to
set the output to 1.
获取该引脚的IRQ编号

The following function can map the given pin number to an IRQ
number to pass to the IRQ system.
int s3c2410_gpio_getirq(unsigned int pin);
Note, not all pins have an IRQ.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: