GPIO资源
WRTnode1的GPIO的对应关系请参考mt7620的datasheet WRTnode2的GPIO的对应关系请参考mt7688的datasheet
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个; 对应GPIO3对应的是GPIO#72,仅有一个。
在WRTNODE.dts里对led、keys等的注册 在$(TOPDIR)/target/linux/ramips/dts/WRTNODE.dts里可以来注册通过gpio接口控制的设备,如led、keys等 如果想用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 同理,其他复用引脚的定义一样。
dts里注册led、按钮
下面就来看如何在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的调用
用户空间访问gpio,即通过sysfs接口访问gpio 控制GPIO的目录位于:/sys/class/gpio
/sys/class/gpio/export export 用于通知系统需要导出控制的GPIO引脚编号
/sys/class/gpio/unexport
unexport 用于通知系统取消导出
/sys/class/gpio/gpiochipX gpiochipX 表示的就是一个gpio_chip,用来管理和控制一组gpio端口的控制器 目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称或标志label,引脚总数ngpio
/sys/class/gpioN gpioN 指代具体的gpio引脚,目录下有如下属性文件 direction 表示gpio端口的方向,读取结果是in或out。 value 表示gpio引脚的电平,0(低电平)1(高电平),如果gpio被配置为输出,这个值是可写的,记住任何非零的值都将输出高电平 edge 表示中断的触发方式
导出一个引脚的操作步骤 1.计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数(偏移量) 2.向/sys/class/gpio/export写入此编号,比如0号引脚,在shell中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio0目录,如果没有出现相应的目录,说明此引脚不可导出:
echo 0 > /sys/class/gpio/export
3./sys/class/gpio/gpio0下direction文件,定义输入输出方向 定义为输出:
echo out > direction
定义为输入:
echo in > direction
4:/sys/class/gpio/gpio0下value文件 value 表示gpio引脚的电平,0(低电平)1(高电平),如果gpio被配置为输出,这个值是可写的,记住任何非零的值都将输出高电平
echo 1 > value
导出gpio0引脚
将GPIO注册为一个led灯、按钮
配置
"make menuconfig"命令进入配置界面,选择Led、Button驱动(默认编译的时候已经选上) 选择len、button驱动 Led 驱动:
LED modules ---> <*> kmod-leds-gpio
<*> kmod-ledtrig-usbdev
Button 驱动:
Other modules ---> <*> kmod-gpio-button-hotplug.
修改dts注册led、按钮(以WRTnode1为准) 打开并修改WRTNODE.dts 添加相关设备树、注册一个led灯 其中WRTnode1的led灯添加如下:
+ gpio-leds {
+ compatible = "gpio-leds";
+ indicator {
+ label = "wrtnode:blue:indicator";
+ gpios = <&gpio1 14 1>;
+ };
+ };
compatible要与Led的驱动leds-gpio.c里compatible对应。label是设备的名字,在文件系统/sys/class/leds/目录下设备名对应 gpios = <&gpio1 14 1>,这是指定对应的gpio引脚(GPIO#38) 注册Button
+ gpio-keys-polled {
+ compatible = "gpio-keys-polled";
+ #address-cells = <1>;
+ #size-cells = <0>;
+ poll-interval = <20>;
+ reset {
+ label = "reset";
+ gpios = <&gpio0 1 1>;
+ linux,code = <0x198>;
+ };
+ };