В интернетах продаются платы чтения/записи rfid карт с микросхемой pn532. Они выглядят по разному, но внутри у них микроконтроллер nxp pn532 с прошивкой от adafruit. Они предназначаются для работы с платами arduino, ибо для компьютера нет работоспособных версий libnfc. Как скомпилировать свою версию libnfc, способную работать с этими платами, я опишу в этом посте.
1. linux
1.1. Компиляция компиляция без модификации кода старой версии: libnfc v1.5.0 и mfoc mfoc-0.10.2
#apt-get install autoconf libtool subversion pkg-config make libusb-dev
$cd /usr/share/aclocal
$wget https://gnunet.org/svn/Extractor/m4/pkg.m4
$wget http://github.com/nfc-tools/libnfc/archive/libnfc-1.5.0.tar.gz
$tar -xvzf libnfc-1.5.0.tar.gz
$cd libnfc-libnfc-1.5.0
$autoreconf -vis
$./configure --with-drivers=pn532_uart --enable-serial-autoprobe
$make
#make install
$echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
$ldconsufig
$wget http://github.com/nfc-tools/mfoc/archive/mfoc-0.10.2.tar.gz
$tar -xvzf mfoc-0.10.2.tar.gz
$cd mfoc-mfoc-0.10.2
$autoreconf -vis
$./configure
$make
#make install
Это займет несколько десятков минут.
1.2 Компиляция последних версий с модификацией кода
#apt-get install autoconf libtool subversion pkg-config make libusb-dev git
$git clone https://github.com/nfc-tools/libnfc.git
$cd libnfc
$autoreconf -vis
$./configure --enable-doc
$sed -i -e 's/res->allow_intrusive_scan *= *false;/res->allow_intrusive_scan *= *true;/ ./libnfc/nfc-internal.c
$sed -i -e 's/const *uint8_t *pn532_wakeup_preamble[[][]] *= *[{] *0x55, *0x55, *0x00,/const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,/ ./libnfc/drivers/pn532_uart.c
$make
#make install
2. Windows
2.1. Загрузить и установить слеедующие компоненты
| Компонент | Имя файла | Размер | Окуда качать в интернете | Куда распаковать/установить |
| tdm-gcc | tdm64-gcc-5.1.0-2.exe | 45.8М | https://sourceforge.net/projects/tdm-gcc/files/latest/download | d:/tools/tdm-gcc, обязательно 32/64 установка |
| libusb-win32 | libusb-win32-bin-1.2.6.0.zip | 891к | https://sourceforge.net/projects/libusb-win32/files/latest/download | d:/tools/libusb-win32-bin-1.2.6.0 |
| PCRE for Windows | pcre-7.0.exe | 1.34М | https://sourceforge.net/projects/gnuwin32/files/pcre/7.0/pcre-7.0.exe/download | d:/tools/libusb-win32-bin-1.2.6.0 |
| cmake | cmake-3.4.3-win32-x86.exe | 12.5М | https://cmake.org/files/v3.4/cmake-3.4.3-win32-x86.exe | D:\tools\CMake |
| doxygen | doxygen-1.8.11-setup.exe | 24М | https://sourceforge.net/projects/doxygen/files/latest/download?source=files | D:\tools\doxygen |
| libnfc | libnfc-libnfc-1.7.1.zip | 351к | https://github.com/nfc-tools/libnfc/archive/libnfc-1.7.1.zip | d:/tools/libnfc-libnfc-1.7.1 |
| mfoc | mfoc-mfoc-0.10.7.zip | 42к | https://github.com/nfc-tools/mfoc/archive/mfoc-0.10.7.zip | d:\tools\mfoc-mfoc-0.10.7 |
| mfcuk | mfcuk-mfcuk-0.3.8.zip | 74.5к | https://github.com/nfc-tools/mfcuk/archive/mfcuk-0.3.8.zip | d:\tools\mfcuk-mfcuk-0.3.8 |
2.2. Интергрировать mfoc в libnfc
2.2.1. Выполнить следующие команды для копирования "сырцов" mfoc в libnfc
copy d:\tools\mfoc-mfoc-0.10.7\src\mfoc.* d:\tools\libnfc-libnfc-1.7.1\utils
copy d:\tools\mfoc-mfoc-0.10.7\src\cr*.* d:\tools\libnfc-libnfc-1.7.1\utils
copy d:\tools\mfoc-mfoc-0.10.7\src\mifare.* d:\tools\libnfc-libnfc-1.7.1\utils\mifare4mfoc.*
copy d:\tools\mfoc-mfoc-0.10.7\src\nfc-utils.* d:\tools\libnfc-libnfc-1.7.1\utils\nfc-utils4mfoc.*
2.2.2 Отредактировать файлы в папке d:\tools\libnfc-libnfc-1.7.1\utils для предотвращения конфликта версий
| Имя файла | Что искать | На что менять |
| CMakeLists.txt | SET(UTILS-SOURCES nfc-emulate-forum-tag4 nfc-jewel nfc-list nfc-mfclassic nfc-mfultralight nfc-read-forum-tag3 nfc-relay-picc nfc-scan-device ) | SET(UTILS-SOURCES nfc-emulate-forum-tag4 nfc-jewel nfc-list nfc-mfclassic nfc-mfultralight nfc-read-forum-tag3 nfc-relay-picc nfc-scan-device mfoc ) |
| IF((${source} MATCHES "nfc-mfultralight") OR (${source} MATCHES "nfc-mfclassic")) LIST(APPEND TARGETS mifare) ENDIF((${source} MATCHES "nfc-mfultralight") OR (${source} MATCHES "nfc-mfclassic")) | IF((${source} MATCHES "nfc-mfultralight") OR (${source} MATCHES "nfc-mfclassic")) IF((${source} MATCHES "mfoc")) | |
| Makefile.am | bin_PROGRAMS = \ nfc-emulate-forum-tag4 \ nfc-jewel \ nfc-list \ nfc-mfclassic \ nfc-mfultralight \ nfc-read-forum-tag3 \ nfc-relay-picc \ nfc-scan-device | bin_PROGRAMS = \ nfc-emulate-forum-tag4 \ nfc-jewel \ nfc-list \ nfc-mfclassic \ nfc-mfultralight \ nfc-read-forum-tag3 \ nfc-relay-picc \ nfc-scan-device \ mfoc |
| nfc_mfclassic_SOURCES = nfc-mfclassic.c mifare.c mifare.h nfc-utils.h nfc_mfclassic_LDADD = $(top_builddir)/libnfc/libnfc.la \ libnfcutils.la | nfc_mfclassic_SOURCES = nfc-mfclassic.c mifare.c mifare.h nfc-utils.h nfc_mfclassic_LDADD = $(top_builddir)/libnfc/libnfc.la \ libnfcutils.la mfoc_SOURCES = mfoc.c crypto1.c crapto1.c mifare4mfoc.c nfc-utils4mfoc.c mifare4mfoc.h nfc-utils4mfoc.h crapto1.h mfoc.h mfoc_LDADD = $(top_builddir)/libnfc/libnfc.la | |
| dist_man_MANS = \ nfc-emulate-forum-tag4.1 \ nfc-jewel.1 \ nfc-list.1 \ nfc-mfclassic.1 \ nfc-mfultralight.1 \ nfc-read-forum-tag3.1 \ nfc-relay-picc.1 \ nfc-scan-device.1 | dist_man_MANS = \ nfc-emulate-forum-tag4.1 \ nfc-jewel.1 \ nfc-list.1 \ nfc-mfclassic.1 \ nfc-mfultralight.1 \ nfc-read-forum-tag3.1 \ nfc-relay-picc.1 \ nfc-scan-device.1 \ mfoc.1 | |
| mifare4mfoc.c | #include "mifare.h" | #include "mifare4mfoc.h" |
| nfc-utils4mfoc.c | #include "nfc-utils.h" | #include "nfc-utils4mfoc.h" |
2.3. интегрирование mfcuk в libnfc
2.3.1. Так как файлов здесь очень много, то буду создавать отдельную папку "d:\tools\libnfc-libnfc-1.7.1\mfcuk", в которую буду копировать все содержимое "d:\tools\mfcuk-mfcuk-0.3.8\src".
2.3.2 Теперь надо отредактировать несколько файлов для их компиляции.
| Имя файла | Что искать | На что менять |
| d:\tools\libnfc-libnfc-1.7.1\CMakeLists.txt | ADD_SUBDIRECTORY(examples) | ADD_SUBDIRECTORY(examples) ADD_SUBDIRECTORY(mfcuk) |
| Makefile.am | SUBDIRS = libnfc utils examples include contrib cmake test | SUBDIRS = libnfc utils examples include contrib cmake test mfcuk |
2.4. Отредактировать исходники libnfc для нормального поиска устройства
| Имя файла | Что искать | На что менять | Смысл |
| C:\tools\libnfc-libnfc-1.7.1\libnfc\drivers\pn532_uart.c | const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; | const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; | увеличение времени на просыпание устройства |
| C:\tools\libnfc-libnfc-1.7.1\libnfc\nfc-internal.c | res->allow_intrusive_scan = false; | res->allow_intrusive_scan = true; | разрешение искать устройство |
2.5. Создать папку d:\libnfc и в ней файл "start console.bat" со строкой "@cmd /k path=%path%;D:\tools\TDM-GCC\bin;D:\tools\Cmake\bin;D:\tools\GnuWin32\bin;d:\libnfc\utils"
2.6. Запусть команду start console.bat
2.7. Запустить cmake-gui. В появившемся окне параметру "Where is source code" дать значение "D:/tools/libnfc-libnfc-1.7.1" и нажать "configure".

2.8. Нажать Finish

2.9. Дождаться появления сообщения об ошибке.

2.10. Задать значения переменным
| Переменная | Значение | Назначение |
| CMAKE_INSTALL_PREXIX | d:/libnfc | Куда будет пытаться устанавливать приложения |
| LIBNFC_SYSCONFDIR | ./ | Путь к конфигурациооным файлам |
| LIBUSB_INCLUDE_DIRS | D:/tools/libusb-win32-bin-1.2.6.0/include | Путь к заголовком библиотеки libusb |
| LIBUSB_LIBRARIES | D:/tools/libusb-win32-bin-1.2.6.0/lib/gcc/libusb.a | Путь к файлу библиотеки libusb |
2.11. Нажать configure и generate. После завершения операций закрыть приложение.
2.12. запустить mingw32-make в консоле.
2.13. Выполнить последовательности команд "cd libnfc" и "nfc-list" при поднесенной карте rfid к считывателю.

PN544
Date: 2016-11-29 02:51 pm (UTC)х64 Window???
Date: 2019-03-01 07:07 pm (UTC)Re: х64 Window???
Date: 2019-03-03 05:43 pm (UTC)Потом выяснилось еще, что гайд не учитывает версию libnfc. Компиляция и запуска программы происходит отлично, только данные сохраняет левые.
Надо для компиляции грузить исходник libnfc 1.5 вероятно.