chips/pn53x: add pn53x_data_new() function to alloc and init pn53x_data structure.

This commit is contained in:
Romuald Conty 2011-05-09 18:47:48 +00:00
parent ebb352f1f3
commit 95914345e1
7 changed files with 40 additions and 33 deletions

View file

@ -25,8 +25,6 @@
#ifndef __PN53X_INTERNAL_H__ #ifndef __PN53X_INTERNAL_H__
#define __PN53X_INTERNAL_H__ #define __PN53X_INTERNAL_H__
#include "pn53x.h"
// Miscellaneous // Miscellaneous
#define Diagnose 0x00 #define Diagnose 0x00
#define GetFirmwareVersion 0x02 #define GetFirmwareVersion 0x02
@ -118,11 +116,11 @@ typedef struct {
#endif #endif
} pn53x_command; } pn53x_command;
/* typedef enum {
#define PN531 0x01 PN531 = 0x01,
#define PN532 0x02 PN532 = 0x02,
#define PN533 0X04 PN533 = 0x04
*/ } pn53x_type;
#ifndef DEBUG #ifndef DEBUG
# define PNCMD( X, Y ) { X , Y } # define PNCMD( X, Y ) { X , Y }

View file

@ -67,12 +67,6 @@ pn53x_init(nfc_device_t * pnd)
return false; return false;
} }
// PN53x starts in initiator mode
CHIP_DATA (pnd)->operating_mode = INITIATOR;
// Set current target to NULL
CHIP_DATA (pnd)->current_target = NULL;
// CRC handling is enabled by default // CRC handling is enabled by default
pnd->bCrc = true; pnd->bCrc = true;
// Parity handling is enabled by default // Parity handling is enabled by default
@ -500,8 +494,6 @@ pn53x_get_firmware_version (nfc_device_t * pnd, char abtFirmwareText[18])
byte_t abtFw[4]; byte_t abtFw[4];
size_t szFwLen = sizeof (abtFw); size_t szFwLen = sizeof (abtFw);
if (!pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), abtFw, &szFwLen)) { if (!pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), abtFw, &szFwLen)) {
// Failed to get firmware revision??, whatever...let's disconnect and clean up and return err
// FIXME: Wtf?
return false; return false;
} }
// Determine which version of chip it is: PN531 will return only 2 bytes, while others return 4 bytes and have the first to tell the version IC // Determine which version of chip it is: PN531 will return only 2 bytes, while others return 4 bytes and have the first to tell the version IC
@ -2237,3 +2229,22 @@ pn53x_nm_to_ptt(const nfc_modulation_t nm)
} }
return PTT_UNDEFINED; return PTT_UNDEFINED;
} }
void
pn53x_data_new (nfc_device_t * pnd, const struct pn53x_io* io)
{
pnd->chip_data = malloc(sizeof(struct pn53x_data));
// Keep I/O functions
CHIP_DATA (pnd)->io = io;
// Set power mode to normal, if your device starts in LowVBat (ie. PN532
// UART) the driver layer have to correctly set it.
CHIP_DATA (pnd)->power_mode = NORMAL;
// PN53x starts in initiator mode
CHIP_DATA (pnd)->operating_mode = INITIATOR;
// Set current target to NULL
CHIP_DATA (pnd)->current_target = NULL;
}

View file

@ -28,6 +28,7 @@
# define __NFC_CHIPS_PN53X_H__ # define __NFC_CHIPS_PN53X_H__
# include <nfc/nfc-types.h> # include <nfc/nfc-types.h>
# include "pn53x-internal.h"
// TODO Remove double register address defines // TODO Remove double register address defines
// Registers and symbols masks used to covers parts within a register // Registers and symbols masks used to covers parts within a register
@ -133,12 +134,6 @@
# define DEACKMISMATCH 0x0200/* Unexpected data */ # define DEACKMISMATCH 0x0200/* Unexpected data */
# define DEISERRFRAME 0x0300/* Error frame */ # define DEISERRFRAME 0x0300/* Error frame */
typedef enum {
PN531 = 0x01,
PN532 = 0x02,
PN533 = 0x04
} pn53x_type;
typedef enum { typedef enum {
NORMAL, // In that case, there is no power saved but the PN53x reacts as fast as possible on the host controller interface. NORMAL, // In that case, there is no power saved but the PN53x reacts as fast as possible on the host controller interface.
POWERDOWN, // Only on PN532, need to be wake up to process commands with a long preamble POWERDOWN, // Only on PN532, need to be wake up to process commands with a long preamble
@ -312,6 +307,7 @@ bool pn53x_target_receive_bytes (nfc_device_t * pnd, byte_t * pbtRx, size_t *
bool pn53x_target_send_bits (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxBits, bool pn53x_target_send_bits (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxBits,
const byte_t * pbtTxPar); const byte_t * pbtTxPar);
bool pn53x_target_send_bytes (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx); bool pn53x_target_send_bytes (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx);
// Error handling functions // Error handling functions
const char *pn53x_strerror (const nfc_device_t * pnd); const char *pn53x_strerror (const nfc_device_t * pnd);
@ -345,4 +341,6 @@ bool pn53x_check_ack_frame (nfc_device_t * pnd, const byte_t * pbtRxFrame, co
bool pn53x_check_error_frame (nfc_device_t * pnd, const byte_t * pbtRxFrame, const size_t szRxFrameLen); bool pn53x_check_error_frame (nfc_device_t * pnd, const byte_t * pbtRxFrame, const size_t szRxFrameLen);
bool pn53x_build_frame (byte_t * pbtFrame, size_t * pszFrame, const byte_t * pbtData, const size_t szData); bool pn53x_build_frame (byte_t * pbtFrame, size_t * pszFrame, const byte_t * pbtData, const size_t szData);
void pn53x_data_new (nfc_device_t * pnd, const struct pn53x_io* io);
#endif // __NFC_CHIPS_PN53X_H__ #endif // __NFC_CHIPS_PN53X_H__

View file

@ -193,7 +193,9 @@ acr122_connect (const nfc_device_desc_t * pndd)
char *pcFirmware; char *pcFirmware;
nfc_device_t *pnd = nfc_device_new (); nfc_device_t *pnd = nfc_device_new ();
pnd->driver_data = malloc (sizeof (struct acr122_data)); pnd->driver_data = malloc (sizeof (struct acr122_data));
pnd->chip_data = malloc (sizeof (struct pn53x_data));
// Alloc and init chip's data
pn53x_data_new (pnd, &acr122_io);
SCARDCONTEXT *pscc; SCARDCONTEXT *pscc;
@ -220,8 +222,6 @@ acr122_connect (const nfc_device_desc_t * pndd)
// Done, we found the reader we are looking for // Done, we found the reader we are looking for
snprintf (pnd->acName, sizeof (pnd->acName), "%s / %s", pndd->acDevice, pcFirmware); snprintf (pnd->acName, sizeof (pnd->acName), "%s / %s", pndd->acDevice, pcFirmware);
CHIP_DATA (pnd)->power_mode = NORMAL;
CHIP_DATA (pnd)->io = &acr122_io;
// 50: empirical tuning on Touchatag // 50: empirical tuning on Touchatag
// 46: empirical tuning on ACR122U // 46: empirical tuning on ACR122U
CHIP_DATA (pnd)->timer_correction = 50; CHIP_DATA (pnd)->timer_correction = 50;

View file

@ -117,9 +117,9 @@ arygon_probe (nfc_device_desc_t pnddDevices[], size_t szDevices, size_t * pszDev
pnd->driver = &arygon_driver; pnd->driver = &arygon_driver;
pnd->driver_data = malloc(sizeof(struct arygon_data)); pnd->driver_data = malloc(sizeof(struct arygon_data));
DRIVER_DATA (pnd)->port = sp; DRIVER_DATA (pnd)->port = sp;
pnd->chip_data = malloc(sizeof(struct pn53x_data));
CHIP_DATA (pnd)->power_mode = NORMAL; // Alloc and init chip's data
CHIP_DATA (pnd)->io = &arygon_tama_io; pn53x_data_new (pnd, &arygon_tama_io);
bool res = arygon_reset_tama (pnd); bool res = arygon_reset_tama (pnd);
nfc_device_free (pnd); nfc_device_free (pnd);

View file

@ -98,10 +98,11 @@ pn532_uart_probe (nfc_device_desc_t pnddDevices[], size_t szDevices, size_t * ps
pnd->driver = &pn532_uart_driver; pnd->driver = &pn532_uart_driver;
pnd->driver_data = malloc(sizeof(struct pn532_uart_data)); pnd->driver_data = malloc(sizeof(struct pn532_uart_data));
DRIVER_DATA (pnd)->port = sp; DRIVER_DATA (pnd)->port = sp;
pnd->chip_data = malloc(sizeof(struct pn53x_data));
CHIP_DATA (pnd)->type = PN532; // Alloc and init chip's data
pn53x_data_new (pnd, &pn532_uart_io);
// This device starts in LowVBat power mode
CHIP_DATA (pnd)->power_mode = LOWVBAT; CHIP_DATA (pnd)->power_mode = LOWVBAT;
CHIP_DATA (pnd)->io = &pn532_uart_io;
// Check communication using "Diagnose" command, with "Communication test" (0x00) // Check communication using "Diagnose" command, with "Communication test" (0x00)
bool res = pn53x_check_communication (pnd); bool res = pn53x_check_communication (pnd);

View file

@ -290,10 +290,9 @@ pn53x_usb_connect (const nfc_device_desc_t *pndd)
pnd->driver_data = malloc(sizeof(struct pn53x_usb_data)); pnd->driver_data = malloc(sizeof(struct pn53x_usb_data));
*DRIVER_DATA (pnd) = data; *DRIVER_DATA (pnd) = data;
pnd->chip_data = malloc(sizeof(struct pn53x_data));
CHIP_DATA (pnd)->power_mode = NORMAL; // Alloc and init chip's data
CHIP_DATA (pnd)->io = &pn53x_usb_io; pn53x_data_new (pnd, &pn53x_usb_io);
switch (DRIVER_DATA (pnd)->model) { switch (DRIVER_DATA (pnd)->model) {
// empirical tuning // empirical tuning