mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-16 21:28:33 +03:00
replace leading spaces with tabs
Change-Id: I86783eba0827b58303b10310e9f6b9625e1a27f1
This commit is contained in:
@@ -152,7 +152,7 @@ extern int main(void)
|
||||
|
||||
EEFC_ReadUniqueID(g_unique_id);
|
||||
|
||||
printf("\n\r\n\r"
|
||||
printf("\n\r\n\r"
|
||||
"=============================================================================\n\r"
|
||||
"SIMtrace2 firmware " GIT_VERSION " (C) 2010-2016 by Harald Welte\n\r"
|
||||
"=============================================================================\n\r");
|
||||
|
||||
@@ -155,7 +155,7 @@ extern int main(void)
|
||||
|
||||
EEFC_ReadUniqueID(g_unique_id);
|
||||
|
||||
printf("\n\r\n\r"
|
||||
printf("\n\r\n\r"
|
||||
"=============================================================================\n\r"
|
||||
"SIMtrace2 firmware " GIT_VERSION " (C) 2010-2016 by Harald Welte\n\r"
|
||||
"=============================================================================\n\r");
|
||||
|
||||
@@ -151,7 +151,7 @@ extern int main(void)
|
||||
|
||||
EEFC_ReadUniqueID(g_unique_id);
|
||||
|
||||
printf("\r\n\r\n"
|
||||
printf("\r\n\r\n"
|
||||
"=============================================================================\r\n"
|
||||
"SIMtrace2 firmware " GIT_REVISION " (C) 2010-2017 by Harald Welte\r\n"
|
||||
"=============================================================================\r\n");
|
||||
|
||||
@@ -71,59 +71,59 @@ void ResetException( void ) ;
|
||||
__attribute__((section(".vectors")))
|
||||
IntFunc exception_table[] = {
|
||||
|
||||
/* Configure Initial Stack Pointer, using linker-generated symbols */
|
||||
(IntFunc)(&pdwStack[STACK_SIZE-1]),
|
||||
ResetException,
|
||||
/* Configure Initial Stack Pointer, using linker-generated symbols */
|
||||
(IntFunc)(&pdwStack[STACK_SIZE-1]),
|
||||
ResetException,
|
||||
|
||||
NMI_Handler,
|
||||
HardFault_Handler,
|
||||
MemManage_Handler,
|
||||
BusFault_Handler,
|
||||
UsageFault_Handler,
|
||||
0, 0, 0, 0, /* Reserved */
|
||||
SVC_Handler,
|
||||
DebugMon_Handler,
|
||||
0, /* Reserved */
|
||||
PendSV_Handler,
|
||||
SysTick_Handler,
|
||||
NMI_Handler,
|
||||
HardFault_Handler,
|
||||
MemManage_Handler,
|
||||
BusFault_Handler,
|
||||
UsageFault_Handler,
|
||||
0, 0, 0, 0, /* Reserved */
|
||||
SVC_Handler,
|
||||
DebugMon_Handler,
|
||||
0, /* Reserved */
|
||||
PendSV_Handler,
|
||||
SysTick_Handler,
|
||||
|
||||
/* Configurable interrupts */
|
||||
SUPC_IrqHandler, /* 0 Supply Controller */
|
||||
RSTC_IrqHandler, /* 1 Reset Controller */
|
||||
RTC_IrqHandler, /* 2 Real Time Clock */
|
||||
RTT_IrqHandler, /* 3 Real Time Timer */
|
||||
WDT_IrqHandler, /* 4 Watchdog Timer */
|
||||
PMC_IrqHandler, /* 5 PMC */
|
||||
EEFC_IrqHandler, /* 6 EEFC */
|
||||
IrqHandlerNotUsed, /* 7 Reserved */
|
||||
UART0_IrqHandler, /* 8 UART0 */
|
||||
UART1_IrqHandler, /* 9 UART1 */
|
||||
SMC_IrqHandler, /* 10 SMC */
|
||||
PIOA_IrqHandler, /* 11 Parallel IO Controller A */
|
||||
PIOB_IrqHandler, /* 12 Parallel IO Controller B */
|
||||
PIOC_IrqHandler, /* 13 Parallel IO Controller C */
|
||||
USART0_IrqHandler, /* 14 USART 0 */
|
||||
USART1_IrqHandler, /* 15 USART 1 */
|
||||
IrqHandlerNotUsed, /* 16 Reserved */
|
||||
IrqHandlerNotUsed, /* 17 Reserved */
|
||||
MCI_IrqHandler, /* 18 MCI */
|
||||
TWI0_IrqHandler, /* 19 TWI 0 */
|
||||
TWI1_IrqHandler, /* 20 TWI 1 */
|
||||
SPI_IrqHandler, /* 21 SPI */
|
||||
SSC_IrqHandler, /* 22 SSC */
|
||||
TC0_IrqHandler, /* 23 Timer Counter 0 */
|
||||
TC1_IrqHandler, /* 24 Timer Counter 1 */
|
||||
TC2_IrqHandler, /* 25 Timer Counter 2 */
|
||||
TC3_IrqHandler, /* 26 Timer Counter 3 */
|
||||
TC4_IrqHandler, /* 27 Timer Counter 4 */
|
||||
TC5_IrqHandler, /* 28 Timer Counter 5 */
|
||||
ADC_IrqHandler, /* 29 ADC controller */
|
||||
DAC_IrqHandler, /* 30 DAC controller */
|
||||
PWM_IrqHandler, /* 31 PWM */
|
||||
CRCCU_IrqHandler, /* 32 CRC Calculation Unit */
|
||||
ACC_IrqHandler, /* 33 Analog Comparator */
|
||||
USBD_IrqHandler, /* 34 USB Device Port */
|
||||
IrqHandlerNotUsed /* 35 not used */
|
||||
/* Configurable interrupts */
|
||||
SUPC_IrqHandler, /* 0 Supply Controller */
|
||||
RSTC_IrqHandler, /* 1 Reset Controller */
|
||||
RTC_IrqHandler, /* 2 Real Time Clock */
|
||||
RTT_IrqHandler, /* 3 Real Time Timer */
|
||||
WDT_IrqHandler, /* 4 Watchdog Timer */
|
||||
PMC_IrqHandler, /* 5 PMC */
|
||||
EEFC_IrqHandler, /* 6 EEFC */
|
||||
IrqHandlerNotUsed, /* 7 Reserved */
|
||||
UART0_IrqHandler, /* 8 UART0 */
|
||||
UART1_IrqHandler, /* 9 UART1 */
|
||||
SMC_IrqHandler, /* 10 SMC */
|
||||
PIOA_IrqHandler, /* 11 Parallel IO Controller A */
|
||||
PIOB_IrqHandler, /* 12 Parallel IO Controller B */
|
||||
PIOC_IrqHandler, /* 13 Parallel IO Controller C */
|
||||
USART0_IrqHandler, /* 14 USART 0 */
|
||||
USART1_IrqHandler, /* 15 USART 1 */
|
||||
IrqHandlerNotUsed, /* 16 Reserved */
|
||||
IrqHandlerNotUsed, /* 17 Reserved */
|
||||
MCI_IrqHandler, /* 18 MCI */
|
||||
TWI0_IrqHandler, /* 19 TWI 0 */
|
||||
TWI1_IrqHandler, /* 20 TWI 1 */
|
||||
SPI_IrqHandler, /* 21 SPI */
|
||||
SSC_IrqHandler, /* 22 SSC */
|
||||
TC0_IrqHandler, /* 23 Timer Counter 0 */
|
||||
TC1_IrqHandler, /* 24 Timer Counter 1 */
|
||||
TC2_IrqHandler, /* 25 Timer Counter 2 */
|
||||
TC3_IrqHandler, /* 26 Timer Counter 3 */
|
||||
TC4_IrqHandler, /* 27 Timer Counter 4 */
|
||||
TC5_IrqHandler, /* 28 Timer Counter 5 */
|
||||
ADC_IrqHandler, /* 29 ADC controller */
|
||||
DAC_IrqHandler, /* 30 DAC controller */
|
||||
PWM_IrqHandler, /* 31 PWM */
|
||||
CRCCU_IrqHandler, /* 32 CRC Calculation Unit */
|
||||
ACC_IrqHandler, /* 33 Analog Comparator */
|
||||
USBD_IrqHandler, /* 34 USB Device Port */
|
||||
IrqHandlerNotUsed /* 35 not used */
|
||||
};
|
||||
|
||||
#if defined(BOARD_USB_DFU) && defined(APPLICATION_dfu)
|
||||
@@ -153,56 +153,56 @@ static void BootIntoApp(void)
|
||||
*/
|
||||
void ResetException( void )
|
||||
{
|
||||
uint32_t *pSrc, *pDest ;
|
||||
uint32_t *pSrc, *pDest ;
|
||||
|
||||
/* Low level Initialize */
|
||||
LowLevelInit() ;
|
||||
/* Low level Initialize */
|
||||
LowLevelInit() ;
|
||||
|
||||
|
||||
#if defined(BOARD_USB_DFU) && defined(APPLICATION_dfu)
|
||||
if (!USBDFU_OverrideEnterDFU()) {
|
||||
UART_Exit();
|
||||
__disable_irq();
|
||||
BootIntoApp();
|
||||
/* Infinite loop */
|
||||
while ( 1 ) ;
|
||||
}
|
||||
if (!USBDFU_OverrideEnterDFU()) {
|
||||
UART_Exit();
|
||||
__disable_irq();
|
||||
BootIntoApp();
|
||||
/* Infinite loop */
|
||||
while ( 1 ) ;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Initialize the relocate segment */
|
||||
pSrc = &_etext ;
|
||||
pDest = &_srelocate ;
|
||||
/* Initialize the relocate segment */
|
||||
pSrc = &_etext ;
|
||||
pDest = &_srelocate ;
|
||||
|
||||
if ( pSrc != pDest )
|
||||
{
|
||||
for ( ; pDest < &_erelocate ; )
|
||||
{
|
||||
*pDest++ = *pSrc++ ;
|
||||
}
|
||||
}
|
||||
if ( pSrc != pDest )
|
||||
{
|
||||
for ( ; pDest < &_erelocate ; )
|
||||
{
|
||||
*pDest++ = *pSrc++ ;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear the zero segment */
|
||||
for ( pDest = &_szero ; pDest < &_ezero ; )
|
||||
{
|
||||
*pDest++ = 0;
|
||||
}
|
||||
/* Clear the zero segment */
|
||||
for ( pDest = &_szero ; pDest < &_ezero ; )
|
||||
{
|
||||
*pDest++ = 0;
|
||||
}
|
||||
|
||||
/* Set the vector table base address */
|
||||
pSrc = (uint32_t *)&_sfixed;
|
||||
SCB->VTOR = ( (uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk ) ;
|
||||
|
||||
if ( ((uint32_t)pSrc >= IRAM_ADDR) && ((uint32_t)pSrc < IRAM_ADDR+IRAM_SIZE) )
|
||||
{
|
||||
/* Set the vector table base address */
|
||||
pSrc = (uint32_t *)&_sfixed;
|
||||
SCB->VTOR = ( (uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk ) ;
|
||||
|
||||
if ( ((uint32_t)pSrc >= IRAM_ADDR) && ((uint32_t)pSrc < IRAM_ADDR+IRAM_SIZE) )
|
||||
{
|
||||
SCB->VTOR |= 1 << SCB_VTOR_TBLBASE_Pos ;
|
||||
}
|
||||
}
|
||||
|
||||
/* App should have disabled interrupts during the transition */
|
||||
__enable_irq();
|
||||
/* App should have disabled interrupts during the transition */
|
||||
__enable_irq();
|
||||
|
||||
/* Branch to main function */
|
||||
main() ;
|
||||
/* Branch to main function */
|
||||
main() ;
|
||||
|
||||
/* Infinite loop */
|
||||
while ( 1 ) ;
|
||||
/* Infinite loop */
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
|
||||
@@ -50,15 +50,15 @@
|
||||
#if (BOARD_MAINOSC == 18432000)
|
||||
/* Clock settings at 48MHz for 18 MHz crystal */
|
||||
#define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \
|
||||
| CKGR_PLLAR_MULA(13-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(5))
|
||||
| CKGR_PLLAR_MULA(13-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(5))
|
||||
#elif (BOARD_MAINOSC == 12000000)
|
||||
/* QMod has 12 MHz clock, so multply by 8 (96 MHz) and divide by 2 */
|
||||
#define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \
|
||||
| CKGR_PLLAR_MULA(8-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(2))
|
||||
| CKGR_PLLAR_MULA(8-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(2))
|
||||
#else
|
||||
#error "Please define PLLA config for your MAINOSC frequency"
|
||||
#endif /* MAINOSC */
|
||||
@@ -66,19 +66,19 @@
|
||||
#if (BOARD_MAINOSC == 18432000)
|
||||
/* Clock settings at 64MHz for 18 MHz crystal: 64.512 MHz */
|
||||
#define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \
|
||||
| CKGR_PLLAR_MULA(7-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(2))
|
||||
| CKGR_PLLAR_MULA(7-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(2))
|
||||
#elif (BOARD_MAINOSC == 12000000)
|
||||
/* QMod has 12 MHz clock, so multply by 10 / div by 2: 60 MHz */
|
||||
#define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \
|
||||
| CKGR_PLLAR_MULA(10-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(2))
|
||||
| CKGR_PLLAR_MULA(10-1) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(2))
|
||||
#error "Please define PLLA config for your MAINOSC frequency"
|
||||
#endif /* MAINOSC */
|
||||
#else
|
||||
#error "No PLL settings for current BOARD_MCK."
|
||||
#error "No PLL settings for current BOARD_MCK."
|
||||
#endif
|
||||
|
||||
#if (BOARD_MAINOSC == 12000000)
|
||||
@@ -117,85 +117,85 @@ static void _ConfigureUsbClock(void)
|
||||
*/
|
||||
extern WEAK void LowLevelInit( void )
|
||||
{
|
||||
uint32_t timeout = 0;
|
||||
uint32_t timeout = 0;
|
||||
|
||||
/* Configure the Supply Monitor to reset the CPU in case VDDIO is
|
||||
* lower than 3.0V. As we run the board on 3.3V, any lower voltage
|
||||
* might be some kind of leakage that creeps in some way, but is not
|
||||
* the "official" power supply */
|
||||
SUPC->SUPC_SMMR = SUPC_SMMR_SMTH_3_0V | SUPC_SMMR_SMSMPL_CSM |
|
||||
/* Configure the Supply Monitor to reset the CPU in case VDDIO is
|
||||
* lower than 3.0V. As we run the board on 3.3V, any lower voltage
|
||||
* might be some kind of leakage that creeps in some way, but is not
|
||||
* the "official" power supply */
|
||||
SUPC->SUPC_SMMR = SUPC_SMMR_SMTH_3_0V | SUPC_SMMR_SMSMPL_CSM |
|
||||
SUPC_SMMR_SMRSTEN_ENABLE;
|
||||
|
||||
/* enable both LED and green LED */
|
||||
PIOA->PIO_PER |= PIO_LED_RED | PIO_LED_GREEN;
|
||||
PIOA->PIO_OER |= PIO_LED_RED | PIO_LED_GREEN;
|
||||
PIOA->PIO_CODR |= PIO_LED_RED | PIO_LED_GREEN;
|
||||
/* enable both LED and green LED */
|
||||
PIOA->PIO_PER |= PIO_LED_RED | PIO_LED_GREEN;
|
||||
PIOA->PIO_OER |= PIO_LED_RED | PIO_LED_GREEN;
|
||||
PIOA->PIO_CODR |= PIO_LED_RED | PIO_LED_GREEN;
|
||||
|
||||
/* Set 3 FWS for Embedded Flash Access */
|
||||
EFC->EEFC_FMR = EEFC_FMR_FWS(3);
|
||||
/* Set 3 FWS for Embedded Flash Access */
|
||||
EFC->EEFC_FMR = EEFC_FMR_FWS(3);
|
||||
|
||||
/* Select external slow clock */
|
||||
/* Select external slow clock */
|
||||
/* if ((SUPC->SUPC_SR & SUPC_SR_OSCSEL) != SUPC_SR_OSCSEL_CRYST)
|
||||
{
|
||||
SUPC->SUPC_CR = (uint32_t)(SUPC_CR_XTALSEL_CRYSTAL_SEL | SUPC_CR_KEY(0xA5));
|
||||
timeout = 0;
|
||||
while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL_CRYST) );
|
||||
}
|
||||
{
|
||||
SUPC->SUPC_CR = (uint32_t)(SUPC_CR_XTALSEL_CRYSTAL_SEL | SUPC_CR_KEY(0xA5));
|
||||
timeout = 0;
|
||||
while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL_CRYST) );
|
||||
}
|
||||
*/
|
||||
|
||||
#ifndef qmod
|
||||
/* Initialize main oscillator */
|
||||
if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )
|
||||
{
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));
|
||||
}
|
||||
/* Initialize main oscillator */
|
||||
if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )
|
||||
{
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));
|
||||
}
|
||||
|
||||
/* Switch to 3-20MHz Xtal oscillator */
|
||||
PIOB->PIO_PDR = (1 << 8) | (1 << 9);
|
||||
PIOB->PIO_PUDR = (1 << 8) | (1 << 9);
|
||||
PIOB->PIO_PPDDR = (1 << 8) | (1 << 9);
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;
|
||||
/* wait for Main XTAL oscillator stabilization */
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));
|
||||
/* Switch to 3-20MHz Xtal oscillator */
|
||||
PIOB->PIO_PDR = (1 << 8) | (1 << 9);
|
||||
PIOB->PIO_PUDR = (1 << 8) | (1 << 9);
|
||||
PIOB->PIO_PPDDR = (1 << 8) | (1 << 9);
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;
|
||||
/* wait for Main XTAL oscillator stabilization */
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));
|
||||
#else
|
||||
/* QMOD has external 12MHz clock source */
|
||||
PIOB->PIO_PDR = (1 << 9);
|
||||
PIOB->PIO_PUDR = (1 << 9);
|
||||
PIOB->PIO_PPDDR = (1 << 9);
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY| CKGR_MOR_MOSCSEL;
|
||||
/* QMOD has external 12MHz clock source */
|
||||
PIOB->PIO_PDR = (1 << 9);
|
||||
PIOB->PIO_PUDR = (1 << 9);
|
||||
PIOB->PIO_PPDDR = (1 << 9);
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY| CKGR_MOR_MOSCSEL;
|
||||
#endif
|
||||
|
||||
/* disable the red LED after main clock initialization */
|
||||
PIOA->PIO_SODR = PIO_LED_RED;
|
||||
/* disable the red LED after main clock initialization */
|
||||
PIOA->PIO_SODR = PIO_LED_RED;
|
||||
|
||||
/* "switch" to main clock as master clock source (should already be the case */
|
||||
PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
|
||||
/* wait for master clock to be ready */
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
/* "switch" to main clock as master clock source (should already be the case */
|
||||
PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
|
||||
/* wait for master clock to be ready */
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
|
||||
/* Initialize PLLA */
|
||||
PMC->CKGR_PLLAR = BOARD_PLLAR;
|
||||
/* Wait for PLLA to lock */
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (timeout++ < CLOCK_TIMEOUT));
|
||||
/* Initialize PLLA */
|
||||
PMC->CKGR_PLLAR = BOARD_PLLAR;
|
||||
/* Wait for PLLA to lock */
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (timeout++ < CLOCK_TIMEOUT));
|
||||
|
||||
/* Switch to main clock (again ?!?) */
|
||||
PMC->PMC_MCKR = (BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
|
||||
/* wait for master clock to be ready */
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
/* Switch to main clock (again ?!?) */
|
||||
PMC->PMC_MCKR = (BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
|
||||
/* wait for master clock to be ready */
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
|
||||
/* switch to PLLA as master clock source */
|
||||
PMC->PMC_MCKR = BOARD_MCKR ;
|
||||
/* wait for master clock to be ready */
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
/* switch to PLLA as master clock source */
|
||||
PMC->PMC_MCKR = BOARD_MCKR ;
|
||||
/* wait for master clock to be ready */
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
|
||||
/* Configure SysTick for 1ms */
|
||||
SysTick_Config(BOARD_MCK/1000);
|
||||
/* Configure SysTick for 1ms */
|
||||
SysTick_Config(BOARD_MCK/1000);
|
||||
|
||||
_ConfigureUsbClock();
|
||||
_ConfigureUsbClock();
|
||||
}
|
||||
|
||||
/* SysTick based delay function */
|
||||
|
||||
@@ -35,9 +35,9 @@ static void led_set(enum led led, int on)
|
||||
ASSERT(led < PIO_LISTSIZE(pinsLeds));
|
||||
|
||||
if (on)
|
||||
PIO_Clear(&pinsLeds[led]);
|
||||
PIO_Clear(&pinsLeds[led]);
|
||||
else
|
||||
PIO_Set(&pinsLeds[led]);
|
||||
PIO_Set(&pinsLeds[led]);
|
||||
}
|
||||
|
||||
/* LED blinking code */
|
||||
|
||||
@@ -66,41 +66,41 @@ static ringbuf uart_tx_buffer;
|
||||
*/
|
||||
extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)
|
||||
{
|
||||
const Pin pPins[] = CONSOLE_PINS;
|
||||
Uart *pUart = CONSOLE_UART;
|
||||
const Pin pPins[] = CONSOLE_PINS;
|
||||
Uart *pUart = CONSOLE_UART;
|
||||
|
||||
/* Configure PIO */
|
||||
PIO_Configure(pPins, PIO_LISTSIZE(pPins));
|
||||
/* Configure PIO */
|
||||
PIO_Configure(pPins, PIO_LISTSIZE(pPins));
|
||||
|
||||
/* Configure PMC */
|
||||
PMC->PMC_PCER0 = 1 << CONSOLE_ID;
|
||||
/* Configure PMC */
|
||||
PMC->PMC_PCER0 = 1 << CONSOLE_ID;
|
||||
|
||||
/* Reset and disable receiver & transmitter */
|
||||
pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX
|
||||
| UART_CR_RXDIS | UART_CR_TXDIS;
|
||||
/* Reset and disable receiver & transmitter */
|
||||
pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX
|
||||
| UART_CR_RXDIS | UART_CR_TXDIS;
|
||||
|
||||
/* Configure mode */
|
||||
pUart->UART_MR = UART_MR_PAR_NO;
|
||||
/* Configure mode */
|
||||
pUart->UART_MR = UART_MR_PAR_NO;
|
||||
|
||||
/* Configure baudrate */
|
||||
/* Asynchronous, no oversampling */
|
||||
pUart->UART_BRGR = (masterClock / baudrate) / 16;
|
||||
/* Configure baudrate */
|
||||
/* Asynchronous, no oversampling */
|
||||
pUart->UART_BRGR = (masterClock / baudrate) / 16;
|
||||
|
||||
/* Disable PDC channel */
|
||||
pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
||||
/* Disable PDC channel */
|
||||
pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;
|
||||
|
||||
/* Reset transmit ring buffer */
|
||||
rbuf_reset(&uart_tx_buffer);
|
||||
/* Reset transmit ring buffer */
|
||||
rbuf_reset(&uart_tx_buffer);
|
||||
|
||||
/* Enable TX interrupts */
|
||||
pUart->UART_IER = UART_IER_TXRDY;
|
||||
NVIC_EnableIRQ(CONSOLE_IRQ);
|
||||
|
||||
/* Enable receiver and transmitter */
|
||||
pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
||||
/* Enable TX interrupts */
|
||||
pUart->UART_IER = UART_IER_TXRDY;
|
||||
NVIC_EnableIRQ(CONSOLE_IRQ);
|
||||
|
||||
/* Enable receiver and transmitter */
|
||||
pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;
|
||||
|
||||
/* Remember the configuration is complete */
|
||||
_ucIsConsoleInitialized=1 ;
|
||||
/* Remember the configuration is complete */
|
||||
_ucIsConsoleInitialized=1 ;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -140,22 +140,22 @@ void CONSOLE_ISR(void)
|
||||
*/
|
||||
extern void UART_PutChar( uint8_t c )
|
||||
{
|
||||
Uart *pUart = CONSOLE_UART ;
|
||||
Uart *pUart = CONSOLE_UART ;
|
||||
|
||||
/* Initialize console is not already done */
|
||||
if ( !_ucIsConsoleInitialized )
|
||||
{
|
||||
UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
|
||||
}
|
||||
/* Initialize console is not already done */
|
||||
if ( !_ucIsConsoleInitialized )
|
||||
{
|
||||
UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
|
||||
}
|
||||
|
||||
/* Only store input if buffer is not full, else drop it */
|
||||
if (!rbuf_is_full(&uart_tx_buffer)) {
|
||||
rbuf_write(&uart_tx_buffer, c);
|
||||
if (!(pUart->UART_IMR & UART_IMR_TXRDY)) {
|
||||
pUart->UART_IER = UART_IER_TXRDY;
|
||||
CONSOLE_ISR();
|
||||
}
|
||||
}
|
||||
/* Only store input if buffer is not full, else drop it */
|
||||
if (!rbuf_is_full(&uart_tx_buffer)) {
|
||||
rbuf_write(&uart_tx_buffer, c);
|
||||
if (!(pUart->UART_IMR & UART_IMR_TXRDY)) {
|
||||
pUart->UART_IER = UART_IER_TXRDY;
|
||||
CONSOLE_ISR();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -166,17 +166,17 @@ extern void UART_PutChar( uint8_t c )
|
||||
*/
|
||||
extern uint32_t UART_GetChar( void )
|
||||
{
|
||||
Uart *pUart = CONSOLE_UART ;
|
||||
Uart *pUart = CONSOLE_UART ;
|
||||
|
||||
if ( !_ucIsConsoleInitialized )
|
||||
{
|
||||
UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
|
||||
}
|
||||
if ( !_ucIsConsoleInitialized )
|
||||
{
|
||||
UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
|
||||
}
|
||||
|
||||
while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 )
|
||||
WDT_Restart(WDT);
|
||||
while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 )
|
||||
WDT_Restart(WDT);
|
||||
|
||||
return pUart->UART_RHR ;
|
||||
return pUart->UART_RHR ;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -186,14 +186,14 @@ extern uint32_t UART_GetChar( void )
|
||||
*/
|
||||
extern uint32_t UART_IsRxReady( void )
|
||||
{
|
||||
Uart *pUart = CONSOLE_UART;
|
||||
Uart *pUart = CONSOLE_UART;
|
||||
|
||||
if ( !_ucIsConsoleInitialized )
|
||||
{
|
||||
UART_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;
|
||||
}
|
||||
if ( !_ucIsConsoleInitialized )
|
||||
{
|
||||
UART_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;
|
||||
}
|
||||
|
||||
return (pUart->UART_SR & UART_SR_RXRDY) > 0 ;
|
||||
return (pUart->UART_SR & UART_SR_RXRDY) > 0 ;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -204,14 +204,14 @@ extern uint32_t UART_IsRxReady( void )
|
||||
*/
|
||||
extern void UART_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )
|
||||
{
|
||||
uint32_t dw ;
|
||||
uint32_t dw ;
|
||||
|
||||
for ( dw=0 ; dw < dwSize ; dw++ )
|
||||
{
|
||||
printf( "%02X ", pucFrame[dw] ) ;
|
||||
}
|
||||
for ( dw=0 ; dw < dwSize ; dw++ )
|
||||
{
|
||||
printf( "%02X ", pucFrame[dw] ) ;
|
||||
}
|
||||
|
||||
printf( "\n\r" ) ;
|
||||
printf( "\n\r" ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -223,62 +223,62 @@ extern void UART_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )
|
||||
*/
|
||||
extern void UART_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress )
|
||||
{
|
||||
uint32_t i ;
|
||||
uint32_t j ;
|
||||
uint32_t dwLastLineStart ;
|
||||
uint8_t* pucTmp ;
|
||||
uint32_t i ;
|
||||
uint32_t j ;
|
||||
uint32_t dwLastLineStart ;
|
||||
uint8_t* pucTmp ;
|
||||
|
||||
for ( i=0 ; i < (dwSize / 16) ; i++ )
|
||||
{
|
||||
printf( "0x%08X: ", (unsigned int)(dwAddress + (i*16)) ) ;
|
||||
pucTmp = (uint8_t*)&pucBuffer[i*16] ;
|
||||
for ( i=0 ; i < (dwSize / 16) ; i++ )
|
||||
{
|
||||
printf( "0x%08X: ", (unsigned int)(dwAddress + (i*16)) ) ;
|
||||
pucTmp = (uint8_t*)&pucBuffer[i*16] ;
|
||||
|
||||
for ( j=0 ; j < 4 ; j++ )
|
||||
{
|
||||
printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;
|
||||
pucTmp += 4 ;
|
||||
}
|
||||
for ( j=0 ; j < 4 ; j++ )
|
||||
{
|
||||
printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;
|
||||
pucTmp += 4 ;
|
||||
}
|
||||
|
||||
pucTmp=(uint8_t*)&pucBuffer[i*16] ;
|
||||
pucTmp=(uint8_t*)&pucBuffer[i*16] ;
|
||||
|
||||
for ( j=0 ; j < 16 ; j++ )
|
||||
{
|
||||
UART_PutChar( *pucTmp++ ) ;
|
||||
}
|
||||
for ( j=0 ; j < 16 ; j++ )
|
||||
{
|
||||
UART_PutChar( *pucTmp++ ) ;
|
||||
}
|
||||
|
||||
printf( "\n\r" ) ;
|
||||
}
|
||||
printf( "\n\r" ) ;
|
||||
}
|
||||
|
||||
if ( (dwSize%16) != 0 )
|
||||
{
|
||||
dwLastLineStart=dwSize - (dwSize%16) ;
|
||||
if ( (dwSize%16) != 0 )
|
||||
{
|
||||
dwLastLineStart=dwSize - (dwSize%16) ;
|
||||
|
||||
printf( "0x%08X: ", (unsigned int)(dwAddress + dwLastLineStart) ) ;
|
||||
for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )
|
||||
{
|
||||
if ( (j!=dwLastLineStart) && (j%4 == 0) )
|
||||
{
|
||||
printf( " " ) ;
|
||||
}
|
||||
printf( "0x%08X: ", (unsigned int)(dwAddress + dwLastLineStart) ) ;
|
||||
for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )
|
||||
{
|
||||
if ( (j!=dwLastLineStart) && (j%4 == 0) )
|
||||
{
|
||||
printf( " " ) ;
|
||||
}
|
||||
|
||||
if ( j < dwSize )
|
||||
{
|
||||
printf( "%02X", pucBuffer[j] ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(" ") ;
|
||||
}
|
||||
}
|
||||
if ( j < dwSize )
|
||||
{
|
||||
printf( "%02X", pucBuffer[j] ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(" ") ;
|
||||
}
|
||||
}
|
||||
|
||||
printf( " " ) ;
|
||||
for ( j=dwLastLineStart ; j < dwSize ; j++ )
|
||||
{
|
||||
UART_PutChar( pucBuffer[j] ) ;
|
||||
}
|
||||
printf( " " ) ;
|
||||
for ( j=dwLastLineStart ; j < dwSize ; j++ )
|
||||
{
|
||||
UART_PutChar( pucBuffer[j] ) ;
|
||||
}
|
||||
|
||||
printf( "\n\r" ) ;
|
||||
}
|
||||
printf( "\n\r" ) ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -288,46 +288,46 @@ extern void UART_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAdd
|
||||
*/
|
||||
extern uint32_t UART_GetInteger( uint32_t* pdwValue )
|
||||
{
|
||||
uint8_t ucKey ;
|
||||
uint8_t ucNbNb=0 ;
|
||||
uint32_t dwValue=0 ;
|
||||
uint8_t ucKey ;
|
||||
uint8_t ucNbNb=0 ;
|
||||
uint32_t dwValue=0 ;
|
||||
|
||||
while ( 1 )
|
||||
{
|
||||
ucKey=UART_GetChar() ;
|
||||
UART_PutChar( ucKey ) ;
|
||||
while ( 1 )
|
||||
{
|
||||
ucKey=UART_GetChar() ;
|
||||
UART_PutChar( ucKey ) ;
|
||||
|
||||
if ( ucKey >= '0' && ucKey <= '9' )
|
||||
{
|
||||
dwValue = (dwValue * 10) + (ucKey - '0');
|
||||
ucNbNb++ ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ucKey == 0x0D || ucKey == ' ' )
|
||||
{
|
||||
if ( ucNbNb == 0 )
|
||||
{
|
||||
printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;
|
||||
return 0 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\n\r" ) ;
|
||||
*pdwValue=dwValue ;
|
||||
if ( ucKey >= '0' && ucKey <= '9' )
|
||||
{
|
||||
dwValue = (dwValue * 10) + (ucKey - '0');
|
||||
ucNbNb++ ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ucKey == 0x0D || ucKey == ' ' )
|
||||
{
|
||||
if ( ucNbNb == 0 )
|
||||
{
|
||||
printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;
|
||||
return 0 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\n\r" ) ;
|
||||
*pdwValue=dwValue ;
|
||||
|
||||
return 1 ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\n\r'%c' not a number!\n\r", ucKey ) ;
|
||||
return 1 ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\n\r'%c' not a number!\n\r", ucKey ) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
}
|
||||
WDT_Restart(WDT);
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
}
|
||||
WDT_Restart(WDT);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -339,25 +339,25 @@ extern uint32_t UART_GetInteger( uint32_t* pdwValue )
|
||||
*/
|
||||
extern uint32_t UART_GetIntegerMinMax( uint32_t* pdwValue, uint32_t dwMin, uint32_t dwMax )
|
||||
{
|
||||
uint32_t dwValue=0 ;
|
||||
uint32_t dwValue=0 ;
|
||||
|
||||
if ( UART_GetInteger( &dwValue ) == 0 )
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
if ( UART_GetInteger( &dwValue ) == 0 )
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
if ( dwValue < dwMin || dwValue > dwMax )
|
||||
if ( dwValue < dwMin || dwValue > dwMax )
|
||||
{
|
||||
printf( "\n\rThe number have to be between %d and %d\n\r", (int)dwMin, (int)dwMax ) ;
|
||||
printf( "\n\rThe number have to be between %d and %d\n\r", (int)dwMin, (int)dwMax ) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
printf( "\n\r" ) ;
|
||||
printf( "\n\r" ) ;
|
||||
|
||||
*pdwValue = dwValue ;
|
||||
*pdwValue = dwValue ;
|
||||
|
||||
return 1 ;
|
||||
return 1 ;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -367,45 +367,45 @@ extern uint32_t UART_GetIntegerMinMax( uint32_t* pdwValue, uint32_t dwMin, uint3
|
||||
*/
|
||||
extern uint32_t UART_GetHexa32( uint32_t* pdwValue )
|
||||
{
|
||||
uint8_t ucKey ;
|
||||
uint32_t dw = 0 ;
|
||||
uint32_t dwValue = 0 ;
|
||||
uint8_t ucKey ;
|
||||
uint32_t dw = 0 ;
|
||||
uint32_t dwValue = 0 ;
|
||||
|
||||
for ( dw=0 ; dw < 8 ; dw++ )
|
||||
{
|
||||
ucKey = UART_GetChar() ;
|
||||
UART_PutChar( ucKey ) ;
|
||||
for ( dw=0 ; dw < 8 ; dw++ )
|
||||
{
|
||||
ucKey = UART_GetChar() ;
|
||||
UART_PutChar( ucKey ) ;
|
||||
|
||||
if ( ucKey >= '0' && ucKey <= '9' )
|
||||
{
|
||||
dwValue = (dwValue * 16) + (ucKey - '0') ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ucKey >= 'A' && ucKey <= 'F' )
|
||||
{
|
||||
dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ucKey >= 'a' && ucKey <= 'f' )
|
||||
{
|
||||
dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\n\rIt is not a hexa character!\n\r" ) ;
|
||||
if ( ucKey >= '0' && ucKey <= '9' )
|
||||
{
|
||||
dwValue = (dwValue * 16) + (ucKey - '0') ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ucKey >= 'A' && ucKey <= 'F' )
|
||||
{
|
||||
dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ucKey >= 'a' && ucKey <= 'f' )
|
||||
{
|
||||
dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "\n\rIt is not a hexa character!\n\r" ) ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0 ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("\n\r" ) ;
|
||||
*pdwValue = dwValue ;
|
||||
printf("\n\r" ) ;
|
||||
*pdwValue = dwValue ;
|
||||
|
||||
return 1 ;
|
||||
return 1 ;
|
||||
}
|
||||
|
||||
#if defined __ICCARM__ /* IAR Ewarm 5.41+ */
|
||||
@@ -418,9 +418,9 @@ extern uint32_t UART_GetHexa32( uint32_t* pdwValue )
|
||||
*/
|
||||
extern WEAK signed int putchar( signed int c )
|
||||
{
|
||||
UART_PutChar( c ) ;
|
||||
UART_PutChar( c ) ;
|
||||
|
||||
return c ;
|
||||
return c ;
|
||||
}
|
||||
#endif // defined __ICCARM__
|
||||
|
||||
|
||||
@@ -65,41 +65,41 @@
|
||||
// Definitions
|
||||
//------------------------------------------------------------------------------
|
||||
#if defined(NOASSERT)
|
||||
#define ASSERT(...)
|
||||
#define SANITY_CHECK(...)
|
||||
#define ASSERT(...)
|
||||
#define SANITY_CHECK(...)
|
||||
#else
|
||||
|
||||
#if (TRACE_LEVEL == 0)
|
||||
/// Checks that the given condition is true,
|
||||
/// otherwise stops the program execution.
|
||||
/// \param condition Condition to verify.
|
||||
#define ASSERT(condition) { \
|
||||
if (!(condition)) { \
|
||||
while (1); \
|
||||
} \
|
||||
}
|
||||
#if (TRACE_LEVEL == 0)
|
||||
/// Checks that the given condition is true,
|
||||
/// otherwise stops the program execution.
|
||||
/// \param condition Condition to verify.
|
||||
#define ASSERT(condition) { \
|
||||
if (!(condition)) { \
|
||||
while (1); \
|
||||
} \
|
||||
}
|
||||
|
||||
/// Performs the same duty as the ASSERT() macro
|
||||
/// \param condition Condition to verify.
|
||||
#define SANITY_CHECK(condition) ASSERT(condition, ...)
|
||||
/// Performs the same duty as the ASSERT() macro
|
||||
/// \param condition Condition to verify.
|
||||
#define SANITY_CHECK(condition) ASSERT(condition, ...)
|
||||
|
||||
#else
|
||||
/// Checks that the given condition is true, otherwise displays an error
|
||||
/// message and stops the program execution.
|
||||
/// \param condition Condition to verify.
|
||||
#define ASSERT(condition) { \
|
||||
if (!(condition)) { \
|
||||
printf("-F- ASSERT: %s %s:%d\n\r", #condition, __BASE_FILE__, __LINE__); \
|
||||
while (1); \
|
||||
} \
|
||||
}
|
||||
#define SANITY_ERROR "Sanity check failed at %s:%d\n\r"
|
||||
|
||||
/// Performs the same duty as the ASSERT() macro, except a default error
|
||||
/// message is output if the condition is false.
|
||||
/// \param condition Condition to verify.
|
||||
#define SANITY_CHECK(condition) ASSERT(condition, SANITY_ERROR, __FILE__, __LINE__)
|
||||
#endif
|
||||
#else
|
||||
/// Checks that the given condition is true, otherwise displays an error
|
||||
/// message and stops the program execution.
|
||||
/// \param condition Condition to verify.
|
||||
#define ASSERT(condition) { \
|
||||
if (!(condition)) { \
|
||||
printf("-F- ASSERT: %s %s:%d\n\r", #condition, __BASE_FILE__, __LINE__); \
|
||||
while (1); \
|
||||
} \
|
||||
}
|
||||
#define SANITY_ERROR "Sanity check failed at %s:%d\n\r"
|
||||
|
||||
/// Performs the same duty as the ASSERT() macro, except a default error
|
||||
/// message is output if the condition is false.
|
||||
/// \param condition Condition to verify.
|
||||
#define SANITY_CHECK(condition) ASSERT(condition, SANITY_ERROR, __FILE__, __LINE__)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -145,129 +145,129 @@ typedef struct
|
||||
/// 6.1.11.2 PIN Verification Data Structure
|
||||
typedef struct
|
||||
{
|
||||
/// Number of seconds.
|
||||
unsigned char bTimerOut;
|
||||
/// Several parameters for the PIN format options
|
||||
unsigned char bmFormatString;
|
||||
/// Define the length of the PIN to present in the APDU command
|
||||
unsigned char bmPINBlockString;
|
||||
/// Allows the length PIN insertion in the APDU command
|
||||
unsigned char bmPINLengthFormat;
|
||||
/// Minimum PIN size in digit and Maximum PIN size in digit
|
||||
unsigned char wPINMaxExtraDigit;
|
||||
/// The value is a bit wise OR operation.
|
||||
unsigned char bEntryValidationCondition;
|
||||
/// Number of messages to display for the PIN modify command
|
||||
unsigned char bNumberMessage;
|
||||
/// Language used to display the messages.
|
||||
unsigned char wLangId;
|
||||
/// Message index in the Reader message table
|
||||
unsigned char bMsgIndex;
|
||||
/// T=1 I-block prologue field to use
|
||||
unsigned char bTeoPrologue[3];
|
||||
/// APDU to send to the ICC
|
||||
unsigned char abPINApdu[255];
|
||||
/// Number of seconds.
|
||||
unsigned char bTimerOut;
|
||||
/// Several parameters for the PIN format options
|
||||
unsigned char bmFormatString;
|
||||
/// Define the length of the PIN to present in the APDU command
|
||||
unsigned char bmPINBlockString;
|
||||
/// Allows the length PIN insertion in the APDU command
|
||||
unsigned char bmPINLengthFormat;
|
||||
/// Minimum PIN size in digit and Maximum PIN size in digit
|
||||
unsigned char wPINMaxExtraDigit;
|
||||
/// The value is a bit wise OR operation.
|
||||
unsigned char bEntryValidationCondition;
|
||||
/// Number of messages to display for the PIN modify command
|
||||
unsigned char bNumberMessage;
|
||||
/// Language used to display the messages.
|
||||
unsigned char wLangId;
|
||||
/// Message index in the Reader message table
|
||||
unsigned char bMsgIndex;
|
||||
/// T=1 I-block prologue field to use
|
||||
unsigned char bTeoPrologue[3];
|
||||
/// APDU to send to the ICC
|
||||
unsigned char abPINApdu[255];
|
||||
}__attribute__ ((packed)) S_ccid_PIN_Verification;
|
||||
|
||||
|
||||
/// 6.1.11.7 PIN Modification Data Structure
|
||||
typedef struct
|
||||
{
|
||||
/// Number of seconds. If 00h then CCID default value is used.
|
||||
unsigned char bTimeOut;
|
||||
/// Several parameters for the PIN format options (defined in § 6.1.11.4)
|
||||
unsigned char bmFormatString4;
|
||||
/// Define the length of the PIN to present in the APDU command
|
||||
unsigned char bmPINBlockString;
|
||||
/// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)
|
||||
unsigned char bmPinLengthFormat;
|
||||
/// Insertion position offset in byte for the current PIN
|
||||
unsigned char bInsertionOffsetOld;
|
||||
/// Insertion position offset in byte for the new PIN
|
||||
unsigned char bInsertionOffsetNew;
|
||||
/// XXYYh
|
||||
/// XX: Minimum PIN size in digit
|
||||
/// YY: Maximum PIN size in digit
|
||||
unsigned char wPINMaxExtraDigit;
|
||||
/// 00h,01h,02h,03h
|
||||
/// Indicates if a confirmation is requested before acceptance of a new PIN (meaning that the user has to enter this new PIN twice before it is accepted)
|
||||
/// Indicates if the current PIN must be entered and set in the same APDU field of not.
|
||||
unsigned char bConfirmPIN;
|
||||
/// The value is a bit wise OR operation.
|
||||
/// 01h Max size reached
|
||||
/// 02h Validation key pressed
|
||||
/// 04h Timeout occurred
|
||||
unsigned char bEntryValidationCondition;
|
||||
/// 00h,01h,02h,03h,or FFh
|
||||
/// Number of messages to display for the PIN modify command.
|
||||
unsigned char bNumberMessage;
|
||||
/// Language used to display the messages. The 16 bit
|
||||
unsigned char wLangId;
|
||||
/// Message index in the Reader message table (should be 00h or 01h).
|
||||
unsigned char bMsgIndex1;
|
||||
/// Message index in the Reader message table (should be 01h or 02h).
|
||||
unsigned char bMsgIndex2;
|
||||
/// Message index in the Reader message table (should be 02h).
|
||||
unsigned char bMsgIndex3;
|
||||
/// T=1 I-block prologue field to use. Significant only if protocol in use is T=1.
|
||||
unsigned char bTeoPrologue[3];
|
||||
/// Byte array APDU to send to the ICC
|
||||
unsigned char abPINApdu[255];
|
||||
/// Number of seconds. If 00h then CCID default value is used.
|
||||
unsigned char bTimeOut;
|
||||
/// Several parameters for the PIN format options (defined in § 6.1.11.4)
|
||||
unsigned char bmFormatString4;
|
||||
/// Define the length of the PIN to present in the APDU command
|
||||
unsigned char bmPINBlockString;
|
||||
/// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)
|
||||
unsigned char bmPinLengthFormat;
|
||||
/// Insertion position offset in byte for the current PIN
|
||||
unsigned char bInsertionOffsetOld;
|
||||
/// Insertion position offset in byte for the new PIN
|
||||
unsigned char bInsertionOffsetNew;
|
||||
/// XXYYh
|
||||
/// XX: Minimum PIN size in digit
|
||||
/// YY: Maximum PIN size in digit
|
||||
unsigned char wPINMaxExtraDigit;
|
||||
/// 00h,01h,02h,03h
|
||||
/// Indicates if a confirmation is requested before acceptance of a new PIN (meaning that the user has to enter this new PIN twice before it is accepted)
|
||||
/// Indicates if the current PIN must be entered and set in the same APDU field of not.
|
||||
unsigned char bConfirmPIN;
|
||||
/// The value is a bit wise OR operation.
|
||||
/// 01h Max size reached
|
||||
/// 02h Validation key pressed
|
||||
/// 04h Timeout occurred
|
||||
unsigned char bEntryValidationCondition;
|
||||
/// 00h,01h,02h,03h,or FFh
|
||||
/// Number of messages to display for the PIN modify command.
|
||||
unsigned char bNumberMessage;
|
||||
/// Language used to display the messages. The 16 bit
|
||||
unsigned char wLangId;
|
||||
/// Message index in the Reader message table (should be 00h or 01h).
|
||||
unsigned char bMsgIndex1;
|
||||
/// Message index in the Reader message table (should be 01h or 02h).
|
||||
unsigned char bMsgIndex2;
|
||||
/// Message index in the Reader message table (should be 02h).
|
||||
unsigned char bMsgIndex3;
|
||||
/// T=1 I-block prologue field to use. Significant only if protocol in use is T=1.
|
||||
unsigned char bTeoPrologue[3];
|
||||
/// Byte array APDU to send to the ICC
|
||||
unsigned char abPINApdu[255];
|
||||
}__attribute__ ((packed)) S_ccid_PIN_Modification;
|
||||
|
||||
/// Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)
|
||||
typedef struct
|
||||
{
|
||||
/// B7-4 – FI – Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// clock rate conversion factor
|
||||
/// B3-0 – DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// baud rate conversion factor
|
||||
unsigned char bmFindexDindex;
|
||||
/// For T=0 ,B0 – 0b, B7-2 – 000000b
|
||||
/// B1 – Convention used (b1=0 for direct, b1=1 for inverse)
|
||||
unsigned char bmTCCKST0; // 0 to 2
|
||||
/// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
|
||||
/// guardtime of 12etu. FFh is the same as 00h.
|
||||
unsigned char bGuardTimeT0; // 0 to FF
|
||||
/// WI for T=0 used to define WWT
|
||||
unsigned char bWaitingIntegerT0; // 0 to FF
|
||||
/// ICC Clock Stop Support
|
||||
/// 00 = Stopping the Clock is not allowed
|
||||
/// 01 = Stop with Clock signal Low
|
||||
/// 02 = Stop with Clock signal High
|
||||
/// 03 = Stop with Clock either High or Low
|
||||
unsigned char bClockStop; // 0 to 3
|
||||
/// B7-4 – FI – Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// clock rate conversion factor
|
||||
/// B3-0 – DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// baud rate conversion factor
|
||||
unsigned char bmFindexDindex;
|
||||
/// For T=0 ,B0 – 0b, B7-2 – 000000b
|
||||
/// B1 – Convention used (b1=0 for direct, b1=1 for inverse)
|
||||
unsigned char bmTCCKST0; // 0 to 2
|
||||
/// Extra Guardtime between two characters. Add 0 to 254 etu to the normal
|
||||
/// guardtime of 12etu. FFh is the same as 00h.
|
||||
unsigned char bGuardTimeT0; // 0 to FF
|
||||
/// WI for T=0 used to define WWT
|
||||
unsigned char bWaitingIntegerT0; // 0 to FF
|
||||
/// ICC Clock Stop Support
|
||||
/// 00 = Stopping the Clock is not allowed
|
||||
/// 01 = Stop with Clock signal Low
|
||||
/// 02 = Stop with Clock signal High
|
||||
/// 03 = Stop with Clock either High or Low
|
||||
unsigned char bClockStop; // 0 to 3
|
||||
} __attribute__ ((packed)) S_ccid_protocol_t0;
|
||||
|
||||
|
||||
/// Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)
|
||||
typedef struct
|
||||
{
|
||||
/// B7-4 – FI – Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// clock rate conversion factor
|
||||
/// B3-0 – DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// baud rate conversion factor
|
||||
unsigned char bmFindexDindex;
|
||||
/// For T=1, B7-2 – 000100b
|
||||
/// B0 – Checksum type (b0=0 for LRC, b0=1 for CRC
|
||||
/// B1 – Convention used (b1=0 for direct, b1=1 for inverse)
|
||||
unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h
|
||||
/// Extra Guardtime (0 to 254 etu between two characters).
|
||||
/// If value is FFh, then guardtime is reduced by 1.
|
||||
unsigned char bGuardTimeT1; // 0 to FF
|
||||
/// B7-4 = BWI
|
||||
/// B3-0 = CWI
|
||||
unsigned char bmWaitingIntegersT1; // 0 to 9
|
||||
/// ICC Clock Stop Support
|
||||
/// 00 = Stopping the Clock is not allowed
|
||||
/// 01 = Stop with Clock signal Low
|
||||
/// 02 = Stop with Clock signal High
|
||||
/// 03 = Stop with Clock either High or Low
|
||||
unsigned char bClockStop; // 0 to 3
|
||||
/// Size of negotiated IFSC
|
||||
unsigned char bIFSC; // 0 to FE
|
||||
/// Nad value used by CCID
|
||||
unsigned char bNadValue; // 0 to FF
|
||||
/// B7-4 – FI – Index into the table 7 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// clock rate conversion factor
|
||||
/// B3-0 – DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a
|
||||
/// baud rate conversion factor
|
||||
unsigned char bmFindexDindex;
|
||||
/// For T=1, B7-2 – 000100b
|
||||
/// B0 – Checksum type (b0=0 for LRC, b0=1 for CRC
|
||||
/// B1 – Convention used (b1=0 for direct, b1=1 for inverse)
|
||||
unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h
|
||||
/// Extra Guardtime (0 to 254 etu between two characters).
|
||||
/// If value is FFh, then guardtime is reduced by 1.
|
||||
unsigned char bGuardTimeT1; // 0 to FF
|
||||
/// B7-4 = BWI
|
||||
/// B3-0 = CWI
|
||||
unsigned char bmWaitingIntegersT1; // 0 to 9
|
||||
/// ICC Clock Stop Support
|
||||
/// 00 = Stopping the Clock is not allowed
|
||||
/// 01 = Stop with Clock signal Low
|
||||
/// 02 = Stop with Clock signal High
|
||||
/// 03 = Stop with Clock either High or Low
|
||||
unsigned char bClockStop; // 0 to 3
|
||||
/// Size of negotiated IFSC
|
||||
unsigned char bIFSC; // 0 to FE
|
||||
/// Nad value used by CCID
|
||||
unsigned char bNadValue; // 0 to FF
|
||||
} __attribute__ ((packed)) S_ccid_protocol_t1;
|
||||
|
||||
|
||||
@@ -357,8 +357,8 @@ typedef struct
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
extern unsigned char RDRtoPCHardwareError( unsigned char bSlot,
|
||||
unsigned char bSeq,
|
||||
unsigned char bHardwareErrorCode );
|
||||
unsigned char bSeq,
|
||||
unsigned char bHardwareErrorCode );
|
||||
|
||||
/*
|
||||
#if !defined(NOAUTOCALLBACK)
|
||||
@@ -368,13 +368,13 @@ extern void USBDCallbacks_RequestReceived(const USBGenericRequest *request);
|
||||
extern void CCID_SmartCardRequest( void );
|
||||
extern void CCIDDriver_Initialize( void );
|
||||
extern unsigned char CCID_Read(void *pBuffer,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArgument);
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArgument);
|
||||
extern unsigned char CCID_Write(void *pBuffer,
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArgument);
|
||||
unsigned int dLength,
|
||||
TransferCallback fCallback,
|
||||
void *pArgument);
|
||||
extern unsigned char CCID_Insertion( void );
|
||||
extern unsigned char CCID_Removal( void );
|
||||
|
||||
|
||||
@@ -76,9 +76,9 @@ extern uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart);
|
||||
|
||||
extern void ISO7816_IccPowerOff(void);
|
||||
extern uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,
|
||||
uint8_t *pMessage,
|
||||
uint16_t wLength,
|
||||
uint16_t *retlen);
|
||||
uint8_t *pMessage,
|
||||
uint16_t wLength,
|
||||
uint16_t *retlen);
|
||||
extern void ISO7816_Escape( void );
|
||||
extern void ISO7816_RestartClock(void);
|
||||
extern void ISO7816_StopClock( void );
|
||||
|
||||
@@ -65,19 +65,19 @@ enum confNum {
|
||||
/// 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;
|
||||
DFURT_IF_DESCRIPTOR_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;
|
||||
DFURT_IF_DESCRIPTOR_STRUCT
|
||||
} __attribute__ ((packed)) CCIDDriverConfigurationDescriptors;
|
||||
|
||||
extern const USBConfigurationDescriptor *configurationDescriptorsArr[];
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -76,45 +76,45 @@ struct Usart_info usart_sim = {.base = USART_SIM, .id = ID_USART_SIM, .state = U
|
||||
*/
|
||||
uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart)
|
||||
{
|
||||
uint32_t status;
|
||||
uint32_t timeout=0;
|
||||
uint32_t status;
|
||||
uint32_t timeout=0;
|
||||
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
|
||||
if( usart->state == USART_SEND ) {
|
||||
while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_RCV;
|
||||
}
|
||||
if( usart->state == USART_SEND ) {
|
||||
while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_RCV;
|
||||
}
|
||||
|
||||
/* Wait USART ready for reception */
|
||||
while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
/* Wait USART ready for reception */
|
||||
while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
WDT_Restart(WDT);
|
||||
if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
|
||||
TRACE_WARNING("TimeOut\n\r");
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
|
||||
TRACE_WARNING("TimeOut\n\r");
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
/* At least one complete character has been received and US_RHR has not yet been read. */
|
||||
/* At least one complete character has been received and US_RHR has not yet been read. */
|
||||
|
||||
/* Get a char */
|
||||
*pCharToReceive = ((us_base->US_RHR) & 0xFF);
|
||||
/* Get a char */
|
||||
*pCharToReceive = ((us_base->US_RHR) & 0xFF);
|
||||
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status);
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status);
|
||||
TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
|
||||
@@ -125,50 +125,50 @@ uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart)
|
||||
*/
|
||||
uint32_t ISO7816_SendChar( uint8_t CharToSend, Usart_info *usart )
|
||||
{
|
||||
uint32_t status;
|
||||
uint32_t status;
|
||||
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
|
||||
if( usart->state == USART_RCV ) {
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_SEND;
|
||||
}
|
||||
if( usart->state == USART_RCV ) {
|
||||
us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
usart->state = USART_SEND;
|
||||
}
|
||||
|
||||
/* Wait USART ready for transmit */
|
||||
int i = 0;
|
||||
while((us_base->US_CSR & (US_CSR_TXRDY)) == 0) {
|
||||
i++;
|
||||
if (!(i%1000000)) {
|
||||
printf("s: %x ", us_base->US_CSR);
|
||||
printf("s: %x\r\n", us_base->US_RHR & 0xFF);
|
||||
us_base->US_CR = US_CR_RSTTX;
|
||||
us_base->US_CR = US_CR_RSTRX;
|
||||
}
|
||||
}
|
||||
/* There is no character in the US_THR */
|
||||
/* Wait USART ready for transmit */
|
||||
int i = 0;
|
||||
while((us_base->US_CSR & (US_CSR_TXRDY)) == 0) {
|
||||
i++;
|
||||
if (!(i%1000000)) {
|
||||
printf("s: %x ", us_base->US_CSR);
|
||||
printf("s: %x\r\n", us_base->US_RHR & 0xFF);
|
||||
us_base->US_CR = US_CR_RSTTX;
|
||||
us_base->US_CR = US_CR_RSTRX;
|
||||
}
|
||||
}
|
||||
/* There is no character in the US_THR */
|
||||
|
||||
/* Transmit a char */
|
||||
us_base->US_THR = CharToSend;
|
||||
/* Transmit a char */
|
||||
us_base->US_THR = CharToSend;
|
||||
|
||||
TRACE_ERROR("Sx%02X\r\n", CharToSend);
|
||||
TRACE_ERROR("Sx%02X\r\n", CharToSend);
|
||||
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32
|
||||
", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",
|
||||
status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
|
||||
((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
|
||||
TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
if (status != 0 ) {
|
||||
TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32
|
||||
", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",
|
||||
status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
|
||||
((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
|
||||
TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);
|
||||
TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );
|
||||
us_base->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
|
||||
@@ -177,10 +177,10 @@ uint32_t ISO7816_SendChar( uint8_t CharToSend, Usart_info *usart )
|
||||
*/
|
||||
static void ISO7816_IccPowerOn( void )
|
||||
{
|
||||
/* Set RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Set(st_pinIso7816RstMC);
|
||||
}
|
||||
/* Set RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Set(st_pinIso7816RstMC);
|
||||
}
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
@@ -192,10 +192,10 @@ static void ISO7816_IccPowerOn( void )
|
||||
*/
|
||||
void ISO7816_IccPowerOff( void )
|
||||
{
|
||||
/* Clear RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Clear(st_pinIso7816RstMC);
|
||||
}
|
||||
/* Clear RESET Master Card */
|
||||
if (st_pinIso7816RstMC) {
|
||||
PIO_Clear(st_pinIso7816RstMC);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -207,159 +207,159 @@ void ISO7816_IccPowerOff( void )
|
||||
* \return 0 on success, content of US_CSR otherwise
|
||||
*/
|
||||
uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,
|
||||
uint8_t *pMessage,
|
||||
uint16_t wLength,
|
||||
uint16_t *retlen )
|
||||
uint8_t *pMessage,
|
||||
uint16_t wLength,
|
||||
uint16_t *retlen )
|
||||
{
|
||||
uint16_t NeNc;
|
||||
uint16_t indexApdu = 4;
|
||||
uint16_t indexMsg = 0;
|
||||
uint8_t SW1 = 0;
|
||||
uint8_t procByte;
|
||||
uint8_t cmdCase;
|
||||
uint32_t status = 0;
|
||||
uint16_t NeNc;
|
||||
uint16_t indexApdu = 4;
|
||||
uint16_t indexMsg = 0;
|
||||
uint8_t SW1 = 0;
|
||||
uint8_t procByte;
|
||||
uint8_t cmdCase;
|
||||
uint32_t status = 0;
|
||||
|
||||
TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);
|
||||
TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);
|
||||
TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);
|
||||
TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);
|
||||
TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);
|
||||
TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);
|
||||
TRACE_INFO("wlength=%d\n\r",wLength);
|
||||
TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);
|
||||
TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);
|
||||
TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);
|
||||
TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);
|
||||
TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);
|
||||
TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);
|
||||
TRACE_INFO("wlength=%d\n\r",wLength);
|
||||
|
||||
ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */
|
||||
ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */
|
||||
ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */
|
||||
ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */
|
||||
ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */
|
||||
ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */
|
||||
ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */
|
||||
ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */
|
||||
ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */
|
||||
ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */
|
||||
|
||||
/* Handle the four structures of command APDU */
|
||||
indexApdu = 5;
|
||||
/* Handle the four structures of command APDU */
|
||||
indexApdu = 5;
|
||||
|
||||
if( wLength == 4 ) {
|
||||
cmdCase = CASE1;
|
||||
NeNc = 0;
|
||||
}
|
||||
else if( wLength == 5) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if (NeNc == 0) {
|
||||
NeNc = 256;
|
||||
}
|
||||
}
|
||||
else if( wLength == 6) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
else if( wLength == 7) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE3;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
if( wLength == 4 ) {
|
||||
cmdCase = CASE1;
|
||||
NeNc = 0;
|
||||
}
|
||||
else if( wLength == 5) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if (NeNc == 0) {
|
||||
NeNc = 256;
|
||||
}
|
||||
}
|
||||
else if( wLength == 6) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
else if( wLength == 7) {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE2;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
NeNc = pAPDU[4]; /* C5 */
|
||||
if( NeNc == 0 ) {
|
||||
cmdCase = CASE3;
|
||||
NeNc = (pAPDU[5]<<8)+pAPDU[6];
|
||||
}
|
||||
else {
|
||||
cmdCase = CASE3;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);
|
||||
TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);
|
||||
|
||||
/* Handle Procedure Bytes */
|
||||
do {
|
||||
status = ISO7816_GetChar(&procByte, &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("procByte: 0x%X\n\r", procByte);
|
||||
/* Handle NULL */
|
||||
if ( procByte == ISO_NULL_VAL ) {
|
||||
TRACE_INFO("INS\n\r");
|
||||
continue;
|
||||
}
|
||||
/* Handle SW1 */
|
||||
else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {
|
||||
TRACE_INFO("SW1\n\r");
|
||||
SW1 = 1;
|
||||
}
|
||||
/* Handle INS */
|
||||
else if ( pAPDU[1] == procByte) {
|
||||
TRACE_INFO("HdlINS\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
do {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
} while(( 0 != --NeNc) && (status == 0) );
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Send data */
|
||||
do {
|
||||
TRACE_INFO("Send %X", pAPDU[indexApdu]);
|
||||
ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
} while( 0 != --NeNc );
|
||||
}
|
||||
}
|
||||
/* Handle INS ^ 0xff */
|
||||
else
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
if ( pAPDU[1] == (procByte ^ 0xff)) {
|
||||
#pragma GCC diagnostic pop
|
||||
TRACE_INFO("HdlINS+\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);
|
||||
}
|
||||
else {
|
||||
status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
NeNc--;
|
||||
}
|
||||
else {
|
||||
/* ?? */
|
||||
TRACE_INFO("procByte=0x%X\n\r", procByte);
|
||||
break;
|
||||
}
|
||||
} while (NeNc != 0);
|
||||
/* Handle Procedure Bytes */
|
||||
do {
|
||||
status = ISO7816_GetChar(&procByte, &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("procByte: 0x%X\n\r", procByte);
|
||||
/* Handle NULL */
|
||||
if ( procByte == ISO_NULL_VAL ) {
|
||||
TRACE_INFO("INS\n\r");
|
||||
continue;
|
||||
}
|
||||
/* Handle SW1 */
|
||||
else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {
|
||||
TRACE_INFO("SW1\n\r");
|
||||
SW1 = 1;
|
||||
}
|
||||
/* Handle INS */
|
||||
else if ( pAPDU[1] == procByte) {
|
||||
TRACE_INFO("HdlINS\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
do {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
} while(( 0 != --NeNc) && (status == 0) );
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Send data */
|
||||
do {
|
||||
TRACE_INFO("Send %X", pAPDU[indexApdu]);
|
||||
ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
} while( 0 != --NeNc );
|
||||
}
|
||||
}
|
||||
/* Handle INS ^ 0xff */
|
||||
else
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
if ( pAPDU[1] == (procByte ^ 0xff)) {
|
||||
#pragma GCC diagnostic pop
|
||||
TRACE_INFO("HdlINS+\n\r");
|
||||
if (cmdCase == CASE2) {
|
||||
/* receive data from card */
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);
|
||||
}
|
||||
else {
|
||||
status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
NeNc--;
|
||||
}
|
||||
else {
|
||||
/* ?? */
|
||||
TRACE_INFO("procByte=0x%X\n\r", procByte);
|
||||
break;
|
||||
}
|
||||
} while (NeNc != 0);
|
||||
|
||||
/* Status Bytes */
|
||||
if (SW1 == 0) {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pMessage[indexMsg++] = procByte;
|
||||
}
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
/* Status Bytes */
|
||||
if (SW1 == 0) {
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
else {
|
||||
pMessage[indexMsg++] = procByte;
|
||||
}
|
||||
status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);
|
||||
TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);
|
||||
|
||||
*retlen = indexMsg;
|
||||
return status;
|
||||
*retlen = indexMsg;
|
||||
return status;
|
||||
|
||||
}
|
||||
|
||||
@@ -368,7 +368,7 @@ uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,
|
||||
*/
|
||||
void ISO7816_Escape( void )
|
||||
{
|
||||
TRACE_DEBUG("For user, if needed\n\r");
|
||||
TRACE_DEBUG("For user, if needed\n\r");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -376,8 +376,8 @@ void ISO7816_Escape( void )
|
||||
*/
|
||||
void ISO7816_RestartClock( void )
|
||||
{
|
||||
TRACE_DEBUG("ISO7816_RestartClock\n\r");
|
||||
USART_SIM->US_BRGR = 13;
|
||||
TRACE_DEBUG("ISO7816_RestartClock\n\r");
|
||||
USART_SIM->US_BRGR = 13;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -385,8 +385,8 @@ void ISO7816_RestartClock( void )
|
||||
*/
|
||||
void ISO7816_StopClock( void )
|
||||
{
|
||||
TRACE_DEBUG("ISO7816_StopClock\n\r");
|
||||
USART_SIM->US_BRGR = 0;
|
||||
TRACE_DEBUG("ISO7816_StopClock\n\r");
|
||||
USART_SIM->US_BRGR = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -394,8 +394,8 @@ void ISO7816_StopClock( void )
|
||||
*/
|
||||
void ISO7816_toAPDU( void )
|
||||
{
|
||||
TRACE_DEBUG("ISO7816_toAPDU\n\r");
|
||||
TRACE_DEBUG("Not supported at this time\n\r");
|
||||
TRACE_DEBUG("ISO7816_toAPDU\n\r");
|
||||
TRACE_DEBUG("Not supported at this time\n\r");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -406,64 +406,64 @@ void ISO7816_toAPDU( void )
|
||||
*/
|
||||
uint32_t ISO7816_Datablock_ATR( uint8_t* pAtr, uint8_t* pLength )
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint32_t status = 0;
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint32_t status = 0;
|
||||
|
||||
*pLength = 0;
|
||||
*pLength = 0;
|
||||
|
||||
/* Read ATR TS */
|
||||
// FIXME: There should always be a check for the GetChar return value..0 means timeout
|
||||
status = ISO7816_GetChar(&pAtr[0], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
/* Read ATR TS */
|
||||
// FIXME: There should always be a check for the GetChar return value..0 means timeout
|
||||
status = ISO7816_GetChar(&pAtr[0], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Read ATR T0 */
|
||||
status = ISO7816_GetChar(&pAtr[1], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
y = pAtr[1] & 0xF0;
|
||||
i = 2;
|
||||
/* Read ATR T0 */
|
||||
status = ISO7816_GetChar(&pAtr[1], &usart_sim);
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
y = pAtr[1] & 0xF0;
|
||||
i = 2;
|
||||
|
||||
/* Read ATR Ti */
|
||||
while (y && (status == 0)) {
|
||||
/* Read ATR Ti */
|
||||
while (y && (status == 0)) {
|
||||
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i], &usart_sim);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
}
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
status = ISO7816_GetChar(&pAtr[i], &usart_sim);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
}
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Historical Bytes */
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; (j < y) && (status == 0); j++ ) {
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
/* Historical Bytes */
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; (j < y) && (status == 0); j++ ) {
|
||||
status = ISO7816_GetChar(&pAtr[i++], &usart_sim);
|
||||
}
|
||||
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
if (status != 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
*pLength = i;
|
||||
return status;
|
||||
*pLength = i;
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -473,18 +473,18 @@ uint32_t ISO7816_Datablock_ATR( uint8_t* pAtr, uint8_t* pLength )
|
||||
*/
|
||||
void ISO7816_SetDataRateandClockFrequency( uint32_t dwClockFrequency, uint32_t dwDataRate )
|
||||
{
|
||||
uint8_t ClockFrequency;
|
||||
uint8_t ClockFrequency;
|
||||
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);
|
||||
|
||||
ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;
|
||||
ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;
|
||||
|
||||
USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;
|
||||
USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;
|
||||
|
||||
}
|
||||
|
||||
@@ -494,10 +494,10 @@ void ISO7816_SetDataRateandClockFrequency( uint32_t dwClockFrequency, uint32_t d
|
||||
*/
|
||||
uint8_t ISO7816_StatusReset( void )
|
||||
{
|
||||
if (st_pinIso7816RstMC) {
|
||||
return PIO_Get(st_pinIso7816RstMC);
|
||||
}
|
||||
return 0;
|
||||
if (st_pinIso7816RstMC) {
|
||||
return PIO_Get(st_pinIso7816RstMC);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -505,16 +505,16 @@ uint8_t ISO7816_StatusReset( void )
|
||||
*/
|
||||
void ISO7816_cold_reset( void )
|
||||
{
|
||||
volatile uint32_t i;
|
||||
volatile uint32_t i;
|
||||
|
||||
/* tb: wait ??? cycles*/
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
/* tb: wait ??? cycles*/
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
|
||||
ISO7816_IccPowerOn();
|
||||
ISO7816_IccPowerOn();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -522,20 +522,20 @@ void ISO7816_cold_reset( void )
|
||||
*/
|
||||
void ISO7816_warm_reset( void )
|
||||
{
|
||||
volatile uint32_t i;
|
||||
volatile uint32_t i;
|
||||
|
||||
// Clears Reset
|
||||
ISO7816_IccPowerOff();
|
||||
ISO7816_IccPowerOff();
|
||||
|
||||
/* tb: wait ??? cycles */
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
/* tb: wait ??? cycles */
|
||||
for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {
|
||||
}
|
||||
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
USART_SIM->US_RHR;
|
||||
USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
|
||||
// Sets Reset
|
||||
ISO7816_IccPowerOn();
|
||||
ISO7816_IccPowerOn();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -544,99 +544,99 @@ void ISO7816_warm_reset( void )
|
||||
*/
|
||||
void ISO7816_Decode_ATR( uint8_t* pAtr )
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint8_t offset;
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
uint32_t y;
|
||||
uint8_t offset;
|
||||
|
||||
printf("\n\r");
|
||||
printf("ATR: Answer To Reset:\n\r");
|
||||
printf("TS = 0x%X Initial character ",pAtr[0]);
|
||||
if( pAtr[0] == 0x3B ) {
|
||||
printf("\n\r");
|
||||
printf("ATR: Answer To Reset:\n\r");
|
||||
printf("TS = 0x%X Initial character ",pAtr[0]);
|
||||
if( pAtr[0] == 0x3B ) {
|
||||
|
||||
printf("Direct Convention\n\r");
|
||||
}
|
||||
else {
|
||||
if( pAtr[0] == 0x3F ) {
|
||||
printf("Direct Convention\n\r");
|
||||
}
|
||||
else {
|
||||
if( pAtr[0] == 0x3F ) {
|
||||
|
||||
printf("Inverse Convention\n\r");
|
||||
}
|
||||
else {
|
||||
printf("BAD Convention\n\r");
|
||||
}
|
||||
}
|
||||
printf("Inverse Convention\n\r");
|
||||
}
|
||||
else {
|
||||
printf("BAD Convention\n\r");
|
||||
}
|
||||
}
|
||||
|
||||
printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);
|
||||
printf(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);
|
||||
printf(" Presence further interface byte:\n\r");
|
||||
if( pAtr[1]&0x80 ) {
|
||||
printf("TA ");
|
||||
}
|
||||
if( pAtr[1]&0x40 ) {
|
||||
printf("TB ");
|
||||
}
|
||||
if( pAtr[1]&0x20 ) {
|
||||
printf("TC ");
|
||||
}
|
||||
if( pAtr[1]&0x10 ) {
|
||||
printf("TD ");
|
||||
}
|
||||
if( pAtr[1] != 0 ) {
|
||||
printf(" present\n\r");
|
||||
}
|
||||
printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);
|
||||
printf(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);
|
||||
printf(" Presence further interface byte:\n\r");
|
||||
if( pAtr[1]&0x80 ) {
|
||||
printf("TA ");
|
||||
}
|
||||
if( pAtr[1]&0x40 ) {
|
||||
printf("TB ");
|
||||
}
|
||||
if( pAtr[1]&0x20 ) {
|
||||
printf("TC ");
|
||||
}
|
||||
if( pAtr[1]&0x10 ) {
|
||||
printf("TD ");
|
||||
}
|
||||
if( pAtr[1] != 0 ) {
|
||||
printf(" present\n\r");
|
||||
}
|
||||
|
||||
i = 2;
|
||||
y = pAtr[1] & 0xF0;
|
||||
i = 2;
|
||||
y = pAtr[1] & 0xF0;
|
||||
|
||||
/* Read ATR Ti */
|
||||
offset = 1;
|
||||
while (y) {
|
||||
/* Read ATR Ti */
|
||||
offset = 1;
|
||||
while (y) {
|
||||
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
printf("TA[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("FI = %d ", (pAtr[i]>>8));
|
||||
printf("DI = %d", (pAtr[i]&0x0F));
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
printf("TC[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("Extra Guard Time: N = %d", pAtr[i]);
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
if (y & 0x10) { /* TA[i] */
|
||||
printf("TA[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("FI = %d ", (pAtr[i]>>8));
|
||||
printf("DI = %d", (pAtr[i]&0x0F));
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x20) { /* TB[i] */
|
||||
printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
if (y & 0x40) { /* TC[i] */
|
||||
printf("TC[%d] = 0x%X ", offset, pAtr[i]);
|
||||
if( offset == 1 ) {
|
||||
printf("Extra Guard Time: N = %d", pAtr[i]);
|
||||
}
|
||||
printf("\n\r");
|
||||
i++;
|
||||
}
|
||||
if (y & 0x80) { /* TD[i] */
|
||||
printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);
|
||||
y = pAtr[i++] & 0xF0;
|
||||
}
|
||||
else {
|
||||
y = 0;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
|
||||
/* Historical Bytes */
|
||||
printf("Historical bytes:\n\r");
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; j < y; j++ ) {
|
||||
printf(" 0x%X", pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
printf("\n\r\n\r");
|
||||
/* Historical Bytes */
|
||||
printf("Historical bytes:\n\r");
|
||||
y = pAtr[1] & 0x0F;
|
||||
for( j=0; j < y; j++ ) {
|
||||
printf(" 0x%X", pAtr[i]);
|
||||
i++;
|
||||
}
|
||||
printf("\n\r\n\r");
|
||||
|
||||
}
|
||||
|
||||
void ISO7816_Set_Reset_Pin(const Pin *pPinIso7816RstMC) {
|
||||
/* Pin ISO7816 initialize */
|
||||
st_pinIso7816RstMC = (Pin *)pPinIso7816RstMC;
|
||||
/* Pin ISO7816 initialize */
|
||||
st_pinIso7816RstMC = (Pin *)pPinIso7816RstMC;
|
||||
}
|
||||
|
||||
/** Initializes a ISO driver
|
||||
@@ -644,46 +644,46 @@ void ISO7816_Set_Reset_Pin(const Pin *pPinIso7816RstMC) {
|
||||
*/
|
||||
void ISO7816_Init( Usart_info *usart, bool master_clock )
|
||||
{
|
||||
uint32_t clk;
|
||||
TRACE_DEBUG("ISO_Init\n\r");
|
||||
uint32_t clk;
|
||||
TRACE_DEBUG("ISO_Init\n\r");
|
||||
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
Usart *us_base = usart->base;
|
||||
uint32_t us_id = usart->id;
|
||||
|
||||
if (master_clock == true) {
|
||||
clk = US_MR_USCLKS_MCK;
|
||||
} else {
|
||||
clk = US_MR_USCLKS_SCK;
|
||||
}
|
||||
if (master_clock == true) {
|
||||
clk = US_MR_USCLKS_MCK;
|
||||
} else {
|
||||
clk = US_MR_USCLKS_SCK;
|
||||
}
|
||||
|
||||
USART_Configure( us_base,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
| clk
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO
|
||||
| US_MR_INACK /* Inhibit errors */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
USART_Configure( us_base,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
| clk
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO
|
||||
| US_MR_INACK /* Inhibit errors */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
|
||||
/* Disable interrupts */
|
||||
us_base->US_IDR = (uint32_t) -1;
|
||||
/* Disable interrupts */
|
||||
us_base->US_IDR = (uint32_t) -1;
|
||||
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(us_id);
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(us_id);
|
||||
|
||||
us_base->US_FIDI = 372; /* by default */
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
if (master_clock == true) {
|
||||
us_base->US_BRGR = BOARD_MCK / (372*9600);
|
||||
} else {
|
||||
us_base->US_BRGR = US_BRGR_CD(1);
|
||||
}
|
||||
us_base->US_FIDI = 372; /* by default */
|
||||
/* Define the baud rate divisor register */
|
||||
/* CD = MCK / SCK */
|
||||
/* SCK = FIDI x BAUD = 372 x 9600 */
|
||||
/* BOARD_MCK */
|
||||
/* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */
|
||||
if (master_clock == true) {
|
||||
us_base->US_BRGR = BOARD_MCK / (372*9600);
|
||||
} else {
|
||||
us_base->US_BRGR = US_BRGR_CD(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ static void usart_irq_rx(uint8_t inst_num)
|
||||
csr = usart->US_CSR & usart->US_IMR;
|
||||
|
||||
if (csr & US_CSR_RXRDY) {
|
||||
byte = (usart->US_RHR) & 0xFF;
|
||||
byte = (usart->US_RHR) & 0xFF;
|
||||
if (rbuf_write(&ci->rb, byte) < 0)
|
||||
TRACE_ERROR("rbuf overrun\r\n");
|
||||
}
|
||||
|
||||
@@ -84,11 +84,11 @@ static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
|
||||
static void ISR_PioSmartCard(const Pin * pPin)
|
||||
{
|
||||
/* 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("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
|
||||
printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
Output:
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
*/
|
||||
// PA10 is DTXD, which is the debug uart transmit pin
|
||||
|
||||
|
||||
@@ -76,8 +76,8 @@ FILE* const stderr = NULL;
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutChar(char *pStr, char c)
|
||||
{
|
||||
*pStr = c;
|
||||
return 1;
|
||||
*pStr = c;
|
||||
return 1;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -89,15 +89,15 @@ signed int PutChar(char *pStr, char c)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutString(char *pStr, const char *pSource)
|
||||
{
|
||||
signed int num = 0;
|
||||
signed int num = 0;
|
||||
|
||||
while (*pSource != 0) {
|
||||
while (*pSource != 0) {
|
||||
|
||||
*pStr++ = *pSource++;
|
||||
num++;
|
||||
}
|
||||
*pStr++ = *pSource++;
|
||||
num++;
|
||||
}
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -110,38 +110,38 @@ signed int PutString(char *pStr, const char *pSource)
|
||||
// \param value Integer value.
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutUnsignedInt(
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned int value)
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned int value)
|
||||
{
|
||||
signed int num = 0;
|
||||
signed int num = 0;
|
||||
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
|
||||
// Recursively write upper digits
|
||||
if ((value / 10) > 0) {
|
||||
// Recursively write upper digits
|
||||
if ((value / 10) > 0) {
|
||||
|
||||
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler characters
|
||||
else {
|
||||
num = PutUnsignedInt(pStr, fill, width, value / 10);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler characters
|
||||
else {
|
||||
|
||||
while (width > 0) {
|
||||
while (width > 0) {
|
||||
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (value % 10) + '0');
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (value % 10) + '0');
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -154,69 +154,69 @@ signed int PutUnsignedInt(
|
||||
// \param value Signed integer value.
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutSignedInt(
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
signed int value)
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
signed int value)
|
||||
{
|
||||
signed int num = 0;
|
||||
unsigned int absolute;
|
||||
signed int num = 0;
|
||||
unsigned int absolute;
|
||||
|
||||
// Compute absolute value
|
||||
if (value < 0) {
|
||||
// Compute absolute value
|
||||
if (value < 0) {
|
||||
|
||||
absolute = -value;
|
||||
}
|
||||
else {
|
||||
absolute = -value;
|
||||
}
|
||||
else {
|
||||
|
||||
absolute = value;
|
||||
}
|
||||
absolute = value;
|
||||
}
|
||||
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
// Take current digit into account when calculating width
|
||||
width--;
|
||||
|
||||
// Recursively write upper digits
|
||||
if ((absolute / 10) > 0) {
|
||||
// Recursively write upper digits
|
||||
if ((absolute / 10) > 0) {
|
||||
|
||||
if (value < 0) {
|
||||
|
||||
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
||||
}
|
||||
else {
|
||||
if (value < 0) {
|
||||
|
||||
num = PutSignedInt(pStr, fill, width, -(absolute / 10));
|
||||
}
|
||||
else {
|
||||
|
||||
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
||||
}
|
||||
pStr += num;
|
||||
}
|
||||
else {
|
||||
num = PutSignedInt(pStr, fill, width, absolute / 10);
|
||||
}
|
||||
pStr += num;
|
||||
}
|
||||
else {
|
||||
|
||||
// Reserve space for sign
|
||||
if (value < 0) {
|
||||
// Reserve space for sign
|
||||
if (value < 0) {
|
||||
|
||||
width--;
|
||||
}
|
||||
width--;
|
||||
}
|
||||
|
||||
// Write filler characters
|
||||
while (width > 0) {
|
||||
// Write filler characters
|
||||
while (width > 0) {
|
||||
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
|
||||
// Write sign
|
||||
if (value < 0) {
|
||||
// Write sign
|
||||
if (value < 0) {
|
||||
|
||||
num += PutChar(pStr, '-');
|
||||
pStr++;
|
||||
}
|
||||
}
|
||||
num += PutChar(pStr, '-');
|
||||
pStr++;
|
||||
}
|
||||
}
|
||||
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (absolute % 10) + '0');
|
||||
// Write lower digit
|
||||
num += PutChar(pStr, (absolute % 10) + '0');
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -230,51 +230,51 @@ signed int PutSignedInt(
|
||||
// \param value Hexadecimal value.
|
||||
//------------------------------------------------------------------------------
|
||||
signed int PutHexa(
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned char maj,
|
||||
unsigned int value)
|
||||
char *pStr,
|
||||
char fill,
|
||||
signed int width,
|
||||
unsigned char maj,
|
||||
unsigned int value)
|
||||
{
|
||||
signed int num = 0;
|
||||
signed int num = 0;
|
||||
|
||||
// Decrement width
|
||||
width--;
|
||||
// Decrement width
|
||||
width--;
|
||||
|
||||
// Recursively output upper digits
|
||||
if ((value >> 4) > 0) {
|
||||
// Recursively output upper digits
|
||||
if ((value >> 4) > 0) {
|
||||
|
||||
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler chars
|
||||
else {
|
||||
num += PutHexa(pStr, fill, width, maj, value >> 4);
|
||||
pStr += num;
|
||||
}
|
||||
// Write filler chars
|
||||
else {
|
||||
|
||||
while (width > 0) {
|
||||
while (width > 0) {
|
||||
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
PutChar(pStr, fill);
|
||||
pStr++;
|
||||
num++;
|
||||
width--;
|
||||
}
|
||||
}
|
||||
|
||||
// Write current digit
|
||||
if ((value & 0xF) < 10) {
|
||||
// Write current digit
|
||||
if ((value & 0xF) < 10) {
|
||||
|
||||
PutChar(pStr, (value & 0xF) + '0');
|
||||
}
|
||||
else if (maj) {
|
||||
PutChar(pStr, (value & 0xF) + '0');
|
||||
}
|
||||
else if (maj) {
|
||||
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
||||
}
|
||||
else {
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'A');
|
||||
}
|
||||
else {
|
||||
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
||||
}
|
||||
num++;
|
||||
PutChar(pStr, (value & 0xF) - 10 + 'a');
|
||||
}
|
||||
num++;
|
||||
|
||||
return num;
|
||||
return num;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -292,91 +292,91 @@ signed int PutHexa(
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
||||
{
|
||||
char fill;
|
||||
unsigned char width;
|
||||
signed int num = 0;
|
||||
size_t size = 0;
|
||||
char fill;
|
||||
unsigned char width;
|
||||
signed int num = 0;
|
||||
size_t size = 0;
|
||||
|
||||
// Clear the string
|
||||
if (pStr) {
|
||||
// Clear the string
|
||||
if (pStr) {
|
||||
|
||||
*pStr = 0;
|
||||
}
|
||||
*pStr = 0;
|
||||
}
|
||||
|
||||
// Phase string
|
||||
while (*pFormat != 0 && size < length) {
|
||||
// Phase string
|
||||
while (*pFormat != 0 && size < length) {
|
||||
|
||||
// Normal character
|
||||
if (*pFormat != '%') {
|
||||
// Normal character
|
||||
if (*pFormat != '%') {
|
||||
|
||||
*pStr++ = *pFormat++;
|
||||
size++;
|
||||
}
|
||||
// Escaped '%'
|
||||
else if (*(pFormat+1) == '%') {
|
||||
*pStr++ = *pFormat++;
|
||||
size++;
|
||||
}
|
||||
// Escaped '%'
|
||||
else if (*(pFormat+1) == '%') {
|
||||
|
||||
*pStr++ = '%';
|
||||
pFormat += 2;
|
||||
size++;
|
||||
}
|
||||
// Token delimiter
|
||||
else {
|
||||
*pStr++ = '%';
|
||||
pFormat += 2;
|
||||
size++;
|
||||
}
|
||||
// Token delimiter
|
||||
else {
|
||||
|
||||
fill = ' ';
|
||||
width = 0;
|
||||
pFormat++;
|
||||
fill = ' ';
|
||||
width = 0;
|
||||
pFormat++;
|
||||
|
||||
// Parse filler
|
||||
if (*pFormat == '0') {
|
||||
// Parse filler
|
||||
if (*pFormat == '0') {
|
||||
|
||||
fill = '0';
|
||||
pFormat++;
|
||||
}
|
||||
fill = '0';
|
||||
pFormat++;
|
||||
}
|
||||
|
||||
// Parse width
|
||||
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
||||
|
||||
width = (width*10) + *pFormat-'0';
|
||||
pFormat++;
|
||||
}
|
||||
// Parse width
|
||||
while ((*pFormat >= '0') && (*pFormat <= '9')) {
|
||||
|
||||
width = (width*10) + *pFormat-'0';
|
||||
pFormat++;
|
||||
}
|
||||
|
||||
// Check if there is enough space
|
||||
if (size + width > length) {
|
||||
// Check if there is enough space
|
||||
if (size + width > length) {
|
||||
|
||||
width = length - size;
|
||||
}
|
||||
|
||||
// Parse type
|
||||
switch (*pFormat) {
|
||||
case 'd':
|
||||
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
||||
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
||||
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
||||
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
||||
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
||||
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
||||
default:
|
||||
return EOF;
|
||||
}
|
||||
width = length - size;
|
||||
}
|
||||
|
||||
// Parse type
|
||||
switch (*pFormat) {
|
||||
case 'd':
|
||||
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
|
||||
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
|
||||
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
|
||||
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
|
||||
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
|
||||
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
|
||||
default:
|
||||
return EOF;
|
||||
}
|
||||
|
||||
pFormat++;
|
||||
pStr += num;
|
||||
size += num;
|
||||
}
|
||||
}
|
||||
pFormat++;
|
||||
pStr += num;
|
||||
size += num;
|
||||
}
|
||||
}
|
||||
|
||||
// NULL-terminated (final \0 is not counted)
|
||||
if (size < length) {
|
||||
// NULL-terminated (final \0 is not counted)
|
||||
if (size < length) {
|
||||
|
||||
*pStr = 0;
|
||||
}
|
||||
else {
|
||||
*pStr = 0;
|
||||
}
|
||||
else {
|
||||
|
||||
*(--pStr) = 0;
|
||||
size--;
|
||||
}
|
||||
*(--pStr) = 0;
|
||||
size--;
|
||||
}
|
||||
|
||||
return size;
|
||||
return size;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -390,14 +390,14 @@ signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int rc;
|
||||
va_list ap;
|
||||
signed int rc;
|
||||
|
||||
va_start(ap, pFormat);
|
||||
rc = vsnprintf(pString, length, pFormat, ap);
|
||||
va_end(ap);
|
||||
va_start(ap, pFormat);
|
||||
rc = vsnprintf(pString, length, pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return rc;
|
||||
return rc;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -410,7 +410,7 @@ signed int snprintf(char *pString, size_t length, const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
||||
{
|
||||
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
||||
return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -422,17 +422,17 @@ signed int vsprintf(char *pString, const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
||||
{
|
||||
char pStr[MAX_STRING_SIZE];
|
||||
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
||||
char pStr[MAX_STRING_SIZE];
|
||||
char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";
|
||||
|
||||
// Write formatted string in buffer
|
||||
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
||||
// Write formatted string in buffer
|
||||
if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {
|
||||
|
||||
fputs(pError, stderr);
|
||||
}
|
||||
fputs(pError, stderr);
|
||||
}
|
||||
|
||||
// Display string
|
||||
return fputs(pStr, pStream);
|
||||
// Display string
|
||||
return fputs(pStr, pStream);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -443,7 +443,7 @@ signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int vprintf(const char *pFormat, va_list ap)
|
||||
{
|
||||
return vfprintf(stdout, pFormat, ap);
|
||||
return vfprintf(stdout, pFormat, ap);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -454,15 +454,15 @@ signed int vprintf(const char *pFormat, va_list ap)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int result;
|
||||
va_list ap;
|
||||
signed int result;
|
||||
|
||||
// Forward call to vfprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vfprintf(pStream, pFormat, ap);
|
||||
va_end(ap);
|
||||
// Forward call to vfprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vfprintf(pStream, pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -472,15 +472,15 @@ signed int fprintf(FILE *pStream, const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int printf(const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int result;
|
||||
va_list ap;
|
||||
signed int result;
|
||||
|
||||
// Forward call to vprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vprintf(pFormat, ap);
|
||||
va_end(ap);
|
||||
// Forward call to vprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vprintf(pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -490,15 +490,15 @@ signed int printf(const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int sprintf(char *pStr, const char *pFormat, ...)
|
||||
{
|
||||
va_list ap;
|
||||
signed int result;
|
||||
va_list ap;
|
||||
signed int result;
|
||||
|
||||
// Forward call to vsprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vsprintf(pStr, pFormat, ap);
|
||||
va_end(ap);
|
||||
// Forward call to vsprintf
|
||||
va_start(ap, pFormat);
|
||||
result = vsprintf(pStr, pFormat, ap);
|
||||
va_end(ap);
|
||||
|
||||
return result;
|
||||
return result;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -507,6 +507,6 @@ signed int sprintf(char *pStr, const char *pFormat, ...)
|
||||
//------------------------------------------------------------------------------
|
||||
signed int puts(const char *pStr)
|
||||
{
|
||||
return fputs(pStr, stdout);
|
||||
return fputs(pStr, stdout);
|
||||
}
|
||||
|
||||
|
||||
@@ -61,33 +61,33 @@
|
||||
//------------------------------------------------------------------------------
|
||||
void * memcpy(void *pDestination, const void *pSource, size_t num)
|
||||
{
|
||||
unsigned char *pByteDestination;
|
||||
unsigned char *pByteSource;
|
||||
unsigned int *pAlignedSource = (unsigned int *) pSource;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pDestination;
|
||||
unsigned char *pByteDestination;
|
||||
unsigned char *pByteSource;
|
||||
unsigned int *pAlignedSource = (unsigned int *) pSource;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pDestination;
|
||||
|
||||
// If num is more than 4 bytes, and both dest. and source are aligned,
|
||||
// then copy dwords
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0)
|
||||
&& (((unsigned int) pAlignedSource & 0x3) == 0)
|
||||
&& (num >= 4)) {
|
||||
// If num is more than 4 bytes, and both dest. and source are aligned,
|
||||
// then copy dwords
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0)
|
||||
&& (((unsigned int) pAlignedSource & 0x3) == 0)
|
||||
&& (num >= 4)) {
|
||||
|
||||
while (num >= 4) {
|
||||
while (num >= 4) {
|
||||
|
||||
*pAlignedDestination++ = *pAlignedSource++;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
*pAlignedDestination++ = *pAlignedSource++;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
|
||||
// Copy remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
pByteSource = (unsigned char *) pAlignedSource;
|
||||
while (num--) {
|
||||
// Copy remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
pByteSource = (unsigned char *) pAlignedSource;
|
||||
while (num--) {
|
||||
|
||||
*pByteDestination++ = *pByteSource++;
|
||||
}
|
||||
*pByteDestination++ = *pByteSource++;
|
||||
}
|
||||
|
||||
return pDestination;
|
||||
return pDestination;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
@@ -99,23 +99,23 @@ void * memcpy(void *pDestination, const void *pSource, size_t num)
|
||||
//------------------------------------------------------------------------------
|
||||
void * memset(void *pBuffer, int value, size_t num)
|
||||
{
|
||||
unsigned char *pByteDestination;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pBuffer;
|
||||
unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value;
|
||||
unsigned char *pByteDestination;
|
||||
unsigned int *pAlignedDestination = (unsigned int *) pBuffer;
|
||||
unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value;
|
||||
|
||||
// Set words if possible
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {
|
||||
while (num >= 4) {
|
||||
*pAlignedDestination++ = alignedValue;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
// Set remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
while (num--) {
|
||||
*pByteDestination++ = value;
|
||||
}
|
||||
return pBuffer;
|
||||
// Set words if possible
|
||||
if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {
|
||||
while (num >= 4) {
|
||||
*pAlignedDestination++ = alignedValue;
|
||||
num -= 4;
|
||||
}
|
||||
}
|
||||
// Set remaining bytes
|
||||
pByteDestination = (unsigned char *) pAlignedDestination;
|
||||
while (num--) {
|
||||
*pByteDestination++ = value;
|
||||
}
|
||||
return pBuffer;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -126,16 +126,16 @@ void * memset(void *pBuffer, int value, size_t num)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strchr(const char *pString, int character)
|
||||
{
|
||||
char * p = (char *)pString;
|
||||
char c = character & 0xFF;
|
||||
char * p = (char *)pString;
|
||||
char c = character & 0xFF;
|
||||
|
||||
while(*p != c) {
|
||||
if (*p == 0) {
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return p;
|
||||
while(*p != c) {
|
||||
if (*p == 0) {
|
||||
return 0;
|
||||
}
|
||||
p++;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -144,12 +144,12 @@ char * strchr(const char *pString, int character)
|
||||
//-----------------------------------------------------------------------------
|
||||
size_t strlen(const char *pString)
|
||||
{
|
||||
unsigned int length = 0;
|
||||
unsigned int length = 0;
|
||||
|
||||
while(*pString++ != 0) {
|
||||
length++;
|
||||
}
|
||||
return length;
|
||||
while(*pString++ != 0) {
|
||||
length++;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,14 +161,14 @@ size_t strlen(const char *pString)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strrchr(const char *pString, int character)
|
||||
{
|
||||
char *p = 0;
|
||||
char *p = 0;
|
||||
|
||||
while(*pString != 0) {
|
||||
if (*pString++ == character) {
|
||||
p = (char*)pString;
|
||||
}
|
||||
}
|
||||
return p;
|
||||
while(*pString != 0) {
|
||||
if (*pString++ == character) {
|
||||
p = (char*)pString;
|
||||
}
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -179,10 +179,10 @@ char * strrchr(const char *pString, int character)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strcpy(char *pDestination, const char *pSource)
|
||||
{
|
||||
char *pSaveDest = pDestination;
|
||||
char *pSaveDest = pDestination;
|
||||
|
||||
for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);
|
||||
return pSaveDest;
|
||||
for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);
|
||||
return pSaveDest;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -196,22 +196,22 @@ char * strcpy(char *pDestination, const char *pSource)
|
||||
//-----------------------------------------------------------------------------
|
||||
int strncmp(const char *pString1, const char *pString2, size_t count)
|
||||
{
|
||||
int r;
|
||||
int r;
|
||||
|
||||
while(count) {
|
||||
r = *pString1 - *pString2;
|
||||
if (r == 0) {
|
||||
if (*pString1 == 0) {
|
||||
break;
|
||||
}
|
||||
pString1++;
|
||||
pString2++;
|
||||
count--;
|
||||
continue;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
while(count) {
|
||||
r = *pString1 - *pString2;
|
||||
if (r == 0) {
|
||||
if (*pString1 == 0) {
|
||||
break;
|
||||
}
|
||||
pString1++;
|
||||
pString2++;
|
||||
count--;
|
||||
continue;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -223,17 +223,17 @@ int strncmp(const char *pString1, const char *pString2, size_t count)
|
||||
//-----------------------------------------------------------------------------
|
||||
char * strncpy(char *pDestination, const char *pSource, size_t count)
|
||||
{
|
||||
char *pSaveDest = pDestination;
|
||||
char *pSaveDest = pDestination;
|
||||
|
||||
while (count) {
|
||||
*pDestination = *pSource;
|
||||
if (*pSource == 0) {
|
||||
break;
|
||||
}
|
||||
pDestination++;
|
||||
pSource++;
|
||||
count--;
|
||||
}
|
||||
return pSaveDest;
|
||||
while (count) {
|
||||
*pDestination = *pSource;
|
||||
if (*pSource == 0) {
|
||||
break;
|
||||
}
|
||||
pDestination++;
|
||||
pSource++;
|
||||
count--;
|
||||
}
|
||||
return pSaveDest;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user