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