четверг, 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

Комментариев нет:

Отправить комментарий