2017/01/22

[nfc]OM5578/PN7150S来たる (5)

前回、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 GPIO  error 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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。