2015年3月9日月曜日

Raspberry Pi で NFC その2

前回は Raspberry Pi に ACR-122U をつけて遊んだわけですが、「model B+ では動かん!」という話があったので試してみました。


OS を入れて、ACR-122U を繋ぐと...


あれ?
もう赤ランプが点いた。
え?これは認識している?前回は確か pcscd を入れないと点かなかったはず。

まぁ、いいか。

前回同様 pcscd を入れて、プログラムを動かしてみると...SCardEstablishContext は通りますがなぜか SCardListReaders が SCARD_E_NO_READERS_AVAILABLE を返してきます。なんで?認識してるんじゃぁないの?
ということで pcscd がどうなっているか見てみます。

pi@raspberrypi ~ $ sudo pcscd -f
00000000 ccid_usb.c:514:OpenUSBByName() Can't claim interface 1/4: -6
00001275 ifdhandler.c:117:CreateChannelByNameOrChannel() failed
00000665 readerfactory.c:972:RFInitializeReader() Open Port 0x200000 Failed (usb:072f/2200:libudev:0:/dev/bus/usb/001/004)
00000545 readerfactory.c:279:RFAddReader() ACS ACR122U PICC Interface init failed.
00000933 hotplug_libudev.c:379:HPAddDevice() Failed adding USB device: ACS ACR122U PICC Interface

あ、何か失敗してる。リーダがすでに何者かに使用されているようだ。誰だ?ということで fuser や lsof 使っても使ってるプロセスが出てこない。ググると OpenCT じゃね?という意見があったが残念なから OpenCT は入っていない。何だこれは! ということでもう少しググると見つけました。


neard というのがあるそうだ。「にあーど?」聞いたこと無いぞ...
とりあえず lsmod してみろとのことなのでしてみた。

pi@raspberrypi ~ $ lsmod
Module                  Size  Used by
snd_bcm2835            21342  0 
snd_pcm                93100  1 snd_bcm2835
snd_seq                61097  0 
snd_seq_device          7209  1 snd_seq
snd_timer              23007  2 snd_pcm,snd_seq
snd                    67211  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
pn533                  23021  0 
evdev                  11000  4 
nfc                    64189  1 pn533
rfkill                 22347  1 nfc
uio_pdrv_genirq         3666  0 
uio                     9897  1 uio_pdrv_genirq

するとあれ?nfc とか pn533 とかがいる!なんといつの間にかカーネルに NFC が組み込まれている?カーネル 3.10 からは neard という名称で NFC が組み込まれているらしい。

というわけでこのモジュールをロードしないようにブラックリストに載せて、リブート

pi@raspberrypi /etc/modprobe.d $ sudo touch raspi-blacklist.conf
pi@raspberrypi /etc/modprobe.d $ sudo vi raspi-blacklist.conf 

blacklist pn533
blacklist nfc

すると、おー!動きました。めでたし、めでたし。
じゃなくて neard という新しいキーワードが出てきてしまった。まだまだ続きそうです...