DragonBoard 410c(Debian)でGPIOを使用する
そろそろDragonBoard(debian)でもGPIOを使用したくなってきましたので、GPIOを使用するための設定を行いたいと思います。
お急ぎの方は下の方にある解答編まで飛ばしてください。
手順
DragonBoard(debian)でGPIOを使用するには2つののライブラリが必要になります。
libsoc
96BoardsGPIO
これらを用いることでGPIOがC言語およびpythonでも使用できるようになります。 ※pythonに関しては言語用Bindingがあるので、それを経由してLibraryにアクセスすることになります。
今回はこちらを参考にさせていただいています。
参考にしていたエントリのまんまなので楽勝と思っている自分がいました。
基本的にはどちらもソースファイルをGithubから取得しbuildしていくというものになります。
buildに必要なパッケージのインストール
96BoardsGPIO
をbuildする際にautogen.sh
を使用するので以下のパッケージを事前にインストールしておきます。
$ sudo apt-get install autoconf automake libtool
事前の準備は終了しました。
libsoc
をインストールする
libsocのgithubページは以下になります。
$ git clone https://github.com/jackmitch/libsoc.git $ cd libsoc $ autoreconf -i $ ./configure --enable-board="dragonboard410c" $ make $ sudo make install
以上の手順で無事にインストールできました。
96BoardsGPIO
をインストールする
手順を確認すると以下の様になるのですが…
$ git clone https://github.com/96boards/96BoardsGPIO.git
$ cd 96BoardsGPIO
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig
make
を実行すると以下のようにErrorが発生してしまいます。
$ make Making all in lib make[1]: Entering directory '/home/linaro/96BoardsGPIO/lib' /bin/bash ../libtool --tag=CC --mode=compile gcc -DPACKAGE_NAME=\"96BoardsGPIO\" -DPACKAGE_TARNAME=\"96boardsgpio\" -DPACKAGE_VERSION=\"0.1\" -DPACKAGE_STRING=\"96BoardsGPIO\ 0.1\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"96boardsgpio\" -DVERSION=\"0.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -I../lib -g -O2 -MT lib96BoardsGPIO_la-gpio.lo -MD -MP -MF .deps/lib96BoardsGPIO_la-gpio.Tpo -c -o lib96BoardsGPIO_la-gpio.lo `test -f 'gpio.c' || echo './'`gpio.c libtool: compile: gcc -DPACKAGE_NAME=\"96BoardsGPIO\" -DPACKAGE_TARNAME=\"96boardsgpio\" -DPACKAGE_VERSION=\"0.1\" "-DPACKAGE_STRING=\"96BoardsGPIO 0.1\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"96boardsgpio\" -DVERSION=\"0.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -I../lib -g -O2 -MT lib96BoardsGPIO_la-gpio.lo -MD -MP -MF .deps/lib96BoardsGPIO_la-gpio.Tpo -c gpio.c -fPIC -DPIC -o .libs/lib96BoardsGPIO_la-gpio.o gpio.c: In function ‘gpio_id’: gpio.c:63:17: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration] char *fixed = strdup(pin_name); ^~~~~~ gpio.c:63:17: warning: incompatible implicit declaration of built-in function strdup’ gpio.c: In function ‘gpio_open’: gpio.c:98:41: error: ‘LS_SHARED’ undeclared (first use in this function) gpio *g = libsoc_gpio_request(gpio_id, LS_SHARED); ^~~~~~~~~ gpio.c:98:41: note: each undeclared identifier is reported only once for each function it appears in gpio.c:101:7: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration] if (!strcmp(direction, "in")) ^~~~~~ Makefile:459: recipe for target 'lib96BoardsGPIO_la-gpio.lo' failed make[1]: *** [lib96BoardsGPIO_la-gpio.lo] Error 1 make[1]: Leaving directory '/home/linaro/96BoardsGPIO/lib' Makefile:459: recipe for target 'all-recursive' failed make: *** [all-recursive] Error 1
warningは目を瞑るとして、
gpio.c:98:41: error: ‘LS_SHARED’ undeclared (first use in this function) gpio *g = libsoc_gpio_request(gpio_id, LS_SHARED); ^~~~~~~~~ gpio.c:98:41: note: each undeclared identifier is reported only once for each function it appears in
エラーメッセージから推測するとLS_SHARED
というシンボルが読み取れないということのようです。LS_SHARED
はlibsocのヘッダーファイルに定義されていたので、ヘッダーファイルのパスが想定とは違っているようです。っていうか、参考にしたサイトはこれでいいということのようなんですが、OSのバージョンということなんでしょうか。
色々試してみたのですが、自分のキャパを超えていたのでどうすればいいかわからず、OSを入れたりconfigureをいじってみたり、オプションを変えてみたりしました。
解答編
OSを何度もいれたりして試したのですが諦めて色々と調べているとlibsocのLibraryのReadmeに以下のような部分を発見。
First, check if your distro packages libsoc. If it does it is easiest to install your distros version of libsoc through it’s provided package manager. Depending on your distro this may be apt-get, yum, pacman, etc. Consult your distro documentation for more info
もしかしてパッケージ化されたLibraryがあるんじゃない?と思って試してみました。
あるし… (ちなみになぜかデフォルトでlibsocのpythonバインドのパッケージが既にインストールされています。)
気を取り直して、まっさらな状態からのインストール手順をまとめます。
$ sudo apt-get install autoconf automake libtool $ sudo apt-get install libsoc2 libsoc-dev python-libsoc $ git clone https://github.com/96boards/96BoardsGPIO.git $ cd 96BoardsGPIO/ $ ./autogen.sh $ ./configure $ make ...(略)... gpio.Tpo -c gpio.c -fPIC -DPIC -o .libs/lib96BoardsGPIO_la-gpio.o gpio.c: In function ‘gpio_id’: gpio.c:63:17: warning: implicit declaration of function ‘strdup’ [-Wimplicit-function-declaration] char *fixed = strdup(pin_name); ^~~~~~ gpio.c:63:17: warning: incompatible implicit declaration of built-in function strdup’ gpio.c: In function ‘gpio_open’: gpio.c:101:7: warning: implicit declaration of function ‘strcmp’ [-Wimplicit-function-declaration] if (!strcmp(direction, "in")) ^~~~~~ ...(略)... $ sudo make install $ sudo ldconfig
今回はwaringは発生していますが、Errorは発生せずにインストールできるようになりました。(96BoardsGPIOのインストール手順は変更ありません。)
これでOKです。
サンプルの実行
インストールが無事終了したので実際のサンプルでLチカを行ってみたいと思います。
上記の図を参考に
- PIN1がGND
- PIN23がGPIO-A
としてLEDを接続します。
96BoardsGPIO
のソースにあるexampleディレクトリに移動して、サンプルソースのmake
を行い成功したらできた実行ファイルを実行します。
$ cd examples/
$ make
$ sudo ./blink
するとこのようになります。
【動画】
無事にLチカすることができました。 同じフォルダにあるpythonのサンプルでもLチカはできています。
設定は終わったはずなんだけど…
インストール後に再度ログインするとログイン時にErrorが発生しています。
Linux linaro-alip 4.9.27-linaro-lt-qcom #1 SMP PREEMPT Wed May 10 19:59:33 UTC 2017 aarch64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Wed May 24 19:26:42 2017 from 192.168.0.7 ERROR: Unable to find libsoc_gpio.conf cat: /usr/local/etc/libsoc_gpio.conf: No such file or directory declare -x HOME="/home/linaro" declare -x JAVA_TOOL_OPTIONS="-Dgnu.io.rxtx.SerialPorts=/dev/tty96B0" declare -x LANG="C.UTF-8" declare -x LOGNAME="linaro" declare -x MAIL="/var/mail/linaro" declare -x MONITOR_PORT="/dev/tty96B0" declare -x OLDPWD declare -x PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" declare -x PWD="/home/linaro" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SSH_CLIENT="192.168.0.7 7154 22" declare -x SSH_CONNECTION="192.168.0.7 7154 192.168.0.8 22" declare -x SSH_TTY="/dev/pts/0" declare -x TERM="xterm" declare -x USER="linaro" declare -x XDG_RUNTIME_DIR="/run/user/1000" declare -x XDG_SESSION_ID="5" linaro@linaro-alip:~$
エラーメッセージを確認するとERROR: Unable to find libsoc_gpio.conf
というエラーが発生しています。libsocの設定ファイルがみあたらないようです。ソースからインストールした時には発生しなようですが、パッケージでのインストールでは発生してしまっているようです。
仕方なくエラーメッセージからググってみると…
というようなページを見つけました。なければ作れということのようです。 そこで以下のファイルを開いて
$ sudo vi /etc/libsoc_gpio.conf
以下のように編集します。
【/etc/libsoc_gpio.conf】
# board model = Qualcomm Technologies, Inc. APQ 8016 SBC # GPIO # dragonboard 410c pin layout #<Pin Name> = <SoC Num> GPIO_A = 36 GPIO_B = 12 GPIO_C = 13 GPIO_D = 69 GPIO_E = 115 GPIO_F = 4 GPIO_G = 24 GPIO_H = 25 GPIO_I = 35 GPIO_J = 34 GPIO_K = 28 GPIO_L = 33 # include mappings by pin number on board GPIO_23 = 36 GPIO_24 = 12 GPIO_25 = 13 GPIO_26 = 69 GPIO_27 = 115 GPIO_28 = 4 GPIO_29 = 24 GPIO_30 = 25 GPIO_31 = 35 GPIO_32 = 34 GPIO_33 = 28 GPIO_34 = 33
内容としてはGPIOのpinとアサインの設定を記載したファイルになるのだと思います。 このあと再度ログインをするとエラメッセージは消えました。
終わりに
今回もいろいろと迷い路をしていましたが、ようやくDragonBoardでもGPIOが使用できるようになりました。電圧が1.8Vなのが気になりますが、これからまた考えていこうかと思います。