27 #endif // HAVE_CONFIG_H
29 #include "../drivers.h"
42 #define SERIAL_DEFAULT_PORT_SPEED 115200
45 static const byte_t ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
47 void pn532_uart_ack (
const nfc_device_spec_t nds);
52 pn532_uart_pick_device (
void)
56 if ((pndd = malloc (
sizeof (*pndd)))) {
60 DBG (
"%s",
"pn532_uart_list_devices failed");
66 DBG (
"%s",
"No device found");
81 #ifndef SERIAL_AUTOPROBE_ENABLED
85 DBG (
"%s",
"Serial auto-probing have been disabled at compile time. Skipping autoprobe.");
91 const char *pcPorts[] = DEFAULT_SERIAL_PORTS;
95 while ((pcPort = pcPorts[iDevice++])) {
96 sp = uart_open (pcPort);
97 DBG (
"Trying to find PN532 device on serial port: %s at %d bauds.", pcPort, SERIAL_DEFAULT_PORT_SPEED);
99 if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) {
102 uart_set_speed (sp, SERIAL_DEFAULT_PORT_SPEED);
112 snprintf (pnddDevices[*pszDeviceFound].acDevice, DEVICE_NAME_LENGTH - 1,
"%s (%s)",
"PN532", pcPort);
113 pnddDevices[*pszDeviceFound].
acDevice[DEVICE_NAME_LENGTH - 1] =
'\0';
114 pnddDevices[*pszDeviceFound].
pcDriver = PN532_UART_DRIVER_NAME;
115 pnddDevices[*pszDeviceFound].
pcPort = strdup (pcPort);
116 pnddDevices[*pszDeviceFound].
uiSpeed = SERIAL_DEFAULT_PORT_SPEED;
117 DBG (
"Device found: %s.", pnddDevices[*pszDeviceFound].acDevice);
121 if ((*pszDeviceFound) >= szDevices)
125 if (sp == INVALID_SERIAL_PORT)
126 DBG (
"Invalid serial port: %s", pcPort);
127 if (sp == CLAIMED_SERIAL_PORT)
128 DBG (
"Serial port already claimed: %s", pcPort);
143 DBG (
"Attempt to connect to: %s at %d bauds.", pndd->
pcPort, pndd->
uiSpeed);
144 sp = uart_open (pndd->
pcPort);
146 if (sp == INVALID_SERIAL_PORT)
147 ERR (
"Invalid serial port: %s", pndd->
pcPort);
148 if (sp == CLAIMED_SERIAL_PORT)
149 ERR (
"Serial port already claimed: %s", pndd->
pcPort);
150 if ((sp == CLAIMED_SERIAL_PORT) || (sp == INVALID_SERIAL_PORT))
153 uart_set_speed (sp, pndd->
uiSpeed);
163 DBG (
"Successfully connected to: %s", pndd->
pcPort);
168 pnd->
acName[DEVICE_NAME_LENGTH - 1] =
'\0';
171 pnd->
nds = (nfc_device_spec_t) sp;
180 uart_close ((serial_port) pnd->
nds);
184 #define TX_BUFFER_LEN (256)
185 #define RX_BUFFER_LEN (PN53x_EXTENDED_FRAME_MAX_LEN + PN53x_EXTENDED_FRAME_OVERHEAD)
187 pn532_uart_transceive (
nfc_device_t * pnd,
const byte_t * pbtTx,
const size_t szTx, byte_t * pbtRx,
190 byte_t abtTxBuf[TX_BUFFER_LEN] = { 0x00, 0x00, 0xff };
191 byte_t abtRxBuf[RX_BUFFER_LEN];
192 size_t szRxBufLen = MIN( RX_BUFFER_LEN, *pszRx );
199 abtTxBuf[4] = 256 - abtTxBuf[3];
201 memmove (abtTxBuf + 5, pbtTx, szTx);
204 abtTxBuf[szTx + 5] = 0;
205 for (szPos = 0; szPos < szTx; szPos++) {
206 abtTxBuf[szTx + 5] -= abtTxBuf[szPos + 5];
210 abtTxBuf[szTx + 6] = 0;
213 PRINT_HEX (
"TX", abtTxBuf, szTx + 7);
215 res =
uart_send ((serial_port) pnd->
nds, abtTxBuf, szTx + 7);
217 ERR (
"%s",
"Unable to transmit data. (TX)");
224 ERR (
"%s",
"Unable to receive data. (RX)");
229 PRINT_HEX (
"RX", abtRxBuf, szRxBufLen);
233 if (!pn53x_check_ack_frame_callback (pnd, abtRxBuf, szRxBufLen))
235 szRxBufLen -=
sizeof (ack_frame);
236 memmove (abtRxBuf, abtRxBuf +
sizeof (ack_frame), szRxBufLen);
238 if (szRxBufLen == 0) {
239 szRxBufLen = RX_BUFFER_LEN;
245 PRINT_HEX (
"RX", abtRxBuf, szRxBufLen);
250 PRINT_HEX (
"TX", ack_frame,
sizeof(ack_frame));
252 res =
uart_send ((serial_port) pnd->
nds, ack_frame,
sizeof(ack_frame));
254 ERR (
"%s",
"Unable to transmit data. (TX)");
259 if (!pn53x_check_error_frame_callback (pnd, abtRxBuf, szRxBufLen))
263 if (pbtRx == NULL || pszRx == NULL)
267 if (szRxBufLen < 9) {
272 *pszRx = szRxBufLen - 9;
273 memcpy (pbtRx, abtRxBuf + 7, *pszRx);
279 pn532_uart_ack (
const nfc_device_spec_t nds)
282 PRINT_HEX (
"TX", ack_frame,
sizeof (ack_frame));
284 uart_send ((serial_port) nds, ack_frame,
sizeof (ack_frame));
288 pn532_uart_wait_for_ack(
const nfc_device_spec_t nds)
290 byte_t abtRx[RX_BUFFER_LEN];
291 size_t szRx =
sizeof(ack_frame);
292 if (0 ==
uart_receive ((serial_port) nds, abtRx, &szRx)) {
294 PRINT_HEX (
"RX", abtRx, szRx);
300 if (0 != memcmp (ack_frame, abtRx, szRx))
305 #define PN53X_RX_OVERHEAD 6
309 byte_t abtRx[RX_BUFFER_LEN];
310 size_t szRx = PN53x_NORMAL_FRAME_OVERHEAD + 2;
314 const byte_t pncmd_pn532c106_wakeup_preamble[] =
315 { 0x55, 0x55, 0x00, 0x00, 0x00,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
317 0x00, 0x00, 0xff, 0x03, 0xfd, 0xd4, 0x14, 0x01, 0x17, 0x00 };
319 PRINT_HEX (
"TX", pncmd_pn532c106_wakeup_preamble,
sizeof (pncmd_pn532c106_wakeup_preamble));
321 uart_send ((serial_port) nds, pncmd_pn532c106_wakeup_preamble,
sizeof (pncmd_pn532c106_wakeup_preamble));
323 pn532_uart_wait_for_ack(nds);
325 if (0 ==
uart_receive ((serial_port) nds, abtRx, &szRx)) {
327 PRINT_HEX (
"RX", abtRx, szRx);
330 ERR (
"Unable to wakeup the PN532.");
337 byte_t abtRx[RX_BUFFER_LEN];
338 const byte_t attempted_result[] =
339 { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x09, 0xf7, 0xD5, 0x01, 0x00,
'l',
'i',
'b',
'n',
'f',
'c',
341 size_t szRx =
sizeof(attempted_result);
345 const byte_t pncmd_communication_test[] =
346 { 0x00, 0x00, 0xff, 0x09, 0xf7, 0xd4, 0x00, 0x00,
'l',
'i',
'b',
'n',
'f',
'c', 0xbe, 0x00 };
351 PRINT_HEX (
"TX", pncmd_communication_test,
sizeof (pncmd_communication_test));
353 res =
uart_send ((serial_port) nds, pncmd_communication_test,
sizeof (pncmd_communication_test));
355 ERR (
"%s",
"Unable to transmit data. (TX)");
361 ERR (
"%s",
"Unable to receive data. (RX)");
365 PRINT_HEX (
"RX", abtRx, szRx);
368 if (0 == memcmp (abtRx, attempted_result,
sizeof (attempted_result)))