Raspberry Pi で学ぶ ARM デバイスドライバープログラミング

RaspberryPiで学ぶ ARMデバイスドライバープログラミング

RaspberryPiで学ぶ ARMデバイスドライバープログラミング

上記を購入。

「はじめに」に 

Raspberry Pi についてはもとより、デジタル回路やC プログラミングの知識はすでにお持ちだという前提で説明を進めていきます。

とあり門前払いを食らった気分だが見なかったことにして読み進めてく。

内容としては、7セグ LED や LCD といった各種デバイスを実際に Raspberry Pi につないで制御する方法が紹介されている。

で、「Raspberry Pi についてはもとより、デジタル回路やC プログラミングの知識はすでにお持ち」かどうか甚だ疑問な私が実際にサンプルコードを動かしながら読み進めるまでに必要だった手順をご紹介。

Raspbian のビルド

Raspbian のカーネルソースを github から取得してビルドする。

私の作業環境は下記の通り。

  • ターゲット

    • Raspberry Pi Model B+(Plus)
  • ホスト

ターゲットについて、著者は Raspberry Pi Model B Rev.2 以降で動作確認を行っているとのこと。それ以前の旧モデルをお持ちの方は I2C バス番号などを読みかえればたいてい動くだろうが動作保証はできかねるといった感じ。

Raspberry Pi 上でコンパイルするか PC 上でクロスコンパイルするかの2択となりますが、私は後者を選択。 ツールチェーン(クロスコンパイラ、ライブラリなど一式)も github に上がっている。便利。

ソースコード及びツールチェーンの取得

$ git clone https://github.com/raspberrypi/linux

$ git clone https://github.com/raspberrypi/tools

気長に待ちます。 なんなら一晩ぐらい待ちます。 寝る前に仕掛ければ目が覚めたら終わっていることでしょう。

ビルド

取得が終わりましたらばカーネルコンフィグしてビルド。

$ cd linux

$ ARCH=arm make bcmrpi_defconfig

$ ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf- make -j4

と、本に記載の通り実行(ッターン

make: ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc: コマンドが見つかりませんでした
scripts/kconfig/conf --silentoldconfig Kconfig
make: ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc: コマンドが見つかりませんでした
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  HOSTCC  scripts/genksyms/lex.lex.o
  CC      scripts/mod/empty.o
/bin/sh: 1: ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc: not found
make[2]: *** [scripts/mod/empty.o] エラー 127
make[1]: *** [scripts/mod] エラー 2
make[1]: *** 未完了のジョブを待っています....
make[1]: `include/generated/mach-types.h' は更新済みです
  CC      kernel/bounds.s
/bin/sh: 1: ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc: not found
make[1]: *** [kernel/bounds.s] エラー 127
make: *** [prepare0] エラー 2
make: *** 未完了のジョブを待っています....
  HOSTLD  scripts/genksyms/genksyms
make: *** [scripts] エラー 2

エラー。

../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc が無いって。

どれどれ

$ ls -l ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc
lrwxrwxrwx 1 kfurue kfurue 29 1130 23:37 ../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc -> arm-linux-gnueabihf-gcc-4.8.3

あるよ。 実行権限も問題なし。

ここから数日詰まった。 下記で tab 補完した時にちらっと見えた -x64 に答えが。。?

$ ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian
gcc-linaro-arm-linux-gnueabihf-raspbian/     gcc-linaro-arm-linux-gnueabihf-raspbian-x64/
$ ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian

使ってみる

$ ARCH=arm CROSS_COMPILE=../tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- make -j5

高速で流れ始めるログ。唸る冷却ファン。

どうやらビルドマシンの OS 種別によって

を使い分ければよいよう?

正解はよくわからないが、とりあえずこの手順でブート可能なカーネルがビルドできたのでよしとする。

ビルド時間は環境によるだろうが、私の場合30分程度で完了。

SD カードに焼きこんで電源を入れれば自分でビルドしたカーネルで Raspberry Pi を起動させられる。

部品購入

秋葉原なり日本橋なり電気街に行って買ってくればいいんだろうけど、すべて通販で済ませた。

Raspberry Pi 及び SD カードは持っていた(なんならそれしか持ってない)のでそれ以外、ブレッドボードから何からイチから揃える。

私が買ったのは下記。

Amazon

配線とブレッドボードだけ欲しさに以下を購入。

本の内容とは別だが、電子工作の紹介をしているブログが別途あるのでそちらを見ながら遊べそうということで。

配線が下手くそな所為か全く足らないので下記を追加購入。

株式会社秋月電子通商

超高輝度赤色7セグメントLED表示器1文字カソードコモン ボディ黒 C−551SRD: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

ダイナミック接続4桁高輝度赤色7セグメントLED表示器 アノードコモン アノード共通接続: LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販

I2C接続小型キャラクタLCDモジュール 8x2行: ディスプレイ関連 秋月電子通商 電子部品 ネット通販

I2C接続小型LCDモジュール用ピッチ変換基板: パーツ一般 秋月電子通商 電子部品 ネット通販

共立エレショップ

【共立エレショップ】>> 74HC4511 DIP [R指]: 【能動・受動・機構パーツ】 << 電子部品,半導体,キットの通販

【共立エレショップ】>> ★受注単位有★小型カーボン抵抗 1/4W 5% 51Ω: 【能動・受動・機構パーツ】 << 電子部品,半導体,キットの通販

なお、現時点で動作確認できているのは

  • ブレッドボード
  • 抵抗
  • 7セグLED
  • 74HC4511

のみ。

その他、手元には揃っているので動作報告は今後上げていく。

デバイスの接続

まずは7セグLED から順に試していく。

基本、本に記載の通り接続していくだけ。

f:id:kfurue:20141221234801j:plain

こんなんなった。

今回使用するのはアノードコモンということで、カソード側はすべて「抵抗を挟んでロジックIC と接続」「抵抗を挟んでロジックIC と接続」となる。

それ以外の部分も、本の通りにつないでいけば問題ない。

サンプルコードを動かす

ここは本の通り、特にハマりポイントは無い。

しかもライブラリのサンプルコードを Web サイトからダウンロードできるようにしてくれている。

GPIO へのリードライトの関数群をまとめたライブラリがその中にあるのでそれを Raspberry Pi 上でコンパイル、インストールする。

第2章の「7セグLEDを使ってみよう」にて紹介されている、「7seg_test.c」を参考に、上記ライブラリを使って7セグLEDを明滅させるコードを書く。

コンパイラのリンカオプションに上記ライブラリを指定してコンパイルする。

$ gcc 7seg_test.c -lrpu_gpio -o 7seg_test

コンパイルできたら実行してみよう。

/dev/mem および mmap システムコールを使うため、実行には root 権限が必要です。次のように実行してみましょう。

$ ./7seg_test

と本にある。試してみたが

Can not open /dev/mem

ですよね。気を取り直して

$ sudo ./7seg_test

無事、7セグLED にて0から9まで1秒おきにカウントアップさせることができた。

Raspberry Pi + 7 segmented LED from Kazuhiro Furue on Vimeo.

今後

その他紹介されているデバイスについても読み進めていって動作確認やハマりポイントなど報告していきたい所存。