convert all src_simtrace code to kernel coding style

Let's use the Osmocom standard, based on the Linux kernel standard:
tab-indent and 8-charracter tab width.
This commit is contained in:
Harald Welte
2016-03-03 12:32:04 +01:00
parent 1605564489
commit 7dd3dfd992
9 changed files with 1025 additions and 986 deletions

View File

@@ -46,22 +46,28 @@
/** Maximum ATR ucSize in bytes.*/ /** Maximum ATR ucSize in bytes.*/
#define MAX_ATR_SIZE 55 #define MAX_ATR_SIZE 55
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* Internal variables * Internal variables
*------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------*/
/** ISO7816 pins */ /** ISO7816 pins */
static const Pin pinsISO7816[] = {PINS_ISO7816}; static const Pin pinsISO7816[] = { PINS_ISO7816 };
/** Bus switch pins */ /** Bus switch pins */
static const Pin pinsBus[] = {PINS_BUS_DEFAULT}; static const Pin pinsBus[] = { PINS_BUS_DEFAULT };
/* SIMcard power pin */ /* SIMcard power pin */
static const Pin pinsPower[] = {PWR_PINS}; static const Pin pinsPower[] = { PWR_PINS };
/** ISO7816 RST pin */ /** ISO7816 RST pin */
static const Pin pinIso7816RstMC = PIN_ISO7816_RSTMC; static const Pin pinIso7816RstMC = PIN_ISO7816_RSTMC;
static uint8_t sim_inserted = 0; static uint8_t sim_inserted = 0;
static struct Usart_info usart_info = {.base = USART_SIM, .id = ID_USART_SIM, .state = USART_RCV}; static struct Usart_info usart_info = {
.base = USART_SIM,
.id = ID_USART_SIM,
.state = USART_RCV
};
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* Optional smartcard detection * Optional smartcard detection
@@ -74,7 +80,7 @@ static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
* PIO interrupt service routine. Checks if the smartcard has been connected * PIO interrupt service routine. Checks if the smartcard has been connected
* or disconnected. * or disconnected.
*/ */
static void ISR_PioSmartCard( const Pin *pPin ) static void ISR_PioSmartCard(const Pin * pPin)
{ {
/* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number? /* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR); printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
@@ -91,16 +97,13 @@ Output:
// if ( (pinSmartCard.pio->PIO_ISR & pinSmartCard.mask) != 0 ) // if ( (pinSmartCard.pio->PIO_ISR & pinSmartCard.mask) != 0 )
{ {
/* Check current level on pin */ /* Check current level on pin */
if ( PIO_Get( &pinSmartCard ) == 0 ) if (PIO_Get(&pinSmartCard) == 0) {
{
sim_inserted = 1; sim_inserted = 1;
printf( "-I- Smartcard inserted\n\r" ) ; printf("-I- Smartcard inserted\n\r");
CCID_Insertion(); CCID_Insertion();
} } else {
else
{
sim_inserted = 0; sim_inserted = 0;
printf( "-I- Smartcard removed\n\r" ) ; printf("-I- Smartcard removed\n\r");
CCID_Removal(); CCID_Removal();
} }
} }
@@ -109,12 +112,12 @@ Output:
/** /**
* Configures the smartcard detection pin to trigger an interrupt. * Configures the smartcard detection pin to trigger an interrupt.
*/ */
static void ConfigureCardDetection( void ) static void ConfigureCardDetection(void)
{ {
printf("+++++ Configure PIOs\n\r"); printf("+++++ Configure PIOs\n\r");
PIO_Configure( &pinSmartCard, 1 ) ; PIO_Configure(&pinSmartCard, 1);
NVIC_EnableIRQ( PIOA_IRQn ); NVIC_EnableIRQ(PIOA_IRQn);
PIO_EnableIt( &pinSmartCard ) ; PIO_EnableIt(&pinSmartCard);
} }
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
@@ -122,28 +125,30 @@ static void ConfigureCardDetection( void )
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
extern CCIDDriverConfigurationDescriptors configurationDescriptorCCID; extern CCIDDriverConfigurationDescriptors configurationDescriptorCCID;
void CCID_configure ( void ) { void CCID_configure(void)
{
CCIDDriver_Initialize(); CCIDDriver_Initialize();
// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10); // FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ; PIO_ConfigureIt(&pinSmartCard, ISR_PioSmartCard);
} }
void CCID_exit ( void ) { void CCID_exit(void)
PIO_DisableIt( &pinSmartCard ) ; {
PIO_DisableIt(&pinSmartCard);
USART_SetTransmitterEnabled(usart_info.base, 0); USART_SetTransmitterEnabled(usart_info.base, 0);
USART_SetReceiverEnabled(usart_info.base, 0); USART_SetReceiverEnabled(usart_info.base, 0);
} }
void CCID_init( void ) void CCID_init(void)
{ {
uint8_t pAtr[MAX_ATR_SIZE]; uint8_t pAtr[MAX_ATR_SIZE];
uint8_t ucSize ; uint8_t ucSize;
// FIXME: do we want to print ATR? // FIXME: do we want to print ATR?
/* Initialize Atr buffer */ /* Initialize Atr buffer */
memset( pAtr, 0, sizeof( pAtr ) ) ; memset(pAtr, 0, sizeof(pAtr));
ConfigureCardDetection() ; ConfigureCardDetection();
// Configure ISO7816 driver // Configure ISO7816 driver
PIO_Configure(pinsISO7816, PIO_LISTSIZE(pinsISO7816)); PIO_Configure(pinsISO7816, PIO_LISTSIZE(pinsISO7816));
@@ -159,21 +164,21 @@ void CCID_init( void )
ISO7816_Set_Reset_Pin(&pinIso7816RstMC); ISO7816_Set_Reset_Pin(&pinIso7816RstMC);
/* Read ATR */ /* Read ATR */
ISO7816_warm_reset() ; ISO7816_warm_reset();
ISO7816_Datablock_ATR( pAtr, &ucSize ) ; ISO7816_Datablock_ATR(pAtr, &ucSize);
/* Decode ATR and print it */ /* Decode ATR and print it */
ISO7816_Decode_ATR( pAtr ) ; ISO7816_Decode_ATR(pAtr);
// FIXME. what if smcard is not inserted? // FIXME. what if smcard is not inserted?
if(PIO_Get(&pinSmartCard) == 0) { if (PIO_Get(&pinSmartCard) == 0) {
printf("SIM card inserted\n\r"); printf("SIM card inserted\n\r");
CCID_Insertion(); CCID_Insertion();
} }
} }
void CCID_run( void ) void CCID_run(void)
{ {
//if (USBD_Read(INT, pBuffer, dLength, fCallback, pArgument); //if (USBD_Read(INT, pBuffer, dLength, fCallback, pArgument);

View File

@@ -15,13 +15,13 @@
*------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------*/
typedef struct { typedef struct {
/* static initialization, called whether or not the usb config is active */ /* static initialization, called whether or not the usb config is active */
void (* configure) ( void ); void (*configure) (void);
/* initialization function after the config was selected */ /* initialization function after the config was selected */
void (* init) ( void ); void (*init) (void);
/* de-initialization before selecting new config */ /* de-initialization before selecting new config */
void (* exit) ( void ); void (*exit) (void);
/* main loop content for given configuration */ /* main loop content for given configuration */
void (* run) ( void ); void (*run) (void);
} conf_func; } conf_func;
static const conf_func config_func_ptrs[] = { static const conf_func config_func_ptrs[] = {
@@ -55,12 +55,11 @@ static const conf_func config_func_ptrs[] = {
.configure = MITM_configure, .configure = MITM_configure,
.init = MITM_init, .init = MITM_init,
.exit = MITM_exit, .exit = MITM_exit,
.run = MITM_run .run = MITM_run,
}, },
#endif #endif
}; };
/*------------------------------------------------------------------------------ /*------------------------------------------------------------------------------
* Internal variables * Internal variables
*------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------*/
@@ -72,7 +71,6 @@ static volatile enum confNum simtrace_config = CFG_NUM_PHONE;
static volatile enum confNum simtrace_config = CFG_NUM_CCID; static volatile enum confNum simtrace_config = CFG_NUM_CCID;
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
* Callbacks * Callbacks
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
@@ -87,7 +85,7 @@ void USBDDriverCallbacks_ConfigurationChanged(uint8_t cfgnum)
* Main * Main
*------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------*/
#define MAX_USB_ITER BOARD_MCK/72 // This should be around a second #define MAX_USB_ITER BOARD_MCK/72 // This should be around a second
extern int main( void ) extern int main(void)
{ {
uint8_t isUsbConnected = 0; uint8_t isUsbConnected = 0;
enum confNum last_simtrace_config = simtrace_config; enum confNum last_simtrace_config = simtrace_config;
@@ -97,8 +95,8 @@ extern int main( void )
LED_Configure(LED_NUM_GREEN); LED_Configure(LED_NUM_GREEN);
LED_Set(LED_NUM_RED); LED_Set(LED_NUM_RED);
/* Disable watchdog*/ /* Disable watchdog */
WDT_Disable( WDT ) ; WDT_Disable(WDT);
req_ctx_init(); req_ctx_init();
@@ -107,17 +105,18 @@ extern int main( void )
SIMtrace_USB_Initialize(); SIMtrace_USB_Initialize();
TRACE_INFO("USB init...\n\r"); TRACE_INFO("USB init...\n\r");
while(USBD_GetState() < USBD_STATE_CONFIGURED){ while (USBD_GetState() < USBD_STATE_CONFIGURED) {
if(i >= MAX_USB_ITER*3) { if (i >= MAX_USB_ITER * 3) {
TRACE_ERROR("Resetting board (USB could not be configured)\n"); TRACE_ERROR("Resetting board (USB could "
"not be configured)\n");
NVIC_SystemReset(); NVIC_SystemReset();
} }
i++; i++;
} }
TRACE_DEBUG("calling configure of all configurations...\n\r"); TRACE_DEBUG("calling configure of all configurations...\n\r");
for (i = 1; i < sizeof(config_func_ptrs)/sizeof(config_func_ptrs[0]); ++i) for (i = 1; i < sizeof(config_func_ptrs) / sizeof(config_func_ptrs[0]);
{ ++i) {
if (config_func_ptrs[i].configure) if (config_func_ptrs[i].configure)
config_func_ptrs[i].configure(); config_func_ptrs[i].configure();
} }
@@ -127,7 +126,7 @@ extern int main( void )
last_simtrace_config = simtrace_config; last_simtrace_config = simtrace_config;
TRACE_DEBUG("entering main loop...\n\r"); TRACE_DEBUG("entering main loop...\n\r");
while(1) { while (1) {
const char rotor[] = { '-', '\\', '|', '/' }; const char rotor[] = { '-', '\\', '|', '/' };
putchar('\b'); putchar('\b');
putchar(rotor[i++ % ARRAY_SIZE(rotor)]); putchar(rotor[i++ % ARRAY_SIZE(rotor)]);
@@ -137,8 +136,7 @@ extern int main( void )
if (isUsbConnected) { if (isUsbConnected) {
isUsbConnected = 0; isUsbConnected = 0;
} }
} } else if (isUsbConnected == 0) {
else if (isUsbConnected == 0) {
TRACE_INFO("USB is now configured\n\r"); TRACE_INFO("USB is now configured\n\r");
LED_Set(LED_NUM_GREEN); LED_Set(LED_NUM_GREEN);
LED_Clear(LED_NUM_RED); LED_Clear(LED_NUM_RED);
@@ -146,7 +144,8 @@ extern int main( void )
isUsbConnected = 1; isUsbConnected = 1;
} }
if (last_simtrace_config != simtrace_config) { if (last_simtrace_config != simtrace_config) {
TRACE_INFO("USB config chg %u -> %u\r\n", last_simtrace_config, simtrace_config); TRACE_INFO("USB config chg %u -> %u\r\n",
last_simtrace_config, simtrace_config);
config_func_ptrs[last_simtrace_config].exit(); config_func_ptrs[last_simtrace_config].exit();
config_func_ptrs[simtrace_config].init(); config_func_ptrs[simtrace_config].init();
last_simtrace_config = simtrace_config; last_simtrace_config = simtrace_config;

View File

@@ -37,16 +37,15 @@
#include <string.h> #include <string.h>
static const Pin pins_bus[] = { PINS_BUS_DEFAULT };
static const Pin pins_bus[] = {PINS_BUS_DEFAULT}; void MITM_configure(void)
void MITM_configure( void )
{ {
Phone_configure(); Phone_configure();
CCID_configure(); CCID_configure();
} }
void MITM_init( void ) void MITM_init(void)
{ {
CCID_init(); CCID_init();
Phone_init(); Phone_init();
@@ -54,13 +53,13 @@ void MITM_init( void )
return; return;
} }
void MITM_exit( void ) void MITM_exit(void)
{ {
Phone_exit(); Phone_exit();
CCID_exit(); CCID_exit();
} }
void MITM_run( void ) void MITM_run(void)
{ {
Phone_run(); Phone_run();
CCID_run(); CCID_run();

View File

@@ -62,15 +62,16 @@ extern volatile uint8_t timeout_occured;
unsigned char USBState = STATE_IDLE; unsigned char USBState = STATE_IDLE;
/** ISO7816 pins */ /** ISO7816 pins */
static const Pin pinsISO7816_PHONE[] = {PINS_ISO7816_PHONE}; static const Pin pinsISO7816_PHONE[] = { PINS_ISO7816_PHONE };
/** Bus switch pins */ /** Bus switch pins */
#if DEBUG_PHONE_SNIFF #if DEBUG_PHONE_SNIFF
# warning "Debug phone sniff via logic analyzer is enabled" #warning "Debug phone sniff via logic analyzer is enabled"
// Logic analyzer probes are easier to attach to the SIM card slot // Logic analyzer probes are easier to attach to the SIM card slot
static const Pin pins_bus[] = {PINS_BUS_SNIFF}; static const Pin pins_bus[] = { PINS_BUS_SNIFF };
#else #else
static const Pin pins_bus[] = {PINS_BUS_DEFAULT}; static const Pin pins_bus[] = { PINS_BUS_DEFAULT };
#endif #endif
/** ISO7816 RST pin */ /** ISO7816 RST pin */
@@ -86,7 +87,11 @@ static const Pin pPwr[] = {
const Pin pinPhoneRST = PIN_ISO7816_RST_PHONE; const Pin pinPhoneRST = PIN_ISO7816_RST_PHONE;
static struct Usart_info usart_info = {.base = USART_PHONE, .id = ID_USART_PHONE, .state = USART_RCV}; static struct Usart_info usart_info = {
.base = USART_PHONE,
.id = ID_USART_PHONE,
.state = USART_RCV,
};
/* ===================================================*/ /* ===================================================*/
/* Taken from iso7816_4.c */ /* Taken from iso7816_4.c */
@@ -101,15 +106,19 @@ static struct Usart_info usart_info = {.base = USART_PHONE, .id = ID_USART_PHONE
static uint8_t host_to_sim_buf[BUFLEN]; static uint8_t host_to_sim_buf[BUFLEN];
static bool change_fidi = false; static bool change_fidi = false;
static void receive_from_host( void ); static void receive_from_host(void);
static void sendResponse_to_phone( uint8_t *pArg, uint8_t status, uint32_t transferred, uint32_t remaining) static void sendResponse_to_phone(uint8_t * pArg, uint8_t status,
uint32_t transferred, uint32_t remaining)
{ {
if (status != USBD_STATUS_SUCCESS) { if (status != USBD_STATUS_SUCCESS) {
TRACE_ERROR("USB err status: %d (%s)\n", __FUNCTION__, status); TRACE_ERROR("USB err status: %d (%s)\n", __FUNCTION__, status);
return; return;
} }
TRACE_DEBUG("sendResp, stat: %X, trnsf: %x, rem: %x\n\r", status, transferred, remaining); TRACE_DEBUG("sendResp, stat: %X, trnsf: %x, rem: %x\n\r", status,
TRACE_DEBUG("Resp: %x %x %x .. %x\n", host_to_sim_buf[0], host_to_sim_buf[1], host_to_sim_buf[2], host_to_sim_buf[transferred-1]); transferred, remaining);
TRACE_DEBUG("Resp: %x %x %x .. %x\n", host_to_sim_buf[0],
host_to_sim_buf[1], host_to_sim_buf[2],
host_to_sim_buf[transferred - 1]);
USART_SetReceiverEnabled(USART_PHONE, 0); USART_SetReceiverEnabled(USART_PHONE, 0);
USART_SetTransmitterEnabled(USART_PHONE, 1); USART_SetTransmitterEnabled(USART_PHONE, 1);
@@ -120,7 +129,7 @@ static void sendResponse_to_phone( uint8_t *pArg, uint8_t status, uint32_t trans
i = 2; i = 2;
change_fidi = true; change_fidi = true;
} }
for (; i < transferred; i++ ) { for (; i < transferred; i++) {
ISO7816_SendChar(host_to_sim_buf[i], &usart_info); ISO7816_SendChar(host_to_sim_buf[i], &usart_info);
} }
USART_SetTransmitterEnabled(USART_PHONE, 0); USART_SetTransmitterEnabled(USART_PHONE, 0);
@@ -138,33 +147,38 @@ static void sendResponse_to_phone( uint8_t *pArg, uint8_t status, uint32_t trans
static void receive_from_host() static void receive_from_host()
{ {
int ret; int ret;
if ((ret = USBD_Read(PHONE_DATAOUT, &host_to_sim_buf, sizeof(host_to_sim_buf), if ((ret = USBD_Read(PHONE_DATAOUT, &host_to_sim_buf,
(TransferCallback)&sendResponse_to_phone, 0)) == USBD_STATUS_SUCCESS) { sizeof(host_to_sim_buf),
(TransferCallback) &sendResponse_to_phone,
0)) == USBD_STATUS_SUCCESS) {
} else { } else {
TRACE_ERROR("USB Err: %X\n", ret); TRACE_ERROR("USB Err: %X\n", ret);
} }
} }
void Phone_configure( void ) { void Phone_configure(void)
PIO_ConfigureIt( &pinPhoneRST, ISR_PhoneRST ) ; {
NVIC_EnableIRQ( PIOA_IRQn ); PIO_ConfigureIt(&pinPhoneRST, ISR_PhoneRST);
NVIC_EnableIRQ(PIOA_IRQn);
} }
void Phone_exit( void ) { void Phone_exit(void)
PIO_DisableIt( &pinPhoneRST ) ; {
PIO_DisableIt(&pinPhoneRST);
NVIC_DisableIRQ(USART1_IRQn); NVIC_DisableIRQ(USART1_IRQn);
USART_DisableIt( USART_PHONE, US_IER_RXRDY) ; USART_DisableIt(USART_PHONE, US_IER_RXRDY);
USART_SetTransmitterEnabled(USART_PHONE, 0); USART_SetTransmitterEnabled(USART_PHONE, 0);
USART_SetReceiverEnabled(USART_PHONE, 0); USART_SetReceiverEnabled(USART_PHONE, 0);
} }
void Phone_init( void ) { void Phone_init(void)
PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ; {
PIO_Configure( pins_bus, PIO_LISTSIZE( pins_bus) ) ; PIO_Configure(pinsISO7816_PHONE, PIO_LISTSIZE(pinsISO7816_PHONE));
PIO_Configure(pins_bus, PIO_LISTSIZE(pins_bus));
PIO_Configure( &pinPhoneRST, 1); PIO_Configure(&pinPhoneRST, 1);
PIO_EnableIt( &pinPhoneRST ) ; PIO_EnableIt(&pinPhoneRST);
ISO7816_Init(&usart_info, CLK_SLAVE); ISO7816_Init(&usart_info, CLK_SLAVE);
USART_SetTransmitterEnabled(USART_PHONE, 0); USART_SetTransmitterEnabled(USART_PHONE, 0);
@@ -176,7 +190,7 @@ void Phone_init( void ) {
receive_from_host(); receive_from_host();
} }
void Phone_run( void ) void Phone_run(void)
{ {
check_data_from_phone(); check_data_from_phone();
} }

View File

@@ -1,40 +1,40 @@
#include "ringbuffer.h" #include "ringbuffer.h"
#include "trace.h" #include "trace.h"
void rbuf_reset(volatile ringbuf *rb) void rbuf_reset(volatile ringbuf * rb)
{ {
rb->ird = 0; rb->ird = 0;
rb->iwr = 0; rb->iwr = 0;
} }
uint8_t rbuf_read(volatile ringbuf *rb) uint8_t rbuf_read(volatile ringbuf * rb)
{ {
uint8_t val = rb->buf[rb->ird]; uint8_t val = rb->buf[rb->ird];
rb->ird = (rb->ird + 1)%RING_BUFLEN; rb->ird = (rb->ird + 1) % RING_BUFLEN;
return val; return val;
} }
uint8_t rbuf_peek(volatile ringbuf *rb) uint8_t rbuf_peek(volatile ringbuf * rb)
{ {
return rb->buf[rb->ird]; return rb->buf[rb->ird];
} }
void rbuf_write(volatile volatile ringbuf *rb, uint8_t item) void rbuf_write(volatile volatile ringbuf * rb, uint8_t item)
{ {
if(!rbuf_is_full(rb)) { if (!rbuf_is_full(rb)) {
rb->buf[rb->iwr] = item; rb->buf[rb->iwr] = item;
rb->iwr = (rb->iwr + 1)%RING_BUFLEN; rb->iwr = (rb->iwr + 1) % RING_BUFLEN;
} else { } else {
TRACE_ERROR("Ringbuffer full, losing bytes!"); TRACE_ERROR("Ringbuffer full, losing bytes!");
} }
} }
bool rbuf_is_empty(volatile ringbuf *rb) bool rbuf_is_empty(volatile ringbuf * rb)
{ {
return rb->ird == rb->iwr; return rb->ird == rb->iwr;
} }
bool rbuf_is_full(volatile ringbuf *rb) bool rbuf_is_full(volatile ringbuf * rb)
{ {
return rb->ird == (rb->iwr+1)%RING_BUFLEN; return rb->ird == (rb->iwr + 1) % RING_BUFLEN;
} }

View File

@@ -13,11 +13,11 @@ typedef struct ringbuf {
size_t iwr; size_t iwr;
} ringbuf; } ringbuf;
void rbuf_reset(volatile ringbuf *rb); void rbuf_reset(volatile ringbuf * rb);
uint8_t rbuf_read(volatile ringbuf *rb); uint8_t rbuf_read(volatile ringbuf * rb);
uint8_t rbuf_peek(volatile ringbuf *rb); uint8_t rbuf_peek(volatile ringbuf * rb);
void rbuf_write(volatile ringbuf *rb, uint8_t item); void rbuf_write(volatile ringbuf * rb, uint8_t item);
bool rbuf_is_empty(volatile ringbuf *rb); bool rbuf_is_empty(volatile ringbuf * rb);
bool rbuf_is_full(volatile ringbuf *rb); bool rbuf_is_full(volatile ringbuf * rb);
#endif /* end of include guard: SIMTRACE_RINGBUF_H */ #endif /* end of include guard: SIMTRACE_RINGBUF_H */

View File

@@ -46,32 +46,36 @@ volatile ringbuf sim_rcv_buf = { {0}, 0, 0 };
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
* Interrupt routines * Interrupt routines
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
static void Callback_PhoneRST_ISR( uint8_t *pArg, uint8_t status, uint32_t transferred, uint32_t remaining) static void Callback_PhoneRST_ISR(uint8_t * pArg, uint8_t status,
uint32_t transferred, uint32_t remaining)
{ {
printf("rstCB\n\r"); printf("rstCB\n\r");
PIO_EnableIt( &pinPhoneRST ) ; PIO_EnableIt(&pinPhoneRST);
} }
void ISR_PhoneRST( const Pin *pPin)
void ISR_PhoneRST(const Pin * pPin)
{ {
int ret; int ret;
// FIXME: no printfs in ISRs? // FIXME: no printfs in ISRs?
printf("+++ Int!! %x\n\r", pinPhoneRST.pio->PIO_ISR); printf("+++ Int!! %x\n\r", pinPhoneRST.pio->PIO_ISR);
if ( ((pinPhoneRST.pio->PIO_ISR & pinPhoneRST.mask) != 0) ) if (((pinPhoneRST.pio->PIO_ISR & pinPhoneRST.mask) != 0)) {
{ if (PIO_Get(&pinPhoneRST) == 0) {
if(PIO_Get( &pinPhoneRST ) == 0) {
printf(" 0 "); printf(" 0 ");
} else { } else {
printf(" 1 "); printf(" 1 ");
} }
} }
if ((ret = USBD_Write( PHONE_INT, "R", 1, (TransferCallback)&Callback_PhoneRST_ISR, 0 )) != USBD_STATUS_SUCCESS) { if ((ret =
USBD_Write(PHONE_INT, "R", 1,
(TransferCallback) & Callback_PhoneRST_ISR,
0)) != USBD_STATUS_SUCCESS) {
TRACE_ERROR("USB err status: %d (%s)\n", ret, __FUNCTION__); TRACE_ERROR("USB err status: %d (%s)\n", ret, __FUNCTION__);
return; return;
} }
/* Interrupt enabled after ATR is sent to phone */ /* Interrupt enabled after ATR is sent to phone */
PIO_DisableIt( &pinPhoneRST ) ; PIO_DisableIt(&pinPhoneRST);
} }
extern void usart_irq_rx(uint8_t num); extern void usart_irq_rx(uint8_t num);
@@ -79,7 +83,7 @@ extern void usart_irq_rx(uint8_t num);
* char_stat is zero if no error occured. * char_stat is zero if no error occured.
* Otherwise it is filled with the content of the status register. * Otherwise it is filled with the content of the status register.
*/ */
void USART1_IrqHandler( void ) void USART1_IrqHandler(void)
{ {
#if 0 #if 0
uint32_t stat; uint32_t stat;
@@ -96,13 +100,13 @@ void USART1_IrqHandler( void )
/* transmit buffer empty, nothing to transmit */ /* transmit buffer empty, nothing to transmit */
} }
if (csr & US_CSR_RXRDY) { if (csr & US_CSR_RXRDY) {
stat = (csr&(US_CSR_OVRE|US_CSR_FRAME| stat = (csr & (US_CSR_OVRE | US_CSR_FRAME |
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK| US_CSR_PARE | US_CSR_TIMEOUT | US_CSR_NACK |
(1<<10))); (1 << 10)));
uint8_t c = (USART_PHONE->US_RHR) & 0xFF; uint8_t c = (USART_PHONE->US_RHR) & 0xFF;
// printf(" %x", c); // printf(" %x", c);
if (stat == 0 ) { if (stat == 0) {
/* Fill char into buffer */ /* Fill char into buffer */
rbuf_write(&sim_rcv_buf, c); rbuf_write(&sim_rcv_buf, c);
} else { } else {
@@ -127,7 +131,7 @@ void update_fidi(uint8_t fidi)
rc = compute_fidi_ratio(fi, di); rc = compute_fidi_ratio(fi, di);
if (rc > 0 && rc < 0x400) { if (rc > 0 && rc < 0x400) {
TRACE_INFO("computed Fi(%u) Di(%u) ratio: %d", fi, di, rc); TRACE_INFO("computed Fi(%u) Di(%u) ratio: %d", fi, di, rc);
/* make sure UART uses new F/D ratio */ /* make sure UART uses new F/D ratio */
USART_PHONE->US_CR |= US_CR_RXDIS | US_CR_RSTRX; USART_PHONE->US_CR |= US_CR_RXDIS | US_CR_RSTRX;
USART_PHONE->US_FIDI = rc & 0x3ff; USART_PHONE->US_FIDI = rc & 0x3ff;
USART_PHONE->US_CR |= US_CR_RXEN | US_CR_STTTO; USART_PHONE->US_CR |= US_CR_RXEN | US_CR_STTTO;

View File

@@ -50,8 +50,9 @@
* Internal variables * Internal variables
*------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------*/
/** ISO7816 pins */ /** ISO7816 pins */
static const Pin pinsISO7816_sniff[] = {PINS_SIM_SNIFF_SIM}; static const Pin pinsISO7816_sniff[] = { PINS_SIM_SNIFF_SIM };
static const Pin pins_bus[] = {PINS_BUS_SNIFF}; static const Pin pins_bus[] = { PINS_BUS_SNIFF };
static const Pin pPwr[] = { static const Pin pPwr[] = {
/* Enable power converter 4.5-6V to 3.3V; low: off */ /* Enable power converter 4.5-6V to 3.3V; low: off */
{SIM_PWEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}, {SIM_PWEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT},
@@ -60,30 +61,37 @@ static const Pin pPwr[] = {
{VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT} {VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
}; };
static struct Usart_info usart_info = {.base = USART_PHONE, .id = ID_USART_PHONE, .state = USART_RCV}; static struct Usart_info usart_info = {
.base = USART_PHONE,
.id = ID_USART_PHONE,
.state = USART_RCV,
};
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
* Initialization routine * Initialization routine
*-----------------------------------------------------------------------------*/ *-----------------------------------------------------------------------------*/
void Sniffer_configure( void ){ void Sniffer_configure(void)
{
TRACE_INFO("Sniffer config\n"); TRACE_INFO("Sniffer config\n");
} }
void Sniffer_exit( void ){ void Sniffer_exit(void)
{
TRACE_INFO("Sniffer exit\n"); TRACE_INFO("Sniffer exit\n");
USART_DisableIt(USART_PHONE, US_IER_RXRDY); USART_DisableIt(USART_PHONE, US_IER_RXRDY);
NVIC_DisableIRQ(USART1_IRQn); NVIC_DisableIRQ(USART1_IRQn);
USART_SetReceiverEnabled(USART_PHONE, 0); USART_SetReceiverEnabled(USART_PHONE, 0);
} }
void Sniffer_init( void )
void Sniffer_init(void)
{ {
TRACE_INFO("Sniffer Init\n"); TRACE_INFO("Sniffer Init\n");
/* Configure ISO7816 driver */ /* Configure ISO7816 driver */
PIO_Configure( pinsISO7816_sniff, PIO_LISTSIZE( pinsISO7816_sniff ) ) ; PIO_Configure(pinsISO7816_sniff, PIO_LISTSIZE(pinsISO7816_sniff));
PIO_Configure( pins_bus, PIO_LISTSIZE( pins_bus) ) ; PIO_Configure(pins_bus, PIO_LISTSIZE(pins_bus));
PIO_Configure(pPwr, PIO_LISTSIZE( pPwr )); PIO_Configure(pPwr, PIO_LISTSIZE(pPwr));
ISO7816_Init(&usart_info, CLK_SLAVE); ISO7816_Init(&usart_info, CLK_SLAVE);
@@ -92,7 +100,7 @@ void Sniffer_init( void )
NVIC_EnableIRQ(USART1_IRQn); NVIC_EnableIRQ(USART1_IRQn);
} }
void Sniffer_run( void ) void Sniffer_run(void)
{ {
check_data_from_phone(); check_data_from_phone();
} }

View File

@@ -41,7 +41,6 @@
* USB String descriptors * USB String descriptors
*------------------------------------------------------------------------------*/ *------------------------------------------------------------------------------*/
static const unsigned char langDesc[] = { static const unsigned char langDesc[] = {
USBStringDescriptor_LENGTH(1), USBStringDescriptor_LENGTH(1),
@@ -156,7 +155,6 @@ const unsigned char phoneConfigStringDescriptor[] = {
USBStringDescriptor_UNICODE('e'), USBStringDescriptor_UNICODE('e'),
}; };
const unsigned char MITMConfigStringDescriptor[] = { const unsigned char MITMConfigStringDescriptor[] = {
USBStringDescriptor_LENGTH(13), USBStringDescriptor_LENGTH(13),
@@ -225,8 +223,15 @@ const unsigned char cardem_usim2_intf_str[] = {
}; };
enum strDescNum { enum strDescNum {
PRODUCT_STRING = 1, MANUF_STR, SNIFFER_CONF_STR, CCID_CONF_STR, PHONE_CONF_STR, MITM_CONF_STR, PRODUCT_STRING = 1,
CARDEM_USIM1_INTF_STR, CARDEM_USIM2_INTF_STR, STRING_DESC_CNT MANUF_STR,
SNIFFER_CONF_STR,
CCID_CONF_STR,
PHONE_CONF_STR,
MITM_CONF_STR,
CARDEM_USIM1_INTF_STR,
CARDEM_USIM2_INTF_STR,
STRING_DESC_CNT
}; };
/** List of string descriptors used by the device */ /** List of string descriptors used by the device */
@@ -258,180 +263,174 @@ typedef struct _SIMTraceDriverConfigurationDescriptorSniffer {
} __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorSniffer; } __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorSniffer;
static const SIMTraceDriverConfigurationDescriptorSniffer configurationDescriptorSniffer = { static const SIMTraceDriverConfigurationDescriptorSniffer
configurationDescriptorSniffer = {
/* Standard configuration descriptor */ /* Standard configuration descriptor */
{ {
sizeof(USBConfigurationDescriptor), .bLength = sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION, .bDescriptorType = USBGenericDescriptor_CONFIGURATION,
sizeof(SIMTraceDriverConfigurationDescriptorSniffer), .wTotalLength = sizeof(SIMTraceDriverConfigurationDescriptorSniffer),
1, /* There is one interface in this configuration */ .bNumInterfaces = 1,
CFG_NUM_SNIFF, /* configuration number */ .bConfigurationValue = CFG_NUM_SNIFF,
SNIFFER_CONF_STR, /* string descriptor for this configuration */ .iConfiguration = SNIFFER_CONF_STR,
USBD_BMATTRIBUTES, .bmAttributes = USBD_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100) .bMaxPower = USBConfigurationDescriptor_POWER(100),
}, },
/* Communication class interface standard descriptor */ /* Communication class interface standard descriptor */
{ {
sizeof(USBInterfaceDescriptor), .bLength = sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE, .bDescriptorType = USBGenericDescriptor_INTERFACE,
0, /* This is interface #0 */ .bInterfaceNumber = 0,
0, /* This is alternate setting #0 for this interface */ .bAlternateSetting = 0,
3, /* Number of endpoints */ .bNumEndpoints = 3,
0xff, /* Descriptor Class: Vendor specific */ .bInterfaceClass = 0xff,
0, /* No subclass */ .bInterfaceSubClass = 0,
0, /* No l */ .bInterfaceProtocol = 0,
SNIFFER_CONF_STR /* Third in string descriptor for this interface */ .iInterface = SNIFFER_CONF_STR,
}, },
/* Bulk-OUT endpoint standard descriptor */ /* Bulk-OUT endpoint standard descriptor */
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT, .bEndpointAddress = USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_OUT,
PHONE_DATAOUT),
.bmAttributes = USBEndpointDescriptor_BULK,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
PHONE_DATAOUT), PHONE_DATAOUT),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_DATAOUT),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0 /* Must be 0 for full-speed bulk endpoints */ .bInterval = 0,
}, },
/* Bulk-IN endpoint descriptor */ /* Bulk-IN endpoint descriptor */
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, .bEndpointAddress = USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_IN,
PHONE_DATAIN),
.bmAttributes = USBEndpointDescriptor_BULK,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
PHONE_DATAIN), PHONE_DATAIN),
USBEndpointDescriptor_BULK,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_DATAIN),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0 /* Must be 0 for full-speed bulk endpoints */ .bInterval = 0,
}, },
// Notification endpoint descriptor // Notification endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, PHONE_INT ), .bEndpointAddress = USBEndpointDescriptor_ADDRESS(
USBEndpointDescriptor_INTERRUPT, USBEndpointDescriptor_IN,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_INT), PHONE_INT),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
PHONE_INT),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
0x10 .bInterval = 0x10,
} }
}; };
#endif /* HAVE_SNIFFER */ #endif /* HAVE_SNIFFER */
#ifdef HAVE_CCID #ifdef HAVE_CCID
/*
/// CCIDDriverConfiguration Descriptors
/// List of descriptors that make up the configuration descriptors of a
/// device using the CCID driver.
typedef struct {
/// Configuration descriptor
USBConfigurationDescriptor configuration;
/// Interface descriptor
USBInterfaceDescriptor interface;
/// CCID descriptor
CCIDDescriptor ccid;
/// Bulk OUT endpoint descriptor
USBEndpointDescriptor bulkOut;
/// Bulk IN endpoint descriptor
USBEndpointDescriptor bulkIn;
/// Interrupt OUT endpoint descriptor
USBEndpointDescriptor interruptIn;
} __attribute__ ((packed)) CCIDDriverConfigurationDescriptors;
*/
static const CCIDDriverConfigurationDescriptors configurationDescriptorCCID = { static const CCIDDriverConfigurationDescriptors configurationDescriptorCCID = {
// Standard USB configuration descriptor // Standard USB configuration descriptor
{ {
sizeof(USBConfigurationDescriptor), .bLength = sizeof(USBConfigurationDescriptor),
USBGenericDescriptor_CONFIGURATION, .bDescriptorType = USBGenericDescriptor_CONFIGURATION,
sizeof(CCIDDriverConfigurationDescriptors), .wTotalLength = sizeof(CCIDDriverConfigurationDescriptors),
1, // One interface in this configuration .bNumInterfaces = 1,
CFG_NUM_CCID, // This is configuration #1 .bConfigurationValue = CFG_NUM_CCID,
CCID_CONF_STR, // associated string descriptor .iConfiguration = CCID_CONF_STR,
BOARD_USB_BMATTRIBUTES, .bmAttributes = BOARD_USB_BMATTRIBUTES,
USBConfigurationDescriptor_POWER(100) .bMaxPower = USBConfigurationDescriptor_POWER(100),
}, },
// CCID interface descriptor // CCID interface descriptor
// Table 4.3-1 Interface Descriptor // Table 4.3-1 Interface Descriptor
// Interface descriptor // Interface descriptor
{ {
sizeof(USBInterfaceDescriptor), .bLength = sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE, .bDescriptorType = USBGenericDescriptor_INTERFACE,
0, // Interface 0 .bInterfaceNumber = 0,
0, // No alternate settings .bAlternateSetting = 0,
3, // uses bulk-IN, bulk-OUT and interrupt IN .bNumEndpoints = 3,
SMART_CARD_DEVICE_CLASS, .bInterfaceClass = SMART_CARD_DEVICE_CLASS,
0, // Subclass code .bInterfaceSubClass = 0,
0, // bulk transfers optional interrupt-IN .bInterfaceProtocol = 0,
CCID_CONF_STR // associated string descriptor .iInterface = CCID_CONF_STR,
}, },
{ {
sizeof(CCIDDescriptor), // bLength: Size of this descriptor in bytes .bLength = sizeof(CCIDDescriptor),
CCID_DECRIPTOR_TYPE, // bDescriptorType:Functional descriptor type .bDescriptorType = CCID_DECRIPTOR_TYPE,
CCID1_10, // bcdCCID: CCID version .bcdCCID = CCID1_10, // CCID version
0, // bMaxSlotIndex: Value 0 indicates that one slot is supported .bMaxSlotIndex = 0, // 1 slot
VOLTS_3_0, // bVoltageSupport .bVoltageSupport = VOLTS_3_0,
(1 << PROTOCOL_TO), // dwProtocols .dwProtocols = (1 << PROTOCOL_TO),
3580, // dwDefaultClock .dwDefaultClock = 3580,
3580, // dwMaxClock .dwMaximumClock = 3580,
0, // bNumClockSupported .bNumClockSupported = 0,
9600, // dwDataRate : 9600 bauds .dwDataRate = 9600,
9600, // dwMaxDataRate : 9600 bauds .dwMaxDataRate = 9600,
0, // bNumDataRatesSupported .bNumDataRatesSupported = 0,
0xfe, // dwMaxIFSD .dwMaxIFSD = 0xfe,
0, // dwSynchProtocols .dwSynchProtocols = 0,
0, // dwMechanical .dwMechanical = 0,
//0x00010042, // dwFeatures: Short APDU level exchanges .dwFeatures = CCID_FEATURES_AUTO_CLOCK | CCID_FEATURES_AUTO_BAUD |
CCID_FEATURES_AUTO_CLOCK | CCID_FEATURES_AUTO_BAUD | CCID_FEATURES_AUTO_PCONF | CCID_FEATURES_AUTO_PNEGO |
CCID_FEATURES_AUTO_PCONF | CCID_FEATURES_AUTO_PNEGO | CCID_FEATURES_EXC_TPDU, CCID_FEATURES_EXC_TPDU,
0x0000010F, // dwMaxCCIDMessageLength: For extended APDU level the value shall be between 261 + 10 .dwMaxCCIDMessageLength = 271, /* For extended APDU
0xFF, // bClassGetResponse: Echoes the class of the APDU level the value shall
0xFF, // bClassEnvelope: Echoes the class of the APDU be between 261 + 10 */
0, // wLcdLayout: no LCD .bClassGetResponse = 0xFF, // Echoes the class of the APDU
0, // bPINSupport: No PIN .bClassEnvelope = 0xFF, // Echoes the class of the APDU
1 // bMaxCCIDBusySlot .wLcdLayout = 0, // wLcdLayout: no LCD
.bPINSupport = 0, // bPINSupport: No PIN
.bMaxCCIDBusySlots = 1,
}, },
// Bulk-OUT endpoint descriptor // Bulk-OUT endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_OUT, CCID_EPT_DATA_OUT ), .bEndpointAddress =
USBEndpointDescriptor_BULK, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_DATA_OUT), CCID_EPT_DATA_OUT),
.bmAttributes = USBEndpointDescriptor_BULK,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
CCID_EPT_DATA_OUT),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0x00 // Does not apply to Bulk endpoints .bInterval = 0x00,
}, },
// Bulk-IN endpoint descriptor // Bulk-IN endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CCID_EPT_DATA_IN ), .bEndpointAddress =
USBEndpointDescriptor_BULK, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_DATA_IN), CCID_EPT_DATA_IN),
.bmAttributes = USBEndpointDescriptor_BULK,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
CCID_EPT_DATA_IN),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0x00 // Does not apply to Bulk endpoints .bInterval = 0x00,
}, },
// Notification endpoint descriptor // Notification endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CCID_EPT_NOTIFICATION ), .bEndpointAddress =
USBEndpointDescriptor_INTERRUPT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_NOTIFICATION), CCID_EPT_NOTIFICATION),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
CCID_EPT_NOTIFICATION),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
0x10 .bInterval = 0x10,
}, },
}; };
#endif /* HAVE_CCID */ #endif /* HAVE_CCID */
#ifdef HAVE_CARDEM #ifdef HAVE_CARDEM
/* SIM card emulator */ /* SIM card emulator */
typedef struct _SIMTraceDriverConfigurationDescriptorPhone { typedef struct _SIMTraceDriverConfigurationDescriptorPhone {
/* Standard configuration descriptor. */
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration; USBConfigurationDescriptor configuration;
USBInterfaceDescriptor phone; USBInterfaceDescriptor phone;
USBEndpointDescriptor phone_dataOut; USBEndpointDescriptor phone_dataOut;
@@ -445,7 +444,8 @@ typedef struct _SIMTraceDriverConfigurationDescriptorPhone {
#endif #endif
} __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorPhone; } __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorPhone;
static const SIMTraceDriverConfigurationDescriptorPhone configurationDescriptorPhone = { static const SIMTraceDriverConfigurationDescriptorPhone
configurationDescriptorPhone = {
/* Standard configuration descriptor */ /* Standard configuration descriptor */
{ {
sizeof(USBConfigurationDescriptor), sizeof(USBConfigurationDescriptor),
@@ -499,7 +499,8 @@ static const SIMTraceDriverConfigurationDescriptorPhone configurationDescriptorP
{ {
sizeof(USBEndpointDescriptor), sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, PHONE_INT ), USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
PHONE_INT),
USBEndpointDescriptor_INTERRUPT, USBEndpointDescriptor_INTERRUPT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_INT), MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_INT),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
@@ -528,7 +529,8 @@ static const SIMTraceDriverConfigurationDescriptorPhone configurationDescriptorP
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_DATAOUT), MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_DATAOUT),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0 /* Must be 0 for full-speed bulk endpoints */ 0 /* Must be 0 for full-speed bulk endpoints */
}, }
,
/* Bulk-IN endpoint descriptor */ /* Bulk-IN endpoint descriptor */
{ {
sizeof(USBEndpointDescriptor), sizeof(USBEndpointDescriptor),
@@ -544,20 +546,20 @@ static const SIMTraceDriverConfigurationDescriptorPhone configurationDescriptorP
{ {
sizeof(USBEndpointDescriptor), sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CARDEM_USIM2_INT ), USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
CARDEM_USIM2_INT),
USBEndpointDescriptor_INTERRUPT, USBEndpointDescriptor_INTERRUPT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_INT), MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CARDEM_USIM2_INT),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
0x10 0x10
} },
#endif #endif
}; };
#endif /* HAVE_CARDEM */ #endif /* HAVE_CARDEM */
#ifdef HAVE_MITM #ifdef HAVE_MITM
typedef struct _SIMTraceDriverConfigurationDescriptorMITM { typedef struct _SIMTraceDriverConfigurationDescriptorMITM {
/* Standard configuration descriptor. */
/** Standard configuration descriptor. */
USBConfigurationDescriptor configuration; USBConfigurationDescriptor configuration;
USBInterfaceDescriptor simcard; USBInterfaceDescriptor simcard;
/// CCID descriptor /// CCID descriptor
@@ -576,7 +578,8 @@ typedef struct _SIMTraceDriverConfigurationDescriptorMITM {
} __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorMITM; } __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptorMITM;
static const SIMTraceDriverConfigurationDescriptorMITM configurationDescriptorMITM = { static const SIMTraceDriverConfigurationDescriptorMITM
configurationDescriptorMITM = {
/* Standard configuration descriptor */ /* Standard configuration descriptor */
{ {
sizeof(USBConfigurationDescriptor), sizeof(USBConfigurationDescriptor),
@@ -592,72 +595,84 @@ static const SIMTraceDriverConfigurationDescriptorMITM configurationDescriptorMI
// Table 4.3-1 Interface Descriptor // Table 4.3-1 Interface Descriptor
// Interface descriptor // Interface descriptor
{ {
sizeof(USBInterfaceDescriptor), .bLength = sizeof(USBInterfaceDescriptor),
USBGenericDescriptor_INTERFACE, .bDescriptorType = USBGenericDescriptor_INTERFACE,
0, // Interface 0 .bInterfaceNumber = 0,
0, // No alternate settings .bAlternateSetting = 0,
3, // uses bulk-IN, bulk-OUT and interrupt IN .bNumEndpoints = 3,
SMART_CARD_DEVICE_CLASS, .bInterfaceClass = SMART_CARD_DEVICE_CLASS,
0, // Subclass code .bInterfaceSubClass = 0,
0, // bulk transfers optional interrupt-IN .bInterfaceProtocol = 0,
CCID_CONF_STR // associated string descriptor .iInterface = CCID_CONF_STR,
}, },
{ {
sizeof(CCIDDescriptor), // bLength: Size of this descriptor in bytes .bLength = sizeof(CCIDDescriptor),
CCID_DECRIPTOR_TYPE, // bDescriptorType:Functional descriptor type .bDescriptorType = CCID_DECRIPTOR_TYPE,
CCID1_10, // bcdCCID: CCID version .bcdCCID = CCID1_10, // CCID version
0, // bMaxSlotIndex: Value 0 indicates that one slot is supported .bMaxSlotIndex = 0, // 1 slot
VOLTS_3_0, // bVoltageSupport .bVoltageSupport = VOLTS_3_0,
(1 << PROTOCOL_TO), // dwProtocols .dwProtocols = (1 << PROTOCOL_TO),
3580, // dwDefaultClock .dwDefaultClock = 3580,
3580, // dwMaxClock .dwMaximumClock = 3580,
0, // bNumClockSupported .bNumClockSupported = 0,
9600, // dwDataRate : 9600 bauds .dwDataRate = 9600,
9600, // dwMaxDataRate : 9600 bauds .dwMaxDataRate = 9600,
0, // bNumDataRatesSupported .bNumDataRatesSupported = 0,
0xfe, // dwMaxIFSD .dwMaxIFSD = 0xfe,
0, // dwSynchProtocols .dwSynchProtocols = 0,
0, // dwMechanical .dwMechanical = 0,
//0x00010042, // dwFeatures: Short APDU level exchanges .dwFeatures = CCID_FEATURES_AUTO_CLOCK | CCID_FEATURES_AUTO_BAUD |
CCID_FEATURES_AUTO_CLOCK | CCID_FEATURES_AUTO_BAUD | CCID_FEATURES_AUTO_PCONF | CCID_FEATURES_AUTO_PNEGO |
CCID_FEATURES_AUTO_PCONF | CCID_FEATURES_AUTO_PNEGO | CCID_FEATURES_EXC_TPDU, CCID_FEATURES_EXC_TPDU,
0x0000010F, // dwMaxCCIDMessageLength: For extended APDU level the value shall be between 261 + 10 .dwMaxCCIDMessageLength = 271, /* For extended APDU
0xFF, // bClassGetResponse: Echoes the class of the APDU level the value shall
0xFF, // bClassEnvelope: Echoes the class of the APDU be between 261 + 10 */
0, // wLcdLayout: no LCD .bClassGetResponse = 0xFF, // Echoes the class of the APDU
0, // bPINSupport: No PIN .bClassEnvelope = 0xFF, // Echoes the class of the APDU
1 // bMaxCCIDBusySlot .wLcdLayout = 0, // wLcdLayout: no LCD
.bPINSupport = 0, // bPINSupport: No PIN
.bMaxCCIDBusySlots = 1,
}, },
// Bulk-OUT endpoint descriptor // Bulk-OUT endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_OUT, CCID_EPT_DATA_OUT ), .bEndpointAddress =
USBEndpointDescriptor_BULK, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_DATA_OUT), CCID_EPT_DATA_OUT),
.bmAttributes = USBEndpointDescriptor_BULK,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
CCID_EPT_DATA_OUT),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0x00 // Does not apply to Bulk endpoints .bInterval = 0x00,
}, },
// Bulk-IN endpoint descriptor // Bulk-IN endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CCID_EPT_DATA_IN ), .bEndpointAddress =
USBEndpointDescriptor_BULK, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_DATA_IN), CCID_EPT_DATA_IN),
.bmAttributes = USBEndpointDescriptor_BULK,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
CCID_EPT_DATA_IN),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0x00 // Does not apply to Bulk endpoints .bInterval = 0x00,
}, },
// Notification endpoint descriptor // Notification endpoint descriptor
{ {
sizeof(USBEndpointDescriptor), .bLength = sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, .bDescriptorType = USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, CCID_EPT_NOTIFICATION ), .bEndpointAddress =
USBEndpointDescriptor_INTERRUPT, USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(CCID_EPT_NOTIFICATION), CCID_EPT_NOTIFICATION),
.bmAttributes = USBEndpointDescriptor_INTERRUPT,
.wMaxPacketSize = MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(
CCID_EPT_NOTIFICATION),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
0x10 .bInterval = 0x10,
}, },
/* Communication class interface standard descriptor */ /* Communication class interface standard descriptor */
{ {
sizeof(USBInterfaceDescriptor), sizeof(USBInterfaceDescriptor),
@@ -669,7 +684,8 @@ static const SIMTraceDriverConfigurationDescriptorMITM configurationDescriptorMI
0, 0,
0, 0,
PHONE_CONF_STR, /* string descriptor for this interface */ PHONE_CONF_STR, /* string descriptor for this interface */
}, }
,
/* Bulk-OUT endpoint standard descriptor */ /* Bulk-OUT endpoint standard descriptor */
{ {
sizeof(USBEndpointDescriptor), sizeof(USBEndpointDescriptor),
@@ -680,7 +696,8 @@ static const SIMTraceDriverConfigurationDescriptorMITM configurationDescriptorMI
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_DATAOUT), MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_DATAOUT),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0 /* Must be 0 for full-speed bulk endpoints */ 0 /* Must be 0 for full-speed bulk endpoints */
}, }
,
/* Bulk-IN endpoint descriptor */ /* Bulk-IN endpoint descriptor */
{ {
sizeof(USBEndpointDescriptor), sizeof(USBEndpointDescriptor),
@@ -691,17 +708,17 @@ static const SIMTraceDriverConfigurationDescriptorMITM configurationDescriptorMI
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_DATAIN), MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_DATAIN),
USBEndpointDescriptor_MAXBULKSIZE_FS), USBEndpointDescriptor_MAXBULKSIZE_FS),
0 /* Must be 0 for full-speed bulk endpoints */ 0 /* Must be 0 for full-speed bulk endpoints */
}, }
,
/* Notification endpoint descriptor */ /* Notification endpoint descriptor */
{ {
sizeof(USBEndpointDescriptor), sizeof(USBEndpointDescriptor),
USBGenericDescriptor_ENDPOINT, USBGenericDescriptor_ENDPOINT,
USBEndpointDescriptor_ADDRESS( USBEndpointDescriptor_IN, PHONE_INT ), USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN, PHONE_INT),
USBEndpointDescriptor_INTERRUPT, USBEndpointDescriptor_INTERRUPT,
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_INT), MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(PHONE_INT),
USBEndpointDescriptor_MAXINTERRUPTSIZE_FS), USBEndpointDescriptor_MAXINTERRUPTSIZE_FS),
0x10 0x10}
}
}; };
#endif /* HAVE_CARDEM */ #endif /* HAVE_CARDEM */
@@ -722,30 +739,26 @@ const USBConfigurationDescriptor *configurationDescriptorsArr[] = {
/** Standard USB device descriptor for the CDC serial driver */ /** Standard USB device descriptor for the CDC serial driver */
const USBDeviceDescriptor deviceDescriptor = { const USBDeviceDescriptor deviceDescriptor = {
.bLength = sizeof(USBDeviceDescriptor),
sizeof(USBDeviceDescriptor), .bDescriptorType = USBGenericDescriptor_DEVICE,
USBGenericDescriptor_DEVICE, .bcdUSB = USBDeviceDescriptor_USB2_00,
USBDeviceDescriptor_USB2_00, .bDeviceClass = 0xff,
0xff, .bDeviceSubClass = 0xff,
// CDCDeviceDescriptor_CLASS, .bDeviceProtocol = 0xff,
0xff, .bMaxPacketSize0 = BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0),
// CDCDeviceDescriptor_SUBCLASS, .idVendor = SIMTRACE_VENDOR_ID,
0xff, .idProduct = SIMTRACE_PRODUCT_ID,
// CDCDeviceDescriptor_PROTOCOL, .bcdDevice = 2, /* Release number */
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0), .iManufacturer = MANUF_STR,
SIMTRACE_VENDOR_ID, .iProduct = PRODUCT_STRING,
SIMTRACE_PRODUCT_ID, .iSerialNumber = 0,
1, /* Release number */ .bNumConfigurations = ARRAY_SIZE(configurationDescriptorsArr),
MANUF_STR, /* Indesx of manufacturer string descriptor */
PRODUCT_STRING, /* Index of product string descriptor */
0, /* No string descriptor for serial number */
ARRAY_SIZE(configurationDescriptorsArr) /* Device has N possible configs */
}; };
/* AT91SAM3S only supports full speed, but not high speed USB */ /* AT91SAM3S only supports full speed, but not high speed USB */
static const USBDDriverDescriptors driverDescriptors = { static const USBDDriverDescriptors driverDescriptors = {
&deviceDescriptor, &deviceDescriptor,
(const USBConfigurationDescriptor **) &(configurationDescriptorsArr), /* first full-speed configuration descriptor */ (const USBConfigurationDescriptor **)&(configurationDescriptorsArr), /* first full-speed configuration descriptor */
0, /* No full-speed device qualifier descriptor */ 0, /* No full-speed device qualifier descriptor */
0, /* No full-speed other speed configuration */ 0, /* No full-speed other speed configuration */
0, /* No high-speed device descriptor */ 0, /* No high-speed device descriptor */
@@ -756,7 +769,6 @@ static const USBDDriverDescriptors driverDescriptors = {
STRING_DESC_CNT /* cnt string descriptors in list */ STRING_DESC_CNT /* cnt string descriptors in list */
}; };
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
* Functions * Functions
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
@@ -768,16 +780,16 @@ static void _ConfigureUsbClock(void)
{ {
/* Enable PLLB for USB */ /* Enable PLLB for USB */
PMC->CKGR_PLLBR = CKGR_PLLBR_DIVB(5) PMC->CKGR_PLLBR = CKGR_PLLBR_DIVB(5)
| CKGR_PLLBR_MULB(0xc) /* MULT+1=0xd*/ | CKGR_PLLBR_MULB(0xc) /* MULT+1=0xd */
| CKGR_PLLBR_PLLBCOUNT_Msk; | CKGR_PLLBR_PLLBCOUNT_Msk;
while((PMC->PMC_SR & PMC_SR_LOCKB) == 0); while ((PMC->PMC_SR & PMC_SR_LOCKB) == 0) ;
/* USB Clock uses PLLB */ /* USB Clock uses PLLB */
PMC->PMC_USB = PMC_USB_USBDIV(0) /* /1 (no divider) */ PMC->PMC_USB = PMC_USB_USBDIV(0) /* /1 (no divider) */
| PMC_USB_USBS; /* PLLB */ | PMC_USB_USBS; /* PLLB */
} }
void SIMtrace_USB_Initialize(void)
void SIMtrace_USB_Initialize( void )
{ {
_ConfigureUsbClock(); _ConfigureUsbClock();
// Get std USB driver // Get std USB driver
@@ -786,11 +798,9 @@ void SIMtrace_USB_Initialize( void )
TRACE_DEBUG("."); TRACE_DEBUG(".");
// Initialize standard USB driver // Initialize standard USB driver
USBDDriver_Initialize(pUsbd, USBDDriver_Initialize(pUsbd, &driverDescriptors, 0); // Multiple interface settings not supported
&driverDescriptors,
0); // Multiple interface settings not supported
USBD_Init(); USBD_Init();
USBD_Connect(); USBD_Connect();
NVIC_EnableIRQ( UDP_IRQn ); NVIC_EnableIRQ(UDP_IRQn);
} }