понедельник, 20 июля 2015 г.

Установка драйвера для NFC-картридера ACR1251 на BBB под управлением Debian 8

На плате BBB используется один из последних дистрибутивов GNU/Linux Debian 8, в котором есть пакетный репозитарий.

Мы подключаемся по RS-232 к BBB через собранную на коленке плату-конвертор. Подробнее тут . На нашей рабочей ОС Ubuntu 14.04 amd64 зайдем в терминал и установим связь:

sudo screen /dev/ttyS0 115200,cs8 

Подключим BeagleBone Black через коммутатор к сети и поставим уже собранные пакеты демона (pcscd) и драйвера (libacsccid) (middleware-библиотека libpcsclite уже стоит):

sudo apt-get update
sudo apt-get install pcscd
sudo apt-get install libacsccid1

Команда lsusb (sudo lsusb) видит картридер ACR1251:

Bus 001 Device 007: ID 072f:221a Advanced Card Systems, Ltd 
Bus 001 Device 006: ID 0eef:0001 D-WAV Scientific Co., Ltd eGalax TouchScreen
Bus 001 Device 005: ID 1a40:0101 Terminus Technology Inc. 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Команда lsusb -d 072f:221a -v :

Посмотреть вывод...


Запустим демон в режиме отладки (/usr/sbin/pcscd -fd), чтобы увидеть, что драйвер картридера libacsccid корректно загрузился при подключении устройства.


Посмотреть вывод...



Возникает ошибка: "Can't claim interface 001/007: Device or resource busy".

При загрузке ядра на BBB мы получаем следующие сообщения инициализации USB (dmesg | grep usb).

Посмотреть вывод...


Однако, несмотря на ошибки, картридер корректно выполняет чтение и запись на карту. Моё приложение, использующее динамическую библиотеку libpcsclite, корректно работает (даже при соединение через USB2.0 Hub, что по непонятным для меня причинам мешало работать другому картридеру ACR122, возможно, поддержка последним только USB1.0 (?)).


вторник, 14 июля 2015 г.

Клонирование microsd-карты для BBB

Сформированную microsd-карту (у меня размером 2GB) можно побайтно скопировать. Под линуксом (у меня Ubuntu 14.04 amd64) это можно сделать с помощью утилиты dd.

Вставим карту в microsd-картридер или в sd-картридер, воспользовавшись переходником microsd-sd. Выясним, выполнив команду lsblk, номер устройства, соответствующего вставленной microsd-карте (у меня это устройство /dev/sdb):

adil@Adil:/media/Data/Libraries/BBB_Kernel$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 279,5G  0 disk 
├─sda1   8:1    0   100M  0 part 
├─sda2   8:2    0  48,7G  0 part 
├─sda3   8:3    0  44,9G  0 part /
├─sda4   8:4    0     1K  0 part 
├─sda5   8:5    0     2G  0 part [SWAP]
└─sda6   8:6    0 183,8G  0 part /media/Data
sdb      8:16   1   1,9G  0 disk 
└─sdb1   8:17   1   1,9G  0 part /media/rootfs

Дампим образ карты в файл на винте (у меня /media/Data/Downloads/Images/bbb/sdcard.img) блоками по 1MB:

sudo dd if=/dev/sdb of=/media/Data/Downloads/Images/bbb/sdcard.img bs=1M

После окончания клонирования отмонтируем карту. Полученный образ можно примонтировать в локальную папку (например, /media/img):

sudo mkdir -p /media/img
sudo mount /media/Data/Downloads/Images/bbb/sdcard.img /media/img -t ext4 -o loop=/dev/loop1

Наш дамп можно теперь залить на другую microsd-карту такого же размера (у меня 2GB) или больше. Вставим новую microsd-карту и удалим с неё все разделы с помощью gparted (sudo gparted). Зальем дамп на новую карту (у нас она имеет то же имя - /dev/sdb):

sudo dd if=/media/Data/Downloads/Images/bbb/sdcard.img of=/dev/sdb bs=1

Использованный материал:
1) https://www.raspberrypi.org/forums/viewtopic.php?f=84&t=45562
2) http://linux.die.net/man/8/mount

понедельник, 13 июля 2015 г.

Безуспешные попытки заставить работать nfc-картридер ACR122 на BBB под управлением Debian 8

На плате BBB используется один из последних дистрибутивов GNU/Linux Debian 8, в котором есть пакетный репозитарий.

Мы подключаемся по RS-232 к BBB через собранную на коленке плату-конвертор. Подробнее тут . На нашей рабочей ОС Ubuntu 14.04 amd64 зайдем в терминал и установим связь:

sudo screen /dev/ttyS0 115200,cs8 

1. Подключим BeagleBone Black через коммутатор к сети и поставим уже собранные пакеты демона (pcscd) и драйвера (libacsccid) (middleware-библиотека libpcsclite уже стоит):

sudo apt-get update
sudo apt-get install pcscd
sudo apt-get install libacsccid1

Команда lsusb (sudo lsusb) видит картридер ACR122:

Bus 001 Device 005: ID 072f:2200 Advanced Card Systems, Ltd 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Запустим демон в режиме отладки (sudo /usr/sbin/pcscd -fd), чтобы увидеть, что драйвер картридера libacsccid корректно загрузился при подключении устройства:

00000000 debuglog.c:269:DebugLogSetLevel() debug level=debug
00000150 configfile.l:254:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000034 configfile.l:307:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000059 configfile.l:266:DBGetReaderListDir() Skipping non regular file: .
00000019 configfile.l:266:DBGetReaderListDir() Skipping non regular file: ..
00000020 pcscdaemon.c:545:main() pcsc-lite 1.8.10 daemon ready.
00001981 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/003/001
00000157 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/004/001
00000149 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/005/001
00000148 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000140 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/006/001
00000140 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/007/001
00000111 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/007/001
00000116 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x072F, PID: 0x2200, path: /dev/bus/usb/007/003
00000040 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x072F, PID: 0x2200, path: /dev/bus/usb/007/003
00000017 hotplug_libudev.c:321:HPAddDevice() Adding USB device: ACS ACR122U
00000038 readerfactory.c:989:RFInitializeReader() Attempting startup of ACS ACR122U 00 00 using /usr/lib/pcsc/drivers/ifd-acsccid.bundle/Contents/Linux/libacsccid.so
00000210 readerfactory.c:874:RFBindFunctions() Loading IFD Handler 3.0
00000041 ifdhandler.c:2328:init_driver() Driver version: 1.0.5
00000248 ifdhandler.c:2341:init_driver() LogLevel: 0x0003
00001316 ifdhandler.c:2361:init_driver() DriverOptions: 0x00C0
00000221 ifdhandler.c:2388:init_driver() ACR38CardVoltage: 0
00000210 ifdhandler.c:2395:init_driver() ACR38CardType: 0
00000016 ifdhandler.c:94:IFDHCreateChannelByName() lun: 0, device: usb:072f/2200:libudev:0:/dev/bus/usb/007/003
00094665 ccid_usb.c:375:OpenUSBByName() Manufacturer: Advanced Card Systems Ltd.
00000199 ccid_usb.c:385:OpenUSBByName() ProductString: ACS CCID driver
00000191 ccid_usb.c:391:OpenUSBByName() Copyright: This driver is protected by terms of the GNU Lesser General Public License version 2.1, or (at your option) any later version.
00012154 ccid_usb.c:643:OpenUSBByName() Can't claim interface 007/003: Device or resource busy
00025410 ifdhandler.c:118:IFDHCreateChannelByName() failed
00000039 readerfactory.c:1020:RFInitializeReader() Open Port 0x200000 Failed (usb:072f/2200:libudev:0:/dev/bus/usb/007/003)
00000015 readerfactory.c:312:RFAddReader() ACS ACR122U init failed.
00000018 readerfactory.c:535:RFRemoveReader() UnrefReader() count was: 1
00000013 readerfactory.c:1040:RFUnInitializeReader() Attempting shutdown of ACS ACR122U 00 00.
00000012 readerfactory.c:911:RFUnloadReader() Unloading reader driver.
00000238 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/008/001
00000126 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/008/001
00000121 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x04D9, PID: 0x1702, path: /dev/bus/usb/008/002
00000119 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x04D9, PID: 0x1702, path: /dev/bus/usb/008/002
00000150 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000116 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000118 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x058F, PID: 0x6362, path: /dev/bus/usb/002/002
^C31211962 pcscdaemon.c:726:signal_trap() Received signal: 2
00000017 pcscdaemon.c:745:signal_trap() Preparing for suicide
01000081 readerfactory.c:1273:RFCleanupReaders() entering cleaning function
00000026 winscard_svc.c:130:ContextsDeinitialize() remaining threads: 0

00000007 pcscdaemon.c:670:at_exit() cleaning /var/run/pcscd

Возникает ошибка: "Can't claim interface 007/003: Device or resource busy".

При загрузке ядра на BBB мы получаем следующие сообщения инициализации USB (dmesg | grep usb):

root@arm:/usr/sbin# dmesg | grep usb
[    2.699934] usbcore: registered new interface driver usbfs
[    2.700007] usbcore: registered new interface driver hub
[    2.700075] usbcore: registered new device driver usb
[    3.874971] usbcore: registered new interface driver udl
[    3.892840] usbcore: registered new interface driver dln2
[    4.168040] usbcore: registered new interface driver usb-storage
[    4.175175] 47401300.usb-phy supply vcc not found, using dummy regulator
[    4.183797] musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
[    4.183810] musb-hdrc: MHDRC RTL version 2.0 
[    4.183817] musb-hdrc: setup fifo_mode 4
[    4.183833] musb-hdrc: 28/31 max ep, 16384/16384 memory
[    4.184753] 47401b00.usb-phy supply vcc not found, using dummy regulator
[    4.193260] musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
[    4.193272] musb-hdrc: MHDRC RTL version 2.0 
[    4.193278] musb-hdrc: setup fifo_mode 4
[    4.193290] musb-hdrc: 28/31 max ep, 16384/16384 memory
[    4.193388] musb-hdrc musb-hdrc.1.auto: MUSB HDRC host driver
[    4.199391] musb-hdrc musb-hdrc.1.auto: new USB bus registered, assigned bus number 1
[    4.207430] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    4.214264] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    4.221515] usb usb1: Product: MUSB HDRC host driver
[    4.226508] usb usb1: Manufacturer: Linux 4.1.0-rc1-bone0 musb-hcd
[    4.232711] usb usb1: SerialNumber: musb-hdrc.1.auto
[    4.395355] usbcore: registered new interface driver usbhid
[    4.400953] usbhid: USB HID core driver
[   23.783052] usb 1-1: new full-speed USB device number 2 using musb-hdrc
[   23.926410] usb 1-1: New USB device found, idVendor=072f, idProduct=2200
[   23.933231] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[   23.940419] usb 1-1: Product: ACR122U PICC Interface
[   23.945487] usb 1-1: Manufacturer: ACS
[   24.131674] usbcore: registered new interface driver pn533

Картридер неправильно опознается ядром как устройство pn533 (usbcore: registered new interface driver pn533). Как пишут на форуме, в ядре версии  (>= 3.1) появилась своя подсистема NFC с своими драйверами, которые конфликтуют с драйверами CCID самого разработчика pscslite
Ludovic Rousseau. Решение проблемы состоит в том, чтобы выгрузить и отменить загрузку драйвера устройства pn533 (можно ещё залезть в сборку Device Tree ядра и отключить драйвер там).

Формируем конфигурационный файл, запрещающий загрузку драйвера pn533:

sudo nano /etc/modprobe.d/blacklist-libnfc.conf

Добавляем в него:

blacklist pn533

Выгружаем сам драйвер из активной системы:

sudo modprobe -r pn533

После перезагрузки системы на BBB вызов команды /usr/sbin/pcscd -fd выводит следующее:

root@arm:~# /usr/sbin/pcscd -fd
00000000 debuglog.c:292:DebugLogSetLevel() debug level=debug
00003033 configfile.l:283:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00001684 configfile.l:355:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00001802 configfile.l:317:DBGetReaderListDir() Skipping non regular file: .
00001306 configfile.l:317:DBGetReaderListDir() Skipping non regular file: ..
00001368 pcscdaemon.c:569:main() pcsc-lite 1.8.13 daemon ready.
00023781 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00002998 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00002729 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x072F, PID: 0x2200, path: /dev/bus/usb/001/002
00001504 hotplug_libudev.c:435:HPAddDevice() Adding USB device: ACS ACR122U
00001646 readerfactory.c:1012:RFInitializeReader() Attempting startup of ACS ACR122U 00 00 using /usr/lib/pcsc/drivers/ifd-acsccid.bundle/Contents/Linux/libacsccid.so
00003277 readerfactory.c:897:RFBindFunctions() Loading IFD Handler 3.0
00001837 ifdhandler.c:2330:init_driver() Driver version: 1.0.8
00004341 ifdhandler.c:2343:init_driver() LogLevel: 0x0003
00003992 ifdhandler.c:2363:init_driver() DriverOptions: 0x00C0
00003897 ifdhandler.c:2390:init_driver() ACR38CardVoltage: 0
00003782 ifdhandler.c:2397:init_driver() ACR38CardType: 0
00001249 ifdhandler.c:94:IFDHCreateChannelByName() lun: 0, device: usb:072f/2200:libudev:0:/dev/bus/usb/001/002
00178173 ccid_usb.c:375:OpenUSBByName() Manufacturer: Advanced Card Systems Ltd.
00002323 ccid_usb.c:385:OpenUSBByName() ProductString: ACS CCID driver
00002030 ccid_usb.c:391:OpenUSBByName() Copyright: This driver is protected by terms of the GNU Lesser General Public License version 2.1, or (at your option) any later version.
00084474 ccid_usb.c:652:OpenUSBByName() Found Vendor/Product: 072F/2200 (ACS ACR122U)
00000771 ccid_usb.c:654:OpenUSBByName() Using USB bus/device: 001/002
01002109 ifdhandler.c:220:IFDHCreateChannelByName() dwFeatures: 0x00020040
00001456 ifdhandler.c:221:IFDHCreateChannelByName() wLcdLayout: 0x0000
00001121 ifdhandler.c:222:IFDHCreateChannelByName() bPINSupport: 0x00
00001088 ifdhandler.c:223:IFDHCreateChannelByName() dwMaxCCIDMessageLength: 271
00001402 ifdhandler.c:224:IFDHCreateChannelByName() dwMaxIFSD: 256
00000154 ifdhandler.c:225:IFDHCreateChannelByName() dwDefaultClock: 4000
00000693 ifdhandler.c:226:IFDHCreateChannelByName() dwMaxDataRate: 250000
00000138 ifdhandler.c:227:IFDHCreateChannelByName() bMaxSlotIndex: 0
00000122 ifdhandler.c:228:IFDHCreateChannelByName() bCurrentSlotIndex: 0
00000697 ifdhandler.c:229:IFDHCreateChannelByName() bInterfaceProtocol: 0x00
00000135 ifdhandler.c:230:IFDHCreateChannelByName() bNumEndpoints: 3
00000126 ifdhandler.c:231:IFDHCreateChannelByName() bVoltageSupport: 0x07
00000724 ifdhandler.c:536:IFDHGetCapabilities() tag: 0xFB3, usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00000148 readerfactory.c:350:RFAddReader() Using the pcscd polling thread
00000338 ccid_usb.c:1498:InterruptRead() Reader: 001/002
00000804 ccid_usb.c:1516:InterruptRead() Slot 0: 0x00
02002053 ccid_usb.c:1090:ReadUSB() usb_bulk_read(001/002): Resource temporarily unavailable
00001482 ifdwrapper.c:371:IFDStatusICC() Card not transacted: 612
00001119 eventhandler.c:233:EHSpawnEventHandler() Initial Check Failed on ACS ACR122U 00 00
00001180 readerfactory.c:361:RFAddReader() ACS ACR122U init failed.
00001124 readerfactory.c:558:RFRemoveReader() UnrefReader() count was: 1
00001103 readerfactory.c:1063:RFUnInitializeReader() Attempting shutdown of ACS ACR122U 00 00.
00000195 ifdhandler.c:437:IFDHCloseChannel() usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00001795 readerfactory.c:934:RFUnloadReader() Unloading reader driver.
00000681 hotplug_libudev.c:501:HPAddDevice() Failed adding USB device: ACS ACR122U
00001389 readerfactory.c:1012:RFInitializeReader() Attempting startup of ACS ACR122U 00 00 using /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Linux/libccid.so
00002124 readerfactory.c:897:RFBindFunctions() Loading IFD Handler 3.0
00002023 ifdhandler.c:1927:init_driver() Driver version: 1.4.18
00010158 ifdhandler.c:1944:init_driver() LogLevel: 0x0003
00001545 ifdhandler.c:1955:init_driver() DriverOptions: 0x0000
00003202 ifdhandler.c:96:CreateChannelByNameOrChannel() Lun: 0, device: usb:072f/2200:libudev:0:/dev/bus/usb/001/002
00001438 ccid_usb.c:284:OpenUSBByName() Using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist
00009651 ccid_usb.c:302:OpenUSBByName() ifdManufacturerString: Ludovic Rousseau (ludovic.rousseau@free.fr)
00001477 ccid_usb.c:303:OpenUSBByName() ifdProductString: Generic CCID driver
00001242 ccid_usb.c:304:OpenUSBByName() Copyright: This driver is protected by terms of the GNU Lesser General Public License version 2.1, or (at your option) any later version.
00012421 ccid_usb.c:596:OpenUSBByName() Found Vendor/Product: 072F/2200 (ACS ACR122U PICC Interface)
00001651 ccid_usb.c:598:OpenUSBByName() Using USB bus/device: 1/2
00001172 ccid_usb.c:650:OpenUSBByName() bNumDataRatesSupported is 0
03005752 ccid_usb.c:798:ReadUSB() read failed (1/2): -7 Resource temporarily unavailable
00002414 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFB3, usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00001325 readerfactory.c:355:RFAddReader() Using the reader polling thread
00002295 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFAE, usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00001331 ifdhandler.c:463:IFDHGetCapabilities() Reader supports 1 slot(s)
00001550 readerfactory.c:1353:RFWaitForReaderInit() Waiting init for reader: ACS ACR122U 00 00
00002976 ifdhandler.c:1139:IFDHPowerICC() action: PowerUp, usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00002459 eventhandler.c:289:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00001289 Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A 
08002816 ccid_usb.c:798:ReadUSB() read failed (1/2): -7 Resource temporarily unavailable
00000138 ifdwrapper.c:371:IFDStatusICC() Card not transacted: 612
00000058 eventhandler.c:478:EHStatusHandlerThread() powerState: POWER_STATE_UNPOWERED
^C01299378 pcscdaemon.c:750:signal_trap() Received signal: 2
00000104 pcscdaemon.c:769:signal_trap() Preparing for suicide
00004968 hotplug_libudev.c:676:HPStopHotPluggables() Hotplug stopped
01001623 readerfactory.c:1296:RFCleanupReaders() entering cleaning function
00001386 readerfactory.c:1305:RFCleanupReaders() Stopping reader: ACS ACR122U 00 00
00001130 readerfactory.c:558:RFRemoveReader() UnrefReader() count was: 1
00001064 eventhandler.c:179:EHDestroyEventHandler() Stomping thread.
00001250 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFB1, usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00000176 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFB2, usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00000134 eventhandler.c:204:EHDestroyEventHandler() Request stopping of polling thread
00000743 ifdhandler.c:340:IFDHStopPolling() usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
00400660 eventhandler.c:501:EHStatusHandlerThread() Die
00001340 eventhandler.c:219:EHDestroyEventHandler() Thread stomped.
00000197 readerfactory.c:1063:RFUnInitializeReader() Attempting shutdown of ACS ACR122U 00 00.
00000730 ifdhandler.c:266:IFDHCloseChannel() usb:072f/2200:libudev:0:/dev/bus/usb/001/002 (lun: 0)
03001115 ccid_usb.c:798:ReadUSB() read failed (1/2): -7 Resource temporarily unavailable
00001948 ccid_usb.c:191:close_libusb_if_needed() libusb_exit
00002357 readerfactory.c:934:RFUnloadReader() Unloading reader driver.
00000867 winscard_svc.c:154:ContextsDeinitialize() remaining threads: 0
00001388 pcscdaemon.c:694:at_exit() cleaning /var/run/pcscd

Звуковая и световая индикация на картридере не включается. Но при загрузке модуля nfc (modprobe nfc) и перезапуске демона (pcscd), картридер начинает корректно реагировать на поднесение карты. Моё приложение, которое использует библиотеку libpcsclite, в это время корректно отрабатывает чтение c карты. Но постепенно демон умирает и картридер перестает работать. Ставим модуль nfc в автозагрузку, добавляя в /etc/modules строку nfc, и получаем временное плохое решение.

Следующая проблема заключается в том, что устройство ACR122U перестает корректно распознаваться, если мы подключаем его через USB 2.0 Hub, в который также подключается USB-разъем touchscreen'а.

2. Попробуем пересобрать deb-пакеты драйвера (libacsccid1) и демона (pcscd) из репозитария на плате вручную.

Отредактируем файл репозитариев (nano /etc/apt/sources.list), раскомментив репозитарии с исходниками пакетов:

deb http://ftp.us.debian.org/debian/ jessie main contrib non-free
deb-src http://ftp.us.debian.org/debian/ jessie main contrib non-free

deb http://ftp.us.debian.org/debian/ jessie-updates main contrib non-free
deb-src http://ftp.us.debian.org/debian/ jessie-updates main contrib non-free

deb http://security.debian.org/ jessie/updates main contrib non-free
deb-src http://security.debian.org/ jessie/updates main contrib non-free

#deb http://ftp.debian.org/debian jessie-backports main contrib non-free
##deb-src http://ftp.debian.org/debian jessie-backports main contrib non-free

#Kernel source (repos.rcn-ee.com) : https://github.com/RobertCNelson/linux-stable-rcn-ee
#
#git clone https://github.com/RobertCNelson/linux-stable-rcn-ee
#cd ./linux-stable-rcn-ee
#git checkout `uname -r` -b tmp
#
deb [arch=armhf] http://repos.rcn-ee.com/debian/ jessie main
deb-src [arch=armhf] http://repos.rcn-ee.com/debian/ jessie main

Установим вспомогательный пакет dpkg-dev, содержащий утилиту для распаковки dpkg-source  (у него много зависимостей :( ):

apt-get install dpkg-dev

2.1. Скачаем в текущую папку (у меня домашняя папка суперпользователя /root) исходники пакета libacsccid1 (на самом деле скачивается пакет acsccid):

apt-get source libacsccid1

Скачаем в текущую папку зависимости пакета libacsccid1 (зависимостей меньше, чем в предыдущем запросе, но всё равно много :((  ):

apt-get build-dep libacsccid1

Установим дополнительно пакет devscripts, содержащий утилиту debuild (очень много зависимостей :(((  ):

apt-get install devscripts

Пересобираем пакет c помощью вызова скрипта debuild -us -uc (не будем его подписывать):

cd ./acsccid-1.0.8/
debuild -us -uc

Устанавливаем собранный пакет:

cd ..
dpkg --install ./libacsccid1_1.0.8-1_armhf.deb

2.2. Скачаем в текущую папку (у меня домашняя папка суперпользователя /root) исходники пакета pcscd (на самом деле скачивается пакет pcsc-lite):

apt-get source pcscd

Скачаем в текущую папку зависимости пакета pcscd :

apt-get build-dep pcscd
Пересобираем пакет c помощью вызова скрипта debuild -us -uc (не будем его подписывать):

cd ./pcsc-lite-1.8.13/
debuild -us -uc

Устанавливаем собранный пакет:

cd ..
dpkg --install ./pcscd_1.8.13-1_armhf.deb


3. Попробуем собрать вручную на рабочей машине Ubuntu 14.04 amd64 c установленным кросскомпилятором Linaro драйвер (libacsccid) и демон (pcscd).

Удалим на устройстве установленные пакеты:
sudo apt-get remove libacsccid1
sudo apt-get remove pcscd

3.1. Соберем libusb, так как от него зависит pcsclite. Скачиваем версию 1.0.9 отсюда. Не берем последнюю версию 1.0.19, так как в ней появилась внешняя зависимость от libudev. Переходим в папку с проектом (у меня /media/Data/Libraries/bbb/libusb-1.0.9/), настраиваем кросскомпиляцию, выбираем директорию для установки собранной библиотеки и собираем:

cd /media/Data/Libraries/bbb/libusb-1.0.9./configure --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu --prefix=/home/adil/target
make
make install

3.2. Соберем libusb-compat для совместимости со старой версией libusb-0.1, в которой присутствовал файл usb.h. Скачиваем версию 0.1.5 отсюда. Настраиваем и собираем:

cd /media/Data/Libraries/bbb/libusb-compat-0.1.5
./configure --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu --prefix=/home/adil/target LIBUSB_1_0_CFLAGS="-I/home/adil/target/include/libusb-1.0" LIBUSB_1_0_LIBS="-L/home/adil/target/lib -lusb-1.0"
make
make install

3.3. Собираем проект pcsclite. Скачиваем версию 1.5.5 отсюда. Переходим в папку с проектом (у меня /media/Data/Libraries/bbb/pcsc-lite-1.5.5/), отказываемся от использования библиотеки libhal, выбираем директорию для установки на устройстве (/usr/local/pcsc/drivers; после выполнения шага ./configure параметр USB drop directory должен быть /usr/local/pcsc/drivers) и собираем:

./configure --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu --prefix=/usr/local LIBUSB_CFLAGS="-I/home/adil/target/include/libusb-1.0/ -I/home/adil/target/include" LIBUSB_LIBS="-L/home/adil/target/lib/ -lusb-1.0 -lusb" --disable-libhal --enable-libusb
make
make install prefix=/home/adil/target

3.4. Собираем библиотеку драйвера libacsccid. Скачиваем версию 1.0.3 отсюда. Собираем (после выполнения шага ./configure параметр USB drop directory должен быть /usr/local/pcsc/drivers ):

./configure --host=arm-linux-gnueabihf --build=i686-pc-linux-gnu --prefix=/home/adil/target LIBUSB_CFLAGS="-I/home/adil/target/include -I/home/adil/target/include/libusb-1.0" LIBUSB_LIBS="-L/home/adil/target/lib/ -lusb-1.0 -lusb" --enable-usbdropdir=/usr/local/pcsc/drivers PCSC_LIBS="-L/home/adil/target/lib/ -lpcsclite" PCSC_CFLAGS="-I/home/adil/target/include/PCSC"
make
sudo make install

После сборки драйвера необходимо папку с ним скопировать на хост-системе из /usr/local/pcsc в ~/target/pcsc.

После успешной сборки четырех проектов необходимо скопировать содержимое трех папок ~target/lib, ~target/sbin, ~target/pcsc на файловую систему target-машины. Я это делаю сжатием всей папки ~/target, затем копирую архив с виртуальной машины на основную, а их основной через ssh-подключение на target-машину копирую папки ~/target/sbin, ~/target/lib, ~/target/pcsc в соответственно /usr/local/sbin, /usr/local/lib, /usr/local/pcsc.

После всего этого запускаем:

/usr/local/sbin/pcscd -fd

И получаем вывод:

root@arm:/usr/local/sbin# ./pcscd -fd
debuglog.c:230:DebugLogSetLevel() debug level=debug
pcscdaemon.c:512:main() pcsc-lite 1.5.5 daemon ready.
hotplug_libusb.c:403:HPEstablishUSBNotifications() Driver ifd-acsccid.bundle does not support IFD_GENERATE_HOTPLUG. Using active polling instead.
hotplug_libusb.c:412:HPEstablishUSBNotifications() Polling forced every 1 second(s)