Linux不写驱动控制直接控制GPIO

说到控制硬件,马上就能想到写个内核模块,驱动一下,像gpio_request、open、read、write……一堆API就出来了。

其实,只是想简单的控制一下GPIO输入或者输出,不用这么复杂,系统已经实现相关驱动了,只需要了解怎么用就可以了。

在用户空间通过sysfs控制GPIO,先访问/sys/class/gpio/,向export文件写入要操作的GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction和value等,direction控制GPIO输入或者输出模式,而value可控制GPIO的状态或者读取状态。

/sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号;

/sys/class/gpio/unexport 用于通知系统取消导出;

/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号,寄存器名称,引脚总数;

/sys/class/gpio/gpioX/direction文件,可以写入in或out设置输入输入方向;

/sys/class/gpio/gpioX/value文件是可以读写GPIO状态;

示例:

1. 导出2号GPIO /sys/class/gpio# echo 2 > export

2. 设置方向为输出 /sys/class/gpio/gpio2# echo out > direction

3. 查看当前方向 /sys/class/gpio/gpio2# cat direction

4. 设置输出高电平 /sys/class/gpio/gpio2# echo 1 > value

5. 查看当前值 /sys/class/gpio/gpio2# cat value

6. 取消导出2号GPIO /sys/class/gpio# echo 2 > unexport

查看当前GPIO使用情况:

cat /sys/kernel/debug/gpio

那么问题来了,在SOC手册上看到的GPIO引脚号都是GPIOA5、GPIOB7、GPH12等这样的名称,哪来的GPIO编号呢?

别急,给你一个shell脚本,肯定是你想要的:

#! /bin/sh

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

上面的脚本在开发板上执行,可能会是这样的输出结果:

GPIOA: 0 
GPIOB: 32
GPIOC: 64
GPIOD: 96
GPIOE: 128
GPIOF: 160
GPIOG: 192
GPIOH: 224

这是什么意思嘞?举个例子:

假设要操作的GPIO是GPE5,那么,对应的GPIO就是133,怎么算的呢?

其实,上面是各个GPIO组的起始编号,GPE的起始编号是128,即GPE0的编号是128,那么GPE5的编号就是GPE0 + 5 = 128 + 5 = 133

好了,可以去玩了。不懂的可以私信哟


相关:

受邀观礼的除了“光头刘sir”,还有他们明天上午,庆祝新中国成立70周年大会将隆重举行。除了受阅官兵和游行群众,现场还有3万多名观礼嘉宾。都是谁如此幸运,受邀参加国庆观礼活动?长安街知事注意到,其中一些典型人物已经获得披露,比如来自香港的“..

微软将关闭Windows开发人员反馈UserVoice论坛 将使用反馈中心据外媒 MSPoweruser报道,微软使用UserVoice已有很长一段时间了,该公司已使用反馈来改进/添加各种功能。但是,随着Windows 10的发布,微软已经逐渐将反馈移至反馈中心(Feedback Hub),该中心充当用户提交反馈..

意天空:加图索正与热那亚商谈执教直播吧9月30日讯 意甲第六轮,拉齐奥4-0大胜热那亚,赛后热那亚主教练安德烈亚佐利承认,球队已经迷失了方向。热那亚在本赛季意甲1胜2平3负积5分排在第18名,处在降级区。安德烈阿佐利对意大利天空体育表示:今天..