четверг, 28 мая 2015 г.

Кросскомпилирование (ELDK) драйверов для NFC-картридера ACR122 (libusb, pcsclite, libacsccid) для custom-платы на базе Digi ConnectCore 9m 2443

Используется хост-машина Ubuntu 10.04. Комплект ELDK 4.1 для архитектуры ARM.

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

cd ~/nfc/libusb-1.0.9
./configure --host=arm-linux --build=i686-pc-linux-gnu --prefix=/home/adil/target
make
sudo make install

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

cd ~/nfc/libusb-0.1.5
./configure --host=arm-linux --build=i686-pc-linux-gnu --prefix=/home/adil/target
make
sudo make install

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

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

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

./configure --host=arm-linux --build=i686-pc-linux-gnu --prefix=/usr/local LIBUSB_CFLAGS=-I/home/adil/target/include 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"
make
sudo make install prefix=/home/adil/target

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

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

После копирования по ssh файлов на плату, переходим в папку /usr/loca//sbin и запускаем демон, указывая папки для поиска shared libraries

LD_LIBRARY_PATH=/usr/local/lib ./pcscd -fd

Плата не находит библиотек librt, libdl, libc, libpthread. Копируем сооттветствующие so-файлы и симлинки в папку /usr/local/lib на устройстве из папки хост-машины /home/adil/eldk/arm/lib.

В итоге я скопировал следующие файлы: librt-2.3.5.so, librt.so.1(link), librt.so (link), libdl-2.3.5.so, libdl.so(link), libdl.so.2(link), libc-2.3.5.so, libc.so.6 (link), libpthread-0.10.so, libpthread.so.0(link).

Картридер опознался:

ifdhandler.c:2364:init_driver() DriverOptions: 0x00C0
ifdhandler.c:2391:init_driver() ACR38CardVoltage: 0
ifdhandler.c:2398:init_driver() ACR38CardType: 0
ifdhandler.c:94:IFDHCreateChannelByName() lun: 0, device: usb:072f/2200:libusb:001:004
ccid_usb.c:309:OpenUSBByName() Manufacturer: Advanced Card Systems Ltd.
ccid_usb.c:319:OpenUSBByName() ProductString: ACS CCID driver
ccid_usb.c:325: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.
ccid_usb.c:582:OpenUSBByName() Found Vendor/Product: 072F/2200 (ACS ACR122U)
ccid_usb.c:584:OpenUSBByName() Using USB bus/device: 001/004
ccid_usb.c:1280:get_data_rates() IFD does not support GET_DATA_RATES request: Success
ifdhandler.c:220:IFDHCreateChannelByName() dwFeatures: 0x00020040
ifdhandler.c:221:IFDHCreateChannelByName() wLcdLayout: 0x0000
ifdhandler.c:222:IFDHCreateChannelByName() bPINSupport: 0x00
ifdhandler.c:223:IFDHCreateChannelByName() dwMaxCCIDMessageLength: 271
ifdhandler.c:224:IFDHCreateChannelByName() dwMaxIFSD: 256
ifdhandler.c:225:IFDHCreateChannelByName() dwDefaultClock: 4000
ifdhandler.c:226:IFDHCreateChannelByName() dwMaxDataRate: 250000
ifdhandler.c:227:IFDHCreateChannelByName() bMaxSlotIndex: 0
ifdhandler.c:228:IFDHCreateChannelByName() bCurrentSlotIndex: 0
ifdhandler.c:229:IFDHCreateChannelByName() bInterfaceProtocol: 0x00
ifdhandler.c:230:IFDHCreateChannelByName() bNumEndpoints: 3
ifdhandler.c:231:IFDHCreateChannelByName() bVoltageSupport: 0x07
ifdhandler.c:536:IFDHGetCapabilities() tag: 0xFB0, usb:072f/2200:libusb:001:004 (lun: 0)
readerfactory.c:249:RFAddReader() Using the pcscd polling thread
ifdhandler.c:536:IFDHGetCapabilities() tag: 0xFAE, usb:072f/2200:libusb:001:004 (lun: 0)
ifdhandler.c:629:IFDHGetCapabilities() Reader supports 1 slot(s)
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)
ifdhandler.c:1353:IFDHPowerICC() action: PowerUp, usb:072f/2200:libusb:001:004 (lun: 0)
Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
eth0: link down
eventhandler.c:361:EHStatusHandlerThread() Card Removed From ACS ACR122U 00 00
ifdhandler.c:1353:IFDHPowerICC() action: PowerUp, usb:072f/2200:libusb:001:004 (lun: 0)
eventhandler.c:429:EHStatusHandlerThread() Card inserted into ACS ACR122U 00 00
Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A
usb 1-1.2: USB disconnect, address 4
ccid_usb.c:875:WriteUSB() usb_bulk_write(001/004): No such device or address
ifdwrapper.c:469:IFDStatusICC() Card not transacted: 612
eventhandler.c:333:EHStatusHandlerThread() Error communicating to: ACS ACR122U 00 00
ccid_usb.c:875:WriteUSB() usb_bulk_write(001/004): No such device or address
ifdwrapper.c:469:IFDStatusICC() Card not transacted: 612
eventhandler.c:333:EHStatusHandlerThread() Error communicating to: ACS ACR122U 00 00
hotplug_libusb.c:554:HPRemoveHotPluggable() Removing USB device[0]: 001:004
eventhandler.c:126:EHDestroyEventHandler() Stomping thread.
ifdhandler.c:536:IFDHGetCapabilities() tag: 0xFB1, usb:072f/2200:libusb:001:004 (lun: 0)
eventhandler.c:139:EHDestroyEventHandler() Waiting polling thread
eventhandler.c:474:EHStatusHandlerThread() Die
eventhandler.c:163:EHDestroyEventHandler() Thread stomped.
readerfactory.c:1065:RFUnInitializeReader() Attempting shutdown of ACS ACR122U 00 00.
ifdhandler.c:437:IFDHCloseChannel() usb:072f/2200:libusb:001:004 (lun: 0)
ccid_usb.c:875:WriteUSB() usb_bulk_write(001/004): No such device or address
readerfactory.c:914:RFUnloadReader() Unloading reader driver.

Использованный материал:
1)http://ww1.microchip.com/downloads/en/DeviceDoc/Prototype_SEC1110_SEC1210_Linux%20Setup.docx

вторник, 26 мая 2015 г.

Установка средств кросскомпиляции (ELDK) для custom-платы на основе Digi ConnectCore 9m 2443 и сборка Qt 4.8.3

Мне необходимо собрать проект, написанный под Qt 4.8.3, для выполнения на custom-плате под управлением микроконтроллера Digi Connect Core 9M 2443. Средства разработки и кросскомпиляции будем ставить на ОС Ubuntu 10.04 (host), так как стандартная библиотека С++ этой версии совместима с библиотекой, используемой в ELDK. Ubuntu 10.04 - самая старшая версия Ubuntu, официально поддерживаемая ELDK, согласно документации.

Версия Ubuntu 10.04 уже не поддерживается, но старые пакеты можно скачать из резервного репозитория. Меняем в файле /etc/apt/sources.list строчку http://ru.archive.ubuntu.com/ubuntu/   на http://old-releases.ubuntu.com/ubuntu.

Для сборки qt надо установить пакет g++:

sudo apt-get install g++

У меня на компе установлена Ubuntu 16.04 amd64. Я устанавливаю virtualbox (sudo apt-get install virtualbox), создаю новую машину со стандартными настройками под 32-битный linux, скачиваю 32-битный iso'шник, примонтирую его в виде оптического диска и устанавливаю с него Ubuntu 10.04 x86 на виртуальную машину (подробнее).

1. Для сборки используются инструменты ELDK (Embedded Linux Development Kit) http://www.denx.de/wiki/DULG/ELDK. Я устанавливаю старую версию 4.2 (ftp://ftp-stud.hs-esslingen.de/pub/Mirrors/eldk/4.2/arm-linux-x86/iso/arm-2008-11-24.iso). В новых версиях ELDK, начиная с 5.0, изменилась система наименований, iso'шники сгруппированны по архитектуре ARM. В плате используется микропроцессор S3C2443 фирмы Sumsung ARM9. Группа микропроцессоров ARM9 может соответствовать либо архитектуре ARMv4T, либо ARMv5TE, либо ARMv5TEJ. Для последней доступной версии ELDK 5.3, по моему мнению, стоит остановиться на версии armv4t (ftp://ftp-stud.hs-esslingen.de/pub/Mirrors/eldk/5.3/iso/eldk-5.3-armv4t.iso), но я ее не проверял.

Я скачал файл на хост-машину и перекинул в общую папку /media/Data/Exchange, которая соответствует папке /media/Exchange гостевой ОС. Переходим в неё (/media/Exchange), создаем папку для монтирования (/mnt/iso) и монтируем исошник:

cd /media/Exchange
sudo mkdir /mnt/iso
sudo mount -o loop -o exec ./arm-2008-11-24.iso /mnt/iso

Переходим в директорию и запускаем установку в папку /usr/local/tools/eldk:

cd /mnt/iso

sudo ./install -d /usr/local/tools/eldk

Добавляем путь к бинарникам в общий путь поиска системы. Редактируем файл ~/.bashrc:

sudo nano ~/.bashrc

Добавляем в конец строку:

export PATH=$PATH:/usr/local/tools/eldk/usr/bin

После перезапуска терминала и инициализации его из обновленного скрипта ~/.bashrc вывод команды echo $PATH должен включать /usr/local/tools/eldk/usr/bin.

2. Кросскомпиляция Qt 4.8.3 производится на гостевой ОС Ubuntu 10.04 x86. Скачиваем версию qt 4.8.3 отсюда под хост-машиной, распаковываем в папку для сборки /media/Data/Exchange/qt_4.8.3_arm.

В проекте нет стандартных настроек для системы кросскомпиляции ELDK, поэтому надо будет создать файлы настроек. Переходим в папку mkspecs/qws, создаем папку и копируем файлы настроек:

cd /media/Data/Exchange/qt_4.8.3_arm/mkspecs/qws
mkdir linux-arm-eldk-g++
cp linux-arm-g++/qmake.conf ./linux-arm-eldk-g++
cp linux-arm-g++/qplatformdefs.h ./linux-arm-eldk-g++


Редактируем файл настроек nano ./linux-arm-eldk-g++/qmake.conf в соответствии с используемым средством кросскомпиляции /usr/local/tools/eldk:

#
# qmake configuration for building with linux-arm-eldk-g++
#

include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)

#Compiler Flags to take advantage of the ARM architecture

QMAKE_CFLAGS_RELEASE = -O0 -march=armv4t -mtune=arm920t -pipe
QMAKE_CXXFLAGS_RELEASE = -O0 -march=armv4t -mtune=arm920t -pipe

# modifications to g++.conf
QMAKE_CC = /usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-gcc
QMAKE_CXX = 
/usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-g++
QMAKE_LINK = /usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-g++
QMAKE_LINK_SHLIB = /usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-g++

# modifications to linux.conf
QMAKE_AR = 
/usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-objcopy
QMAKE_STRIP = /usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-strip

load(qt_config)


Мы прописали полный путь к кроссинструментам (например, /usr/local/tools/eldk/usr/bin/arm-linux-gnueabi-gcc вместо просто arm-linux-gnueabi-gcc ) потому, что версия QtCreator 1.3.1, которая идет в этой версии Ubuntu, почему-то не считывает путь поиска из переменной $PATH.

Собираем qt 4.8.3:

cd /media/Data/Libraries/bbb/qt_4.8.3_arm
./configure -v -embedded arm -platform qws/linux-x86-g++ -xplatform qws/linux-arm-eldk-g++ -prefix /usr/local/tools/qt_4.8.3_arm -little-endian -qt-gfx-transformed -static -confirm-license -opensource -no-accessibility -no-largefile -fast -no-phonon -no-phonon-backend -qt-zlib -no-qt3support -no-openssl -no-qdbus -no-webkit -qt-sql-sqlite -nomake demos -nomake examples -nomake docs

make
sudo make install

Устанавливаем QtCreator из репозитария:

sudo apt-get install qt-sdk

Использованный материал:
1) http://help.ubuntu.ru/wiki/old_ubuntu_versions
2) http://help.ubuntu.ru/wiki/%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9

Подключение существующего vdi-образа с гостевой ОС Ubuntu 10.04 на VirtualBox под управлением Ubuntu 16.04 (хост-ОС)

Ставим из репозитария VirtualBox:

sudo apt-get install virtualbox

Создаем новую виртуальную машину Ubuntu 10.04, выбирая те же дефолтные параметры, что и в предыдущем посте. На шаге подключения жесткого диска выбираем существующий vdi-образ с установленной Ubuntu 10.04. Запускаем. При первом запуске Ubuntu 10.04 повисла при загрузке. При перезапуске загрузка прошла корректно, установленные дополнения гостевой ОС работают.

Настраиваем общую папку для того, чтобы Ubuntu 10.04 видела Ubuntu 16.04. Переходим в верхнем меню в пункт "Устройства/Настроить общие папки". Добавляем папки машины. Выбираем папку /media/Data/Exchange.

После перезагрузки папка на гостевой ОС /media/sf_Exchange должна содержать файлы папки /media/Data/Echange хост-машины. У меня так автоматически не произошло даже после перезагрузки, поэтому делаем шаги по монтированию сами. Создаем папку для монтирования (у меня /media/Exchange) и примонтируем:

sudo mkdir /media/Exchange
sudo mount -t vboxsf Exchange /media/Exchange


После этого папка /media/Exchange гостевой ОС связана с папкой /media/Data/Echange хост-ОС.

Установка Ubuntu 10.04 x86 в качестве гостевой ОС на VirtualBox под управлением Windows 7(хост-ОС)

Скачиваем последний дистрибутив VirtualBox отсюда (у меня последняя версия 4.3.28) и устанавливаем. Скачиваем iso-файл со старой версией Ubuntu 10.04 отсюда (обязательно x86/i386, так как 64-битные архитектуры(amd64) VirtualBox не поддерживает).

Запускаем VirtualBox и создаем новую машину со следующими параметрами. В поле название вводим "Ubuntu 10.04", в поле тип "Linux", в поле версия "Ubuntu (32 bit)" (последние два парметра выберутся автоматически при выборе имени, содержащего графический компекс знаков"ubuntu"). Переходим к следующему шагу. Используем рекомендуемый размер оперативной памяти - 512 MB. Переходим к следующему шагу. Соглашаемся на создание нового виртуального жесткого диска размером 8 GB. Далее выбираем тип VDI и используем динамическое выделение памяти, это удобно. Выбираем место, куда положить файл (у меня D:\Downloads\Images\vdi\Ubuntu10_04) и создаем виртуальный диск.

Подключаем скачанный установочный iso-образ в эмулятор DVD-привода к созданной виртуальной машине. Переходим в Настройки/Носители. Добавляем к "Контроллеру IDE" новое устройство (почему-то при добавлении оптического привода к контроллеру SATA виртуальная машина отказывалась видеть iso-образ, вставленный в него). Нажимаем кнопку "Добавить новое устройство к выбранному контроллеру" и выбираем "Добавить привод оптических дисков". Выбираем iso-образ Ubuntu 10.04 для добавленного привода. Нажимаем "Ок". Переходим в меню "Настройки/Система/Материнская плата/Порядок загрузки". Переставляем оптический привод в списке вверх или оставляем только его включенным в списке загрузки. Запускаем виртуальную машину. 

Начинается установка Ubuntu 10.04 на виртуальную машину. Выбираем русский язык установки, свой часовой пояс, русскую раскладку клавиатуры, автоматическое разбиение мастером всего жесткого диска на разделы (удалить все данные и использовать весь диск). В графе "Как вас зовут?" введите ваш логин для работы в машине (например, adil). Это же имя появится в графе "Какое имя вы хотите использовать при входе в систему". Название компьютера в сети будет построено добавлением слова "desktop" к имени (например, adil-desktop). В качестве пароля я обычно использую "qwerty". В radiobutton'e ниже выберите "Входить в систему автоматически". Далее подтвердите все выбранные параметры. Начнется копирование файлов.

Устанавливаем "Дополнения гостевой ОС" для взаимодействия с системой и улучшенного отображения (экран эмулируемой системы сможет принимать разрешение хост-ОС). Если мышь захвачена эмулируемой системой, нажимаем host-button (по умолчанию,"Right Control") для разблокировки. Выбираем в верхнем меню "Устройства/Подключить образ диска Дополнения гостевой ОС". В эмулируемой системе Ubuntu ставим "VirtualBox Guest Additions".

Для доступа из гостевой Ubuntu 10.04 к хост-ОС Windows 7 выбираем в верхнем меню "Устройства/Настроить общие папки". Выбираем "Папки машины" и добавляем папку на реальной машине (например, D:\Exchange), имя папки "Exchange", ставим галочки в checkbox'ах "Автоподключение" и "Создать постоянную папку". В Ubuntu добавляем текущего пользователя в группу vboxsf:

sudo adduser adil vboxsf

Общая папка, судя по ману, должна монтироваться при загрузке Ubuntu 10.04 в папку /media/sf_Exchange. На всякий случай, если она автоматически не примонтировалась, делаем все сами. Создаем папку для монтирования (у меня /media/Exchange) и примонтируем:

sudo mkdir /media/Exchange
sudo mount -t vboxsf Exchange /media/Exchange

После этого папка /media/Exchange гостевой ОС связана с папкой D:\Exchange хост-ОС.

Использованный материал:

среда, 20 мая 2015 г.

Хранение кодовой фразы в NFC-картах Mifare Classic Ultralight, 1K, 4K для картридеров ACR122, ACR1251

Кодовая фраза, состоящая из шести байт, хранится на NFC-картах (например, Mifare Classic 1K, ) вместе с секторами данных. Перед записью блока на карту или чтением c карты нужно пройти аутентификацию для доступа к сектору, содержащему указанный блок. Это справедливо для карт Mifare Classic 1K, 4K. Для самой простой и наименьшей по объему хранения данных карты Mifare Classic Ultralight аутентификация не нужна, доступ на запись и чтение к блоку данных её не требует.

Для карты Mifare Classic 1K каждый сектор состоит из четырех блоков: три блока данных (data block) и один дополнительный блок (trailer block). В этом блоке хранится информация для проверки доступа к блокам сектора. Описание (datasheet) карты хранения памяти (memory map) в картах Mifare Classic 1K можно посмотреть здесь.

В картридере ACR122 нет энергонезависимой памяти для хранения ключей доступа к картам для проверки. Перед работой с картами 6-байтный ключ должен быть загружен при помощи функции Load Authentication Keys APDU Format (11 bytes). Например, для дефолтного ключа FF FF FF FF FF FF с загрузкой в энергозависимую область хранения картридера с адресом 0x00 APDU-структура (записываемая в картридер команда) имеет следующий вид {FF 82 00 00h 06 FF FF FF FF FF FFh}. Затем перед доступом на чтение или запись к определенному блоку карты нужно пройти аутентификацию при помощи вызова одного из двух вариантов функции Load Authentication Keys APDU Format (6 Bytes) или (10 Bytes). Рассмотрим пример вызова функции (6 Bytes). Для аутентификации доступа к блоку 04h будем использовать тип ключа A (Type A) 60h, загруженный в область 00h. APDU-структура имеет следующий вид {FF 88 00 04 60 00h}. Теперь можно, например, прочитать 16-байтовый блок с адресом 04h при помощи функции Read Binary APDU Format (5 Bytes) APDU = {FF B0 00 04 10h}. Описание API работы картридера ACR122 можно посмотреть здесь.

Картридер ACR1251, в отличии от ACR122, имеет встроенную энергонезависимую память для хранения до 32 ключей для доступа к секторам карт. Описание API работы картридера ACR1251 можно скачать отсюда.

Для работы с картридером используется API проекта pcsc-lite, doxygen-документацию по которому можно найти на сайте проекта https://pcsclite.alioth.debian.org/api/.

Интересная статья про уязвимости карт Mifare Classic 1K http://habrahabr.ru/post/141213/.

Дополнительный материал:
1) MIFARE Ultralight datasheet
2) MIFARE Classic EV1 1K datasheet

понедельник, 18 мая 2015 г.

Установка драйвера (libacsccid) для работы с NFC-картридером ACR122 под Ubuntu 14.04

Файлы библиотеки libpcsclite уже предустановлены в дистрибутиве Ubuntu (библиотека /lib/x86_64-linux-gnu/libpcsclite.so.1.0.0 и символьная ссылка /lib/x86_64-linux-gnu/libpcsclite.so). Устанавливаем необходимые пакеты демона (pcscd) и драйвера (libacsccid) из репозитария Ubuntu. Есть два драйвера, два пакета libacsccid (поддерживающий большее количество карт фирмы ACS и тестирующийся ее инженерами https://lists.debian.org/debian-devel/2011/05/msg00705.html) и libccid (дефолный). Ставим демон pcscd и библиотеку libacsccid из репозитария:

sudo apt-get install pcscd

sudo apt-get install libacsccid1

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

Bus 002 Device 002: ID 058f:6362 Alcor Micro Corp. Flash Card Reader/Writer
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 002: ID 04d9:1702 Holtek Semiconductor, Inc. 
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 003: ID 072f:2200 Advanced Card Systems, Ltd 
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Остановим запущенный демон pcscd (sudo service pcscd stop или sudo killall pcscd). Запустим демон в режиме отладки (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".

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

...
[ 9636.196045] usb 7-2: new full-speed USB device number 2 using uhci_hcd
[ 9636.379053] usb 7-2: New USB device found, idVendor=072f, idProduct=2200
[ 9636.379057] usb 7-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 9636.379059] usb 7-2: Product: ACR122U PICC Interface
[ 9636.379061] usb 7-2: Manufacturer: ACS
[ 9636.793182] 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

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

00000000 debuglog.c:269:DebugLogSetLevel() debug level=debug
00000097 configfile.l:254:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000023 configfile.l:307:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000039 configfile.l:266:DBGetReaderListDir() Skipping non regular file: .
00000012 configfile.l:266:DBGetReaderListDir() Skipping non regular file: ..
00000012 pcscdaemon.c:545:main() pcsc-lite 1.8.10 daemon ready.
00001284 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/003/001
00000100 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/004/001
00000093 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/005/001
00000092 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000090 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/006/001
00000089 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/007/001
00000069 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/007/001
00000073 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x072F, PID: 0x2200, path: /dev/bus/usb/007/002
00000026 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x072F, PID: 0x2200, path: /dev/bus/usb/007/002
00000012 hotplug_libudev.c:321:HPAddDevice() Adding USB device: ACS ACR122U
00000023 readerfactory.c:989:RFInitializeReader() Attempting startup of ACS ACR122U 00 00 using /usr/lib/pcsc/drivers/ifd-acsccid.bundle/Contents/Linux/libacsccid.so
00000129 readerfactory.c:874:RFBindFunctions() Loading IFD Handler 3.0
00000027 ifdhandler.c:2328:init_driver() Driver version: 1.0.5
00000150 ifdhandler.c:2341:init_driver() LogLevel: 0x0003
00000130 ifdhandler.c:2361:init_driver() DriverOptions: 0x00C0
00000128 ifdhandler.c:2388:init_driver() ACR38CardVoltage: 0
00000128 ifdhandler.c:2395:init_driver() ACR38CardType: 0
00000012 ifdhandler.c:94:IFDHCreateChannelByName() lun: 0, device: usb:072f/2200:libudev:0:/dev/bus/usb/007/002
00178155 ccid_usb.c:375:OpenUSBByName() Manufacturer: Advanced Card Systems Ltd.
00000160 ccid_usb.c:385:OpenUSBByName() ProductString: ACS CCID driver
00000122 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.
00007615 ccid_usb.c:650:OpenUSBByName() Found Vendor/Product: 072F/2200 (ACS ACR122U)
00000015 ccid_usb.c:652:OpenUSBByName() Using USB bus/device: 007/002
00002182 ccid_usb.c:1368:get_data_rates() IFD does not support GET_DATA_RATES request: Success
01013513 ifdhandler.c:220:IFDHCreateChannelByName() dwFeatures: 0x00020040
00000019 ifdhandler.c:221:IFDHCreateChannelByName() wLcdLayout: 0x0000
00000005 ifdhandler.c:222:IFDHCreateChannelByName() bPINSupport: 0x00
00000005 ifdhandler.c:223:IFDHCreateChannelByName() dwMaxCCIDMessageLength: 271
00000004 ifdhandler.c:224:IFDHCreateChannelByName() dwMaxIFSD: 256
00000005 ifdhandler.c:225:IFDHCreateChannelByName() dwDefaultClock: 4000
00000005 ifdhandler.c:226:IFDHCreateChannelByName() dwMaxDataRate: 250000
00000004 ifdhandler.c:227:IFDHCreateChannelByName() bMaxSlotIndex: 0
00000005 ifdhandler.c:228:IFDHCreateChannelByName() bCurrentSlotIndex: 0
00000017 ifdhandler.c:229:IFDHCreateChannelByName() bInterfaceProtocol: 0x00
00000005 ifdhandler.c:230:IFDHCreateChannelByName() bNumEndpoints: 3
00000004 ifdhandler.c:231:IFDHCreateChannelByName() bVoltageSupport: 0x07
00000009 ifdhandler.c:536:IFDHGetCapabilities() tag: 0xFB3, usb:072f/2200:libudev:0:/dev/bus/usb/007/002 (lun: 0)
00000006 readerfactory.c:327:RFAddReader() Using the pcscd polling thread
00015973 ifdhandler.c:536:IFDHGetCapabilities() tag: 0xFAE, usb:072f/2200:libudev:0:/dev/bus/usb/007/002 (lun: 0)
00000018 ifdhandler.c:631:IFDHGetCapabilities() Reader supports 1 slot(s)
00000195 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/008/001
00000108 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0001, path: /dev/bus/usb/008/001
00000111 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x04D9, PID: 0x1702, path: /dev/bus/usb/008/002
00000106 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x04D9, PID: 0x1702, path: /dev/bus/usb/008/002
00000140 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000103 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/002/001
00000106 hotplug_libudev.c:269:get_driver() Looking for a driver for VID: 0x058F, PID: 0x6362, path: /dev/bus/usb/002/002
00000047 readerfactory.c:1330:RFWaitForReaderInit() Waiting init for reader: ACS ACR122U 00 00
00010073 readerfactory.c:1330:RFWaitForReaderInit() Waiting init for reader: ACS ACR122U 00 00
00010079 readerfactory.c:1330:RFWaitForReaderInit() Waiting init for reader: ACS ACR122U 00 00
00010078 readerfactory.c:1330:RFWaitForReaderInit() Waiting init for reader: ACS ACR122U 00 00
00002745 ifdhandler.c:1355:IFDHPowerICC() action: PowerUp, usb:072f/2200:libudev:0:/dev/bus/usb/007/002 (lun: 0)
00001991 eventhandler.c:266:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000014 Card ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 01 00 00 00 00 6A 
00429759 ifdhandler.c:1355:IFDHPowerICC() action: PowerDown, usb:072f/2200:libudev:0:/dev/bus/usb/007/002 (lun: 0)
00001995 eventhandler.c:455:EHStatusHandlerThread() powerState: POWER_STATE_UNPOWERED
00011372 ccid_usb.c:1485:InterruptRead() Reader: 007/002
00000018 ccid_usb.c:1503:InterruptRead() Slot 0: 0x00

Для работы с библиотекой libpcsclite потребуются хедеры (pcsclite.h и другие). Необходимые заголовочные файлы включены в пакет libpcsclite-dev. Установив его (sudo apt-get install libpcsclite-dev), мы получим файлы pcsclite.hwinscard.hwintypes.h в папке /usr/include/PCSC.

Для настройки проекта Qt (pro-файла) для работы с библиотекой libpcsclite необходимо указать подключение библиотеки, добавить указанные пути к библиотеке и хедерам:

unix:{
  INCLUDEPATH += /usr/include/PCSC
  LIBS += -L"/lib/x86_64-linux-gnu/" -lpcsclite
}