gpio.txt
gpio.c
wiringPi 説明資料
https://projects.drogon.net/raspberry-pi/wiringpi/functions/
GPIO_API_for_C/gpio
Usage: gpio -v
gpio -h
gpio [-g|-1] [-x extension:params] ...
gpio [-p] <read/write/wb> ...
gpio <read/write/pwm/mode> ...
gpio readall/reset
gpio unexportall/exports
gpio export/edge/unexport ...
gpio load spi/i2c
gpio unload spi/i2c
gpio i2cd/i2cdetect
https://www.asus.com/jp/Single-Board-Computer/Tinker-Board/ の 「GPIO API C」の手順
「4. インストールが成功したかどうかを確認します。」
実行結果 linaro@Tinker01:~/GPIO_API_for_C/gpio$ gpio -v
gpio version: 2.31
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
asus Pi Details:
Type: ASUS pi, Revision: 02, Memory: 2048MB, Maker: Asus
実行結果 linaro@Tinker01:~/GPIO_API_for_C/gpio$ gpio readall
+-----+-----+---------+------+---+--Tinker--+---+------+---------+-----+-----+
| CPU | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | CPU |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 252 | 8 | SDA.1 | | 1 | 3 || 4 | | | 5V | | |
| 253 | 9 | SCL.1 | | 1 | 5 || 6 | | | 0v | | |
| 17 | 7 | GPIO0C1 | OUT | 1 | 7 || 8 | 1 | SERL | TxD1 | 15 | 161 |
| | | 0v | | | 9 || 10 | 1 | SERL | RxD1 | 16 | 160 |
| 164 | 0 | GPIO5B4 | IN | 1 | 11 || 12 | 1 | | GPIO6A0 | 1 | 184 |
| 166 | 2 | GPIO5B6 | SERL | 1 | 13 || 14 | | | 0v | | |
| 167 | 3 | GPIO5B7 | SERL | 1 | 15 || 16 | 1 | IN | GPIO5B2 | 4 | 162 |
| | | 3.3v | | | 17 || 18 | 1 | IN | GPIO5B3 | 5 | 163 |
| 257 | 12 | MOSI1 | | 0 | 19 || 20 | | | 0v | | |
| 256 | 13 | MISO1 | | 1 | 21 || 22 | 0 | IN | GPIO5C3 | 6 | 171 |
| 254 | 14 | SCLK1 | | 1 | 23 || 24 | 1 | | CE0 | 10 | 255 |
| | | 0v | | | 25 || 26 | 1 | | CE1 | 11 | 251 |
| 233 | 30 | SDA.2 | OUT | 1 | 27 || 28 | 1 | | SCL.2 | 31 | 234 |
| 165 | 21 | GPIO5B5 | IN | 1 | 29 || 30 | | | 0v | | |
| 168 | 22 | GPIO5C0 | IN | 1 | 31 || 32 | 1 | SERL | GPIO7C7 | 26 | 239 |
| 238 | 23 | GPIO7C6 | SERL | 1 | 33 || 34 | | | 0v | | |
| 185 | 24 | GPIO6A1 | | 0 | 35 || 36 | 1 | SERL | GPIO7A7 | 27 | 223 |
| 224 | 25 | GPIO7B0 | SERL | 1 | 37 || 38 | 1 | | GPIO6A3 | 28 | 187 |
| | | 0v | | | 39 || 40 | 0 | | GPIO6A4 | 29 | 188 |
+-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
| CPU | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | CPU |
+-----+-----+---------+------+---+--Tinker--+---+------+---------+-----+-----+
-----------------------------------------------------------
ヘッダファイルのパス
C 標準ではない *.h が <> で括られている
#include <wiringPi.h>
#include <wpiExtensions.h>
#include <gertboard.h>
#include <piFace.h>
インクルードパスを通しているのはどこ?
Makefile で /usr/local/include にパスを通していた
ついでに、ライブラリパスは?
GPIO_API_for_C/gpio/Makefile で /usr/local/lib にパスを通していた
linux のライブラリルールがわからない;
リンカコマンドライン -l[ライブラリ名] だと思うが、該当する名前のファイルがない 探す
-----------------------------------------------------------
ライブラリを探す
GPIO_API_for_C/gpio/Makefile のライブラリ関係の指定
LDFLAGS = -L$(DESTDIR)$(PREFIX)/lib
LIBS = -lwiringPi -lwiringPiDev -lpthread
LDFLAGS は展開すると /usr/local/lib
linaro@Tinker01:~/GPIO_API_for_C/gpio$ _ls /usr/local/lib
合計 96
lrwxrwxrwx 1 root staff 19 12月 19 21:53 libwiringPi.so -> libwiringPi.so.2.31
-rwxr-xr-x 1 root staff 61548 12月 19 21:53 libwiringPi.so.2.31
lrwxrwxrwx 1 root staff 22 12月 19 21:53 libwiringPiDev.so -> libwiringPiDev.so.2.31
-rwxr-xr-x 1 root staff 22972 12月 19 21:53 libwiringPiDev.so.2.31
drwxrwsr-x 4 root staff 4096 12月 14 12:49 python2.7
drwxrwsr-x 3 root staff 4096 9月 18 19:38 python3.5
libwiringPi.so -lwiringPi
libwiringPiDev.so -lwiringPiDev
libwiringPi.so.2.31 と libwiringPiDev.so.2.31 をライブラリとして使用していると仮定して先へ進む
$ man gcc
リンカオプション
-llibrary
名前が library であるライブラリをリンク時に使用します。
リンカは、標準のライブラリ用ディレクトリのリスト中から、 実際のファイル名が `liblibrary.a' であるファイルを検索します。
リンカはこのファイルを、ファイル 名で直接指定した場合と同様に使用します。
検索するディレクトリには、いくつかの標準システムディレクトリと、`-L' によって指定したディレクトリが含まれます。
通常、この方法で発見されるファイルはライブラリファイル、つまりいくつかの オブジェクトファイルをメンバとして含むアーカイブファイルです。
リンカは、アーカイブファイルの中を検索して、 参照されているが定義されていないシンボルを定義しているメンバを 探し出します。
しかし、もしリンカがライブラリでなく通常のオブジェクトファイルを発見した 場合は、そのオブジェクトファイルを通常の方法でリンクします。
`-l' オプションを使用する場合とファイル名を直接指定する場合の違いは、`-l' の場合が library を `lib' と `.a' で囲み、いくつもの
ディレクトリを検索することだけです。
先頭 'lib' が LIBS -l で省略されているのは納得 '.a' ではなく '.so' が省略? 先へ進む
libwiringPi.so.2.31 と libwiringPiDev.so.2.31 を作っているところを探す
/GPIO_API_for_C/wiringPi に libwiringPi.so.2.31
linaro@Tinker01:~/GPIO_API_for_C/wiringPi$ _ls lib*
-rwxr-xr-x 1 root root 61548 12月 19 21:53 libwiringPi.so.2.31
/GPIO_API_for_C/devlib に libwiringPiDev.so.2.31
linaro@Tinker01:~/GPIO_API_for_C/devLib$ _ls lib*
-rwxr-xr-x 1 root root 22972 12月 19 21:53 libwiringPiDev.so.2.31
を見つける
/usr/local/lib にあるライブラリ候補とサイズ・タイムスタンプが同じ
GPIO_API_for_C をインストールした時に、ここ(~/ の下)で作って /usr/local/lib にコピーしていると思われる
/wiringPi /devLib 供にディレクトリ内に Makefile がある
/devLib/libwiringPiDev.so.2.31 の方が規模が小さそうなので、こちらを調べる
/devLib/MakeFile
STATIC=libwiringPiDev.a
DYNAMIC=libwiringPiDev.so.$(VERSION)
の記述を見つける
上で保留した「'.a' と '.so' の違い」のヒントがあった この件は必要あればもっと調べるが、今はここまで
と書いたが、ちょとだけ…
以下、不確定
'.a':静的ライブラリ
リンカが実行ファイルを作成する時に、静的ライブラリから抜出して実行ファイルに含める DOS/Win 系の '.lib' と同じ?
作成
$ gcc -c static-library.c // 'static-library.o' を作る
$ ar r libstatic.a static-library.o // static-library.o を libstatic.a に入れる
$ man ar によると、
ar r(eplacement:同名置換) [対象ライブラリ] [obj-list]
シンボル 15 文字以内なら、「制限」の対象にならない
'.a' '.o' 中に含まれるシンボルの表示
$ nm [name]
linaro@Tinker01:~/GPIO_API_for_C/wiringPi$ nm drcSerial.o
00000000 r .LC0
00000024 r .LC1
U __errno_location
U delay
00000120 T drcSetupSerial
00000078 t myAnalogRead
00000050 t myDigitalRead
00000028 t myDigitalWrite
000000ec t myPinMode
000000a8 t myPullUpDnControl
00000000 t myPwmWrite
U serialClose
U serialDataAvail
U serialGetchar
U serialOpen
U serialPutchar
U strerror
U time
U wiringPiFailure
U wiringPiNewNode
linaro@Tinker01:/usr/lib/gcc/arm-linux-gnueabihf/6$ nm libgcc.a
<省略>
gcc のヘルパルーチンはここから持って来ている?
linaro@Tinker01:/usr/lib/gcc/arm-linux-gnueabihf/6$ nm libstdc++.a
<省略>
gcc の標準関数はここ?他のライブラリにも有るかも
'.so':動的ライブラリ
'.a' の「実行ファイルに含める」他に、DOS/Win 系の '.dll' と同じ様に「実行ファイルに含めずに実行時に読込む」も?
makefile のリンケージ指示を見ればわかるのか?
-----------------------------------------------------------
~/GPIO_API_for_C/gpio の Makefile に戻る
Windows 側にディレクトリ gpio を作り、ファイルを全部コピーする 以降、こちら側で色々試す
コマンドライン・GUI PCManFM を使い分ける
カレント ~/win/Tinker/gpio (以下、@Windows) から make しようとするが失敗する
linaro@Tinker01:~/win/Tinker/gpio$ make -B
make: *** 'version.h' に必要なターゲット '../VERSION' を make するルールがありません. 中止.
Linux 側 ~/GPIO_API_for_C/gpio の下にディレクトリ org を作り、全部の元ファイルをバックアップする
カレント ~/GPIO_API_for_C/gpio (以下、@Tinker) からはうまくいく
linaro@Tinker01:~/GPIO_API_for_C/gpio$ make -B
Need to run newVersion above.
[Compile] gpio.c
gpio.c:1190:13: warning: ‘doVersion’ defined but not used [-Wunused-function]
static void doVersion (char *argv [])
^~~~~~~~~
[Compile] readall.c
[Compile] pins.c
[Link]
Makefile を調べる まだ何も手を着けていないのでどちらも同じ筈
@Windows:Makefile '/VERSION' を検索
000051 version.h: ../VERSION
000052 $Q echo Need to run newVersion above.
@Windows Linux テキストを直接コピペ・編集等すると、変な動きをする
自作プログラム TextForm で変換する // LF->CRLF TAB->Space
タブコードの扱いに迷ったが、8tab でスペース変換する (DOS/Win 上の make で「先頭 TAB 必須」があったような…)
「先頭 TAB 必須」の確認
@Windows で変換した Makefile を @Tinker に上書き
linaro@Tinker01:~/GPIO_API_for_C/gpio$ make
Makefile:52: *** missing separator (did you mean TAB instead of 8 spaces?). 中止.
怒られた(汗)ので、オリジナルから LF->CRLF 変換のみの Makefile を作り直す
今度は OK
linaro@Tinker01:~/GPIO_API_for_C/gpio$ make -B
Need to run newVersion above.
[Compile] gpio.c
gpio.c:1190:13: warning: ‘doVersion’ defined but not used [-Wunused-function]
static void doVersion (char *argv [])
[Compile] readall.c
[Compile] pins.c
[Link]
戻る!
@Windows:Makefile '/VERSION' を検索
000051 version.h: ../VERSION
000052 $Q echo Need to run newVersion above.
何だ、"$Q" って
ifneq ($V,1)
Q ?= @
endif
え;;ーと、
ifneq // if not equal だろう
($V,1) // 「version 番号が 1 でなければ」
Q ?= @ // はい?
ネットで検索したら 「make のオプションに 'V=1' を付けろ」とのこと
$ linaro@Tinker01:~/GPIO_API_for_C/gpio$ make -B V=1
echo Need to run newVersion above.
Need to run newVersion above.
echo [Compile] gpio.c
[Compile] gpio.c
gcc -c -O2 -Wall -I/usr/local/include -Winline -pipe gpio.c -o gpio.o
gpio.c:1190:13: warning: ‘doVersion’ defined but not used [-Wunused-function]
static void doVersion (char *argv [])
echo [Compile] readall.c
[Compile] readall.c
gcc -c -O2 -Wall -I/usr/local/include -Winline -pipe readall.c -o readall.o
echo [Compile] pins.c
[Compile] pins.c
gcc -c -O2 -Wall -I/usr/local/include -Winline -pipe pins.c -o pins.o
echo [Link]
[Link]
gcc -o gpio gpio.o readall.o pins.o -L/usr/local/lib -lwiringPi -lwiringPiDev -lpthread
make 実行の詳細が出るみたい この件、これでよしとする
linaro@Tinker01:~/win/Tinker/gpio$ make -B
make: *** 'version.h' に必要なターゲット '../VERSION' を make するルールがありません. 中止.
「カレントの一つ上に ファイル 'VERSION'」が必要なのか
@Tinker の ~/GPIO_API_for_C/VERSION を @Windows のカレントにコピー
@Windows の Makefile "version.h: ../VERSION" を "version.h: VERSION" に変更
$ linaro@Tinker01:~/win/Tinker/gpio$ make -B V=1
echo Need to run newVersion above.
Need to run newVersion above.
echo [Compile] gpio.c
[Compile] gpio.c
gcc -c -O2 -Wall -I/usr/local/include -Winline -pipe gpio.c -o gpio.o
gpio.c:1190:13: warning: ‘doVersion’ defined but not used [-Wunused-function]
static void doVersion (char *argv [])
echo [Compile] readall.c
[Compile] readall.c
gcc -c -O2 -Wall -I/usr/local/include -Winline -pipe readall.c -o readall.o
echo [Compile] pins.c
[Compile] pins.c
gcc -c -O2 -Wall -I/usr/local/include -Winline -pipe pins.c -o pins.o
echo [Link]
[Link]
gcc -o gpio gpio.o readall.o pins.o -L/usr/local/lib -lwiringPi -lwiringPiDev -lpthread
VERSION を書き換えても version.h が更新されない
Need to run newVersion above.:「上記のnewVersionを実行する必要があります。」
-----------------------------------------------------------
Makefile への深入りはあきらめて、ソースを小変更しながら読む
小変更した後は、メイク・実行で変化を確認
$ linaro@Tinker01:~/win/Tinker/gpio$ make -B
実行ファイルが更新されても動作が変わらない
$ linaro@Tinker01:~/win/Tinker/gpio$ gpio // 変わらない
$ linaro@Tinker01:~/win/Tinker/gpio$ which gpio // コマンドの場所
/usr/local/bin/gpio // コレが実行されている
$ linaro@Tinker01:~/win/Tinker/gpio$ ./gpio // 「カレントの」を付けて今更新した実行プログラムを指定する
ソースにコメントを追加してゆくので、後はソースを参照