GPIO使用
S100 Acore芯片内中共有3个sys有gpio设备,分别是peri, cam和video,每个设备最多有32个gpio引脚,并且每个gpio引脚都支持中断。

驱动代码
kernel/drivers/gpio/gpio-dwapb.c # gpio驱动源文件
内核配置
GPIO_DWAPB

内核DTS配置
S100 GPIO控制器的设备树定义位于SDK包的kernel文件夹下的arch/arm64/boot/dts/hobot/drobot-s100-soc.dtsi文件内。
s100.dtsi中的节点主要声明SoC共有特性,和具体电路板无关,一般情况下不用修改。
GPIO使用
Kernel Space
DTS配置
s100所有引脚的GPIO配置位于SDK包的kernel文件夹下路径为arch/arm64/boot/dts/hobot/drobot-s100-soc.dtsi的文件内。
用户需要配置特定引脚为GPIO功能时,可以直接引用预定义GPIO配置:
GPIO设备树节点的属 性命名方式一般为<names>-gpios或<names>-gpio,举例如下:
/**
* peri_port0表示peri sys的第一个gpio设备
* 下列设备节点共有四个gpio引脚,分别是:
* peri sys的第一个gpio设备 16号引脚(从0开始)
* peri sys的第二个gpio设备 17号引脚(从0开始)
* cam sys的第一个gpio设备 28号引脚(从0开始)
* video sys的第一个gpio设备 18号引脚(从0开始)
* GPIO_ACTIVE_HIGH表示高电平有效,一般设为GPIO_ACTIVE_HIGH
*/
gpio-test {
test-gpios = <&peri_port0 16 GPIO_ACTIVE_HIGH
&peri_port1 17 GPIO_ACTIVE_HIGH
&cam_port0 28 GPIO_ACTIVE_HIGH
&video_port0 18 GPIO_ACTIVE_HIGH>;
};
驱动代码接口
/* include/linux/gpio.h */
/* 申请GPIO */
int gpio_request(unsigned gpio, const char *label);
/* GPIO初始化为输出。并设置输出电平*/
int gpio_direction_output(unsigned gpio, int value);
/* GPIO初始化为输入 */
int gpio_direction_input(unsigned gpio);
/* 获取GPIO的电平 */
int gpio_get_value(unsigned int gpio);
/* 设置GPIO的电平 */
void gpio_set_value(unsigned int gpio, int value);
/* 释放GPIO */
void gpio_free(unsigned gpio);
/* 申请GPIO中断,返回的值可以传给request_irq和free_irq */
int gpio_to_irq(unsigned int gpio);
User Space
控制接口
在用户层可以使用/sys/class/gpio节点来进行相关gpio的操作。
在sys节点下存在如下节点:
#申请gpio
echo <gpio_num> > /sys/class/gpio/export
#释放gpio
echo <gpio_num> > /sys/class/gpio/unexport
#设置gpio为输出
#当设置dir为out时,可以向value中echo 1/0,分别表示输入高低电平。
echo out > /sys/class/gpio/gpio<gpio_num>/direction
#设置高电平
echo 1 > /sys/class/gpio/gpio<gpio_num>/value
#设置低电平
echo 0 > /sys/class/gpio/gpio<gpio_num>/value
#设置gpio为输入, 当设置dir为in时,cat value表示输入的值(0-低,1-高)。
echo in > /sys/class/gpio/gpio<gpio_num>/direction
#读取gpio的外部值
cat /sys/class/gpio/gpio<gpio_num>/value
#查看gpio的debug接口
cat /sys/kernel/debug/gpio
#查看gpio和pinctrl的关系
#可以看到系统的引脚和gpio的号关系
cat /sys/kernel/debug/pinctrl/<pinctrl_dev>/gpio-ranges
sysfs接口介绍
export&unexport
/sys/class/gpio/export和/sys/class/gpio/unexport,这两个节点只能写不能读。
用户程序通过写入gpio的编号来向内核申请将某个gpio的控制权导出到用户空间,前提是没有内核代码申请这个gpio端口,如用户申请编号为480的GPIO的命令:
echo 480 > export
上述操作会为480号gpio创建一个节点gpio480,此时/sys/class/gpio目录下边生成一个gpio480的目录。
/sys/class/gpio/unexport和导出的效果相反,比如移除gpio480这个节点操作命令:
echo 480 > unexport #该操作将会移除gpio480这个节点,释放序号为480的gpio。
direction
其中direction表示gpio端口的方向,读取结果是in或out。也可以对该文件进行写操作,写入out时该gpio设为输出,写入in时该gpio设为输入。