Linux下控制GPIO的方法有N種,詳細請參考《RPi GPIO Code Samples》,文中用十多種語言演示了如何控制GPIO,非常全面詳盡。因此,這里不再多做贅述,僅把調試過程中整理的腳本貼上並做簡單的分析。特別說明,Linux必須有root權限!!!否則會出現/system/bin/sh: can't create /sys/class/gpio/export: Permission denied等錯誤。
@echo off echo adb root adb root >%temp%\_tmp @findstr "already" %temp%\_tmp @if NOT errorlevel 1 goto config timeout /T 10 :config @echo on adb shell chmod 0666 /sys/class/gpio/export adb shell chmod 0666 /sys/class/gpio/unexport adb shell echo 62 ">" /sys/class/gpio/export adb shell echo 63 ">" /sys/class/gpio/export adb shell chmod 0666 /sys/class/gpio/gpio62/direction adb shell chmod 0666 /sys/class/gpio/gpio63/direction adb shell chmod 0666 /sys/class/gpio/gpio62/value adb shell chmod 0666 /sys/class/gpio/gpio63/value adb shell echo out ">" /sys/class/gpio/gpio62/direction adb shell echo out ">" /sys/class/gpio/gpio63/direction adb shell echo 1 ">" /sys/class/gpio/gpio62/value adb shell echo 1 ">" /sys/class/gpio/gpio63/value @echo off :top adb shell echo 1 ">" /sys/class/gpio/gpio62/value adb shell echo 1 ">" /sys/class/gpio/gpio63/value rem @timeout /T 1
for /l %%i in (1,1,768) do echo %%i>nul rem ping 0.0.0.1 -n 1 -w 500>nul adb shell echo 0 ">" /sys/class/gpio/gpio62/value adb shell echo 0 ">" /sys/class/gpio/gpio63/value rem @timeout /T 1
for /l %%i in (1,1,768) do echo %%i>nul rem ping 0.0.0.1 -n 1 -w 500>nul goto top pause.
該批處理文件運行在PC上,通過adb發送shell命令操作/sys/class/gpio以控制GPIO。
在MSM8996的開發板上測試,運行結果如下圖所示。
從圖中可以看出,兩個GPIO的控制時間間隔相差約40ms,說明GPIO控制延時較為嚴重。
#!/system/bin/sh
chmod 0666 /sys/class/gpio/export chmod 0666 /sys/class/gpio/unexport echo 62 > /sys/class/gpio/export echo 63 > /sys/class/gpio/export chmod 0666 /sys/class/gpio/gpio62/direction chmod 0666 /sys/class/gpio/gpio63/direction chmod 0666 /sys/class/gpio/gpio62/value chmod 0666 /sys/class/gpio/gpio63/value echo out > /sys/class/gpio/gpio62/direction echo out > /sys/class/gpio/gpio63/direction echo 1 > /sys/class/gpio/gpio62/value echo 1 > /sys/class/gpio/gpio63/value while : do
echo 1 > /sys/class/gpio/gpio62/value echo 1 > /sys/class/gpio/gpio63/value usleep 100000
echo 0 > /sys/class/gpio/gpio62/value echo 0 > /sys/class/gpio/gpio63/value usleep 100000
done
該腳本運行在MSM8996開發板上,通過操作/sys/class/gpio以控制GPIO,執行結果如下圖所示。
從圖中可以看出,兩個GPIO的控制時間間隔相差約0.6ms,說明GPIO控制延時較小。
Android腳本文件可通過如下命令發送到開發板上,並修改其屬性。
pushd %~dp0 adb push .\gpio.sh /data/local/ adb shell chmod 777 /data/local/gpio.sh
參考:
How to use GPIO signals(Linux應用程序控制GPIO) PNG
https://developer.ridgerun.com/wiki/index.php/How_to_use_GPIO_signals
樹莓派上使用多種語言(C、Python、shell)控制GPIO
http://elinux.org/RPi_GPIO_Code_Samples
安卓應用程序通過JNI控制GPIO
http://android.serverbox.ch/?p=972
Device Tree Usage
http://elinux.org/Device_Tree_Usage
BeagleBone Black (BBB) Pin Muxes
http://www.valvers.com/embedded-linux/beaglebone-black/step04-gpio
Beaglebone Pin Muxes
http://www.valvers.com/embedded-linux/beaglebone/step04-gpio1
Using Device Trees To Configure PRU IO Pins
http://www.ofitselfso.com/BeagleNotes/UsingDeviceTreesToConfigurePRUIOPins.php
BeagleBone Black GPIOs
http://kilobaser.com/blog/2014-07-15-beaglebone-black-gpios
gpio-header
https://github.com/nomel/beaglebone/tree/master/gpio-header
beaglebone-universal-io