openwrt-dts-gpio-控制LTE上电及LED点亮

记录一下

板子MT7620 16+64 


最近在弄LTE/4G的移植.当kernel添加了usb cdc-acm rndis以后。发现板子没有发现LTE模块。

在LTE模块上接上串口,没有打印输出。

测量电压发现电压也不对。


于是猜测LTE模块没有上电。

查找MT7620 datasheet 查找GPIO给LTE模块上电的GPIO口。


通过电路图发现,GPIO为 11 低电平 则给模块上电。


于是在/sys/class/gpio 下面 输入如下命令:

echo 11 > export

[ 1572.890000] rt2880-pinmux pinctrl: pin 66 is not set to gpio mux
[ 1572.910000] rt2880-pinmux pinctrl: request() failed for pin 66
[ 1572.920000] rt2880-pinmux pinctrl: pin-66 (pio:66) status -22
ash: write error: Invalid argument


提示如上错误。

这是因为11管脚被复用了.

所以要对它进行解复用.(这块我自已也搞糊涂了,不清楚是要解复用还是要复用。希望清楚的同学帮忙指证一下。)

于是就要想办法把管脚11的GPIO文件给搞出来。于是研究了一下DTS 中GPIO相关的东西。


//这篇文档给了我极大的帮助。

//它详细的解释了,如何解释了GPIO的对应关系,如何设置等方法

http://wiki.wrtnode.com/index.php?title=Released_multiused_GPIO_and_register_gpio-leds/zh-cn

直接把内容贴过来了。


mt7620n.dtsi里对gpio的注册

我们假定$(TOPDIR)为OpenWrt的编译目录。

在$(TOPDIR)/target/linux/ramips/dts/mt7620n.dtsi里有对gpio的注册

注:结合mt7620的datasheet里GPIO pin share schemes以及在mt7620n.dtsi里我们看到有,将GPIO#0到GPIO#72(中间有仅仅做GPO或GPI的)分为四组GPIO0-GPIO3;

对应GPIO0是从GPIO#0开始到GPIO#23,一共有24个;对应GPIO1是从GPIO#24开始到GPIO#39,一共有16个;对应GPIO2是从GPIO#40开始到GPIO#71,一共有32个;

对应GPIO4对应的是GPIO#72,仅有一个。




三:在WRTNODE.dts里对led、keys等的注册

在$(TOPDIR)/target/linux/ramips/dts/WRTNODE.dts里可以来注册通过gpio接口控制的设备,如led、keys等

如果想用GPIO接口首先要使能GPIO并且释放gpio引脚复用功能:

使能GPIO:

释放gpio引脚复用功能:

引脚复用的定义在$(TOPDIR)/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620n/linux-3.10.28/arch/mips/ralink/mt7620.c

注:路径不一定为这个,根据你自己的内核版本,linux-3.10.xx

同理,其他复用引脚的定义一样。

下面就来看如何在WRTNODE.dts里注册具体的gpio设备(led,key等等),注册的方法可以参照 $(TOPDIR)/target/linux/ramips/dts/RT-N14U.dts

注:dts里对设备的注册很简单,如gpio-leds的注册,compatible要与Led的驱动leds-gpio.c里compatible对应,label是设备的名字,设备注册成功,在WRTnode文件系统下就会有 /sys/class/leds/wrtnode:blue:wan , 我们可以通过

echo 1 > /sys/class/leds/wrtnode\:blue\:wan/brightness
echo 0 > /sys/class/leds/wrtnode\:blue\:wan/brightness  来控制亮灭

gpios = <&gpio2 0 1>,这是指定对应的gpio引脚(GPIO#40)



通过上面的内容,了解了如何查看GPIO的值,以及映射关系。然后查看mt7620.c文件。

查找GPIO11是跟谁对应的。


从代码中可以看到,是uartf。

然后就是将uartf 添加到对应的DTS文件中.



改好了以后,重新编译。

烧到板子中去。


到/sys/class/gpio/下面去执行命令:

echo 11 > export

root@OpenWrt:/sys/class/gpio# ls
export      gpio11      gpiochip0   gpiochip24  gpiochip40  unexport


gpio11已经出来了。

cd gpio11

echo 0 > value  

这样就是把GPIO11设置为低电平:然后就看到串口出现了讨喜的打印:

[   88.000000] usb 1-1: new high-speed USB device number 2 using ehci-platform
a[   88.290000] cdc_acm 1-1:1.0: This device cannot do calls on its own. It is not a modem.

[   94.340000] usb 1-1: USB disconnect, device number 2

[   98.720000] usb 1-1: new high-speed USB device number 3 using ehci-platform
/[   98.910000] cdc_ether 1-1:2.0 eth1: register 'cdc_ether' at usb-101c0000.ehci-1, CDC Ethernet Device, 00:11:22:33:44:56
[   99.030000] cdc_acm 1-1:2.2: This device cannot do calls on its own. It is not a modem.
[   99.040000] cdc_acm 1-1:2.2: ttyACM0: USB ACM device
[   99.090000] cdc_acm 1-1:2.4: This device cannot do calls on its own. It is not a modem.
[   99.100000] cdc_acm 1-1:2.4: ttyACM1: USB ACM device
d[   99.110000] cdc_acm 1-1:2.6: This device cannot do calls on its own. It is not a modem.
[   99.130000] cdc_acm 1-1:2.6: ttyACM2: USB ACM device


root@OpenWrt:/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio11# ls /dev/ |
grep tty
tty
ttyACM0
ttyACM1
ttyACM2
ttyS0
ttyS1

已经可以看到ACM0 ACM1 ACM2了。


至此GPIO相关东西结束。

有送4G/LTE移植的相关东西.详见我的另一篇文档





你可能感兴趣的:(OPENWRT,GPIO,LINUX,嵌入式,DTS)