2011/11/23

[libnfc]libnfcとRC-S620/S

LLCPの動作確認をするには、R/Wが2つないとだめだ。
うちにあるのは、パソリとRC-S620/S。
ならば、RC-S620/Sをlibnfcから使うことができるならばよかろう。

使うのは、RC-S620/SとUSB-シリアル変換(CP2102)を接続したもので、Linuxでは/dev/ttyUSB0として認識されている。


幸い、libnfcには「pn532_uart」というシリアル向けのドライバが入っている。
RC-S956もPN532も似たようなもんじゃないだろうか?

$ ./configure --with-drivers='pn532_uart,pn53x_usb' --enable-serial-autoprobe
$ make clean all
$ sudo make install
$ utils/nfc-list
utils/.libs/lt-nfc-list uses libnfc 1.5.1 (r1182M)
No NFC device found.

うーむ。


こちらを参考にデバッグ。
http://code.google.com/p/libnfc/issues/detail?id=176

$ ./configure --with-drivers='pn532_uart,pn53x_usb' --enable-serial-autoprobe --enable-debug
$ make clean all
$ sudo make install
$ utils/nfc-list
utils/.libs/lt-nfc-list uses libnfc 1.5.1 (r1182M)
libnfc.general - 0 device(s) found using PN53x USB driver
libnfc.driver.pn532_uart - Trying to find PN532 device on serial port: /dev/ttyUSB0 at 115200 bauds.
libnfc.bus.uart - Serial port speed requested to be set to 115200 bauds.
libnfc.chip.pn53x - Diagnose
libnfc.chip.pn53x - Timeout values: 1 s, 0 us
libnfc.bus.uart - TX: 55  55  00  00  00 
libnfc.chip.pn53x - SAMConfiguration
libnfc.chip.pn53x - Timeout values: 1 s, 0 us
libnfc.bus.uart - TX: 00  00  ff  03  fd  d4  14  01  17  00 
libnfc.bus.uart - RX: 00  00  ff  00  ff  00 
libnfc.chip.pn53x - PN53x ACKed
libnfc.bus.uart - RX: 00  00  ff  02  fe 
libnfc.bus.uart - RX: d5  15 
libnfc.bus.uart - RX: 16  00 
libnfc.chip.pn53x - Last command status: Success
libnfc.bus.uart - TX: 00  00  ff  09  f7  d4  00  00  6c  69  62  6e  66  63  be  00 
libnfc.bus.uart - RX: 00  00  ff  00  ff  00 
libnfc.chip.pn53x - PN53x ACKed
libnfc.bus.uart - RX: 00  00  ff  08  f8 
libnfc.bus.uart - RX: d5  01 
libnfc.bus.uart - RX: 6c  69  62  6e  66  63 
libnfc.bus.uart - RX: bc  00 
libnfc.chip.pn53x - Last command status: Success
pn53x_check_communication:
Success
(中略)
libnfc.general - 0 device(s) found using PN532_UART driver
No NFC device found.

いやいや、待ってくれ!
成功しとうやん。
なぜなんだ・・・。


ログを追加してわかったのは、最後に

pn53x_check_communication: Success

といってるけど、これはエラールートを通っているのだ。
Successにだまされてはいけない。

pn53x_check_communication()の中でDiagnoseコマンドを発行しているのだが、期待値が異なるようだ。
先頭の1byteが返ってこないのか何なのかわからんが、そうなっている。

ここでようやく、PN533のドキュメントを読む。
Diagnoseコマンドは、ペイロードの1byte目が診断コード、それ以降がデータ部になっている。
ここでは診断コード0x00で、データ部として「libnfc」を送信している。
その戻り値は、PN533では「診断コード+データ部」ということで、エコーバックみたいな形で戻ってくる。
RC-S956で同じことをすると、診断コードは戻ってこずにデータ部だけが返っている。
まあ、そういう仕様ってことだろうな。

期待値の先頭を削ることで、認識するようになった。


パソリと同じように、nfc-pollでMifare 1Kのカードを見てみる。

examples/.libs/lt-nfc-poll uses libnfc 1.5.1 (r1182M)
fail: pn53x_check_communication: Input/output error
Connected to NFC reader: PN532 (/dev/ttyUSB0) - PN533 v1.48 (0x07)
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04 
       UID (NFCID1): 3d  c5  73  b0 
      SAK (SEL_RES): 08 

エラーが出てるのは、PCのttyS0か何かだろう。
シリアルを自動認識させようとしてるからよくないな。
固定でもかまわないのだが、どうやって指定するのだろうか?

ソースを見ていった限り、pn532_uartでは指定できなさそうだ。
autoprobeを無効にして、環境変数からとってくるような仕組みにすればいいんだけど、まあいいや。

0 件のコメント:

コメントを投稿

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