Split init into configure and init

* Implemented configure, init, exit functions:
    When a configuration is changed, interrupts for reset pins
    should be disabled

* Moved variables shared between code files to simtrace.h
This commit is contained in:
Christina Quast
2015-04-09 22:38:47 +02:00
parent abcf3038d2
commit 95d6616ba1
8 changed files with 95 additions and 72 deletions

View File

@@ -112,8 +112,6 @@ static void ConfigureCardDetection( void )
printf("+++++ Configure PIOs\n\r");
PIO_Configure( &pinSmartCard, 1 ) ;
NVIC_EnableIRQ( PIOA_IRQn );
// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ;
PIO_EnableIt( &pinSmartCard ) ;
}
@@ -133,21 +131,27 @@ static void ConfigureCardDetection( void )
/*-----------------------------------------------------------------------------
* Initialization and run
*-----------------------------------------------------------------------------*/
static const CCIDDriverConfigurationDescriptors *configDescCCID;
extern CCIDDriverConfigurationDescriptors configurationDescriptorCCID;
void CCID_configure ( void ) {
CCIDDriver_Initialize();
// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ;
}
void CCID_exit ( void ) {
PIO_DisableIt( &pinSmartCard ) ;
}
void CCID_init( void )
{
uint8_t pAtr[MAX_ATR_SIZE];
uint8_t ucSize ;
configDescCCID = &configurationDescriptorCCID;
// FIXME: do we want to print ATR?
/* Initialize Atr buffer */
memset( pAtr, 0, sizeof( pAtr ) ) ;
/* Configure IT on Smart Card */
ConfigureCardDetection() ;
// Configure ISO7816 driver
@@ -160,8 +164,6 @@ void CCID_init( void )
ISO7816_Init( &pinIso7816RstMC ) ;
CCIDDriver_Initialize();
/* Read ATR */
ISO7816_warm_reset() ;

View File

@@ -9,34 +9,33 @@
* Internal variables
*------------------------------------------------------------------------------*/
typedef struct {
void (* configure) ( void );
void (* init) ( void );
void (* exit) ( void );
void (* run) ( void );
} conf_func;
conf_func config_func_ptrs[] = {
{Sniffer_Init, Sniffer_run}, /* CFG_NUM_SNIFF */
{CCID_init, CCID_run}, /* CFG_NUM_CCID */
{Phone_Master_Init, Phone_run}, /* CFG_NUM_PHONE */
{MITM_init, MITM_run}, /* CFG_NUM_MITM */
{Sniffer_configure, Sniffer_init, Sniffer_exit, Sniffer_run}, /* CFG_NUM_SNIFF */
{CCID_configure, CCID_init, CCID_exit, CCID_run}, /* CFG_NUM_CCID */
{Phone_configure, Phone_init, Phone_exit, Phone_run}, /* CFG_NUM_PHONE */
{MITM_configure, MITM_init, MITM_exit, MITM_run}, /* CFG_NUM_MITM */
};
/*------------------------------------------------------------------------------
* Internal variables
*------------------------------------------------------------------------------*/
uint8_t simtrace_config = CFG_NUM_SNIFF;
uint8_t conf_changed = 1;
uint8_t rcvdChar = 0;
uint32_t char_stat = 0;
volatile enum confNum simtrace_config = CFG_NUM_SNIFF;
/*------------------------------------------------------------------------------
* Main
* Main
*------------------------------------------------------------------------------*/
extern int main( void )
{
uint8_t isUsbConnected = 0;
enum confNum last_simtrace_config = simtrace_config;
LED_Configure(LED_NUM_RED);
LED_Configure(LED_NUM_GREEN);
@@ -51,6 +50,14 @@ extern int main( void )
printf("%s", "USB init\n\r");
for (unsigned int i = 0; i < sizeof(config_func_ptrs)/sizeof(config_func_ptrs[0]); ++i)
{
config_func_ptrs[i].configure();
}
config_func_ptrs[simtrace_config-1].init();
last_simtrace_config = simtrace_config;
// FIXME: why don't we get any interrupts with this line?:
while(USBD_GetState() < USBD_STATE_CONFIGURED);
@@ -72,15 +79,16 @@ extern int main( void )
isUsbConnected = 1;
// TC_Start(TC0, 0);
}
}
// for (int i=0; i <10000; i++);
/* FIXME: Or should we move the while loop into every case, and break out
in case the config changes? */
if (conf_changed) {
if (last_simtrace_config != simtrace_config) {
config_func_ptrs[last_simtrace_config-1].exit();
config_func_ptrs[simtrace_config-1].init();
conf_changed = 0;
last_simtrace_config = simtrace_config;
} else {
config_func_ptrs[simtrace_config-1].run();
}

View File

@@ -38,11 +38,16 @@
static const Pin pins_bus[] = {PINS_BUS_DEFAULT};
void MITM_configure( void )
{
Phone_configure();
CCID_configure();
}
void MITM_init( void )
{
CCID_init();
Phone_Master_Init();
Phone_init();
return;
/* Configure ISO7816 driver */
@@ -62,9 +67,14 @@ void MITM_init( void )
*/
}
void MITM_exit( void )
{
Phone_exit();
CCID_exit();
}
void MITM_run( void )
{
Phone_run();
CCID_SmartCardRequest();
CCID_run();
}

View File

@@ -126,7 +126,6 @@ enum states{
static uint8_t StateUsartGlobal = USART_RCV;
static enum states state;
extern uint8_t rcvdChar;
extern volatile uint8_t timeout_occured;
@@ -146,21 +145,9 @@ static void ISR_PhoneRST( const Pin *pPin)
}
}
state = RST_RCVD;
// FIXME: What to do on reset?
// FIXME: It seems like the phone is constantly sending a lot of these RSTs
PIO_DisableIt( &pinPhoneRST ) ;
}
static void Config_PhoneRST_IrqHandler()
{
PIO_Configure( &pinPhoneRST, 1);
// PIO_Configure( &pinPhoneClk, 1);
PIO_ConfigureIt( &pinPhoneRST, ISR_PhoneRST ) ;
// PIO_ConfigureIt( &pinPhoneClk, ISR_PhoneRST ) ;
PIO_EnableIt( &pinPhoneRST ) ;
// PIO_EnableIt( &pinPhoneClk ) ;
NVIC_EnableIRQ( PIOA_IRQn );
/* Interrupt enabled after ATR is sent to phone */
PIO_DisableIt( &pinPhoneRST ) ;
}
/**
@@ -252,13 +239,25 @@ uint32_t _ISO7816_SendChar( uint8_t CharToSend )
return( status );
}
void Phone_Master_Init( void ) {
void Phone_configure( void ) {
PIO_ConfigureIt( &pinPhoneRST, ISR_PhoneRST ) ;
NVIC_EnableIRQ( PIOA_IRQn );
}
void Phone_exit( void ) {
PIO_DisableIt( &pinPhoneRST ) ;
USART_DisableIt( USART_PHONE, US_IER_RXRDY) ;
USART_SetTransmitterEnabled(USART_PHONE, 0);
USART_SetReceiverEnabled(USART_PHONE, 0);
}
void Phone_init( void ) {
PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ;
PIO_Configure( pins_bus, PIO_LISTSIZE( pins_bus) ) ;
Config_PhoneRST_IrqHandler();
PIO_Configure( &pinPhoneRST, 1);
PIO_EnableIt( &pinPhoneRST ) ;
_ISO7816_Init();
USART_SetTransmitterEnabled(USART_PHONE, 1);
@@ -272,20 +271,8 @@ void Phone_Master_Init( void ) {
// FIXME: Or do I need to call VBUS_CONFIGURE() here instead, which will call USBD_Connect() later?
// USBD_Connect();
// FIXME: USB clock? USB PMC?
// NVIC_EnableIRQ( UDP_IRQn );
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) {
int i = 1;
if ((i%10000) == 0) {
TRACE_DEBUG("%d: USB State: %x\n\r", i, USBD_GetState());
}
i++;
}
*/
USART_EnableIt( USART_PHONE, US_IER_RXRDY) ;
Timer_Init();
}
@@ -330,7 +317,6 @@ void sendResponse( uint8_t *pArg, uint8_t status, uint32_t transferred, uint32_t
state = WAIT_CMD_PHONE;
}
extern ring_buffer buf;
#define MAX_MSG_LEN 64
void wait_for_response(uint8_t pBuffer[]) {
@@ -339,7 +325,7 @@ void wait_for_response(uint8_t pBuffer[]) {
printf(" rr ");
/* DATA_IN for host side is data_out for simtrace side */
ret = USBD_Write( PHONE_DATAIN, buf.buf, BUFLEN, 0, 0 );
ret = USBD_Write( PHONE_DATAIN, (void *)buf.buf, BUFLEN, 0, 0 );
if (ret != USBD_STATUS_SUCCESS) {
TRACE_ERROR("USB err status: %d (%s)", __FUNCTION__, ret);
return;
@@ -350,7 +336,7 @@ void wait_for_response(uint8_t pBuffer[]) {
} else if (timeout_occured && buf.idx != 0) {
printf(" to ");
ret = USBD_Write( PHONE_DATAIN, buf.buf, buf.idx, 0, 0 );
ret = USBD_Write( PHONE_DATAIN, (void *) buf.buf, buf.idx, 0, 0 );
if (ret != USBD_STATUS_SUCCESS) {
TRACE_ERROR("USB err status: %d (%s)", __FUNCTION__, ret);
return;

View File

@@ -18,6 +18,11 @@ typedef struct ring_buffer
uint8_t idx; // number of items in the buffer
} ring_buffer;
extern volatile ring_buffer buf;
extern volatile bool rcvdChar;
extern volatile uint32_t char_stat;
extern volatile enum confNum simtrace_config;
enum confNum {
CFG_NUM_SNIFF = 1, CFG_NUM_CCID, CFG_NUM_PHONE, CFG_NUM_MITM, NUM_CONF
@@ -50,15 +55,27 @@ extern const USBConfigurationDescriptor *configurationDescriptorsArr[];
extern uint32_t _ISO7816_GetChar( uint8_t *pCharToReceive );
extern uint32_t _ISO7816_SendChar( uint8_t CharToSend );
/* Configure functions */
extern void Sniffer_configure( void );
extern void CCID_configure( void );
extern void Phone_configure( void );
extern void MITM_configure( void );
/* Init functions */
extern void Phone_Master_Init( void );
extern void Sniffer_init( void );
extern void CCID_init( void );
extern void Sniffer_Init( void );
extern void Phone_init( void );
extern void MITM_init( void );
extern void SIMtrace_USB_Initialize( void );
extern void _ISO7816_Init( void );
/* Exit functions */
extern void Sniffer_exit( void );
extern void CCID_exit( void );
extern void Phone_exit( void );
extern void MITM_exit( void );
/* Run functions */
extern void Sniffer_run( void );
extern void CCID_run( void );

View File

@@ -35,8 +35,8 @@
#include <string.h>
extern uint8_t rcvdChar;
extern uint32_t char_stat;
volatile uint32_t char_stat;
volatile bool rcvdChar = 0;
//#define BUFLEN 14
// FIXME: Remove:
@@ -49,7 +49,7 @@ extern uint32_t char_stat;
uint8_t idx; // number of items in the buffer
} ring_buffer;
*/
ring_buffer buf = { {0}, 0 };
volatile ring_buffer buf = { {0}, 0 };
void buf_push(uint8_t item)
{

View File

@@ -60,20 +60,23 @@ static const Pin pPwr[] = {
{VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
};
extern uint32_t char_stat;
extern uint8_t rcvdChar;
extern ring_buffer buf;
/*-----------------------------------------------------------------------------
* Initialization routine
*-----------------------------------------------------------------------------*/
void Sniffer_Init( void )
void Sniffer_configure( void ){
}
void Sniffer_exit( void ){
USART_SetReceiverEnabled(USART_PHONE, 0);
}
void Sniffer_init( void )
{
/* Configure ISO7816 driver */
PIO_Configure( pinsISO7816_sniff, PIO_LISTSIZE( pinsISO7816_sniff ) ) ;
PIO_Configure( pins_bus, PIO_LISTSIZE( pins_bus) ) ;
PIO_Configure(pPwr, PIO_LISTSIZE( pPwr ));
_ISO7816_Init();
@@ -87,7 +90,7 @@ void Sniffer_run( void )
/* 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 );
USBD_Write( DATAIN, (void *) buf.buf, BUFLEN, 0, 0 );
PR("----- Rcvd char\n\r");
rcvdChar = 0;
}

View File

@@ -602,13 +602,10 @@ const USBDDriverDescriptors driverDescriptors = {
/*----------------------------------------------------------------------------
* Callbacks
*----------------------------------------------------------------------------*/
extern uint8_t conf_changed;
extern uint8_t simtrace_config;
void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum)
{
TRACE_INFO_WP("cfgChanged%d ", cfgnum);
conf_changed =1;
simtrace_config = cfgnum;
}