/sys/class/gpio 文件接口操作IO端口(s3c2440)



更多 0



在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gpio” 方式。

首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入   Device Drivers  —>  GPIO Support  —>     /sys/class/gpio/… (sysfs interface)。

/sys/class/gpio 的使用说明:

01 gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射
02 * 控制GPIO的目录位于/sys/class/gpio
03 * /sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号
04 * /sys/class/gpio/unexport 用于通知系统取消导出
05 * /sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数 导出一个引脚的操作步骤
06 * 首先计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数
07 * 向/sys/class/gpio/export写入此编号,比如12号引脚,在shell中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出:
08 echo 12 > /sys/class/gpio/export
09 * direction文件,定义输入输入方向,可以通过下面命令定义为输出
10 echo out > direction
11 * direction接受的参数:in, out, high, low。high/low同时设置方向为输出,并将value设置为相应的1/0。
12 * value文件是端口的数值,为1或0.
13 echo 1 > value

下面在2440下进行一下测试

1.取得GPIO信息,在终端中敲入以下命令

1 $ cd /sys/class/gpio
2 for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done

终端中显示如下

1 GPIOA: 0
2 GPIOE: 128
3 GPIOF: 160
4 GPIOG: 192
5 GPIOH: 224
6 GPIOB: 32
7 GPIOC: 64
8 GPIOD: 96

2.计算GPIO号码

我们把GPE11用来控制LED。

GPE0的头是128,GPE11 就是128+11 = 139.

1 $ echo 139 >; /sys/class/gpio/export

ls 一下看看有没有 gpio139 这个目录

3.GPIO控制测试。

控制LED所以是输出。

所以我们应该执行

1 $ echo out > /sys/class/gpio/gpio139/direction

之后就可以进行输出设置了。

1 $ echo 1 > /sys/class/gpio/gpio139/value

or

1 $ echo 0 > /sys/class/gpio/gpio139/value
<think>好的,用户问的是关于Linux系统中GPIO相关的几个文件路径的来源,比如/sys/class/gpio/export、/sys/class/gpio/gpio%d/direction和/gpio17/value。我需要详细解释这些文件的作用和它们是如何生成的。 首先,用户可能是在开发嵌入式设备或者使用树莓派之类的设备,需要控制GPIO。他们可能在写代码时遇到了这些路径,想了解它们的原理和生成机制。 接下来,我应该从Linux的sysfs文件系统入手,说明这些文件是内核通过sysfs导出的接口,供用户空间操作GPIO。需要分点解释每个文件的作用,比如export用于导出GPIO,direction设置方向,value读写电平。 然后,用户可能想知道这些文件背后的技术细节,比如内核模块、设备树配置以及权限问题。需要提到gpiolib核心库,设备树中的定义,以及如何通过内核配置启用这些接口。 还要考虑用户的实际应用场景,比如他们可能在写控制GPIO的程序,需要了解如何正确使用这些文件,以及可能遇到的常见问题,比如权限错误或路径不存在的情况。 最后,相关问题应该覆盖导出GPIO失败的原因、设备树配置示例、权限设置、内核配置选项以及使用libgpiod的优势。这样用户可以得到全面的信息,帮助他们解决实际开发中的问题。</think>在Linux系统中,`/sys/class/gpio` 目录下的文件(如 `export`、`direction`、`value`)是 **通过内核的 `gpiolib` 子系统** 向用户空间提供的GPIO控制接口。这些文件的生成和功能与以下机制密切相关: --- ### 1. **`/sys/class/gpio/export` 文件** - **作用**:将指定编号的GPIO从内核空间导出到用户空间。 - **生成原理**: - 当内核启用 `CONFIG_GPIO_SYSFS` 配置选项时,`gpiolib` 会创建 `/sys/class/gpio/export` 接口。 - 用户通过向该文件写入GPIO编号(如 `17`),触发内核将对应的GPIO引脚注册为用户可操作的设备。 - **示例**: ```bash echo 17 > /sys/class/gpio/export # 导出GPIO17 ``` - **内核实现**: - 内核通过 `gpio_export()` 函数将GPIO注册到sysfs文件系统。 - 导出后,系统会自动创建 `/sys/class/gpio/gpio17` 目录。 --- ### 2. **`/sys/class/gpio/gpio%d/direction` 文件** - **作用**:设置GPIO引脚的输入/输出方向。 - **生成条件**: - 必须先通过 `export` 导出GPIO。 - 内核通过 `gpio_direction_input()` 和 `gpio_direction_output()` 实现方向控制。 - **使用方法**: ```bash echo out > /sys/class/gpio/gpio17/direction # 设置为输出 echo in > /sys/class/gpio/gpio17/direction # 设置为输入 ``` --- ### 3. **`/sys/class/gpio/gpio17/value` 文件** - **作用**:读取或写入GPIO引脚的电平状态(高电平1/低电平0)。 - **操作限制**: - 仅当GPIO被设置为输出方向时,才可以通过 `value` 文件写入电平。 - 输入方向时只能读取当前电平。 - **示例**: ```bash echo 1 > /sys/class/gpio/gpio17/value # 输出高电平 cat /sys/class/gpio/gpio17/value # 读取当前电平 ``` --- ### 4. **文件的底层依赖** 这些文件的生成和功能依赖以下Linux内核机制: 1. **`gpiolib` 子系统**: - 核心代码位于内核源码的 `drivers/gpio/gpiolib.c`。 - 提供GPIO注册、方向控制、电平操作的底层接口。 2. **设备树(Device Tree)**: - GPIO控制器在设备树中定义(如 `gpio-controller` 节点),描述硬件资源(如寄存器基地址、引脚数量)。 - 示例(设备树片段): ```dts gpio1: gpio@1a4 { compatible = "samsung,s3c64xx-gpio"; reg = <0x1a4 0x0c>; #gpio-cells = <2>; gpio-controller; }; ``` 3. **sysfs文件系统**: - 通过内核配置 `CONFIG_SYSFS` 启用,提供用户空间与内核的虚拟文件接口。 --- ### 5. **常见问题** - **文件不存在?** - 原因:内核未启用 `CONFIG_GPIO_SYSFS` 或未正确配置GPIO控制器驱动。 - 解决方案:检查内核配置或设备树是否包含对应GPIO控制器。 - **权限问题?** - 默认情况下,`/sys/class/gpio` 文件权限为 root 用户可操作。 - 可通过 udev 规则或修改文件权限(如 `chmod 666 /sys/class/gpio/export`)解决。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值