版本: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