From c0aa769a35a542045b2655c8951ecc3a51d0c6ed Mon Sep 17 00:00:00 2001 From: Christina Quast Date: Wed, 25 Feb 2015 14:02:01 +0100 Subject: [PATCH] Redundant functions in phone and sniffer moved File simtrace_iso7816.c is like a library for iso specific functions. The next step will be to use the atmel softlib functions instead. --- sam3s_example/include/board.h | 2 + sam3s_example/simtrace/phone.c | 102 ++----------------- sam3s_example/simtrace/simtrace.h | 6 ++ sam3s_example/simtrace/simtrace_iso7816.c | 117 ++++++++++++++++++++++ sam3s_example/simtrace/sniffer.c | 84 +--------------- 5 files changed, 138 insertions(+), 173 deletions(-) create mode 100644 sam3s_example/simtrace/simtrace_iso7816.c diff --git a/sam3s_example/include/board.h b/sam3s_example/include/board.h index b7bec1cb..e05052f2 100644 --- a/sam3s_example/include/board.h +++ b/sam3s_example/include/board.h @@ -24,6 +24,8 @@ #include "string.h" #include "inttypes.h" +#include "simtrace.h" + #define MIN(a, b) ((a < b) ? a : b) #ifdef __GNUC__ diff --git a/sam3s_example/simtrace/phone.c b/sam3s_example/simtrace/phone.c index 2f79a778..0d077fbb 100644 --- a/sam3s_example/simtrace/phone.c +++ b/sam3s_example/simtrace/phone.c @@ -90,54 +90,19 @@ static const Pin pinPhoneRST = ISO7816_PHONE_RST; *-----------------------------------------------------------------------------*/ /** Variable for state of send and receive froom USART */ static uint8_t StateUsartGlobal = USART_RCV; -/** Pin reset master card */ -static Pin st_pinIso7816RstMC; -static uint32_t char_stat = 0; -static char rcvdChar = 0; +extern uint32_t char_stat; +extern uint8_t rcvdChar; /*----------------------------------------------------------------------------- * Interrupt routines *-----------------------------------------------------------------------------*/ -/* - * char_stat is zero if no error occured. - * Otherwise it is filled with the content of the status register. - */ -void USART1_IrqHandler( void ) -{ - uint32_t stat; - char_stat = 0; - // Rcv buf full -/* if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) { - TRACE_DEBUG("Rcv buf full"); - USART_DisableIt(USART1, US_IDR_RXBUFF); - } -*/ - uint32_t csr = USART_PHONE->US_CSR; - -// printf(".\n\r"); - - if (csr & US_CSR_TXRDY) { - /* transmit buffer empty, nothing to transmit */ - } - if (csr & US_CSR_RXRDY) { - stat = (csr&(US_CSR_OVRE|US_CSR_FRAME| - US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK| - (1<<10))); - - if (stat == 0 ) { - /* Get a char */ - rcvdChar = ((USART_PHONE->US_RHR) & 0xFF); - } /* else: error occured */ - char_stat = stat; - } -} 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); - phone_state = SEND_ATR; - PIO_DisableIt( &pinPhoneRST ) ; + // FIXME: What to do on reset? + // PIO_DisableIt( &pinPhoneRST ) ; } static void Config_PhoneRST_IrqHandler() @@ -227,7 +192,7 @@ uint32_t _ISO7816_SendChar( uint8_t CharToSend ) (1<<10))); if (status != 0 ) { - TRACE_DEBUG("******* status: 0x%X (Overrun: %d, NACK: %d, Timeout: %d, underrun: %d)\n\r", + TRACE_DEBUG("******* status: 0x%X (Overrun: %lu, NACK: %lu, Timeout: %lu, underrun: %lu)\n\r", status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13), ((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10)); @@ -240,64 +205,15 @@ uint32_t _ISO7816_SendChar( uint8_t CharToSend ) return( status ); } - -/** Initializes a ISO driver - * \param pPinIso7816RstMC Pin ISO 7816 Rst MC - */ -// FIXME: This function is implemented in iso7816_4.c !! Only MCK instead of SCK is always taken. Change that! -void _ISO7816_Init( const Pin pPinIso7816RstMC ) -{ - TRACE_DEBUG("ISO_Init\n\r"); - - /* Pin ISO7816 initialize */ - st_pinIso7816RstMC = pPinIso7816RstMC; - - USART_Configure( USART_PHONE, - US_MR_USART_MODE_IS07816_T_0 -// Nope, we aren't master: - // | US_MR_USCLKS_MCK - | US_MR_USCLKS_SCK - | US_MR_NBSTOP_1_BIT - | 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 */ - 1, - 0); - /* - SYNC = 0 (async mode) - OVER = 0 (oversampling by 8?) - FIDI = 372 (default val on startup before other value is negotiated) - USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK - CD = 1 ? --> 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(ID_USART_PHONE); - - USART1->US_IDR = 0xffffffff; - USART_EnableIt( USART1, US_IER_RXRDY) ; - /* 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(USART_PHONE, 1); - USART_SetReceiverEnabled(USART_PHONE, 1); - -} - void Phone_Master_Init( void ) { PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ; Config_PhoneRST_IrqHandler(); - _ISO7816_Init(pinIso7816RstMC); + _ISO7816_Init(); + + USART_SetTransmitterEnabled(USART_PHONE, 1); + USART_SetReceiverEnabled(USART_PHONE, 1); // FIXME: Or do I need to call VBUS_CONFIGURE() here instead, which will call USBD_Connect() later? // USBD_Connect(); // FIXME: USB clock? USB PMC? diff --git a/sam3s_example/simtrace/simtrace.h b/sam3s_example/simtrace/simtrace.h index 444e783c..0e024e9f 100644 --- a/sam3s_example/simtrace/simtrace.h +++ b/sam3s_example/simtrace/simtrace.h @@ -1,3 +1,5 @@ +#ifndef SIMTRACE_H +#define SIMTRACE_H // FIXME: static function definitions extern uint32_t _ISO7816_GetChar( uint8_t *pCharToReceive ); @@ -6,4 +8,8 @@ extern void Phone_Master_Init( void ); extern void Sniffer_Init( void ); +extern void SIMtrace_USB_Initialize( void ); +extern void _ISO7816_Init( void ); + +#endif diff --git a/sam3s_example/simtrace/simtrace_iso7816.c b/sam3s_example/simtrace/simtrace_iso7816.c new file mode 100644 index 00000000..b03c6cdc --- /dev/null +++ b/sam3s_example/simtrace/simtrace_iso7816.c @@ -0,0 +1,117 @@ +/* ---------------------------------------------------------------------------- + * ATMEL Microcontroller Software Support + * ---------------------------------------------------------------------------- + * Copyright (c) 2009, Atmel Corporation + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the disclaimer below. + * + * Atmel's name may not be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * ---------------------------------------------------------------------------- + */ + +/*------------------------------------------------------------------------------ + * Headers + *------------------------------------------------------------------------------*/ + +#include "board.h" + +#include + +extern uint8_t rcvdChar; +extern uint32_t char_stat; + +/** Initializes a ISO driver + */ +// FIXME: This function is implemented in iso7816_4.c !! Only MCK instead of SCK is always taken. Change that! +void _ISO7816_Init( void ) +{ + TRACE_DEBUG("ISO_Init\n\r"); + + USART_Configure( USART_PHONE, + US_MR_USART_MODE_IS07816_T_0 +// Nope, we aren't master: + // | US_MR_USCLKS_MCK + | US_MR_USCLKS_SCK + | US_MR_NBSTOP_1_BIT + | 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 */ + 1, + 0); + /* + SYNC = 0 (async mode) + OVER = 0 (oversampling by 8?) + FIDI = 372 (default val on startup before other value is negotiated) + USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK + CD = 1 ? --> 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(ID_USART_PHONE); + + USART1->US_IDR = 0xffffffff; + USART_EnableIt( USART1, US_IER_RXRDY) ; + /* 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; +} + +/* + * Initializes rcvdChar with the char received on USART interface + * char_stat is zero if no error occured. + * Otherwise it is filled with the content of the status register. + */ +void USART1_IrqHandler( void ) +{ + uint32_t stat; + char_stat = 0; + // Rcv buf full +/* if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) { + TRACE_DEBUG("Rcv buf full"); + USART_DisableIt(USART1, US_IDR_RXBUFF); + } +*/ + uint32_t csr = USART_PHONE->US_CSR; + + if (csr & US_CSR_TXRDY) { + /* transmit buffer empty, nothing to transmit */ + } + if (csr & US_CSR_RXRDY) { + stat = (csr&(US_CSR_OVRE|US_CSR_FRAME| + US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK| + (1<<10))); + + if (stat == 0 ) { + /* Get a char */ + rcvdChar = ((USART_PHONE->US_RHR) & 0xFF); + } /* else: error occured */ + char_stat = stat; + } +} + + diff --git a/sam3s_example/simtrace/sniffer.c b/sam3s_example/simtrace/sniffer.c index c68ee835..fd724468 100644 --- a/sam3s_example/simtrace/sniffer.c +++ b/sam3s_example/simtrace/sniffer.c @@ -58,89 +58,12 @@ static const Pin pPwr[] = { {VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT} }; -uint32_t char_stat = 0; -uint8_t rcvdChar = 0; +extern uint32_t char_stat; +extern uint8_t rcvdChar; /*----------------------------------------------------------------------------- * Interrupt routines *-----------------------------------------------------------------------------*/ -/* - * Initializes rcvdChar with the char received on USART interface - * char_stat is zero if no error occured. - * Otherwise it is filled with the content of the status register. - */ -void USART1_IrqHandler( void ) -{ - uint32_t stat; - char_stat = 0; - // Rcv buf full -/* if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) { - TRACE_DEBUG("Rcv buf full"); - USART_DisableIt(USART1, US_IDR_RXBUFF); - } -*/ - uint32_t csr = USART_PHONE->US_CSR; - - if (csr & US_CSR_TXRDY) { - /* transmit buffer empty, nothing to transmit */ - } - if (csr & US_CSR_RXRDY) { - stat = (csr&(US_CSR_OVRE|US_CSR_FRAME| - US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK| - (1<<10))); - - if (stat == 0 ) { - /* Get a char */ - rcvdChar = ((USART_PHONE->US_RHR) & 0xFF); - } /* else: error occured */ - char_stat = stat; - } -} - -/** Initializes a ISO driver - * \param pPinIso7816RstMC Pin ISO 7816 Rst MC - */ -void _ISO7816_Init( ) -{ - TRACE_DEBUG("ISO_Init\n\r"); - - USART_Configure( USART_PHONE, - US_MR_USART_MODE_IS07816_T_0 -// Nope, we aren't master: - // | US_MR_USCLKS_MCK - | US_MR_USCLKS_SCK - | US_MR_NBSTOP_1_BIT - | 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 */ - 1, - 0); - /* - SYNC = 0 (async mode) - OVER = 0 (oversampling by 8?) - FIDI = 372 (default val on startup before other value is negotiated) - USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK - CD = 1 ? --> US_BRGR_CD(1) - */ - USART_PHONE->US_FIDI = 372; - 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(ID_USART_PHONE); - - USART1->US_IDR = 0xffffffff; - USART_EnableIt( USART1, US_IER_RXRDY) ; - /* 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_SetReceiverEnabled(USART_PHONE, 1); - -} void Sniffer_Init( void ) { @@ -150,6 +73,7 @@ void Sniffer_Init( void ) PIO_Configure(pPwr, PIO_LISTSIZE( pPwr )); - _ISO7816_Init( ); + _ISO7816_Init(); + USART_SetReceiverEnabled(USART_PHONE, 1); }