blob: 2426eced815749f1c5101a1efb3f888d725e32b6 [file] [log] [blame]
/* Copyright 2020 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdio.h>
/*TODO Review */
#include "smComSerial.h"
#include <stdlib.h>
#include <stdio.h>
#include "string.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <paths.h>
#include <termios.h>
#include <sysexits.h>
#include <sys/param.h>
#include <sys/select.h>
#include <sys/time.h>
#include <time.h>
#include "sm_printf.h"
#include "smComSocket.h"
#include "nxLog_smCom.h"
#include "inttypes.h"
#include "nxEnsure.h"
#include "sm_timer.h"
#define REMOTE_JC_SHELL_HEADER_LEN (4)
#define REMOTE_JC_SHELL_MSG_TYPE_APDU_DATA (0x01)
#include "sm_apdu.h"
#define MAX_BUF_SIZE (MAX_APDU_BUF_LENGTH)
static int gfileDescriptor = -1;
static int smUartSetInterfaceAttrib(int fd, int speed);
U32 smComVCom_Open(void** vcom_ctx, const char *portname)
{
LOG_I("Opening %s", portname);
gfileDescriptor = open(portname, O_RDWR | O_NOCTTY);
LOG_E("gfileDescriptor = %d", gfileDescriptor);
if (gfileDescriptor < 0)
{
LOG_E("error %d opening %s: %s\r\n", errno, portname, strerror (errno));
goto error;
}
if (0 == smUartSetInterfaceAttrib(gfileDescriptor, B115200)) {
smCom_Init(&smComVCom_Transceive, &smComVCom_TransceiveRaw);
}
else {
LOG_W("smUartSetInterfaceAttrib Failed");
goto error;
}
return 0;
error:
if (gfileDescriptor != -1) {
close(gfileDescriptor);
}
return (U32)-1;
}
U32 smComVCom_Close(void* conn_ctx)
{
U32 status = 0;
smComSocket_CloseFD(gfileDescriptor);
return status;
}
U32 smComVCom_GetATR(void* conn_ctx, U8 *pAtr, U16 *atrLen)
{
return smComSocket_GetATRFD(gfileDescriptor, pAtr, atrLen);
}
U32 smComVCom_Transceive(void* conn_ctx, apdu_t *pApdu)
{
return smComSocket_TransceiveFD(gfileDescriptor, pApdu);
}
U32 smComVCom_TransceiveRaw(void* conn_ctx, U8 *pTx, U16 txLen, U8 *pRx, U32 *pRxLen)
{
return smComSocket_TransceiveRawFD(gfileDescriptor, pTx, txLen, pRx, pRxLen);
}
static int smUartSetInterfaceAttrib(int fd, int speed)
{
struct termios SerialPortSettings; /* Create the structure */
bzero(&SerialPortSettings, sizeof(SerialPortSettings));
SerialPortSettings.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD;
if (cfsetspeed(&SerialPortSettings, speed)) // Set baud
{
LOG_W("cfsetspeed Failed");
}
SerialPortSettings.c_iflag = IGNPAR;
SerialPortSettings.c_oflag = 0;
SerialPortSettings.c_cc[VMIN] = 10;
SerialPortSettings.c_cc[VTIME] = 10;
if (cfsetispeed(&SerialPortSettings, speed)) /* Set Read Speed */
{
LOG_W("cfsetspeed Failed");
}
if (cfsetospeed(&SerialPortSettings, speed)) /* Set Write Speed */
{
LOG_W("cfsetspeed Failed");
}
//tcflush(fd, TCIFLUSH);
if ((tcsetattr(fd, TCSANOW, &SerialPortSettings)) != 0) /* Set the attributes to the termios structure*/
{
LOG_W("Failed Setting attributes");
return 1;
}
else {
LOG_D("Attributes Set");
return 0;
}
}