2018/01/30

在 PC 編譯 wiringPi

參考了 raspberry pi 操控 gpio 的幾個方法
原本最想要的是直接存取,不知道哪裡沒弄好,gpio8 以上的行為怪怪的,只能 out,設定成 in 時,不管是拉 3.3v 還是 gnd 都是 low,所以改用 wiringpi 來處理。基於上篇,還是在 PC 上編譯 wiringPi 再拿去 raspberry pi 執行。

下載 wiringPi 原始碼

參考官網
git clone git://git.drogon.net/wiringPi

編譯主元件

需要編譯的內容是 wiringPi 和 devLib 這兩支,因為原先的 Makefile 內容是放在 raspberry pi 上編譯用的,所以需要做一些小小的調整,以便符合在 PC 上進行 cross compile。

wiringPi/Makefile 在 LIBS = 後面追加下列內容來蓋掉前面的設定
RPI_BASE := $(HOME)/rpi
CROSS := $(RPI_BASE)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
CC := $(CROSS)gcc
AR := $(CROSS)ar
RANLIB := $(CROSS)ranlib

devLib/Makefile 一樣在 LIBS = 後面追加
RPI_BASE := $(HOME)/rpi
CROSS := $(RPI_BASE)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
CC := $(CROSS)gcc
AR := $(CROSS)ar
RANLIB := $(CROSS)ranlib
INCLUDE += -I../wiringPi

原先的 Makefile 只編出 shared object,如果想要編出 static object,就在 all: 追加 $(STATIC) 就可以了。

編譯 gpio

因為是要先測試功能,所以使用 static object 的 wiringPi 元件,這樣就只需要把 gpio 程式放到 nfs 就能執行。

gpio/Makefile 還是在 LIBS = 後面追加
RPI_BASE := $(HOME)/rpi
CROSS := $(RPI_BASE)/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-
CC := $(CROSS)gcc
AR := $(CROSS)ar
RANLIB := $(CROSS)ranlib
INCLUDE += -I../wiringPi -I../devLib
LDFLAGS += -L../wiringPi -L../devLib

把 gpio 放到 nfs 上面,把 raspberrypi 的 v33 接到 gpio26 進行測試,改接gnd 再測,再改回 v33 再測,終於可以正常當 input 了。

安裝 shared object

如果有多支程式需要用到 wiringPi,做成 shared object 會比較理想。先把編譯好的 libwiringPi.so.2.44 和 libwiringPiDev.so.2.44 複製到 host 的 nfs 上,然後從 raspberrypi 上複製到 /lib 同時處理 symbolic link。
sudo cp /mnt/nfs/libwiringPi.so.2.44 /lib
sudo ln -s /lib/libwiringPi.so.2.44 /lib/libwiringPi.so
sudo cp /mnt/nfs/libwiringPiDev.so.2.44 /lib
sudo ln -s /lib/libwiringPiDev.so.2.44 /lib/libwiringPiDev.so



完成

基本上到此已經能完全操控 gpio,如果為了效能跟空間,可以參考 wiringPi 的 gpio,把不需要的拿掉,放到自己的程式內部。由於 gpio 需要 sudo 執行,基於安全上的考量,可能要改寫成 gpiod,再透過 ipc 跟 shared memory 去要求或進行控制。

沒有留言: