first try of sim card emulator

This commit is contained in:
Christina Quast 2015-03-13 23:46:01 +01:00
parent 74876d2079
commit 578daaaeff
1 changed files with 75 additions and 5 deletions

View File

@ -53,6 +53,26 @@
/// The USB device is in resume state
#define STATE_RESUME 5
/* WTX (Wait time extension):
* R-block PCB begins with (msb) 10 , ends with 000011 for WTX req, 100011 for WTX resp
*
* The standard says:
* Rule 3 If the card requires more than BWT to process the previously received I-block, it transmits S(WTX
* request) where INF conveys one byte encoding an integer multiplier of the BWT value. The interface device
* shall acknowledge by S(WTX response) with the same INF.
* The time allocated starts at the leading edge of the last character of S(WTX response).
*/
#define WTX_req 0b10000011
#define WTX_req 0b10100011
// Alternatively:
/* For T = 0 Protocol: The firmware on receiving the NULL (0x60) Procedure byte from the card, notifies
it to the driver using the RDR_to_PC_DataBlock response. During this period, the reception of bytes
from the smart card is still in progress and hence the device cannot indefinitely wait for IN tokens on
the USB bulk-in endpoint. Hence, it is required of the driver to readily supply IN tokens on the USB
bulk-in endpoint. On failure to do so, some of the wait time extension responses, will not be queued to
the driver.
*/
/*------------------------------------------------------------------------------
* Internal variables
*------------------------------------------------------------------------------*/
@ -62,7 +82,7 @@ unsigned char USBState = STATE_IDLE;
/** ISO7816 pins */
static const Pin pinsISO7816_PHONE[] = {PINS_ISO7816_PHONE};
/** Bus switch pins */
static const Pin pinsBus[] = {PINS_BUS_DEFAULT};
static const Pin pins_bus[] = {PINS_BUS_DEFAULT};
/** ISO7816 RST pin */
static const Pin pinIso7816RstMC = PIN_ISO7816_RST_PHONE;
static uint8_t sim_inserted = 0;
@ -99,12 +119,15 @@ extern uint8_t rcvdChar;
/*-----------------------------------------------------------------------------
* Interrupt routines
*-----------------------------------------------------------------------------*/
#define RESET 'R'
static void ISR_PhoneRST( const Pin *pPin)
{
TRACE_DEBUG("+++++++++ Interrupt!! ISR:0x%x, CSR:0x%x\n\r", pinPhoneRST.pio->PIO_ISR, USART1->US_CSR);
int msg = RESET;
printf("+++ Int!!\n\r");
USBD_Write( INT, &msg, 1, 0, 0 );
// FIXME: What to do on reset?
// PIO_DisableIt( &pinPhoneRST ) ;
// PIO_DisableIt( &pinPhoneRST ) ;
}
static void Config_PhoneRST_IrqHandler()
@ -230,7 +253,7 @@ void Phone_Master_Init( void ) {
// FIXME: USB clock? USB PMC?
// NVIC_EnableIRQ( UDP_IRQn );
// USART_EnableIt( USART_PHONE, US_IER_RXRDY) ;
USART_EnableIt( USART_PHONE, US_IER_RXRDY) ;
// FIXME: At some point USBD_IrqHandler() should get called and set USBD_STATE_CONFIGURED
/* while (USBD_GetState() < USBD_STATE_CONFIGURED) {
@ -244,8 +267,55 @@ void Phone_Master_Init( void ) {
}
void send_ATR(uint8_t *ATR, uint8_t len)
{
int i;
TRACE_INFO("Send %x %x %x", ATR[0], ATR[1], ATR[2]);
for ( i = 0; i < len; i++ ) {
_ISO7816_SendChar(*(ATR++));
}
}
void HandleIncommingData( void *pArg, uint8_t status, uint32_t transferred, uint32_t remaining)
{
TRACE_INFO("HandleIncommingData ,stat: %X, transf: %x, remain: %x", status, transferred, remaining);
uint8_t ans[MAX_ANSWER_SIZE];
if (status == USBD_STATUS_SUCCESS) {
if (((uint8_t *)pArg)[0] == 0x3B) {
send_ATR(pArg, transferred);
return;
} else {
ISO7816_XfrBlockTPDU_T0(pArg, ans, transferred);
}
}
TRACE_INFO("Ans: %x %x %x", ans[0], ans[1], ans[2]);
}
#define PR TRACE_INFO
extern ring_buffer buf;
#define MAX_MSG_LEN 64
void Phone_run( void )
{
int ret;
uint8_t pBuffer[MAX_MSG_LEN];
if (rcvdChar != 0) {
/* DATA_IN for host side is data_out for simtrace side */
/* FIXME: Performancewise sending a USB packet for every byte is a disaster */
PR("----- %x %x %x ..\n\r", buf.buf[0], buf.buf[1],buf.buf[2] );
USBD_Write( DATAIN, buf.buf, BUFLEN, 0, 0 );
rcvdChar = 0;
}
if ((ret = USBD_Read(DATAOUT, pBuffer, MAX_MSG_LEN, (TransferCallback)&HandleIncommingData, pBuffer)) == USBD_STATUS_SUCCESS) {
TRACE_INFO("Reading started sucessfully");
TRACE_INFO("Recvd: %X %X %X %X %X", pBuffer[0], pBuffer[1], pBuffer[2], pBuffer[3], pBuffer[4]);
} else {
// TRACE_INFO("USB Error: %X", ret);
}
// FIXME: Function Phone_run not implemented yet
/* Send and receive chars */