以msm8996的Android6.0為例,修改device/qcom/msm8996/init.target.rc文件以控制GPIO。 ...
前文《Android(Linux)控制GPIO的方法及實時性分析》主要使用Linux shell命令控制GPIO,該方法可在調試過程中快速確定GPIO硬體是否有問題,即對應的GPIO是否受控。實際項目中,一般需要對GPIO做特殊控制,如車載導航系統開機就給GPS模塊上電,或在daemon程式中控制GPIO給一個脈衝以Reset藍牙模塊等,就不便用shell 命令來控制,而需要另想辦法。
http://elinux.org/RPi_GPIO_Code_Samples#sysfs介紹瞭如何在C代碼中導出GPIO、設置方向以及控制GPIO,這是完全可以工作的。如果只是需要在系統開機時給GPS模塊上電,那單獨寫一個應用或者把相關代碼放在daemon里,雖然也行,但稍顯麻煩,可採用如下方法簡便實現。
以msm8996的Android6.0為例,修改device/qcom/msm8996/init.target.rc文件,在on post-fs部分添加如下代碼,
write /sys/class/gpio/export 62 write /sys/class/gpio/gpio62/direction out chown system system /sys/class/gpio/gpio62/value chmod 0666 /sys/class/gpio/gpio62/value write /sys/class/gpio/gpio62/value 1
執行make bootimage命令生成boot.img,使用fastboot燒錄boot.img,系統重新啟動即可實現開機自動給GPS模塊上電。類似導出一個GPIO,用於控制藍牙模塊的RESET引腳,就可以在Bluetooth的daemon程式里直接打開/sys/class/gpio/gpio63/value,並對其進行控制,可省去代碼中對export和direction的配置。
特別說明,如果可通過shell腳本導出GPIO併進行控制,而修改init.target.rc卻無反映,則很可能是內核中GPIO的配置有衝突!我在實際調試過程中,就掉到這個坑裡了,折騰好久才最終發現問題的根本原因,GPIO62和GPIO63在內核中被用作了CAM_RST和CAM_STANDBY,線索在dmesg的log里,如下,
[ 18.590187] msm_camera_request_gpio_table:751 gpio 63:CAM_RESET1 request fails
[ 18.590193] msm_camera_request_gpio_table:751 gpio 62:CAM_STANDBY1 request fails
後來通過make kernelconfig,去除camera相關的驅動,重新編譯內核就可以了。
另外,使用chown和chmod命令主要是為了後面Android的APP可訪問/sys/class/gpio/gpio62/value,如果只在Linux的daemon里訪問,chown和chmod應該可省,一如export和direction可直接write。