QOTOM MINIPC 在Ubuntu下支持GPIO的方法

QOTOM 迷你电脑 Ubuntu下支持GPIO的方法

电脑硬件型号:Q350P

1551345003499

问题

在使用在QOTOM Q350P迷你电脑时,发现安装ubuntu后,不能识别到GPIO。

cat /sys/kernel/debug/gpio 为空,这里通过安装驱动的方式尝试解决。

1551333285113

1.准备源代码
1
2
3
4
5
cd /usr/src
root@tiger:/usr/src# ls
linux-4.19.23 linux-headers-4.15.0-45
linux-headers-4.15.0-43 linux-headers-4.15.0-45-generic
linux-headers-4.15.0-43-generic

这里存放了系统内核源代码,linux-4.19.23是我单独下载的,这里使用4.19.23,直接使用系统自带的内核代码应该也是可以的。

下载地址:https://www.kernel.org/

2.配置内核
1
2
root@tiger:/# cd usr/src/linux-4.19.23/
root@tiger:/usr/src/linux-4.19.23# make menuconfig

*Device Drivers *

GPIO Support

Port-mapped I/O GPIO drivers

通过GPIO说明书发现GPIO由TI8786E-1芯片处理,对IT87xx设置为[*]

1551423069259

然后save->Exit

3.编译并安装内核

编译内核,具体编译方法可以参见另一篇博文《Ubuntu 18.04 上编译Linux内核

1
root@tiger:/usr/src/linux-4.19.23# make -j4

编译结束后,执行安装

1
2
make modules_install
make install

因为我已经生成新的内核启动项了,这里直接重启就行了

1
root@tiger:/usr/src/linux-4.19.23#shutdown -r now
4.验证结果

新的内核已经能够识别到GPIO

1551437055972

在用户空间通过sysfs接口访问gpio正常

1551348768297

/sys/class/gpio使用说明:

参考https://blog.csdn.net/u010871058/article/details/65648593

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1、gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射。

2、控制GPIO的目录位于/sys/class/gpio。

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

4、/sys/class/gpio/unexport 用于通知系统取消导出。

5、/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称label,引脚总数ngpio,导出一个引脚的操作步骤。

6、首先计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数。

7、向/sys/class/gpio/export写入此编号,比如12号引脚,echo 12 > /sys/class/gpio/export,命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出。

8、direction文件,定义输入输出方向,可以通过下面命令定义为输出,direction接受的参数:in, out, high, low;high/low同时设置方向为输出。

9、value文件是端口的数值,为1或0。
测试GPIO:

通过查看说明书,得知使用的GPIO端口为80-87

664719571

1.找到对应的gpio编号

1
2
3
4
5
6
7
8
9
10
cat /sys/kernel/debug/gpio
...
gpio-504 (it87_gp80 )
gpio-505 (it87_gp81 )
gpio-506 (it87_gp82 )
gpio-507 (it87_gp83 )
gpio-508 (it87_gp84 )
gpio-509 (it87_gp85 )
gpio-510 (it87_gp86 )
gpio-511 (it87_gp87 )

2.使用gp87端口,设置输出模式为输出

1
2
root@tiger:/sys/class/gpio# echo 511 > export 
root@tiger:/sys/class/gpio# echo out > it87_gp87/direction

3.测试led

高电平熄灭

1
root@tiger:/sys/class/gpio# echo 1 > it87_gp87/value

低电平点亮

1
root@tiger:/sys/class/gpio# echo 0 > it87_gp87/value

附上测试脚本,led闪烁100次

1
2
3
4
5
6
7
8
9
10
11
12
13
#!bin/sh

COUNTER=1
echo 511 > /sys/class/gpio/export
echo out > /sys/class/gpio/it87_gp87/direction
while [ "$COUNTER" -lt 100 ]; do
echo "gpio test ...:$COUNTER"
echo 1 > /sys/class/gpio/it87_gp87/value
sleep 0.3
echo 0 > /sys/class/gpio/it87_gp87/value
sleep 0.3
COUNTER=$(($COUNTER+1))
done

最终效果图

gpio_7

简单方法:如果系统原始内核已经存在该驱动,直接加载驱动就可以了 insmod gpio_xxx.ko

永久生效:install -p -m 644 xxx.ko

------ 本文结束------