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方向,函数如下所示
调用这两个函数需要注意两个问题:第一、这两个函数会引起睡眠;第二、调用这两个函数需要检查返回值,即是否设置成功
5、使用自旋锁安全访问GPIO
大多数GPIO控制器可以通过内存读写指令进行访问,这不需要睡眠,并且可以从中断处理函数里面进行安全访问,函数如下所示
6、GPIO访问可能导致睡眠情况
有些GPIO控制块可以通过I2C、SPI总线进行访问,因此、在读写命令的时候就会存在反应时间,这样就需要睡眠,此操作不能够在中断处理程序里面进行。区分这两种GPIO口的可以通过以下函数进行
int gpio_cansleep(unsigned gpio);
如果返回非0值,那么是可以睡眠的
访问这样的GPIO口,又重新定义了一套方式,如下所示
7、请求和释放GPIO口
此功能现在在好多平台上还未实现,通过以下方式访问
8、GPIO的中断映射
GPIO的中断编号就想GPIO编号是一样的多是无符号整形,因此,就建立了两个不同的逻辑命名空间(GPIO0 不一定要使用IRQ0),通过以下方式可以映射其关系
可以将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,该编号用于告诉配置函数配置哪个引脚
配置引脚,函数如下
读取当前配置,函数如下
配置上拉电阻,函数如下
获取引脚状态,函数如下
设置引脚状态,函数如下
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.
相关文章推荐
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux 下操作gpio(两种方法,驱动和mmap)
- Linux下用文件IO的方式操作GPIO
- 嵌入式linux下操作GPIO
- Linux应用层直接操作GPIO
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- linux 标准 GPIO 操作
- linux内核里的GPIO操作函数
- 【嵌入式Linux+ARM】GPIO操作
- Linux下s3c6410的GPIO操作(2)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下s3c6410的GPIO操作(5)
- LINUX 2440-GPIO操作 .
- linux内核里的GPIO操作函数
- Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
- Linux下s3c6410的GPIO操作(7)
- 这一个在OMAP3530/DM3730 ARM A8平台上,LINUX系统下,对GPIO的操作
- 【嵌入式Linux+ARM】GPIO操作
- linux下操作gpio寄存器的方法