QOTOM工控电脑安装GPIO驱动

By | 2019-09-23

工控机型号:QOTOM Q350P SIO芯片ITE8786-I

问题

Q350P在安装ubuntu18.04后, cat /sys/kernel/debug/gpio 为空 ,无法使用GPIO,经查是因为系统默认没有安装SIO芯片驱动,这里通过安装gpio-it87 drive来解决。

安装步骤

1.下载源代码 https://www.kernel.org/ 这里使用4.19.23

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

2.查看GPIO驱动源代码

Q300P使用SIO芯片IT8786,进入内核源码根目录\drivers\gpio查看gpio-it87.c源代码,可以看到IT8786_ID的型号

#define IT8786_ID	0x8786
...
case IT8786_ID:
	gpio_ba_reg = 0x62;
	it87_gpio->io_size = 8;
	it87_gpio->output_base = 0xc8;
	it87_gpio->simple_base = 0xc0;
	it87_gpio->simple_size = 5;
	it87_gpio->chip.ngpio = 64;
	break;

注意:如果不知道使用的SIO型号,可以使用dmesg过滤Chip日志,找到SIO芯片型号,添加进来编译,内核日志如下:

pr_err("Unknown Chip found, Chip %04x Revision %x\n",
		       chip_type, chip_rev);

3.配置内核

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

QOTOM Q350P GPIO由TI8786E-1芯片处理,找到gpio drive 对IT87xx设置为[*]
[*]代表编译并安装到内核,[M]表示编译不安装

配置GPIO

4.编译并安装内核

  1. 编译内核,具体编译方法可以参考《Ubuntu 18.04上编译Linux内核root@tiger:/usr/src/linux-4.19.23# make -j4
  2. 编译结束后,执行安装
    make modules_install
    make install
    reboot

5.验证结果

  1. 新的内核已经能够识别到GPIO
  2. 在用户空间通过sysfs接口访问gpio正常,说明 gpio drive 安装成功

/sys/class/gpio使用说明:

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:

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

gpio pin

2. 找到对应的gpio编号

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端口,设置输出模式为输出

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

3.测试led
高电平熄灭
root@tiger:/sys/class/gpio# echo 1 > it87_gp87/value
低电平点亮
root@tiger:/sys/class/gpio# echo 0 > it87_gp87/value

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

#!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

效果图 如下:

发表评论

邮箱地址不会被公开。 必填项已用*标注