工控机型号: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]表示编译不安装
4.编译并安装内核
- 编译内核,具体编译方法可以参考《Ubuntu 18.04上编译Linux内核》
root@tiger:/usr/src/linux-4.19.23# make -j4
- 编译结束后,执行安装
make modules_install
make install
reboot
5.验证结果
- 新的内核已经能够识别到GPIO
- 在用户空间通过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
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
效果图 如下: