mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-18 06:08:31 +03:00
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:
@@ -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() ;
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user