OpenWRT 启动后,查看 gpio 的内核信息
root@OpenWrt:~# ls /sys/class/gpio/
export gpiochip416 gpiochip448 gpiochip480 unexport
416/448/480的值比较奇怪,详细原理可以参考这个邮件列表讨论
Linux 的 GPIO 的分配号是从 512 向下开始的,而 MT7628 设计了 0-95 个GPIO,32 个为一组,共 3 组。
第一组 512 - 32 = 480(对应 gpio 0 - 31)
第二组 480 - 32 = 448(对应 gpio 32 - 63)
第三组 448 - 32 = 416(对应 gpio 64 - 95)
如果设置 gpio 4(i2c_sclk),为第一组,480 + 4 = 484
下面是对 gpio 4 的测试
# export gpio 4
echo "484" > /sys/class/gpio/export
# 设置为输出
echo "out" > /sys/class/gpio/gpio484/direction
# 输出高电平
echo "1" > /sys/class/gpio/gpio484/value
# 输出低电平
echo "0" > /sys/class/gpio/gpio484/value
如果设置 gpio 44(wlen_n),为第二组,448 + (44 - 32) = 460
下面是对 gpio 44 的测试
# export gpio 44
echo "460" > /sys/class/gpio/export
# 设置为输出
echo "out" > /sys/class/gpio/gpio460/direction
# 输出高电平
echo "1" > /sys/class/gpio/gpio460/value
# 输出低电平
echo "0" > /sys/class/gpio/gpio460/value
另外 gpio 4 和 gpio 44 的配置在 DTS 上,将 i2c 和 wled_an 管脚配置成 gpio 模式。
比如 TP-Link 的 WR902AC_V3 路由器
openwrt_wr902ac_v3/target/linux/ramips/dts/mt7628an_tplink_tl-wr902ac-v3.dts
&state_default {
gpio {
groups = "i2c", "i2s", "p0led_an", "p2led_an", "p4led_an", "uart1", "wdt", "wled_an";
function = "gpio";
};
};
附:MT7628 datasheet 的 GPIO 的说明
gpio pins
gpio pins