first try of sim card emulator
diff --git a/sam3s_example/simtrace/phone.c b/sam3s_example/simtrace/phone.c
index 1a230ca..eb4ded6 100644
--- a/sam3s_example/simtrace/phone.c
+++ b/sam3s_example/simtrace/phone.c
@@ -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 @@
/** 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 @@
/*-----------------------------------------------------------------------------
* 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 @@
// 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 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 */