# 扩展引脚功能定制

### 添加uart2支持

PH6,7,8,9默认为SPI PH4,5默认为I2C 要将PH5 PH6作为UART2使用，则原先的默认功能就要关闭，uart2功能要打开

安卓SDK设备树文件为： longan/device/config/chips/h618/configs/p2/linux-5.4/board-k2b.dts

LinuxSDK设备树文件为： aw-image-build/source/kernel/linux-5.4-h618/arch/arm64/boot/dts/sunxi/sun50iw9-kickpi-k2b.dts

![cf9c366bb88d7214bc93412cbc0accb3](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/cf9c366bb88d7214bc93412cbc0accb3.jpg)

### sys gpio控制

将GPIO释放出来，通过/sys/class/gpio进行控制

步骤一 修改管脚状态

/sys/class/gpio/export 只能导出UNCLAIMED状态的 gpio

查看所需管脚是否是UNCLAIMED状态

```shell
cat /sys/kernel/debug/pinctrl/300b000.pinctrl/pinmux-pins
```

管脚非UNCLAIMED状态 说明管脚被内核注册了，需要修改设备树，注释掉其默认功能

PH2 PH3 做举例

查询管脚状态，发现PH2 PH3作为了uart5

![image-20250326115428401](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20250326115428401.png)

```diff
vim longan/device/config/chips/h618/configs/p2/linux-5.4/board-*.dts  //android
vim source/kernel/linux-5.4-h618/arch/arm64/boot/dts/sunxi/sun50iw9-kickpi-k2b.dts //Linux
```

关闭默认功能

![image-20250326133713399](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20250326133713399.png)

步骤二

​ 编译镜像，重新烧录

步骤三

​ 确认gpio未被注册

```
root@kickpi:~# cat /sys/kernel/debug/pinctrl/300b000.pinctrl/pinmux-pins | grep PH
```

​ 能够看到PH2 PH3未被使用，且对应 pin 值为 226 227

![image-20250326142700157](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20250326142700157.png)

步骤四

​ 通过 /sys/class/gpio/export 注册 PH2，PH3 并进行控制

![image-20250326142738724](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20250326142738724.png)

通过结点下的内容控制 gpio , 常用如下

设置GPIO方向

```shell
echo in > /sys/class/gpio/gpio226/direction
echo out > /sys/class/gpio/gpio226/direction
```

设置GPIO值

```
cat /sys/class/gpio/gpio226/value 		// 读取
echo 1 > /sys/class/gpio/gpio226/value	// 配置高电平
echo 0 > /sys/class/gpio/gpio226/value  // 配置低电平
```

### 示例功能配置

GPIO输出

K2B开发板默认配置两路GPIO输出功能，分别为PC12（12脚）、PC7（14脚）

注意：其他引脚已配置为其他功能，若要配置为GPIO功能，则需要先把默认功能去掉

其中PC管脚输出电压为1.8V，PH管脚输出电压为3.3V

GPIO输出 提供两种控制方式，分别为gpio-leds、gpio\_para

**gpio-para**

是全志的GPIO控制驱动，可实现简单的电平高低控制

系统中目录位于/sys/class/gpio\_sw

以下示例为 扩展引脚PC7、PC12的配置

增加或删减注意修改gpio\_num的值

```
&soc {
        gpio_para {
                gpio_num = <2>;
                gpio_pin_1 = <&pio PC 7 GPIO_ACTIVE_HIGH>;
                gpio_pin_2 = <&pio PC 12 GPIO_ACTIVE_HIGH>;
                status = "okay";
        };
};
```

**gpio-leds**

gpio-leds 是LINUX内核自带的GPIO控制驱动，可实现丰富的控制方式

系统中目录位于/sys/class/leds

以下示例为 系统运行指示灯配置，实现心跳闪烁功能

```
/{
		gpio-leds {
                compatible = "gpio-leds";
                status = "okay";

                sys_led {
                        label="sys_led";
                        gpio = <&pio PI 16 GPIO_ACTIVE_HIGH>;
                        linux,default-trigger = "heartbeat";
                };
        };
};
```

**GPIO按键**

```
/{
		gpio-keys {
                compatible = "gpio-keys";
                status = "okay";
                autorepeat;

                power {
                        label = "Power Key";
                        linux,code = <KEY_POWER>;
                        gpio = <&pio PC 2 GPIO_ACTIVE_LOW>;     /* PC7 */
                        wakeup-source;
                        debounce-interval = <100>;
                };
        };
};
```
