cubieboard2 gpio實作

安裝 gcc及git
sudo apt-get install build-essential make gcc g++ git-core

Using sunxi-gpio kernel module:
CubieBoard官方img的,本身已經帶gpio驅動程式。
官方驅動為gpio-sunxi.ko,位於 /lib/modules/3.4.75+/kernel/drivers/gpio/gpio-sunxi.ko。
因為系統啟動後並沒有載入該驅動程式,需要用戶自行插入,使用insmod命令即可。之後使用lsmod檢查是否可以看到gpio-sunxi。
當然也可以編輯/etc/modules,在其中加入gpio-sunxi.ko。重啟後lsmod檢查是否已經加載。驅動載入完畢後就可以操作GPIO了。


設定GPIO的名稱:
$ git clone git://github.com/linux-sunxi/sunxi-tools.git
$ cd sunxi-tools
$ make
如果出現pkg-config: not found的錯誤訊息,請安裝pkg-config:
sudo apt-get install pkg-config
pkg-config 命令可以用來讀取安裝在 linux 系統上的 library 相關資訊。這個程式主要讀取系統中位於 /usr/lib/pkgconfig 目錄或是環境變數 PKG_CONFIG_PATH 所設定的路徑中的負檔名為 .pc 的檔案,這些檔案包含系統安裝的 library 的相關資訊,包括:安裝的目錄、程式編譯的參數等等。

如果出現No package 'libusb-1.0' found錯誤訊息,請安裝libusb:
sudo apt-get install libusb-1.0-0-dev
[libusb] 是一個 user-space 的 USB 程式庫,在 embedded linux 應用上,在本次編譯上會使用 libusb 實作一個 host 端的應用程式,並透過 USB 介面存取或控制 target device。

modify script.bin
   $ mkdir mnt
   $ sudo mount /dev/nanda ~/mnt
#將剛剛拷貝過來的script.bin轉為script.fex,然後修改script.fex
   $ cp ~/mnt/script.bin ./
   $ ./bin2fex script.bin >./script.fex
#將bin轉為fex並寫入到當前目錄的script.fex文件
   $ vim script.fex

將下列設定文字添增至檔案最後。
--------------------------------------------------------------------------------------
[gpio_para]
gpio_used = 1
gpio_num = 67
gpio_pin_1 = port:PG03<1><default><default><1>
gpio_pin_2 = port:PB19<1><default><default><1>
gpio_pin_3 = port:PB18<1><default><default><1>
gpio_pin_4 = port:PG06<1><default><default><1>
gpio_pin_5 = port:PG05<1><default><default><1>
gpio_pin_6 = port:PG04<1><default><default><1>
gpio_pin_7 = port:PG01<1><default><default><1>
gpio_pin_8 = port:PG02<1><default><default><1>
gpio_pin_9 = port:PG00<1><default><default><1>
gpio_pin_10 = port:PH14<1><default><default><1>
gpio_pin_11 = port:PH15<1><default><default><1>
gpio_pin_12 = port:PI06<1><default><default><1>
gpio_pin_13 = port:PI05<1><default><default><1>
gpio_pin_14 = port:PI04<1><default><default><1>
gpio_pin_15 = port:PG11<1><default><default><1>
gpio_pin_16 = port:PG10<1><default><default><1>
gpio_pin_17 = port:PG09<1><default><default><1>
gpio_pin_18 = port:PG08<1><default><default><1>
gpio_pin_19 = port:PG07<1><default><default><1>
gpio_pin_20 = port:PE08<1><default><default><1>
gpio_pin_21 = port:PE07<1><default><default><1>
gpio_pin_22 = port:PE06<1><default><default><1>
gpio_pin_23 = port:PE05<1><default><default><1>
gpio_pin_24 = port:PE04<1><default><default><1>
gpio_pin_25 = port:PI09<1><default><default><1>
gpio_pin_26 = port:PI08<1><default><default><1>
gpio_pin_27 = port:PI07<1><default><default><1>
gpio_pin_28 = port:PD04<1><default><default><1>
gpio_pin_29 = port:PD03<1><default><default><1>
gpio_pin_30 = port:PD02<1><default><default><1>
gpio_pin_31 = port:PD01<1><default><default><1>
gpio_pin_32 = port:PD00<1><default><default><1>
gpio_pin_33 = port:PE11<1><default><default><1>
gpio_pin_34 = port:PE10<1><default><default><1>
gpio_pin_35 = port:PE09<1><default><default><1>
gpio_pin_36 = port:PD12<1><default><default><1>
gpio_pin_37 = port:PD11<1><default><default><1>
gpio_pin_38 = port:PD10<1><default><default><1>
gpio_pin_39 = port:PD09<1><default><default><1>
gpio_pin_40 = port:PD08<1><default><default><1>
gpio_pin_41 = port:PD07<1><default><default><1>
gpio_pin_42 = port:PD06<1><default><default><1>
gpio_pin_43 = port:PD05<1><default><default><1>
gpio_pin_44 = port:PD20<1><default><default><1>
gpio_pin_45 = port:PD19<1><default><default><1>
gpio_pin_46 = port:PD18<1><default><default><1>
gpio_pin_47 = port:PD17<1><default><default><1>
gpio_pin_48 = port:PD16<1><default><default><1>
gpio_pin_49 = port:PD15<1><default><default><1>
gpio_pin_50 = port:PD14<1><default><default><1>
gpio_pin_51 = port:PD13<1><default><default><1>
gpio_pin_52 = port:PB02<1><default><default><1>
gpio_pin_53 = port:PD25<1><default><default><1>
gpio_pin_54 = port:PD24<1><default><default><1>
gpio_pin_55 = port:PD26<1><default><default><1>
gpio_pin_56 = port:PD27<1><default><default><1>
gpio_pin_57 = port:PD23<1><default><default><1>
gpio_pin_58 = port:PD22<1><default><default><1>
gpio_pin_59 = port:PD21<1><default><default><1>
gpio_pin_60 = port:PI11<1><default><default><1>
gpio_pin_61 = port:PI13<1><default><default><1>
gpio_pin_62 = port:PI10<1><default><default><1>
gpio_pin_63 = port:PI12<1><default><default><1>
gpio_pin_64 = port:PB13<1><default><default><1>
gpio_pin_65 = port:PB11<1><default><default><1>
gpio_pin_66 = port:PB10<1><default><default><1>
gpio_pin_67 = port:PH07<1><default><default><1>
-----------------------------------------------------------------------------------------
將修改過的script.fex轉回script.bin並放回原處
./fex2bin script.fex >  ./script.bin
sudo cp ./script.bin ~/mnt/
sudo umount ~/mnt/
然後重啟系統,新script配置就生效了。
sudo shutdown -r now

重新啟動之後,還要檢查設定有無生效。
 
sudo dmesg | grep gpio
當系統開機的過程中 , kerenel 會被先載入到記憶體 ,並控制著整個系統 . 系統一開起來 , 它會在螢幕顯示一連串的訊息 ,
內容是關於開機過程中kernel 所偵測到的硬體資訊。
而這些訊息會擺在 kernel ring bufer 裡面 , 所謂的 ring buffer 就是當新的資訊進來 , 就會把就資訊覆蓋掉 , 所以稱  ring buffer 。
所以如果想要在開機之後讀取gpio的硬體資訊 , 可以使用 dmesg 指令 。 

echo 1 > /sys/class/gpio/export
 
備註:
對於GPIO的操作,有三個要點要注意:
1)指明操作的埠(port)號。
echo 4 >  /sys/class/gpio/export
ls /sys/class/gpio
在/gpio底下會多出一個port的文件夾==> gpio4_PG06。
2)打開gpio4_PG06,或者 ls gpio4_PG06,可以看到gpio4-PG06裡面的文件,有2個檔案:
分別是 direction 和 value ,可以看出分別代表port的方向和值。
對於direction ,可以寫入echo out >  /sys/class/gpio/gpio4-PG06/direction 設置該port為輸出端。如果不設置,則寫入數據也沒有反應。
3)port reset。
透過向value文件寫入1或者0來完成port reset。
echo 1 >  /sys/class/gpio/gpio4-PG06/value ;set 1.
通過上述3個步驟就可完成對GPIO port的選擇、設置、和使用。
 
bug & solution:
1 gpio-sunxi.ko 這一支driver不會自動被系統載入。
解決方法:編輯 /etc/modules 添加gpio driver。之後每次重啟後,系統即自動載入GPIO driver。
2.每次系統重啟後都需要重新對GPIO reset。
解決方法:編輯 /etc/rc.local,在exit前 加入
echo 4 >  /sys/class/gpio/export
echo out >  /sys/class/gpio/gpio4-pg06/direction
完成對GPIO port reset。
3.系統每次開機後,會對/sys目錄做reset,所以也需調整 /sys的目錄權限為可讀寫。
sudo chmod -R 777 /sys ,此動作也可以編輯/etc/rc.local來完成。


 

留言

熱門文章