一、硬件说明:
主板上有2组可编程GPIO,一组是和CPU直连的CPU_GPIO,另外一是通过SIO芯片引出的GPIO:
以下是CPU引出的IO口如下,PCB丝印编号:CPU_GPIO

| CPUIO名称 | 对应操作地址 | 电压范围(V) |
|---|---|---|
| CGP1 | 0XFD6A0A90 | 0--3.3V |
| CGP3 | 0XFD6D0A60 | 0--3.3V |
| CGP5 | 0XFD6D0A70 | 0--3.3V |
| CGP7 | 0XFD6D0A40 | 0--3.3V |
| CGP9 | 0XFD6D0A50 | 0--3.3V |
| CGP2 | 0XFD6D0710 | 0--1.8V |
| CGP4 | 0XFD6D0B70 | 0--1.8V |
| CGP6 | 0XFD6D0720 | 0--1.8V |
| CGP8 | 0XFD6D0730 | 0--1.8V |
| CGP10 | 0XFD6D0700 | 0--1.8V |
以下是SIO芯片印出来的IO口,PCB丝印编号:GP1

| SIO名称 | 位地址 | 电压范围(V) | 备注 |
|---|---|---|---|
| GP1 | 0 | 0--3.3V | 最高支持5V输入 |
| GP2 | 1 | 0--3.3V | 最高支持5V输入 |
| GP3 | 2 | 0--3.3V | 最高支持5V输入 |
| GP4 | 3 | 0--3.3V | 最高支持5V输入 |
| GP5 | 4 | 0--3.3V | 最高支持5V输入 |
| GP6 | 5 | 0--3.3V | 最高支持5V输入 |
| GP8 | 7 | 0--3.3V | 最高支持5V输入 |
二、测试软件(内核映射驱动方式)编译和测试:
[linux-gpio-test-src-File]http://dd.youyeetoo.cn:5000/sharing/V9mofnmY7
下载测试软件源码,解压后,linux-gpio目录如图:

源码目录结构说明:
| 文件/文件夹 | 说明 |
|---|---|
| drv文件夹 | gpio内核映射驱动 |
| IOApp.h | gpio应用接口头文件 |
| IOApp.cpp | gpio应用接口源文件 |
| test_gpio.cpp | 测试代码main |
| Makefile | make编译脚本文件 |
| Readme.txt | 编译流程说明文件 |
编译和运行流程如下,下面开始目录是linux-gpio
进行编译操作前,需要先安装基本的编译工具,安装方法请参考"Linux应用程序开发(调用硬件)"说明.
#进入gpio驱动源码目录
user@K1:~/linux-gpio$ cd drv
#编译gpio驱动
user@K1:~/linux-gpio/drv$ make
#返回上一级目录
user@K1:~/linux-gpio/drv$ cd ..
user@K1:~/linux-gpio$ cp drv/gpio_drv.ko ./
#编译gpio测试应用程序
user@K1:~/linux-gpio$ make
#执行程序程序
user@K1:~/linux-gpio$ sudo ./test_gpio
以上操作,若没有错误,显示测试结果如下:
$sudo ./test_gpio
GPIO Open Success
read cpu io,ret=0X800102
The CPU Gpio Output Is Successful The Led Control Is Successful And The K1_CPU_GPIO_CGP9 Input Level Is Successful:1
The SIO Output Is Successful The Led Control Is Successful And The SIO 5 Input Level Is Successful:1
特别提醒:因为是控制硬件,需要sudo 来运行测试程序.若是root 账号可以直接运行.
三、gpio应用接口(内核映射驱动方式)说明:
3.1以下是IOApp.h文件结构说明
#ifndef _IOAPP_H
#define _IOAPP_H
#include <stdint.h>
#include "LinuxGPIO.h"
#define K1_CPU_GPIO_CGP1 0XFD6A0A90
#define K1_CPU_GPIO_CGP2 0XFD6D0710
#define K1_CPU_GPIO_CGP3 0XFD6D0A60
#define K1_CPU_GPIO_CGP4 0XFD6D0B70
#define K1_CPU_GPIO_CGP5 0XFD6D0A70
#define K1_CPU_GPIO_CGP6 0XFD6D0720
#define K1_CPU_GPIO_CGP7 0XFD6D0A40
#define K1_CPU_GPIO_CGP8 0XFD6D0730
#define K1_CPU_GPIO_CGP9 0XFD6D0A50
#define K1_CPU_GPIO_CGP10 0XFD6D0700
#define K1_SIO_Bit_GP1 0
#define K1_SIO_Bit_GP2 1
#define K1_SIO_Bit_GP3 2
#define K1_SIO_Bit_GP4 3
#define K1_SIO_Bit_GP5 4
#define K1_SIO_Bit_GP6 5
#define K1_SIO_Bit_GP7 6
#define K1_SIO_Bit_GP8 7
#define K1_SIO_REG_DIR 0xCE
#define K1_SIO_REG_VAL 0xA06
// Before Use You Need To Dynamically Load The Driver Load Module Method 1 Load This Module Only
// commandLine: chmod 644 gpio_drv.ko
// commandLine: insmod gpio_drv.ko
class IOApp
{
private:
std::unique_ptr<LinuxGPIO> lpGpio;
public:
IOApp();
~IOApp();
void LoadGpioDriver();
bool IsOpen();
public:
// gpio Output High And Low Levels
bool CpuIO_Set(uint32_t addr, bool hightLevel);
// return: 0:low 1:hight 2:model error,-1:failed
int32_t CpuIO_Get(uint32_t addr);
// Set Gpio To Input Mode
bool CpuIO_SetModel_InPut(uint32_t addr);
// Set SIO Output
bool SIO_Set2(uint16_t bitOffset, bool isHight);
// return: 0:low 1:hight 2:model error,-1:failed
int32_t SIO_Get2(uint16_t bitOffset);
};
#endif
~
3.2IO输入输出说明:
IO口有输入模式和输出模式
IO口设置为输出模式后,输出的高低电平才是正确的,此模式下读取的IO值是随机的。
IO口设置为输入模式后,读取的值:
若读出值为0X84000102表示高电平,若值为0X84000100表示低电平
若读取出其他值,可能IO不是在输入模式下。
四、GPIO 其他控制方式说明(根据实际情况,参考使用):
4.1 GPIO sysfs接口 (kernel 4.8开始 已经默认禁用,官方也不推荐使用)
在Linux中,最常见的读写GPIO方式就是用GPIO sysfs interface, 是通过操作 /sys/class/gpio 目录下的 export 、 unexport 、gpio{N}/direction, gpio{N} /value (用实际引脚号替代{N})等文件实现的,经常出现shell脚本里面。 在kernel 4.8开始,加入了libgpiod的支持;而原有基于sysfs的访问方式,将被逐渐放弃。
4.2使用libgpiod 库控制IO
libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如 /dev/gpiodchip0 )实现的, 并通过libgpiod提供一些命令工具、c库以及python封装。
注意:GPIO sysfs接口 和 libgpiod库只能控制CPU直连的CPU-GPIO,不支持控制 Super IO 引出的GPIO.
五、GPIO测试样例程序Qt界面(内核映射驱动方式):

在GPIO测试页面
IO-PIO:可以选择切换5个不同GIPIO
输出模式测试:
选择需要测试的IO,先点"设置输出模式",把IO设置为输出模式,
在"值(HEX)"位置输入1(输出高电平)或者0(输出低电平)
然后点"写IO"按钮.然后用万用表测量对应IO验证输出电平是否正确.
输入模式测试:
选择需要测试的IO,先点"设置输入模式",把IO设置为输入模式,
对应IO可以接GND(低电平)或者悬空(IO内部有上拉,默认高电平).
然后点"读IO"按钮,查看读取到的值(若值为0X84000102表示高电平,若值为0X84000100表示低电平),以验证读取结果.
测试程序qt界面样例源码和如何编译使用,请参考如下页面:
https://wiki.youyeetoo.cn/zh/youyeetooK1/linux/qt-build