一个爱徒步的~IT民工
3406
- 收藏
- 点赞
- 分享
- 举报
T30 GPIO接口及操作方法
GPIO是“General Purpose Input/Output”的简称,具有输入输出,功能复用的功能。开发者在开发硬件驱动时往往需要操作GPIO,以控制外设硬件。
ISVP使用Linux标准的GPIOLIB接口。GPIOLIB提供了统一的GPIO申请/释放/设置/获取接口,按照GPIOLIB的设定,需要在Kernel space进行调用。如果是User space需要操作GPIO,有两种方法可以选择:
通过sysfs GPIO接口进行操作
应用程序调用相关的驱动,驱动中实现GPIO的设置
1. GPIOLIB
2.1 头文件及API
GPIOLIB的头文件为:include/linux/gpio.h
在驱动程序中加入头文件引用:
#include
API在头文件include/asm-generic/gpio.h中定义,例如:
[code]
int gpio_request(unsigned gpio, const char *label);
void gpio_free(unsigned gpio);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
int gpio_get_value(unsigned int gpio);
void gpio_set_value(unsigned int gpio, int value);
int gpio_to_irq(unsigned int gpio);[/code]
等等。详细的文档说明可参考kernel/Documentation/gpio.txt。
2.2 参考代码
Linux kernel中标准驱动的GPIO操作均使用标准的GPIOLIB,比如Software I2C,Fixed regulator,以及中断等等。
2. sysfs GPIO
sysfs GPIO是Linux标准的用户空间操作GPIO的接口。用户可用过命令行或者应用程序直接设置GPIO的输入/输出,高低电平等属性。一般情况下,GPIO调试或者简单的GPIO应用(比如IR-Cut操作),可通过sysfs GPIO接口进行快速开发。
2.1 内核选项
在内核源码根目录下执行$ make menuconfig命令进入配置界面,选中以下选项:
[code]Device Drivers --->
-*- GPIO Support --->
/sys/class/gpio/... (sysfs interface)[/code]
一般情况下,内核的默认配置已经勾选了此选项。
2.2 sysfs GPIO的申请与释放
在操作sysfs GPIO之前需要对其进行申请。值得注意的是,由于申请sysfs GPIO会在内核request_gpio,因此在内核中已经申请过的GPIO在sysfs GPIO再次申请会失败。
申请/释放GPIO方法如下:
[code]$ cd /sys/class/gpio
$ echo [gpio_num] > export #申请GPIO
$ echo [gpio_num] > unexport #释放GPIO
注:gpio_num即GPIO号。计算公式为:
PA(n) = 0 * 32 + n
PB(n) = 1 * 32 + n
PC(n) = 2 * 32 + n[/code]
...
例如:申请PB(10) = 1 * 32 + 10 = 42
[code]$ echo 42 > export[/code]
申请后在/sys/class/gpio目录下即会出现gpio42目录。
[code]$ echo 42 > unexport[/code]
释放后gpio42目录也会消失。释放后的GPIO状态并不会恢复,会保持申请时的状态(电平等)。
2.3 设置输入/输出方式
在申请GPIO后,进入gpioN目录,例如gpio42,进行如下操作:
[code]
$ echo out > direction #设置PB10为输出模式
$ echo in > direction #设置PB10为输入模式[/code]
2.4 设置有效电平
gpioN目录下有active_low节点,表示当前GPIO的有限电平,默认为0,其意义为,当输入/输出value为0时,GPIO为低电平,当输入/输出value为1时,GPIO为高电平。同样的,当active_low为1时,当输入/输出value为0时,GPIO为高电平,当输入/输出value为1时,GPIO为低电平。 也就是说,GPIO的真实电平=value^active_low。
[code]$ echo 0 > active_low #value是0,表示低电平。value是1,表示高电平
$ echo 1 > active_low #value是1,表示低电平。value是0,表示高电平[/code]
2.5 输入/输出
gpioN目录下有value节点,表示gpioN的电平:当GPIO为输入模式时,读取到value的值异或active_low即为GPIO的电平;当GPIO为输出模式时,写入到value的值异或active_low即为GPIO的输出电平。
[code]$ cat value #读取电平(输入模式)
$ echo 0 > value #设置电平(输出模式)[/code]
ISVP使用Linux标准的GPIOLIB接口。GPIOLIB提供了统一的GPIO申请/释放/设置/获取接口,按照GPIOLIB的设定,需要在Kernel space进行调用。如果是User space需要操作GPIO,有两种方法可以选择:
通过sysfs GPIO接口进行操作
应用程序调用相关的驱动,驱动中实现GPIO的设置
1. GPIOLIB
2.1 头文件及API
GPIOLIB的头文件为:include/linux/gpio.h
在驱动程序中加入头文件引用:
#include
API在头文件include/asm-generic/gpio.h中定义,例如:
[code]
int gpio_request(unsigned gpio, const char *label);
void gpio_free(unsigned gpio);
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
int gpio_get_value(unsigned int gpio);
void gpio_set_value(unsigned int gpio, int value);
int gpio_to_irq(unsigned int gpio);[/code]
等等。详细的文档说明可参考kernel/Documentation/gpio.txt。
2.2 参考代码
Linux kernel中标准驱动的GPIO操作均使用标准的GPIOLIB,比如Software I2C,Fixed regulator,以及中断等等。
2. sysfs GPIO
sysfs GPIO是Linux标准的用户空间操作GPIO的接口。用户可用过命令行或者应用程序直接设置GPIO的输入/输出,高低电平等属性。一般情况下,GPIO调试或者简单的GPIO应用(比如IR-Cut操作),可通过sysfs GPIO接口进行快速开发。
2.1 内核选项
在内核源码根目录下执行$ make menuconfig命令进入配置界面,选中以下选项:
[code]Device Drivers --->
-*- GPIO Support --->
一般情况下,内核的默认配置已经勾选了此选项。
2.2 sysfs GPIO的申请与释放
在操作sysfs GPIO之前需要对其进行申请。值得注意的是,由于申请sysfs GPIO会在内核request_gpio,因此在内核中已经申请过的GPIO在sysfs GPIO再次申请会失败。
申请/释放GPIO方法如下:
[code]$ cd /sys/class/gpio
$ echo [gpio_num] > export #申请GPIO
$ echo [gpio_num] > unexport #释放GPIO
注:gpio_num即GPIO号。计算公式为:
PA(n) = 0 * 32 + n
PB(n) = 1 * 32 + n
PC(n) = 2 * 32 + n[/code]
...
例如:申请PB(10) = 1 * 32 + 10 = 42
[code]$ echo 42 > export[/code]
申请后在/sys/class/gpio目录下即会出现gpio42目录。
[code]$ echo 42 > unexport[/code]
释放后gpio42目录也会消失。释放后的GPIO状态并不会恢复,会保持申请时的状态(电平等)。
2.3 设置输入/输出方式
在申请GPIO后,进入gpioN目录,例如gpio42,进行如下操作:
[code]
$ echo out > direction #设置PB10为输出模式
$ echo in > direction #设置PB10为输入模式[/code]
2.4 设置有效电平
gpioN目录下有active_low节点,表示当前GPIO的有限电平,默认为0,其意义为,当输入/输出value为0时,GPIO为低电平,当输入/输出value为1时,GPIO为高电平。同样的,当active_low为1时,当输入/输出value为0时,GPIO为高电平,当输入/输出value为1时,GPIO为低电平。 也就是说,GPIO的真实电平=value^active_low。
[code]$ echo 0 > active_low #value是0,表示低电平。value是1,表示高电平
$ echo 1 > active_low #value是1,表示低电平。value是0,表示高电平[/code]
2.5 输入/输出
gpioN目录下有value节点,表示gpioN的电平:当GPIO为输入模式时,读取到value的值异或active_low即为GPIO的电平;当GPIO为输出模式时,写入到value的值异或active_low即为GPIO的输出电平。
[code]$ cat value #读取电平(输入模式)
$ echo 0 > value #设置电平(输出模式)[/code]
我来回答
回答5个
时间排序
认可量排序
认可0
认可0
认可0
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2018-11-16 13:07:10
-
2018-11-15 22:31:26
-
2018-11-15 22:00:41
-
2018-11-15 21:59:39
-
2018-11-16 13:05:40
-
2016-08-15 21:42:15
-
12019-09-11 22:40:59
-
2018-05-17 14:21:56
-
2020-11-10 14:29:21
-
2020-09-22 11:14:03
-
2020-11-10 19:45:56
-
2018-05-14 16:58:25
-
2019-01-19 12:39:46
-
2020-11-11 10:21:07
-
122018-11-11 13:02:53
-
2018-08-17 11:13:28
-
2018-11-21 20:38:30
-
2020-02-18 19:42:35
-
2018-11-15 21:57:49
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认