记录一下
板子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移植的相关东西.详见我的另一篇文档