WRTnode 進階篇-gpio的使用
時間:2018-09-29 來源:未知
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>;
+ };
+ };

