PN7150をRaspberry Pi 3で動作チェックできるようにする
一応このページでPN7150の動作チェックを行えるRaspbianOSイメージは配布されている。
「OM5578 PN7150 RPI Linux」ってやつがそのイメージファイル。
しかし、これを書き込んでもRasPiがPN7150の接続を認識してくれない。
おかげでテスト用プログラムが動作しない。
おいおいしっかりしてくれよ〜。
仕方ないので、ドライバを組み込んでカーネルをビルドし直すことにした。
Raspbianのカーネルのビルド方法は、ローカルビルドとクロスコンパイルの2通り存在する。
- RasPi上で直接ビルドして上書きする
- Ubuntuとか別の環境でビルドしたものを、Raspbianを書き込んであるSDカードにコピーする
後者の方が色々やりやすいしビルドの時間も大幅に短縮できるんだけど、今回はこの方法では成功しなかった(ぐやじい!!)ので、前者のローカルビルドで話を進めていく。
Raspbianのカーネルビルドについての公式サポートページ↓
PN7150のためのドライバを組み込む方法が載っているガイドライン↓
クロスコンパイルで成功している人のブログ↓
「[nfc]OM5578/PN7150S来たる」というタイトルの記事群が参考になる。
ローカルビルドで成功している人の記事↓
今回はこれをベースにして進めたらうまくいった。
環境
- Raspberry Pi 3
- Raspbian Jessie(ダウンロードはここから)
ビルド手順
依存モジュールをインストール
1 | $ sudo apt-get install git bc bison flex libssl-dev libncurses5-dev libncursesw5-dev automake autoconf libtool |
カーネルのソースを取得
1 2 | $ cd ~/ $ git clone --depth=1 https://github.com/raspberrypi/linux |
ドライバーのソースを取得
1 2 | $ cd ~/linux/drivers/misc $ sudo git clone https://github.com/NXPNFCLinux/nxp-pn5xx.git |
drivers/misc/Makefileを編集
1 2 | $ cd ~/linux $ sudo nano drivers/misc/Makefile |
最下行に「obj-$(CONFIG_NFC_NXP_PN5XX) += nxp-pn5xx/」と追加。
drivers/misc/Kconfigを編集
1 | $ sudo nano drivers/misc/Kconfig |
最下行のendmenuの直前(source "~"の並びの最後)に「source "drivers/misc/nxp-pn5xx/Kconfig"」を追加。
dtsファイルの追加
nxp-pn54x-nfc.dtsというファイルを作る。
1 | $ sudo nano arch/arm/boot/dts/nxp-pn54x-nfc.dts |
中身は以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 | &i2c1 { status = "okay"; pn7150: pn7150@28 { compatible = "nxp,pn547"; reg = <0x28>; clock-frequency = <400000>; interrupt-parent = <&gpio>; interrupts = <23 0x0>; interrupt-gpios = <&gpio 23 0>; enable-gpios = <&gpio 24 0>; firmware-gpios = <&gpio 25 0>; }; }; |
bcm2710.dtsiの編集
1 | $ sudo nano arch/arm/boot/dts/bcm2710.dtsi |
#includeの並びに「#include "nxp-pn54x-nfc.dts"」を追加。
ビルドの準備
1 2 3 | $ KERNEL=kernel7 $ make bcm2709_defconfig $ sudo make menuconfig |
Kernel Configuration画面では、[Device Drivers] > [Misc devices] > [< > NXP PN5XX based driver]と辿り、これを<M>にしてSaveしてExit。
ビルド
RasPiでのローカルビルドなので、4~5時間くらいかかる。
クロスコンパイルなら1時間半くらいで終わるのに...
1 | $ sudo make -j4 zImage modules dtbs |
これが終わったら、「ls arch/arm/boot/dts/*.dtb」とかを叩いてdtbファイルが生成されていることを確認する。
生成されていないとこの先で失敗する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $ ls arch/arm/boot/dts/*.dtb arch/arm/boot/dts/bcm2708-rpi-b.dtb arch/arm/boot/dts/bcm2708-rpi-b-plus.dtb arch/arm/boot/dts/bcm2708-rpi-cm.dtb arch/arm/boot/dts/bcm2708-rpi-zero.dtb arch/arm/boot/dts/bcm2708-rpi-zero-w.dtb arch/arm/boot/dts/bcm2709-rpi-2-b.dtb arch/arm/boot/dts/bcm2710-rpi-3-b.dtb arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dtb arch/arm/boot/dts/bcm2710-rpi-cm3.dtb arch/arm/boot/dts/bcm2835-rpi-a.dtb arch/arm/boot/dts/bcm2835-rpi-a-plus.dtb arch/arm/boot/dts/bcm2835-rpi-b.dtb arch/arm/boot/dts/bcm2835-rpi-b-plus.dtb arch/arm/boot/dts/bcm2835-rpi-b-rev2.dtb arch/arm/boot/dts/bcm2835-rpi-cm1-io1.dtb arch/arm/boot/dts/bcm2835-rpi-zero.dtb arch/arm/boot/dts/bcm2835-rpi-zero-w.dtb arch/arm/boot/dts/bcm2836-rpi-2-b.dtb arch/arm/boot/dts/bcm2837-rpi-3-b.dtb arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dtb |
クロスコンパイルの時はここでdtbファイルが生成されず、先に進むことができなかった。
この辺の解決方法はフォーラムで議論されていたし、なんならdtbファイルを生成できるようにもなったんだけど、結局PN7150は認識されなかった。
インストール
1 2 3 4 5 | $ sudo make modules_install $ sudo cp arch/arm/boot/dts/*.dtb /boot/ $ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/ $ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/ $ sudo cp arch/arm/boot/zImage /boot/$KERNEL.img |
パーミッションの設定
デフォルトでは、/dev/pn544のr/wはルートユーザーにしか許可されていない。
これではアプリの実行に支障をきたすので、一般ユーザーでもr/w可能にする。
1 | $ sudo nano /etc/udev/rules.d/pn5xx_i2c.rules |
新たに「pn5xx_i2c.rules」というファイルを作り、「#ACTION=="add", KERNEL=="pn544", MODE="0666"」と記述する。
再起動
1 | $ sudo reboot |
再起動後、lsmodとかでpn5xx_i2cが表示されていれば、無事認識されている。
おめでとう!
1 2 | $ lsmod | grep pn pn5xx_i2c 16384 0 |
i2cdetectでも接続が確認できる。
1 2 3 4 5 6 7 8 9 10 | $ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- |
デモを動かす手順
linux_libnfc-nciというフォルダの中にでもアプリが入っているが、これも元のままだと動かないため、ビルドし直す必要がある。
linux_libnfc-nciのビルド方法はこのissueが参考になった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | $ git clone https://github.com/NXPNFCLinux/linux_libnfc-nci.git $ cd linux_libnfc-nci $ ./bootstrap $ ./configure --enable-pn7150 --sysconfdir=/etc $ make -j4 $ sudo make install $ sudo ./nfcDemoApp poll ######################################################################################### ## NFC demo ## ######################################################################################### ## Poll mode activated ## ######################################################################################### ... press enter to quit ... Waiting for a Tag/Device... NFC Tag Found Type : 'Type V' NFCID2 : 'D8 0F 9C 00 18 01 04 E0 ' Record Found : NDEF Content Max size : '250 bytes' NDEF Actual Content size : '10 bytes' ReadOnly : 'FALSE' Type : 'Text' Lang : 'en' Text : 'hey' 10 bytes of NDEF data received : D1 01 06 54 02 65 6E 68 65 79 NFC Tag Lost |
Waiting for a Tag/Device...というのが出てくればpollingが正常に開始されたと見ていい。
ここまでくれば安心だと思う。
でも今度はマウスとキーボードが動かなくなってしまった。
なんでだ。
まぁssh使えば本来の目的が遂行できるからいいけども。
いや〜もう1週間以上かかったわ〜。
大変だった...
この記事へのコメントはこちら