Attempt to support ARYGON APDB (APDB1UA33N and APDB2UA33).
Code clean up.
This commit is contained in:
parent
710745262d
commit
b16bc53025
4 changed files with 99 additions and 62 deletions
|
@ -34,7 +34,25 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
|
||||||
#define BUFFER_LENGTH 256
|
#define BUFFER_LENGTH 256
|
||||||
#define USB_TIMEOUT 30000
|
#define USB_TIMEOUT 30000
|
||||||
static byte_t abtTxBuf[BUFFER_LENGTH] = { 0x32, 0x00, 0x00, 0xff }; // Every packet must start with "00 00 ff"
|
|
||||||
|
/** @def DEV_ARYGON_PROTOCOL_ARYGON_ASCII
|
||||||
|
* @brief High level language in ASCII format. (Common µC commands and Mifare® commands)
|
||||||
|
*/
|
||||||
|
#define DEV_ARYGON_PROTOCOL_ARYGON_ASCII '0'
|
||||||
|
/** @def DEV_ARYGON_MODE_HL_ASCII
|
||||||
|
* @brief High level language in Binary format With AddressingByte for party line. (Common µC commands and Mifare® commands)
|
||||||
|
*/
|
||||||
|
#define DEV_ARYGON_PROTOCOL_ARYGON_BINARY_WAB '1'
|
||||||
|
/** @def DEV_ARYGON_PROTOCOL_TAMA
|
||||||
|
* @brief Philips protocol (TAMA language) in binary format.
|
||||||
|
*/
|
||||||
|
#define DEV_ARYGON_PROTOCOL_TAMA '2'
|
||||||
|
/** @def DEV_ARYGON_PROTOCOL_TAMA_WAB
|
||||||
|
* @brief Philips protocol (TAMA language) in binary With AddressingByte for party line.
|
||||||
|
*/
|
||||||
|
#define DEV_ARYGON_PROTOCOL_TAMA_WAB '3'
|
||||||
|
|
||||||
|
static byte_t abtTxBuf[BUFFER_LENGTH] = { DEV_ARYGON_PROTOCOL_TAMA, 0x00, 0x00, 0xff }; // Every packet must start with "00 00 ff"
|
||||||
|
|
||||||
dev_info* dev_arygon_connect(const uint32_t uiIndex)
|
dev_info* dev_arygon_connect(const uint32_t uiIndex)
|
||||||
{
|
{
|
||||||
|
@ -42,11 +60,9 @@ dev_info* dev_arygon_connect(const uint32_t uiIndex)
|
||||||
serial_port sp;
|
serial_port sp;
|
||||||
char acConnect[BUFFER_LENGTH];
|
char acConnect[BUFFER_LENGTH];
|
||||||
dev_info* pdi = INVALID_DEVICE_INFO;
|
dev_info* pdi = INVALID_DEVICE_INFO;
|
||||||
|
|
||||||
#ifdef DEBUG
|
DBG("Trying to find ARYGON device on serial port: %s#",SERIAL_STRING);
|
||||||
printf("Trying to find ARYGON device on serial port: %s#\n",SERIAL_STRING);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// I have no idea how MAC OS X deals with multiple devices, so a quick workaround
|
// I have no idea how MAC OS X deals with multiple devices, so a quick workaround
|
||||||
for (uiDevNr=0; uiDevNr<MAX_DEVICES; uiDevNr++)
|
for (uiDevNr=0; uiDevNr<MAX_DEVICES; uiDevNr++)
|
||||||
{
|
{
|
||||||
|
@ -59,17 +75,15 @@ dev_info* dev_arygon_connect(const uint32_t uiIndex)
|
||||||
#endif
|
#endif
|
||||||
if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) break;
|
if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) break;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (sp == INVALID_SERIAL_PORT) printf("invalid serial port: %s\n",acConnect);
|
if (sp == INVALID_SERIAL_PORT) DBG("Invalid serial port: %s",acConnect);
|
||||||
if (sp == CLAIMED_SERIAL_PORT) printf("serial port already claimed: %s\n",acConnect);
|
if (sp == CLAIMED_SERIAL_PORT) DBG("Serial port already claimed: %s",acConnect);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
// Test if we have found a device
|
// Test if we have found a device
|
||||||
if (uiDevNr == MAX_DEVICES) return INVALID_DEVICE_INFO;
|
if (uiDevNr == MAX_DEVICES) return INVALID_DEVICE_INFO;
|
||||||
|
|
||||||
#ifdef DEBUG
|
DBG("Successfully connected to: %s",acConnect);
|
||||||
printf("Succesfully connected to: %s\n",acConnect);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// We have a connection
|
// We have a connection
|
||||||
pdi = malloc(sizeof(dev_info));
|
pdi = malloc(sizeof(dev_info));
|
||||||
strcpy(pdi->acName,"ARYGON");
|
strcpy(pdi->acName,"ARYGON");
|
||||||
|
@ -80,60 +94,65 @@ dev_info* dev_arygon_connect(const uint32_t uiIndex)
|
||||||
pdi->bPar = true;
|
pdi->bPar = true;
|
||||||
pdi->ui8TxBits = 0;
|
pdi->ui8TxBits = 0;
|
||||||
return pdi;
|
return pdi;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dev_arygon_disconnect(dev_info* pdi)
|
void dev_arygon_disconnect(dev_info* pdi)
|
||||||
{
|
{
|
||||||
rs232_close((serial_port)pdi->ds);
|
rs232_close((serial_port)pdi->ds);
|
||||||
free(pdi);
|
free(pdi);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dev_arygon_transceive(const dev_spec ds, const byte_t* pbtTx, const uint32_t uiTxLen, byte_t* pbtRx, uint32_t* puiRxLen)
|
bool dev_arygon_transceive(const dev_spec ds, const byte_t* pbtTx, const uint32_t uiTxLen, byte_t* pbtRx, uint32_t* puiRxLen)
|
||||||
{
|
{
|
||||||
byte_t abtRxBuf[BUFFER_LENGTH];
|
byte_t abtRxBuf[BUFFER_LENGTH];
|
||||||
uint32_t uiRxBufLen = BUFFER_LENGTH;
|
uint32_t uiRxBufLen = BUFFER_LENGTH;
|
||||||
uint32_t uiPos;
|
uint32_t uiPos;
|
||||||
|
|
||||||
// Packet length = data length (len) + checksum (1) + end of stream marker (1)
|
// Packet length = data length (len) + checksum (1) + end of stream marker (1)
|
||||||
abtTxBuf[4] = uiTxLen;
|
abtTxBuf[4] = uiTxLen;
|
||||||
// Packet length checksum
|
// Packet length checksum
|
||||||
abtTxBuf[5] = BUFFER_LENGTH - abtTxBuf[4];
|
abtTxBuf[5] = BUFFER_LENGTH - abtTxBuf[4];
|
||||||
// Copy the PN53X command into the packet buffer
|
// Copy the PN53X command into the packet buffer
|
||||||
memmove(abtTxBuf+6,pbtTx,uiTxLen);
|
memmove(abtTxBuf+6,pbtTx,uiTxLen);
|
||||||
|
|
||||||
// Calculate data payload checksum
|
// Calculate data payload checksum
|
||||||
abtTxBuf[uiTxLen+6] = 0;
|
abtTxBuf[uiTxLen+6] = 0;
|
||||||
for(uiPos=0; uiPos < uiTxLen; uiPos++)
|
for(uiPos=0; uiPos < uiTxLen; uiPos++)
|
||||||
{
|
{
|
||||||
abtTxBuf[uiTxLen+6] -= abtTxBuf[uiPos+6];
|
abtTxBuf[uiTxLen+6] -= abtTxBuf[uiPos+6];
|
||||||
}
|
}
|
||||||
|
|
||||||
// End of stream marker
|
// End of stream marker
|
||||||
abtTxBuf[uiTxLen+7] = 0;
|
abtTxBuf[uiTxLen+7] = 0;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("Tx: ");
|
printf(" TX: ");
|
||||||
print_hex(abtTxBuf,uiTxLen+8);
|
print_hex(abtTxBuf,uiTxLen+8);
|
||||||
#endif
|
#endif
|
||||||
if (!rs232_send((serial_port)ds,abtTxBuf,uiTxLen+8)) return false;
|
if (!rs232_send((serial_port)ds,abtTxBuf,uiTxLen+8)) {
|
||||||
|
ERR("Unable to transmit data. (TX)");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!rs232_receive((serial_port)ds,abtRxBuf,&uiRxBufLen)) return false;
|
if (!rs232_receive((serial_port)ds,abtRxBuf,&uiRxBufLen)) {
|
||||||
|
ERR("Unable to receive data. (RX)");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("Rx: ");
|
printf(" RX: ");
|
||||||
print_hex(abtRxBuf,uiRxBufLen);
|
print_hex(abtRxBuf,uiRxBufLen);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// When the answer should be ignored, just return a succesful result
|
// When the answer should be ignored, just return a successful result
|
||||||
if(pbtRx == NULL || puiRxLen == NULL) return true;
|
if(pbtRx == NULL || puiRxLen == NULL) return true;
|
||||||
|
|
||||||
// Only succeed when the result is at least 00 00 ff 00 ff 00 00 00 FF xx Fx Dx xx .. .. .. xx 00 (x = variable)
|
// Only succeed when the result is at least 00 00 ff 00 ff 00 00 00 FF xx Fx Dx xx .. .. .. xx 00 (x = variable)
|
||||||
if(uiRxBufLen < 15) return false;
|
if(uiRxBufLen < 15) return false;
|
||||||
|
|
||||||
// Remove the preceding and appending bytes 00 00 ff 00 ff 00 00 00 FF xx Fx .. .. .. xx 00 (x = variable)
|
// Remove the preceding and appending bytes 00 00 ff 00 ff 00 00 00 FF xx Fx .. .. .. xx 00 (x = variable)
|
||||||
*puiRxLen = uiRxBufLen - 15;
|
*puiRxLen = uiRxBufLen - 15;
|
||||||
memcpy(pbtRx, abtRxBuf+13, *puiRxLen);
|
memcpy(pbtRx, abtRxBuf+13, *puiRxLen);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -256,18 +256,18 @@ dev_info* nfc_connect()
|
||||||
uint32_t uiDev;
|
uint32_t uiDev;
|
||||||
byte_t abtFw[4];
|
byte_t abtFw[4];
|
||||||
uint32_t uiFwLen = sizeof(abtFw);
|
uint32_t uiFwLen = sizeof(abtFw);
|
||||||
|
|
||||||
// Search through the device list for an available device
|
// Search through the device list for an available device
|
||||||
for (uiDev=0; uiDev<sizeof(dev_callbacks_list)/sizeof(dev_callbacks_list[0]); uiDev++)
|
for (uiDev=0; uiDev<sizeof(dev_callbacks_list)/sizeof(dev_callbacks_list[0]); uiDev++)
|
||||||
{
|
{
|
||||||
// Try to claim the device
|
// Try to claim the device
|
||||||
pdi = dev_callbacks_list[uiDev].connect(0);
|
pdi = dev_callbacks_list[uiDev].connect(0);
|
||||||
|
|
||||||
// Test if the connection was successful
|
// Test if the connection was successful
|
||||||
if (pdi != INVALID_DEVICE_INFO)
|
if (pdi != INVALID_DEVICE_INFO)
|
||||||
{
|
{
|
||||||
// Great we have claimed a device
|
// Great we have claimed a device
|
||||||
pdi->pdc = &(dev_callbacks_list[uiDev]);
|
pdi->pdc = &(dev_callbacks_list[uiDev]);
|
||||||
pdi->pdc->transceive(pdi->ds,pncmd_get_register,4,NULL,NULL);
|
pdi->pdc->transceive(pdi->ds,pncmd_get_register,4,NULL,NULL);
|
||||||
|
|
||||||
// Try to retrieve PN53x chip revision
|
// Try to retrieve PN53x chip revision
|
||||||
|
|
34
src/list.c
34
src/list.c
|
@ -30,15 +30,15 @@ static dev_info* pdi;
|
||||||
static byte_t abtFelica[5] = { 0x00, 0xff, 0xff, 0x00, 0x00 };
|
static byte_t abtFelica[5] = { 0x00, 0xff, 0xff, 0x00, 0x00 };
|
||||||
|
|
||||||
int main(int argc, const char* argv[])
|
int main(int argc, const char* argv[])
|
||||||
{
|
{
|
||||||
tag_info ti;
|
tag_info ti;
|
||||||
|
|
||||||
// Try to open the NFC reader
|
// Try to open the NFC reader
|
||||||
pdi = nfc_connect();
|
pdi = nfc_connect();
|
||||||
|
|
||||||
if (pdi == INVALID_DEVICE_INFO)
|
if (pdi == INVALID_DEVICE_INFO)
|
||||||
{
|
{
|
||||||
printf("Error connecting NFC reader\n");
|
ERR("Unable to connect to NFC device.");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
nfc_initiator_init(pdi);
|
nfc_initiator_init(pdi);
|
||||||
|
@ -57,7 +57,7 @@ int main(int argc, const char* argv[])
|
||||||
nfc_configure(pdi,DCO_ACTIVATE_FIELD,true);
|
nfc_configure(pdi,DCO_ACTIVATE_FIELD,true);
|
||||||
|
|
||||||
printf("\nConnected to NFC reader: %s\n\n",pdi->acName);
|
printf("\nConnected to NFC reader: %s\n\n",pdi->acName);
|
||||||
|
|
||||||
// Poll for a ISO14443A (MIFARE) tag
|
// Poll for a ISO14443A (MIFARE) tag
|
||||||
if (nfc_initiator_select_tag(pdi,IM_ISO14443A_106,NULL,0,&ti))
|
if (nfc_initiator_select_tag(pdi,IM_ISO14443A_106,NULL,0,&ti))
|
||||||
{
|
{
|
||||||
|
@ -80,19 +80,19 @@ int main(int argc, const char* argv[])
|
||||||
printf("%18s","Parameter (PAD): "); print_hex(ti.tif.abtPad,8);
|
printf("%18s","Parameter (PAD): "); print_hex(ti.tif.abtPad,8);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Poll for a ISO14443B tag
|
// Poll for a ISO14443B tag
|
||||||
if (nfc_initiator_select_tag(pdi,IM_ISO14443B_106,"\x00",1,&ti))
|
if (nfc_initiator_select_tag(pdi,IM_ISO14443B_106,"\x00",1,&ti))
|
||||||
{
|
{
|
||||||
printf("The following (NFC) ISO14443-B tag was found:\n\n");
|
printf("The following (NFC) ISO14443-B tag was found:\n\n");
|
||||||
printf(" ATQB: "); print_hex(ti.tib.abtAtqb,12);
|
printf(" ATQB: "); print_hex(ti.tib.abtAtqb,12);
|
||||||
printf(" ID: "); print_hex(ti.tib.abtId,4);
|
printf(" ID: "); print_hex(ti.tib.abtId,4);
|
||||||
printf(" CID: %02x\n",ti.tib.btCid);
|
printf(" CID: %02x\n",ti.tib.btCid);
|
||||||
if (ti.tib.uiInfLen>0)
|
if (ti.tib.uiInfLen>0)
|
||||||
{
|
{
|
||||||
printf(" INF: "); print_hex(ti.tib.abtInf,ti.tib.uiInfLen);
|
printf(" INF: "); print_hex(ti.tib.abtInf,ti.tib.uiInfLen);
|
||||||
}
|
}
|
||||||
printf("PARAMS: %02x %02x %02x %02x\n",ti.tib.btParam1,ti.tib.btParam2,ti.tib.btParam3,ti.tib.btParam4);
|
printf("PARAMS: %02x %02x %02x %02x\n",ti.tib.btParam1,ti.tib.btParam2,ti.tib.btParam3,ti.tib.btParam4);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Poll for a Jewel tag
|
// Poll for a Jewel tag
|
||||||
if (nfc_initiator_select_tag(pdi,IM_JEWEL_106,NULL,0,&ti))
|
if (nfc_initiator_select_tag(pdi,IM_JEWEL_106,NULL,0,&ti))
|
||||||
|
|
34
src/rs232.c
34
src/rs232.c
|
@ -73,12 +73,24 @@ serial_port rs232_open(const char* pcPortName)
|
||||||
|
|
||||||
// Copy the old terminal info struct
|
// Copy the old terminal info struct
|
||||||
sp->tiNew = sp->tiOld;
|
sp->tiNew = sp->tiOld;
|
||||||
|
|
||||||
|
/** @todo provide this settings dynamically using model provide in configuration file */
|
||||||
sp->tiNew.c_cflag = CS8 | CLOCAL | CREAD;
|
sp->tiNew.c_cflag = CS8 | CLOCAL | CREAD;
|
||||||
sp->tiNew.c_iflag = CCLAIMED | IGNPAR;
|
sp->tiNew.c_iflag = CCLAIMED | IGNPAR;
|
||||||
sp->tiNew.c_oflag = 0;
|
sp->tiNew.c_oflag = 0;
|
||||||
sp->tiNew.c_lflag = 0;
|
sp->tiNew.c_lflag = 0;
|
||||||
sp->tiNew.c_cc[VMIN] = 0; // block untill n bytes are received
|
|
||||||
sp->tiNew.c_cc[VTIME] = 0; // block untill a timer expires (n * 100 mSec.)
|
/**
|
||||||
|
* @note ARYGON-ADRA (PN531): ???,n,8,1
|
||||||
|
* @note ARYGON-ADRB (PN532): ???,n,8,1
|
||||||
|
* @note ARYGON-APDA (PN531): 9600,n,8,1
|
||||||
|
* @note ARYGON-APDB (PN532): 115200,n,8,1
|
||||||
|
*/
|
||||||
|
cfsetispeed(&(sp->tiNew), B115200);
|
||||||
|
cfsetospeed(&(sp->tiNew), B115200);
|
||||||
|
|
||||||
|
sp->tiNew.c_cc[VMIN] = 0; // block until n bytes are received
|
||||||
|
sp->tiNew.c_cc[VTIME] = 0; // block until a timer expires (n * 100 mSec.)
|
||||||
if(tcsetattr(sp->fd,TCSANOW,&sp->tiNew) == -1)
|
if(tcsetattr(sp->fd,TCSANOW,&sp->tiNew) == -1)
|
||||||
{
|
{
|
||||||
rs232_close(sp);
|
rs232_close(sp);
|
||||||
|
@ -106,7 +118,7 @@ bool rs232_receive(const serial_port sp, byte_t* pbtRx, uint32_t* puiRxLen)
|
||||||
int iResult;
|
int iResult;
|
||||||
uint32_t uiCount = 0;
|
uint32_t uiCount = 0;
|
||||||
fd_set rfds;
|
fd_set rfds;
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Reset file descriptor
|
// Reset file descriptor
|
||||||
|
@ -115,18 +127,24 @@ bool rs232_receive(const serial_port sp, byte_t* pbtRx, uint32_t* puiRxLen)
|
||||||
iResult = select(((serial_port_unix*)sp)->fd+1, &rfds, NULL, NULL, &tv);
|
iResult = select(((serial_port_unix*)sp)->fd+1, &rfds, NULL, NULL, &tv);
|
||||||
|
|
||||||
// Read error
|
// Read error
|
||||||
if (iResult < 0) return false;
|
if (iResult < 0) {
|
||||||
|
DBG("RX error.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Read time-out
|
// Read time-out
|
||||||
if (iResult == 0)
|
if (iResult == 0)
|
||||||
{
|
{
|
||||||
// Test if we at least have received something
|
// Test if we at least have received something
|
||||||
if (uiCount == 0) return false;
|
if (uiCount == 0) return false;
|
||||||
|
|
||||||
|
DBG("RX time-out.");
|
||||||
|
|
||||||
// Store the received byte count and return succesful
|
// Store the received byte count and return succesful
|
||||||
*puiRxLen = uiCount;
|
*puiRxLen = uiCount;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// There is something available, read the data
|
// There is something available, read the data
|
||||||
uiCount += read(((serial_port_unix*)sp)->fd,pbtRx+uiCount,*puiRxLen-uiCount);
|
uiCount += read(((serial_port_unix*)sp)->fd,pbtRx+uiCount,*puiRxLen-uiCount);
|
||||||
}
|
}
|
||||||
|
@ -139,7 +157,7 @@ bool rs232_send(const serial_port sp, const byte_t* pbtTx, const uint32_t uiTxLe
|
||||||
return (iResult >= 0);
|
return (iResult >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
// The windows serial port implementation
|
// The windows serial port implementation
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -186,7 +204,7 @@ serial_port rs232_open(const char* pcPortName)
|
||||||
sp->ct.ReadTotalTimeoutConstant = 30;
|
sp->ct.ReadTotalTimeoutConstant = 30;
|
||||||
sp->ct.WriteTotalTimeoutMultiplier = 0;
|
sp->ct.WriteTotalTimeoutMultiplier = 0;
|
||||||
sp->ct.WriteTotalTimeoutConstant = 30;
|
sp->ct.WriteTotalTimeoutConstant = 30;
|
||||||
|
|
||||||
if(!SetCommTimeouts(sp->hPort,&sp->ct))
|
if(!SetCommTimeouts(sp->hPort,&sp->ct))
|
||||||
{
|
{
|
||||||
rs232_close(sp);
|
rs232_close(sp);
|
||||||
|
|
Loading…
Add table
Reference in a new issue