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

  

 

  

 

posted @ 2021-02-27 20:32  凡尘夫子  阅读(1582)  评论(0编辑  收藏  举报