前回、dmesgを確認して、何かエラーになっているところまで分かった。
どうしたものか。。。
01: (irq_create_of_mapping) from [<80498ba8>] (of_irq_get+0x4c/0x5c) 02: (of_irq_get) from [<8044af78>] (i2c_device_probe+0x208/0x224) 03: (i2c_device_probe) from [<8039d008>] (driver_probe_device+0x204/0x2d0) 04: (driver_probe_device) from [<8039d170>] (__driver_attach+0x9c/0xa0) 05: (__driver_attach) from [<8039b1b0>] (bus_for_each_dev+0x74/0xa4) 06: (bus_for_each_dev) from [<8039ca30>] (driver_attach+0x28/0x30) 07: (driver_attach) from [<8039c640>] (bus_add_driver+0x19c/0x224) 08: (bus_add_driver) from [<8039d830>] (driver_register+0x88/0x108) 09: (driver_register) from [<8044c278>] (i2c_register_driver+0x48/0x8c) 10: (i2c_register_driver) from [<7f0e9024>] (pn54x_dev_init+0x24/0x38 [pn5xx_i2c]) 11: (pn54x_dev_init [pn5xx_i2c]) from [<80009754>] (do_one_initcall+0x90/0x1f0)
バックトレースまで出ていて、この辺がポイントなんじゃなかろうかとは思うのだが、見方がさっぱりわからん。
pn54x_dev_initはgithubから落としてきたソースに入っている。
また、このログの後にこう出ている。
01: pn54x_probe 02: /soc/i2c@7e804000/pn547@28: could not get #gpio-cells for /soc/cprman@7e101000 03: pn544 1-0028: VEN GPIO error getting from OF node 04: pn544: probe of 1-0028 failed with error -22
よくわからんが、OF nodeとかいうやつが関係しているらしいから、of_irq_getがうまくいかないとか、そんなことだろうか。
検索してみた。
Raspberry Pi • View topic - AR1021 Touch Controller Overlay/Driver Issues
この人も、同じようにエラー-22で、I2Cで、of_irq_getのログが出ている。
アドバイスで「"interrupt-parent"を正しくせよ」と書かれている。
今使っているDTSの設定は、NXPが提供しているDTBファイルから持ってきたものだ。
kernelが違うので、interrupt-parentを変更しないといけないということかもしれない。
<0xf>という値は、動いているDTSファイルを検索すると、bcm2835-gpioのphandleというものと同じ値のような気がする。
今のDTSファイルでは、bcm2835-gpioのphandleは<0xb>になっていた。
では、と、pn7150のDTSファイルで<0xf>を<0xb>に変えてみた。
01: pn54x_dev_init 02: pn54x_probe 03: pn544 1-0028: CLKREQ GPIOerror getting from OF node 04: pn54x_probe: request irq_gpio 23 05: pn54x_probe: request ven_gpio 24 06: pn54x_probe: request firm_gpio 25 07: pn54x_probe : requesting IRQ 189
おお、バックトレースが出なくなった!
出なくなったが、OF nodeのエラーは出ている。。。
nfcDemoAppを動かしても、コールバック関数登録のエラーが出て動かない。
エラーは、ここだろう。
https://github.com/NXPNFCLinux/nxp-pn5xx/blob/master/pn5xx_i2c.c#L460
OPTIONALと書いてあるから、もしかしたらオリジナルでもエラーになっているかも・・・出てた。
ということは、それ以外の原因で動いていないのか。。。
NXPのkernelでnfcDemoApp pollするとpn54_dev_open()が呼ばれているログがdmesgに出るのだが、私のkernelでは出てない。
lsmodでpn5xx_i2cは出てるし、/dev/pn544はあるし、何が不満なのだ?
出ているのは、このエラーだろう。
https://github.com/NXPNFCLinux/linux_libnfc-nci/blob/master/demoapp/main.c#L665
たどると、nativeNfcSnep_registerClientCallback()だとは思うが、エラーログすら出てないので、さっぱりわからん。
トレースログはsrc/halimpl/pn54x/log/phNxpLog.hのマクロをTRUEに変更せんといかんようなので、リビルド。
NxpFunc: nativeNfcManager_doInitialize: enter; NCI_VERSION=0x10 NxpFunc: nativeNfcManager_doInitialize: can't find libnfc-nxp.conf file NxpFunc: nativeNfcSnep_registerClientCallback: NxpFunc: nativeNfcSnep_registerClientCallback: Nfc not initialized. SNEP Client Register Callback Failed
意外ッ! それは設定ファイル!!
どうも、/etc/libnfc-nxp.confを読みに行っているようである。
ファイル自体はこれを置けばよいのか。
make installしてもコピーされないので、わからんよ。。。
https://github.com/NXPNFCLinux/linux_libnfc-nci/blob/master/conf/PN7150/libnfc-nxp.conf
ファイルを置いて、ついでにLD_LIBRARY_PATHに/usr/local/libを追加した。
今度実行すると、先に進んだが、I2Cのオープンに失敗しているようだ。
NxpTml: Opening port=/dev/pn544
NxpTml: _i2c_open() Failed: retval ffffffff
I2Cは/dev/i2c-1だと思うが、/dev/pn544とつながっているのかな?
試しに
$ cat /dev/pn544
とすると、Permission deniedで怒られた。
ということは・・・
$ sudo ./nfcDemoApp poll
おー、動いた!
ログが大量に出てわからんが、搬送波も出ているし、かざすとログが出るので、読んでいるのだろう。
では、Raspberry Pi2の自分のkernelをビルドし、OM5578/PN7150Sを動かすようにするまでの手順を残しておこう。
もっとスマートなやり方があるとは思うのだが、今の私ではこれが限界だ。
- Raspberry PiのKernel buildingを見ながら、ビルドする環境を作る。
うちは、Bash on Windowsでやった。 - AN11697のPDFの3章を見ながら環境を作る。
- 3.2.3章のデバイスノードは、Device treeの方にする。
私はこの内容をnxp-pn5xx.dtsという名前で、arch/arm/boot/dts/に置いた。
数字は、NXPのkernelからDTBファイルをDTSに変換して持ってきた。
&i2c1{ status = "okay"; pn547: pn547@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>; }; };
- arch/arm/boot/dts/bcm2709.dtsiファイルに、「#include "nxp-pn5xx.dts"」を追加。
これだと、Raspberry Pi2のDTSファイルにしか読み込まれないので、bcm2708_common.dtsiに追加した方がよいかもしれない。
また、nxp-pn5xx.dtsにしたものの、includeするから拡張子はdtsiの方が良いのかも。
ルールがよくわかってない。 - Raspberry Piのサイトを見ながらkernelをビルドする。
DTBファイルを作るだけなら、make ~ dtbsだけ実行するとarch/arm/boot/dts/にDTBファイルができるので、それでよいだろう。 - ビルドしたものをRaspberry Piのサイトを見ながらSDカードに展開する。
DTBファイルだけなら、SDカードにコピーするか、動いている環境から/boot/にコピーする、でよいだろう。 - ここまででよいはずなので、Raspberry Piを起動し、dmesgを見る。
"dmesg | less"などとして、"pn"を検索するのがよいだろう。
エラーになっていないなら、たぶん大丈夫。
次は、デモアプリ。
Raspberry Piでビルドする前提。
- githubからlinux_libnfc-nciをgitで取ってくる。
- ./bootstrap
- ./configure --enable-pn7150
- make -j4 (jの数はてきとう)
- sudo make install
- conf/PN7150/libnfc-nxp.confを/etc/にコピー
- LD_LIBRARY_PATHに/usr/local/libを追加
- sudo ./nfcDemoApp pollなど
たぶん、こんなもんじゃなかろうか。
つかれたー。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。