linux 中的GPIO操作

本文主要参考了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.


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GPIO(General Purpose Input/Output)是通用输入输出端口,可以通过GPIO控制外部设备,如LED、电机、传感器等。在Linux系统,可以使用sysfs文件系统来操作GPIO。 以下是在Linux系统操作GPIO的基本步骤: 1. 打开GPIO设备 在Linux系统GPIO设备通常以文件的形式存在于/sys/class/gpio目录下。首先需要打开GPIO设备文件,可使用以下命令: ``` echo [GPIO编号] > /sys/class/gpio/export ``` 例如,要打开GPIO 27,则可以执行以下命令: ``` echo 27 > /sys/class/gpio/export ``` 2. 配置GPIO方向 GPIO可设置为输入或输出模式。要将GPIO 27配置为输出模式,可以执行以下命令: ``` echo out > /sys/class/gpio/gpio27/direction ``` 要将GPIO 27配置为输入模式,可以执行以下命令: ``` echo in > /sys/class/gpio/gpio27/direction ``` 3. 控制GPIO输出 当GPIO被配置为输出模式时,可以通过以下命令控制GPIO输出: ``` echo [0/1] > /sys/class/gpio/gpio27/value ``` 其,0表示GPIO输出低电平,1表示GPIO输出高电平。 4. 读取GPIO输入 当GPIO被配置为输入模式时,可以通过以下命令读取GPIO输入: ``` cat /sys/class/gpio/gpio27/value ``` 该命令会返回GPIO当前的输入状态,0表示GPIO输入低电平,1表示GPIO输入高电平。 5. 关闭GPIO设备 使用完GPIO后,应该将GPIO设备关闭以释放资源。可以执行以下命令关闭GPIO设备: ``` echo [GPIO编号] > /sys/class/gpio/unexport ``` 例如,要关闭GPIO 27,则可以执行以下命令: ``` echo 27 > /sys/class/gpio/unexport ``` 需要注意的是,以上命令需要以root权限执行。如果没有root权限,可以使用sudo命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值