mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
phone: on reset by smartcardreader send ATR
Every time the reset line is pulled low, simtrace sends an ATR packet over USART1. The USART1 is slave in this configuration.
This commit is contained in:
@@ -73,20 +73,18 @@ static const Pin pPwr[] = {
|
||||
{VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
|
||||
};
|
||||
|
||||
#ifdef BOARD_ISO7816_BASE_USART
|
||||
#undef BOARD_ISO7816_BASE_USART
|
||||
#define BOARD_ISO7816_BASE_USART USART1
|
||||
#endif
|
||||
// SuperSIM ATR: 3B 9A 94 00 92 02 75 93 11 00 01 02 02 19
|
||||
static const ATR[] = {0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19};
|
||||
#define NONE 0
|
||||
#define SEND_ATR 1
|
||||
#define AFTER_ATR 2
|
||||
static uint8_t phone_state = NONE;
|
||||
|
||||
#ifdef BOARD_ISO7816_ID_USART
|
||||
#undef BOARD_ISO7816_ID_USART
|
||||
#define BOARD_ISO7816_ID_USART ID_USART1
|
||||
#endif
|
||||
|
||||
#define ISO7816_PHONE_RST {PIO_PA24, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
|
||||
static const Pin pinPhoneRST = ISO7816_PHONE_RST;
|
||||
#define ISO7816_PHONE_CLK {PIO_PA23A_SCK1, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
|
||||
static const Pin pinPhoneClk = ISO7816_PHONE_CLK;
|
||||
//#define ISO7816_PHONE_CLK {PIO_PA23A_SCK1, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
|
||||
//static const Pin pinPhoneClk = ISO7816_PHONE_CLK;
|
||||
|
||||
/* ===================================================*/
|
||||
/* Taken from iso7816_4.c */
|
||||
@@ -112,7 +110,7 @@ void USART1_IrqHandler( void )
|
||||
{
|
||||
uint32_t stat;
|
||||
|
||||
stat = BOARD_USART_BASE->US_CSR;
|
||||
stat = USART1->US_CSR;
|
||||
TRACE_DEBUG("stat: 0x%x, imask: 0x%x", stat, USART1->US_IMR);
|
||||
|
||||
// Rcv buf full
|
||||
@@ -126,7 +124,8 @@ void USART1_IrqHandler( void )
|
||||
|
||||
static void ISR_PhoneRST( const Pin *pPin)
|
||||
{
|
||||
printf("+++++++++ Interrupt!! %x\n\r", pinPhoneRST.pio->PIO_ISR);
|
||||
TRACE_DEBUG("+++++++++ Interrupt!! ISR:0x%x, CSR:0x%x\n\r", pinPhoneRST.pio->PIO_ISR, USART1->US_CSR);
|
||||
phone_state = SEND_ATR;
|
||||
}
|
||||
|
||||
static void Config_PhoneRST_IrqHandler()
|
||||
@@ -151,13 +150,13 @@ static uint32_t ISO7816_GetChar( uint8_t *pCharToReceive )
|
||||
uint32_t timeout=0;
|
||||
|
||||
if( StateUsartGlobal == USART_SEND ) {
|
||||
while((BOARD_ISO7816_BASE_USART->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
BOARD_ISO7816_BASE_USART->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
while((USART_PHONE->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
StateUsartGlobal = USART_RCV;
|
||||
}
|
||||
|
||||
/* Wait USART ready for reception */
|
||||
while( ((BOARD_ISO7816_BASE_USART->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
while( ((USART_PHONE->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
|
||||
TRACE_DEBUG("TimeOut\n\r");
|
||||
return( 0 );
|
||||
@@ -167,23 +166,65 @@ static uint32_t ISO7816_GetChar( uint8_t *pCharToReceive )
|
||||
/* At least one complete character has been received and US_RHR has not yet been read. */
|
||||
|
||||
/* Get a char */
|
||||
*pCharToReceive = ((BOARD_ISO7816_BASE_USART->US_RHR) & 0xFF);
|
||||
*pCharToReceive = ((USART_PHONE->US_RHR) & 0xFF);
|
||||
|
||||
status = (BOARD_ISO7816_BASE_USART->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
status = (USART_PHONE->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("R:0x%X\n\r", status);
|
||||
TRACE_DEBUG("R:0x%X\n\r", BOARD_ISO7816_BASE_USART->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%X\n\r", BOARD_ISO7816_BASE_USART->US_NER );
|
||||
BOARD_ISO7816_BASE_USART->US_CR = US_CR_RSTSTA;
|
||||
TRACE_DEBUG("R:0x%X\n\r", USART_PHONE->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%X\n\r", USART_PHONE->US_NER );
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a char to ISO7816
|
||||
* \param CharToSend char to be send
|
||||
* \return status of US_CSR
|
||||
*/
|
||||
static uint32_t ISO7816_SendChar( uint8_t CharToSend )
|
||||
{
|
||||
uint32_t status;
|
||||
|
||||
TRACE_DEBUG("********** Send char: %c (0x%X)\n\r", CharToSend, CharToSend);
|
||||
|
||||
if( StateUsartGlobal == USART_RCV ) {
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
StateUsartGlobal = USART_SEND;
|
||||
}
|
||||
|
||||
/* Wait USART ready for transmit */
|
||||
while((USART_PHONE->US_CSR & US_CSR_TXRDY) == 0) {}
|
||||
/* There is no character in the US_THR */
|
||||
|
||||
/* Transmit a char */
|
||||
USART_PHONE->US_THR = CharToSend;
|
||||
|
||||
status = (USART_PHONE->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("******* status: 0x%X (Overrun: %d, NACK: %d, Timeout: %d, underrun: %d)\n\r",
|
||||
status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
|
||||
((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
|
||||
|
||||
TRACE_DEBUG("E (USART CSR reg):0x%X\n\r", USART_PHONE->US_CSR);
|
||||
TRACE_DEBUG("Nb (Number of errors):0x%X\n\r", USART_PHONE->US_NER );
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
|
||||
/** Initializes a ISO driver
|
||||
* \param pPinIso7816RstMC Pin ISO 7816 Rst MC
|
||||
*/
|
||||
@@ -194,15 +235,16 @@ void _ISO7816_Init( const Pin pPinIso7816RstMC )
|
||||
/* Pin ISO7816 initialize */
|
||||
st_pinIso7816RstMC = pPinIso7816RstMC;
|
||||
|
||||
USART_Configure( BOARD_ISO7816_BASE_USART,
|
||||
USART_Configure( USART_PHONE,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
// Nope, we aren't master: | US_MR_USCLKS_MCK
|
||||
// Nope, we aren't master:
|
||||
// | US_MR_USCLKS_MCK
|
||||
| US_MR_USCLKS_SCK
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
// | US_MR_PAR_EVEN
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO, /** TODO: This field was set in the original simtrace firmware..why? */
|
||||
// | (3<<24), /* MAX_ITERATION */
|
||||
| US_MR_CLKO /** TODO: This field was set in the original simtrace firmware..why? */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
/*
|
||||
@@ -212,17 +254,23 @@ void _ISO7816_Init( const Pin pPinIso7816RstMC )
|
||||
USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK
|
||||
CD = 1 ? --> US_BRGR_CD(1)
|
||||
*/
|
||||
BOARD_ISO7816_BASE_USART->US_FIDI = 372;
|
||||
BOARD_ISO7816_BASE_USART->US_BRGR = US_BRGR_CD(1);
|
||||
USART_PHONE->US_FIDI = 372;
|
||||
// USART_PHONE->US_IDR = (uint32_t) -1;
|
||||
USART_PHONE->US_BRGR = US_BRGR_CD(1);
|
||||
// USART_PHONE->US_BRGR = BOARD_MCK / (372*9600);
|
||||
USART_PHONE->US_TTGR = 5;
|
||||
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(BOARD_ISO7816_ID_USART);
|
||||
PMC_EnablePeripheral(ID_USART_PHONE);
|
||||
|
||||
/* enable USART1 interrupt */
|
||||
NVIC_EnableIRQ( USART1_IRQn ) ;
|
||||
|
||||
// USART_PHONE->US_IER = US_IER_RXRDY | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | US_IER_NACK | US_IER_ITER;
|
||||
|
||||
USART_SetTransmitterEnabled(BOARD_ISO7816_BASE_USART, 1);
|
||||
USART_SetReceiverEnabled(BOARD_ISO7816_BASE_USART, 1);
|
||||
|
||||
USART_SetTransmitterEnabled(USART_PHONE, 1);
|
||||
// USART_SetReceiverEnabled(USART_PHONE, 1);
|
||||
|
||||
}
|
||||
|
||||
@@ -272,7 +320,7 @@ extern int main( void )
|
||||
PIO_InitializeInterrupts(0);
|
||||
|
||||
/* Configure ISO7816 driver */
|
||||
PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( &pinsISO7816_PHONE ) ) ;
|
||||
PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ;
|
||||
PIO_Configure(pPwr, PIO_LISTSIZE(pPwr));
|
||||
|
||||
// FIXME: RST seems to be allways high
|
||||
@@ -288,7 +336,8 @@ extern int main( void )
|
||||
Config_PhoneRST_IrqHandler();
|
||||
|
||||
|
||||
// USART_EnableIt( USART1, US_IER_RXRDY) ;
|
||||
// USART_EnableIt( USART_PHONE, US_IER_TXRDY) ;
|
||||
|
||||
//USART_EnableIt( USART1, 0xffff) ;
|
||||
// FIXME: At some point USBD_IrqHandler() should get called and set USBD_STATE_CONFIGURED
|
||||
/* while (USBD_GetState() < USBD_STATE_CONFIGURED) {
|
||||
@@ -299,8 +348,8 @@ extern int main( void )
|
||||
i++;
|
||||
}
|
||||
*/
|
||||
|
||||
// Infinite loop
|
||||
printf("***** START \n\r");
|
||||
TRACE_DEBUG("%s", "Start while loop\n\r");
|
||||
while (1) {
|
||||
|
||||
/* if( USBState == STATE_SUSPEND ) {
|
||||
@@ -317,25 +366,30 @@ extern int main( void )
|
||||
CCID_SmartCardRequest();
|
||||
*/
|
||||
int j;
|
||||
for( j=0; j < 100; j++ ) {
|
||||
// ISO7816_GetChar(&buff[j++]);
|
||||
for( j=0; j < 1000; j++ ) {
|
||||
// ISO7816_GetChar(&buff[j++]);
|
||||
}
|
||||
// printf("1 ");
|
||||
for( j=0; j < 100; j++ ) {
|
||||
for( j=0; j < 1000; j++ ) {
|
||||
/* printf("0x%x ", buff[j++]);
|
||||
if ((j % 40)==0) {
|
||||
printf("\n\r");
|
||||
}
|
||||
*/
|
||||
}
|
||||
// printf("2\n\r");
|
||||
//ISO7816_GetChar(&buff[0]);
|
||||
//printf("buf: 0x%x\n\r", buff[0]);
|
||||
|
||||
/*if (char_avail == 1) {
|
||||
ISO7816_GetChar(&buff[0]);
|
||||
char_avail = 0;
|
||||
}*/
|
||||
|
||||
uint32_t ret=-1;
|
||||
|
||||
if (phone_state == SEND_ATR) {
|
||||
printf("*");
|
||||
TRACE_DEBUG("Send char %x %x %x ..", ATR[0], ATR[1], ATR[2]);
|
||||
for (j=0; j < sizeof(ATR)/sizeof(ATR[0]); j++) {
|
||||
ret = ISO7816_SendChar(ATR[j]);
|
||||
TRACE_DEBUG("ret: 0x%x\n\r", ret);
|
||||
}
|
||||
phone_state = AFTER_ATR;
|
||||
}
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user