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

S600 GPIO 概述
S600芯片内中共有3个 sys 有 gpio 设备,分别是 hsi, cam 和 peri,总共110个 gpio 引脚,并且每个 gpio 引脚都支持中断。
| GPIO 控制器 | 引脚数量 | 基地址 | 设备节点 |
|---|---|---|---|
| hsi_gpio0 | 32 | 0x33810000 | hsi_port0 |
| hsi_gpio1 | 32 | 0x33814000 | hsi_port1 |
| hsi_gpio2 | 3 | 0x33818000 | hsi_port2 |
| cam_gpio0 | 16 | 0x37130000 | cam_port0 |
| peri_gpio0 | 27 | 0x390b0000 | peri_port0 |
驱动代码
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 共有特性,和具体电路板无关,一般情况下不用修改。
S600 GPIO 控制器的设备树定义位于 SDK 包的 hobot-drivers/kernel-dts 文件夹下的 drobot-s600-pinctrl.dtsi 文件内。
drobot-s600-pinctrl.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>;
};
S600所有引脚的 GPIO 配置位于 SDK 包的 hobot-drivers/kernel-dts 文件夹下路径为drobot-s600-pinctrl.dtsi的文件内。
用户需要配置特定引脚为 GPIO 功能时,可以直接引用预定义 GPIO 配置:
GPIO 设备树节点的属性命名方式一般为<names>-gpios或<names>-gpio,举例如下:
/**
* hsi_port0表示hsi sys的第一个gpio设备
* 下列设备节点共有三个gpio引脚,分别是:
* hsi sys的第一个gpio设备 0号引脚(从0开始)
* hsi sys的第一个gpio设备 1号引脚(从0开始)
* cam sys的第一个gpio设备 8号引脚(从0开始)
* GPIO_ACTIVE_HIGH表示高电平有效,一般设为GPIO_ACTIVE_HIGH
*/
gpio-test {
test-gpios = <&hsi_port0 0 GPIO_ACTIVE_HIGH
&hsi_port0 1 GPIO_ACTIVE_HIGH
&cam_port0 8 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);