MT7628NN的GPIO复用控制
版本:Openwrt19.07
芯片:MT7268NN
1、在源码 /target/linux/rampis/dts目录中,打开 mt7628an.dtsi 查看注册复用的GPIO
gpio: gpio@600 {
compatible = "mediatek,mt7621-gpio";
reg = <0x600 0x100>;
interrupt-parent = <&intc>;
interrupts = <6>;
#interrupt-cells = <2>;
interrupt-controller;
gpio-controller;
#gpio-cells = <2>;
};
i2c: i2c@900 {
compatible = "mediatek,mt7621-i2c";
reg = <0x900 0x100>;
resets = <&rstctrl 16>;
reset-names = "i2c";
#address-cells = <1>;
#size-cells = <0>;
status = "disabled"; #disabled为该复用功能未启用,若需启用,改为 okay或禁用这一行。
2、如果需要查看复用的GPIO引脚定义,编译过后,查看/build_dir/toolchain-mipsel_24kc_gcc-8.4.0_musl/linux-5.4.92/arch/mips/ralink/mt7620.c 文件
static struct rt2880_pmx_func i2s_grp_mt7628[] = { FUNC("antenna", 3, 0, 4), FUNC("pcm", 2, 0, 4), FUNC("gpio", 1, 0, 4), FUNC("i2s", 0, 0, 4), };
#( GPIO名称,编号,GPIO#起始号,占用引脚数),如 i2s功能组,编号为0 ,GPIO#0开始 ,占4个GPIO,即i2s功能组为 GPI#0 -- GPIO#3 static struct rt2880_pmx_func spi_cs1_grp_mt7628[] = { FUNC("-", 3, 6, 1), FUNC("refclk", 2, 6, 1), FUNC("gpio", 1, 6, 1), FUNC("spi cs1", 0, 6, 1), };
3、在源码 /target/linux/rampis/dts目录中,修改 mt7628an_xxxxx.dts , 在state_default的gpio组中添加要改成GPIO控制的复用功能名称
&state_default {
gpio {
#groups = "gpio","wled_an", "i2s", "i2c","refclk", "perst", "wdt", "spi cs1";
groups = "gpio","wled_an","i2s";
function = "gpio";
};
};
4、在用户态层控制GPIO
在编译时,kernel_menuconfig中启用 Device Drivers ---> GPIO Suppot ---> sys/class/gpio/...(sysfs interface)
升级固件后,在 /sys/class/gpio 会出现 gpio这个目录,包含有两个文件 export、unexport 和 3组GPIO控制器
export 用于将指定编号的引脚导出,作为GPIO使用
unexport 用于将导出的GPIO删除掉
gpiochip416、gpiochip448、gpiochip480 对应3组GPIO控制器,每组32个GPIO引脚
导出GPIO:
查看MT7628 datasheet文档中GPIO功能对应的 GPIO#N 引脚。
如 无线wifi灯 wled_an 为 GPIO#44 ,44 - 32 = 12 在第2组gpiochip448中, 448 + 12 = 460 故:
echo "460" > export
导出成功后会在当前目录下生成 gpio460文件夹 ,文件夹内包含三个主要方法 direction、value、edge
direction
设置输出还是输入模式
设置为输入:echo “in” > direction
设置为输出:echo “out” > direction
value
输出时,控制高低电平;输入时,获取高低电平
高电平:echo 1 > value
低电平:echo 0 > value
edge
控制中断触发模式,引脚被配置为中断后可以使用poll() 函数监听引脚
非中断引脚: echo “none” > edge
上升沿触发:echo “rising” > edge
下降沿触发:echo “falling” > edge
边沿触发:echo “both” > edge
综合:控制GPIO#44输出高电平,点亮wled_an灯
echo "460" > export echo "out" > gpio460/direction echo "1" > gpio460/value