<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9918">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
Harald Welte: Looks good to me, approved
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">replace leading spaces with tabs<br><br>Change-Id: I86783eba0827b58303b10310e9f6b9625e1a27f1<br>---<br>M firmware/apps/cardem/main.c<br>M firmware/apps/trace/main.c<br>M firmware/apps/triple_play/main.c<br>M firmware/libboard/common/source/board_cstartup_gnu.c<br>M firmware/libboard/common/source/board_lowlevel.c<br>M firmware/libboard/common/source/led.c<br>M firmware/libboard/common/source/uart_console.c<br>M firmware/libcommon/include/assert.h<br>M firmware/libcommon/include/cciddriver.h<br>M firmware/libcommon/include/iso7816_4.h<br>M firmware/libcommon/include/simtrace.h<br>M firmware/libcommon/source/cciddriver.c<br>M firmware/libcommon/source/iso7816_4.c<br>M firmware/libcommon/source/mode_cardemu.c<br>M firmware/libcommon/source/mode_ccid.c<br>M firmware/libcommon/source/stdio.c<br>M firmware/libcommon/source/string.c<br>17 files changed, 1,726 insertions(+), 1,726 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/apps/cardem/main.c b/firmware/apps/cardem/main.c</span><br><span>index 9241c06..ae46794 100644</span><br><span>--- a/firmware/apps/cardem/main.c</span><br><span>+++ b/firmware/apps/cardem/main.c</span><br><span>@@ -152,7 +152,7 @@</span><br><span> </span><br><span> EEFC_ReadUniqueID(g_unique_id);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r\n\r"</span><br><span> "=============================================================================\n\r"</span><br><span> "SIMtrace2 firmware " GIT_VERSION " (C) 2010-2016 by Harald Welte\n\r"</span><br><span> "=============================================================================\n\r");</span><br><span>diff --git a/firmware/apps/trace/main.c b/firmware/apps/trace/main.c</span><br><span>index d2fddf9..6b6d70b 100644</span><br><span>--- a/firmware/apps/trace/main.c</span><br><span>+++ b/firmware/apps/trace/main.c</span><br><span>@@ -155,7 +155,7 @@</span><br><span> </span><br><span> EEFC_ReadUniqueID(g_unique_id);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r\n\r"</span><br><span> "=============================================================================\n\r"</span><br><span> "SIMtrace2 firmware " GIT_VERSION " (C) 2010-2016 by Harald Welte\n\r"</span><br><span> "=============================================================================\n\r");</span><br><span>diff --git a/firmware/apps/triple_play/main.c b/firmware/apps/triple_play/main.c</span><br><span>index 47d53af..b81abdd 100644</span><br><span>--- a/firmware/apps/triple_play/main.c</span><br><span>+++ b/firmware/apps/triple_play/main.c</span><br><span>@@ -151,7 +151,7 @@</span><br><span> </span><br><span> EEFC_ReadUniqueID(g_unique_id);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("\r\n\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\r\n\r\n"</span><br><span> "=============================================================================\r\n"</span><br><span> "SIMtrace2 firmware " GIT_REVISION " (C) 2010-2017 by Harald Welte\r\n"</span><br><span> "=============================================================================\r\n");</span><br><span>diff --git a/firmware/libboard/common/source/board_cstartup_gnu.c b/firmware/libboard/common/source/board_cstartup_gnu.c</span><br><span>index 0e8bb87..e82a2fb 100644</span><br><span>--- a/firmware/libboard/common/source/board_cstartup_gnu.c</span><br><span>+++ b/firmware/libboard/common/source/board_cstartup_gnu.c</span><br><span>@@ -71,59 +71,59 @@</span><br><span> __attribute__((section(".vectors")))</span><br><span> IntFunc exception_table[] = {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure Initial Stack Pointer, using linker-generated symbols */</span><br><span style="color: hsl(0, 100%, 40%);">- (IntFunc)(&pdwStack[STACK_SIZE-1]),</span><br><span style="color: hsl(0, 100%, 40%);">- ResetException,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure Initial Stack Pointer, using linker-generated symbols */</span><br><span style="color: hsl(120, 100%, 40%);">+ (IntFunc)(&pdwStack[STACK_SIZE-1]),</span><br><span style="color: hsl(120, 100%, 40%);">+ ResetException,</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- NMI_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- HardFault_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- MemManage_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- BusFault_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- UsageFault_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- 0, 0, 0, 0, /* Reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- SVC_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- DebugMon_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- 0, /* Reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- PendSV_Handler,</span><br><span style="color: hsl(0, 100%, 40%);">- SysTick_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ NMI_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ HardFault_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ MemManage_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ BusFault_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ UsageFault_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0, 0, 0, 0, /* Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+ SVC_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ DebugMon_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0, /* Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+ PendSV_Handler,</span><br><span style="color: hsl(120, 100%, 40%);">+ SysTick_Handler,</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configurable interrupts */</span><br><span style="color: hsl(0, 100%, 40%);">- SUPC_IrqHandler, /* 0 Supply Controller */</span><br><span style="color: hsl(0, 100%, 40%);">- RSTC_IrqHandler, /* 1 Reset Controller */</span><br><span style="color: hsl(0, 100%, 40%);">- RTC_IrqHandler, /* 2 Real Time Clock */</span><br><span style="color: hsl(0, 100%, 40%);">- RTT_IrqHandler, /* 3 Real Time Timer */</span><br><span style="color: hsl(0, 100%, 40%);">- WDT_IrqHandler, /* 4 Watchdog Timer */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC_IrqHandler, /* 5 PMC */</span><br><span style="color: hsl(0, 100%, 40%);">- EEFC_IrqHandler, /* 6 EEFC */</span><br><span style="color: hsl(0, 100%, 40%);">- IrqHandlerNotUsed, /* 7 Reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- UART0_IrqHandler, /* 8 UART0 */</span><br><span style="color: hsl(0, 100%, 40%);">- UART1_IrqHandler, /* 9 UART1 */</span><br><span style="color: hsl(0, 100%, 40%);">- SMC_IrqHandler, /* 10 SMC */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOA_IrqHandler, /* 11 Parallel IO Controller A */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB_IrqHandler, /* 12 Parallel IO Controller B */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOC_IrqHandler, /* 13 Parallel IO Controller C */</span><br><span style="color: hsl(0, 100%, 40%);">- USART0_IrqHandler, /* 14 USART 0 */</span><br><span style="color: hsl(0, 100%, 40%);">- USART1_IrqHandler, /* 15 USART 1 */</span><br><span style="color: hsl(0, 100%, 40%);">- IrqHandlerNotUsed, /* 16 Reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- IrqHandlerNotUsed, /* 17 Reserved */</span><br><span style="color: hsl(0, 100%, 40%);">- MCI_IrqHandler, /* 18 MCI */</span><br><span style="color: hsl(0, 100%, 40%);">- TWI0_IrqHandler, /* 19 TWI 0 */</span><br><span style="color: hsl(0, 100%, 40%);">- TWI1_IrqHandler, /* 20 TWI 1 */</span><br><span style="color: hsl(0, 100%, 40%);">- SPI_IrqHandler, /* 21 SPI */</span><br><span style="color: hsl(0, 100%, 40%);">- SSC_IrqHandler, /* 22 SSC */</span><br><span style="color: hsl(0, 100%, 40%);">- TC0_IrqHandler, /* 23 Timer Counter 0 */</span><br><span style="color: hsl(0, 100%, 40%);">- TC1_IrqHandler, /* 24 Timer Counter 1 */</span><br><span style="color: hsl(0, 100%, 40%);">- TC2_IrqHandler, /* 25 Timer Counter 2 */</span><br><span style="color: hsl(0, 100%, 40%);">- TC3_IrqHandler, /* 26 Timer Counter 3 */</span><br><span style="color: hsl(0, 100%, 40%);">- TC4_IrqHandler, /* 27 Timer Counter 4 */</span><br><span style="color: hsl(0, 100%, 40%);">- TC5_IrqHandler, /* 28 Timer Counter 5 */</span><br><span style="color: hsl(0, 100%, 40%);">- ADC_IrqHandler, /* 29 ADC controller */</span><br><span style="color: hsl(0, 100%, 40%);">- DAC_IrqHandler, /* 30 DAC controller */</span><br><span style="color: hsl(0, 100%, 40%);">- PWM_IrqHandler, /* 31 PWM */</span><br><span style="color: hsl(0, 100%, 40%);">- CRCCU_IrqHandler, /* 32 CRC Calculation Unit */</span><br><span style="color: hsl(0, 100%, 40%);">- ACC_IrqHandler, /* 33 Analog Comparator */</span><br><span style="color: hsl(0, 100%, 40%);">- USBD_IrqHandler, /* 34 USB Device Port */</span><br><span style="color: hsl(0, 100%, 40%);">- IrqHandlerNotUsed /* 35 not used */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configurable interrupts */</span><br><span style="color: hsl(120, 100%, 40%);">+ SUPC_IrqHandler, /* 0 Supply Controller */</span><br><span style="color: hsl(120, 100%, 40%);">+ RSTC_IrqHandler, /* 1 Reset Controller */</span><br><span style="color: hsl(120, 100%, 40%);">+ RTC_IrqHandler, /* 2 Real Time Clock */</span><br><span style="color: hsl(120, 100%, 40%);">+ RTT_IrqHandler, /* 3 Real Time Timer */</span><br><span style="color: hsl(120, 100%, 40%);">+ WDT_IrqHandler, /* 4 Watchdog Timer */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC_IrqHandler, /* 5 PMC */</span><br><span style="color: hsl(120, 100%, 40%);">+ EEFC_IrqHandler, /* 6 EEFC */</span><br><span style="color: hsl(120, 100%, 40%);">+ IrqHandlerNotUsed, /* 7 Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+ UART0_IrqHandler, /* 8 UART0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ UART1_IrqHandler, /* 9 UART1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ SMC_IrqHandler, /* 10 SMC */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOA_IrqHandler, /* 11 Parallel IO Controller A */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB_IrqHandler, /* 12 Parallel IO Controller B */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOC_IrqHandler, /* 13 Parallel IO Controller C */</span><br><span style="color: hsl(120, 100%, 40%);">+ USART0_IrqHandler, /* 14 USART 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ USART1_IrqHandler, /* 15 USART 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ IrqHandlerNotUsed, /* 16 Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+ IrqHandlerNotUsed, /* 17 Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+ MCI_IrqHandler, /* 18 MCI */</span><br><span style="color: hsl(120, 100%, 40%);">+ TWI0_IrqHandler, /* 19 TWI 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ TWI1_IrqHandler, /* 20 TWI 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ SPI_IrqHandler, /* 21 SPI */</span><br><span style="color: hsl(120, 100%, 40%);">+ SSC_IrqHandler, /* 22 SSC */</span><br><span style="color: hsl(120, 100%, 40%);">+ TC0_IrqHandler, /* 23 Timer Counter 0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ TC1_IrqHandler, /* 24 Timer Counter 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ TC2_IrqHandler, /* 25 Timer Counter 2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ TC3_IrqHandler, /* 26 Timer Counter 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ TC4_IrqHandler, /* 27 Timer Counter 4 */</span><br><span style="color: hsl(120, 100%, 40%);">+ TC5_IrqHandler, /* 28 Timer Counter 5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ADC_IrqHandler, /* 29 ADC controller */</span><br><span style="color: hsl(120, 100%, 40%);">+ DAC_IrqHandler, /* 30 DAC controller */</span><br><span style="color: hsl(120, 100%, 40%);">+ PWM_IrqHandler, /* 31 PWM */</span><br><span style="color: hsl(120, 100%, 40%);">+ CRCCU_IrqHandler, /* 32 CRC Calculation Unit */</span><br><span style="color: hsl(120, 100%, 40%);">+ ACC_IrqHandler, /* 33 Analog Comparator */</span><br><span style="color: hsl(120, 100%, 40%);">+ USBD_IrqHandler, /* 34 USB Device Port */</span><br><span style="color: hsl(120, 100%, 40%);">+ IrqHandlerNotUsed /* 35 not used */</span><br><span> };</span><br><span> </span><br><span> #if defined(BOARD_USB_DFU) && defined(APPLICATION_dfu)</span><br><span>@@ -153,56 +153,56 @@</span><br><span> */</span><br><span> void ResetException( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t *pSrc, *pDest ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t *pSrc, *pDest ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Low level Initialize */</span><br><span style="color: hsl(0, 100%, 40%);">- LowLevelInit() ;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Low level Initialize */</span><br><span style="color: hsl(120, 100%, 40%);">+ LowLevelInit() ;</span><br><span> </span><br><span> </span><br><span> #if defined(BOARD_USB_DFU) && defined(APPLICATION_dfu)</span><br><span style="color: hsl(0, 100%, 40%);">- if (!USBDFU_OverrideEnterDFU()) {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_Exit();</span><br><span style="color: hsl(0, 100%, 40%);">- __disable_irq();</span><br><span style="color: hsl(0, 100%, 40%);">- BootIntoApp();</span><br><span style="color: hsl(0, 100%, 40%);">- /* Infinite loop */</span><br><span style="color: hsl(0, 100%, 40%);">- while ( 1 ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!USBDFU_OverrideEnterDFU()) {</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_Exit();</span><br><span style="color: hsl(120, 100%, 40%);">+ __disable_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+ BootIntoApp();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Infinite loop */</span><br><span style="color: hsl(120, 100%, 40%);">+ while ( 1 ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the relocate segment */</span><br><span style="color: hsl(0, 100%, 40%);">- pSrc = &_etext ;</span><br><span style="color: hsl(0, 100%, 40%);">- pDest = &_srelocate ;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize the relocate segment */</span><br><span style="color: hsl(120, 100%, 40%);">+ pSrc = &_etext ;</span><br><span style="color: hsl(120, 100%, 40%);">+ pDest = &_srelocate ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( pSrc != pDest )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- for ( ; pDest < &_erelocate ; )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- *pDest++ = *pSrc++ ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( pSrc != pDest )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( ; pDest < &_erelocate ; )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pDest++ = *pSrc++ ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Clear the zero segment */</span><br><span style="color: hsl(0, 100%, 40%);">- for ( pDest = &_szero ; pDest < &_ezero ; )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- *pDest++ = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clear the zero segment */</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( pDest = &_szero ; pDest < &_ezero ; )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pDest++ = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Set the vector table base address */</span><br><span style="color: hsl(0, 100%, 40%);">- pSrc = (uint32_t *)&_sfixed;</span><br><span style="color: hsl(0, 100%, 40%);">- SCB->VTOR = ( (uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- if ( ((uint32_t)pSrc >= IRAM_ADDR) && ((uint32_t)pSrc < IRAM_ADDR+IRAM_SIZE) )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set the vector table base address */</span><br><span style="color: hsl(120, 100%, 40%);">+ pSrc = (uint32_t *)&_sfixed;</span><br><span style="color: hsl(120, 100%, 40%);">+ SCB->VTOR = ( (uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ((uint32_t)pSrc >= IRAM_ADDR) && ((uint32_t)pSrc < IRAM_ADDR+IRAM_SIZE) )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span> SCB->VTOR |= 1 << SCB_VTOR_TBLBASE_Pos ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* App should have disabled interrupts during the transition */</span><br><span style="color: hsl(0, 100%, 40%);">- __enable_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+ /* App should have disabled interrupts during the transition */</span><br><span style="color: hsl(120, 100%, 40%);">+ __enable_irq();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Branch to main function */</span><br><span style="color: hsl(0, 100%, 40%);">- main() ;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Branch to main function */</span><br><span style="color: hsl(120, 100%, 40%);">+ main() ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Infinite loop */</span><br><span style="color: hsl(0, 100%, 40%);">- while ( 1 ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Infinite loop */</span><br><span style="color: hsl(120, 100%, 40%);">+ while ( 1 ) ;</span><br><span> }</span><br><span> </span><br><span>diff --git a/firmware/libboard/common/source/board_lowlevel.c b/firmware/libboard/common/source/board_lowlevel.c</span><br><span>index b37719c..b82f6f3 100644</span><br><span>--- a/firmware/libboard/common/source/board_lowlevel.c</span><br><span>+++ b/firmware/libboard/common/source/board_lowlevel.c</span><br><span>@@ -50,15 +50,15 @@</span><br><span> #if (BOARD_MAINOSC == 18432000)</span><br><span> /* Clock settings at 48MHz for 18 MHz crystal */</span><br><span> #define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_MULA(13-1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_DIVA(5))</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_MULA(13-1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_DIVA(5))</span><br><span> #elif (BOARD_MAINOSC == 12000000)</span><br><span> /* QMod has 12 MHz clock, so multply by 8 (96 MHz) and divide by 2 */</span><br><span> #define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_MULA(8-1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_DIVA(2))</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_MULA(8-1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_DIVA(2))</span><br><span> #else</span><br><span> #error "Please define PLLA config for your MAINOSC frequency"</span><br><span> #endif /* MAINOSC */</span><br><span>@@ -66,19 +66,19 @@</span><br><span> #if (BOARD_MAINOSC == 18432000)</span><br><span> /* Clock settings at 64MHz for 18 MHz crystal: 64.512 MHz */</span><br><span> #define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_MULA(7-1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_DIVA(2))</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_MULA(7-1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_DIVA(2))</span><br><span> #elif (BOARD_MAINOSC == 12000000)</span><br><span> /* QMod has 12 MHz clock, so multply by 10 / div by 2: 60 MHz */</span><br><span> #define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_MULA(10-1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(0, 100%, 40%);">- | CKGR_PLLAR_DIVA(2))</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_MULA(10-1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_PLLACOUNT(0x1) \</span><br><span style="color: hsl(120, 100%, 40%);">+ | CKGR_PLLAR_DIVA(2))</span><br><span> #error "Please define PLLA config for your MAINOSC frequency"</span><br><span> #endif /* MAINOSC */</span><br><span> #else</span><br><span style="color: hsl(0, 100%, 40%);">- #error "No PLL settings for current BOARD_MCK."</span><br><span style="color: hsl(120, 100%, 40%);">+ #error "No PLL settings for current BOARD_MCK."</span><br><span> #endif</span><br><span> </span><br><span> #if (BOARD_MAINOSC == 12000000)</span><br><span>@@ -117,85 +117,85 @@</span><br><span> */</span><br><span> extern WEAK void LowLevelInit( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t timeout = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t timeout = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure the Supply Monitor to reset the CPU in case VDDIO is</span><br><span style="color: hsl(0, 100%, 40%);">- * lower than 3.0V. As we run the board on 3.3V, any lower voltage</span><br><span style="color: hsl(0, 100%, 40%);">- * might be some kind of leakage that creeps in some way, but is not</span><br><span style="color: hsl(0, 100%, 40%);">- * the "official" power supply */</span><br><span style="color: hsl(0, 100%, 40%);">- SUPC->SUPC_SMMR = SUPC_SMMR_SMTH_3_0V | SUPC_SMMR_SMSMPL_CSM |</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure the Supply Monitor to reset the CPU in case VDDIO is</span><br><span style="color: hsl(120, 100%, 40%);">+ * lower than 3.0V. As we run the board on 3.3V, any lower voltage</span><br><span style="color: hsl(120, 100%, 40%);">+ * might be some kind of leakage that creeps in some way, but is not</span><br><span style="color: hsl(120, 100%, 40%);">+ * the "official" power supply */</span><br><span style="color: hsl(120, 100%, 40%);">+ SUPC->SUPC_SMMR = SUPC_SMMR_SMTH_3_0V | SUPC_SMMR_SMSMPL_CSM |</span><br><span> SUPC_SMMR_SMRSTEN_ENABLE;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* enable both LED and green LED */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOA->PIO_PER |= PIO_LED_RED | PIO_LED_GREEN;</span><br><span style="color: hsl(0, 100%, 40%);">- PIOA->PIO_OER |= PIO_LED_RED | PIO_LED_GREEN;</span><br><span style="color: hsl(0, 100%, 40%);">- PIOA->PIO_CODR |= PIO_LED_RED | PIO_LED_GREEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* enable both LED and green LED */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOA->PIO_PER |= PIO_LED_RED | PIO_LED_GREEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOA->PIO_OER |= PIO_LED_RED | PIO_LED_GREEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOA->PIO_CODR |= PIO_LED_RED | PIO_LED_GREEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Set 3 FWS for Embedded Flash Access */</span><br><span style="color: hsl(0, 100%, 40%);">- EFC->EEFC_FMR = EEFC_FMR_FWS(3);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set 3 FWS for Embedded Flash Access */</span><br><span style="color: hsl(120, 100%, 40%);">+ EFC->EEFC_FMR = EEFC_FMR_FWS(3);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Select external slow clock */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Select external slow clock */</span><br><span> /* if ((SUPC->SUPC_SR & SUPC_SR_OSCSEL) != SUPC_SR_OSCSEL_CRYST)</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- SUPC->SUPC_CR = (uint32_t)(SUPC_CR_XTALSEL_CRYSTAL_SEL | SUPC_CR_KEY(0xA5));</span><br><span style="color: hsl(0, 100%, 40%);">- timeout = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL_CRYST) );</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ SUPC->SUPC_CR = (uint32_t)(SUPC_CR_XTALSEL_CRYSTAL_SEL | SUPC_CR_KEY(0xA5));</span><br><span style="color: hsl(120, 100%, 40%);">+ timeout = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL_CRYST) );</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> */</span><br><span> </span><br><span> #ifndef qmod</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize main oscillator */</span><br><span style="color: hsl(0, 100%, 40%);">- if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;</span><br><span style="color: hsl(0, 100%, 40%);">- timeout = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize main oscillator */</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ timeout = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Switch to 3-20MHz Xtal oscillator */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB->PIO_PDR = (1 << 8) | (1 << 9);</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB->PIO_PUDR = (1 << 8) | (1 << 9);</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB->PIO_PPDDR = (1 << 8) | (1 << 9);</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;</span><br><span style="color: hsl(0, 100%, 40%);">- /* wait for Main XTAL oscillator stabilization */</span><br><span style="color: hsl(0, 100%, 40%);">- timeout = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Switch to 3-20MHz Xtal oscillator */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB->PIO_PDR = (1 << 8) | (1 << 9);</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB->PIO_PUDR = (1 << 8) | (1 << 9);</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB->PIO_PPDDR = (1 << 8) | (1 << 9);</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* wait for Main XTAL oscillator stabilization */</span><br><span style="color: hsl(120, 100%, 40%);">+ timeout = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));</span><br><span> #else</span><br><span style="color: hsl(0, 100%, 40%);">- /* QMOD has external 12MHz clock source */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB->PIO_PDR = (1 << 9);</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB->PIO_PUDR = (1 << 9);</span><br><span style="color: hsl(0, 100%, 40%);">- PIOB->PIO_PPDDR = (1 << 9);</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY| CKGR_MOR_MOSCSEL;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* QMOD has external 12MHz clock source */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB->PIO_PDR = (1 << 9);</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB->PIO_PUDR = (1 << 9);</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOB->PIO_PPDDR = (1 << 9);</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY| CKGR_MOR_MOSCSEL;</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* disable the red LED after main clock initialization */</span><br><span style="color: hsl(0, 100%, 40%);">- PIOA->PIO_SODR = PIO_LED_RED;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* disable the red LED after main clock initialization */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIOA->PIO_SODR = PIO_LED_RED;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* "switch" to main clock as master clock source (should already be the case */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;</span><br><span style="color: hsl(0, 100%, 40%);">- /* wait for master clock to be ready */</span><br><span style="color: hsl(0, 100%, 40%);">- for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );</span><br><span style="color: hsl(120, 100%, 40%);">+ /* "switch" to main clock as master clock source (should already be the case */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* wait for master clock to be ready */</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize PLLA */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->CKGR_PLLAR = BOARD_PLLAR;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Wait for PLLA to lock */</span><br><span style="color: hsl(0, 100%, 40%);">- timeout = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (timeout++ < CLOCK_TIMEOUT));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize PLLA */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->CKGR_PLLAR = BOARD_PLLAR;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Wait for PLLA to lock */</span><br><span style="color: hsl(120, 100%, 40%);">+ timeout = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (timeout++ < CLOCK_TIMEOUT));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Switch to main clock (again ?!?) */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->PMC_MCKR = (BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;</span><br><span style="color: hsl(0, 100%, 40%);">- /* wait for master clock to be ready */</span><br><span style="color: hsl(0, 100%, 40%);">- for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Switch to main clock (again ?!?) */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->PMC_MCKR = (BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* wait for master clock to be ready */</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* switch to PLLA as master clock source */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->PMC_MCKR = BOARD_MCKR ;</span><br><span style="color: hsl(0, 100%, 40%);">- /* wait for master clock to be ready */</span><br><span style="color: hsl(0, 100%, 40%);">- for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );</span><br><span style="color: hsl(120, 100%, 40%);">+ /* switch to PLLA as master clock source */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->PMC_MCKR = BOARD_MCKR ;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* wait for master clock to be ready */</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure SysTick for 1ms */</span><br><span style="color: hsl(0, 100%, 40%);">- SysTick_Config(BOARD_MCK/1000);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure SysTick for 1ms */</span><br><span style="color: hsl(120, 100%, 40%);">+ SysTick_Config(BOARD_MCK/1000);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- _ConfigureUsbClock();</span><br><span style="color: hsl(120, 100%, 40%);">+ _ConfigureUsbClock();</span><br><span> }</span><br><span> </span><br><span> /* SysTick based delay function */</span><br><span>diff --git a/firmware/libboard/common/source/led.c b/firmware/libboard/common/source/led.c</span><br><span>index cffff70..e3293b6 100644</span><br><span>--- a/firmware/libboard/common/source/led.c</span><br><span>+++ b/firmware/libboard/common/source/led.c</span><br><span>@@ -35,9 +35,9 @@</span><br><span> ASSERT(led < PIO_LISTSIZE(pinsLeds));</span><br><span> </span><br><span> if (on)</span><br><span style="color: hsl(0, 100%, 40%);">- PIO_Clear(&pinsLeds[led]);</span><br><span style="color: hsl(120, 100%, 40%);">+ PIO_Clear(&pinsLeds[led]);</span><br><span> else</span><br><span style="color: hsl(0, 100%, 40%);">- PIO_Set(&pinsLeds[led]);</span><br><span style="color: hsl(120, 100%, 40%);">+ PIO_Set(&pinsLeds[led]);</span><br><span> }</span><br><span> </span><br><span> /* LED blinking code */</span><br><span>diff --git a/firmware/libboard/common/source/uart_console.c b/firmware/libboard/common/source/uart_console.c</span><br><span>index 88c9166..3ce7331 100644</span><br><span>--- a/firmware/libboard/common/source/uart_console.c</span><br><span>+++ b/firmware/libboard/common/source/uart_console.c</span><br><span>@@ -66,41 +66,41 @@</span><br><span> */</span><br><span> extern void UART_Configure( uint32_t baudrate, uint32_t masterClock)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- const Pin pPins[] = CONSOLE_PINS;</span><br><span style="color: hsl(0, 100%, 40%);">- Uart *pUart = CONSOLE_UART;</span><br><span style="color: hsl(120, 100%, 40%);">+ const Pin pPins[] = CONSOLE_PINS;</span><br><span style="color: hsl(120, 100%, 40%);">+ Uart *pUart = CONSOLE_UART;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure PIO */</span><br><span style="color: hsl(0, 100%, 40%);">- PIO_Configure(pPins, PIO_LISTSIZE(pPins));</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure PIO */</span><br><span style="color: hsl(120, 100%, 40%);">+ PIO_Configure(pPins, PIO_LISTSIZE(pPins));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure PMC */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC->PMC_PCER0 = 1 << CONSOLE_ID;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure PMC */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC->PMC_PCER0 = 1 << CONSOLE_ID;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Reset and disable receiver & transmitter */</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX</span><br><span style="color: hsl(0, 100%, 40%);">- | UART_CR_RXDIS | UART_CR_TXDIS;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Reset and disable receiver & transmitter */</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX</span><br><span style="color: hsl(120, 100%, 40%);">+ | UART_CR_RXDIS | UART_CR_TXDIS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure mode */</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_MR = UART_MR_PAR_NO;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure mode */</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_MR = UART_MR_PAR_NO;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure baudrate */</span><br><span style="color: hsl(0, 100%, 40%);">- /* Asynchronous, no oversampling */</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_BRGR = (masterClock / baudrate) / 16;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure baudrate */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Asynchronous, no oversampling */</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_BRGR = (masterClock / baudrate) / 16;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Disable PDC channel */</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Disable PDC channel */</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Reset transmit ring buffer */</span><br><span style="color: hsl(0, 100%, 40%);">- rbuf_reset(&uart_tx_buffer);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Reset transmit ring buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+ rbuf_reset(&uart_tx_buffer);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Enable TX interrupts */</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_IER = UART_IER_TXRDY;</span><br><span style="color: hsl(0, 100%, 40%);">- NVIC_EnableIRQ(CONSOLE_IRQ);</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- /* Enable receiver and transmitter */</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Enable TX interrupts */</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_IER = UART_IER_TXRDY;</span><br><span style="color: hsl(120, 100%, 40%);">+ NVIC_EnableIRQ(CONSOLE_IRQ);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Enable receiver and transmitter */</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Remember the configuration is complete */</span><br><span style="color: hsl(0, 100%, 40%);">- _ucIsConsoleInitialized=1 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Remember the configuration is complete */</span><br><span style="color: hsl(120, 100%, 40%);">+ _ucIsConsoleInitialized=1 ;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -140,22 +140,22 @@</span><br><span> */</span><br><span> extern void UART_PutChar( uint8_t c )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- Uart *pUart = CONSOLE_UART ;</span><br><span style="color: hsl(120, 100%, 40%);">+ Uart *pUart = CONSOLE_UART ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize console is not already done */</span><br><span style="color: hsl(0, 100%, 40%);">- if ( !_ucIsConsoleInitialized )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize console is not already done */</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( !_ucIsConsoleInitialized )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Only store input if buffer is not full, else drop it */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!rbuf_is_full(&uart_tx_buffer)) {</span><br><span style="color: hsl(0, 100%, 40%);">- rbuf_write(&uart_tx_buffer, c);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(pUart->UART_IMR & UART_IMR_TXRDY)) {</span><br><span style="color: hsl(0, 100%, 40%);">- pUart->UART_IER = UART_IER_TXRDY;</span><br><span style="color: hsl(0, 100%, 40%);">- CONSOLE_ISR();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Only store input if buffer is not full, else drop it */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!rbuf_is_full(&uart_tx_buffer)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rbuf_write(&uart_tx_buffer, c);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(pUart->UART_IMR & UART_IMR_TXRDY)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ pUart->UART_IER = UART_IER_TXRDY;</span><br><span style="color: hsl(120, 100%, 40%);">+ CONSOLE_ISR();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -166,17 +166,17 @@</span><br><span> */</span><br><span> extern uint32_t UART_GetChar( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- Uart *pUart = CONSOLE_UART ;</span><br><span style="color: hsl(120, 100%, 40%);">+ Uart *pUart = CONSOLE_UART ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( !_ucIsConsoleInitialized )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( !_ucIsConsoleInitialized )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 )</span><br><span style="color: hsl(0, 100%, 40%);">- WDT_Restart(WDT);</span><br><span style="color: hsl(120, 100%, 40%);">+ while ( (pUart->UART_SR & UART_SR_RXRDY) == 0 )</span><br><span style="color: hsl(120, 100%, 40%);">+ WDT_Restart(WDT);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return pUart->UART_RHR ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return pUart->UART_RHR ;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -186,14 +186,14 @@</span><br><span> */</span><br><span> extern uint32_t UART_IsRxReady( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- Uart *pUart = CONSOLE_UART;</span><br><span style="color: hsl(120, 100%, 40%);">+ Uart *pUart = CONSOLE_UART;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( !_ucIsConsoleInitialized )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( !_ucIsConsoleInitialized )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_Configure( CONSOLE_BAUDRATE, BOARD_MCK ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return (pUart->UART_SR & UART_SR_RXRDY) > 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return (pUart->UART_SR & UART_SR_RXRDY) > 0 ;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -204,14 +204,14 @@</span><br><span> */</span><br><span> extern void UART_DumpFrame( uint8_t* pucFrame, uint32_t dwSize )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dw ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t dw ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for ( dw=0 ; dw < dwSize ; dw++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "%02X ", pucFrame[dw] ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( dw=0 ; dw < dwSize ; dw++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "%02X ", pucFrame[dw] ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\r" ) ;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -223,62 +223,62 @@</span><br><span> */</span><br><span> extern void UART_DumpMemory( uint8_t* pucBuffer, uint32_t dwSize, uint32_t dwAddress )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t i ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t j ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dwLastLineStart ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t* pucTmp ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t i ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t j ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t dwLastLineStart ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t* pucTmp ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for ( i=0 ; i < (dwSize / 16) ; i++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "0x%08X: ", (unsigned int)(dwAddress + (i*16)) ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- pucTmp = (uint8_t*)&pucBuffer[i*16] ;</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( i=0 ; i < (dwSize / 16) ; i++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "0x%08X: ", (unsigned int)(dwAddress + (i*16)) ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ pucTmp = (uint8_t*)&pucBuffer[i*16] ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for ( j=0 ; j < 4 ; j++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- pucTmp += 4 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( j=0 ; j < 4 ; j++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "%02X%02X%02X%02X ", pucTmp[0], pucTmp[1], pucTmp[2], pucTmp[3] ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ pucTmp += 4 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- pucTmp=(uint8_t*)&pucBuffer[i*16] ;</span><br><span style="color: hsl(120, 100%, 40%);">+ pucTmp=(uint8_t*)&pucBuffer[i*16] ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for ( j=0 ; j < 16 ; j++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_PutChar( *pucTmp++ ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( j=0 ; j < 16 ; j++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_PutChar( *pucTmp++ ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\r" ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( (dwSize%16) != 0 )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- dwLastLineStart=dwSize - (dwSize%16) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( (dwSize%16) != 0 )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ dwLastLineStart=dwSize - (dwSize%16) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf( "0x%08X: ", (unsigned int)(dwAddress + dwLastLineStart) ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if ( (j!=dwLastLineStart) && (j%4 == 0) )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( " " ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "0x%08X: ", (unsigned int)(dwAddress + dwLastLineStart) ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( j=dwLastLineStart ; j < dwLastLineStart+16 ; j++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( (j!=dwLastLineStart) && (j%4 == 0) )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( " " ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( j < dwSize )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "%02X", pucBuffer[j] ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" ") ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( j < dwSize )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "%02X", pucBuffer[j] ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" ") ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf( " " ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- for ( j=dwLastLineStart ; j < dwSize ; j++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_PutChar( pucBuffer[j] ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( " " ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( j=dwLastLineStart ; j < dwSize ; j++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_PutChar( pucBuffer[j] ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\r" ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -288,46 +288,46 @@</span><br><span> */</span><br><span> extern uint32_t UART_GetInteger( uint32_t* pdwValue )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ucKey ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ucNbNb=0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dwValue=0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ucKey ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ucNbNb=0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t dwValue=0 ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while ( 1 )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- ucKey=UART_GetChar() ;</span><br><span style="color: hsl(0, 100%, 40%);">- UART_PutChar( ucKey ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ while ( 1 )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ ucKey=UART_GetChar() ;</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_PutChar( ucKey ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( ucKey >= '0' && ucKey <= '9' )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- dwValue = (dwValue * 10) + (ucKey - '0');</span><br><span style="color: hsl(0, 100%, 40%);">- ucNbNb++ ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if ( ucKey == 0x0D || ucKey == ' ' )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if ( ucNbNb == 0 )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- return 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\r" ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- *pdwValue=dwValue ;</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ucKey >= '0' && ucKey <= '9' )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ dwValue = (dwValue * 10) + (ucKey - '0');</span><br><span style="color: hsl(120, 100%, 40%);">+ ucNbNb++ ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ucKey == 0x0D || ucKey == ' ' )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ucNbNb == 0 )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\rWrite a number and press ENTER or SPACE!\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ *pdwValue=dwValue ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return 1 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\r'%c' not a number!\n\r", ucKey ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\r'%c' not a number!\n\r", ucKey ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- WDT_Restart(WDT);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ WDT_Restart(WDT);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -339,25 +339,25 @@</span><br><span> */</span><br><span> extern uint32_t UART_GetIntegerMinMax( uint32_t* pdwValue, uint32_t dwMin, uint32_t dwMax )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dwValue=0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t dwValue=0 ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( UART_GetInteger( &dwValue ) == 0 )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- return 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( UART_GetInteger( &dwValue ) == 0 )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( dwValue < dwMin || dwValue > dwMax )</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( dwValue < dwMin || dwValue > dwMax )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\rThe number have to be between %d and %d\n\r", (int)dwMin, (int)dwMax ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\rThe number have to be between %d and %d\n\r", (int)dwMin, (int)dwMax ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\r" ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pdwValue = dwValue ;</span><br><span style="color: hsl(120, 100%, 40%);">+ *pdwValue = dwValue ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return 1 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1 ;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -367,45 +367,45 @@</span><br><span> */</span><br><span> extern uint32_t UART_GetHexa32( uint32_t* pdwValue )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ucKey ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dw = 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t dwValue = 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ucKey ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t dw = 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t dwValue = 0 ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for ( dw=0 ; dw < 8 ; dw++ )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- ucKey = UART_GetChar() ;</span><br><span style="color: hsl(0, 100%, 40%);">- UART_PutChar( ucKey ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ for ( dw=0 ; dw < 8 ; dw++ )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ ucKey = UART_GetChar() ;</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_PutChar( ucKey ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if ( ucKey >= '0' && ucKey <= '9' )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- dwValue = (dwValue * 16) + (ucKey - '0') ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if ( ucKey >= 'A' && ucKey <= 'F' )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- if ( ucKey >= 'a' && ucKey <= 'f' )</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- {</span><br><span style="color: hsl(0, 100%, 40%);">- printf( "\n\rIt is not a hexa character!\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ucKey >= '0' && ucKey <= '9' )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ dwValue = (dwValue * 16) + (ucKey - '0') ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ucKey >= 'A' && ucKey <= 'F' )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ dwValue = (dwValue * 16) + (ucKey - 'A' + 10) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ucKey >= 'a' && ucKey <= 'f' )</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ dwValue = (dwValue * 16) + (ucKey - 'a' + 10) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf( "\n\rIt is not a hexa character!\n\r" ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return 0 ;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r" ) ;</span><br><span style="color: hsl(0, 100%, 40%);">- *pdwValue = dwValue ;</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r" ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ *pdwValue = dwValue ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return 1 ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1 ;</span><br><span> }</span><br><span> </span><br><span> #if defined __ICCARM__ /* IAR Ewarm 5.41+ */</span><br><span>@@ -418,9 +418,9 @@</span><br><span> */</span><br><span> extern WEAK signed int putchar( signed int c )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- UART_PutChar( c ) ;</span><br><span style="color: hsl(120, 100%, 40%);">+ UART_PutChar( c ) ;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return c ;</span><br><span style="color: hsl(120, 100%, 40%);">+ return c ;</span><br><span> }</span><br><span> #endif // defined __ICCARM__</span><br><span> </span><br><span>diff --git a/firmware/libcommon/include/assert.h b/firmware/libcommon/include/assert.h</span><br><span>index a52ffa9..22bb101 100644</span><br><span>--- a/firmware/libcommon/include/assert.h</span><br><span>+++ b/firmware/libcommon/include/assert.h</span><br><span>@@ -65,41 +65,41 @@</span><br><span> // Definitions</span><br><span> //------------------------------------------------------------------------------</span><br><span> #if defined(NOASSERT)</span><br><span style="color: hsl(0, 100%, 40%);">- #define ASSERT(...)</span><br><span style="color: hsl(0, 100%, 40%);">- #define SANITY_CHECK(...)</span><br><span style="color: hsl(120, 100%, 40%);">+ #define ASSERT(...)</span><br><span style="color: hsl(120, 100%, 40%);">+ #define SANITY_CHECK(...)</span><br><span> #else</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- #if (TRACE_LEVEL == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- /// Checks that the given condition is true, </span><br><span style="color: hsl(0, 100%, 40%);">- /// otherwise stops the program execution.</span><br><span style="color: hsl(0, 100%, 40%);">- /// \param condition Condition to verify.</span><br><span style="color: hsl(0, 100%, 40%);">- #define ASSERT(condition) { \</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(condition)) { \</span><br><span style="color: hsl(0, 100%, 40%);">- while (1); \</span><br><span style="color: hsl(0, 100%, 40%);">- } \</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ #if (TRACE_LEVEL == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Checks that the given condition is true, </span><br><span style="color: hsl(120, 100%, 40%);">+ /// otherwise stops the program execution.</span><br><span style="color: hsl(120, 100%, 40%);">+ /// \param condition Condition to verify.</span><br><span style="color: hsl(120, 100%, 40%);">+ #define ASSERT(condition) { \</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(condition)) { \</span><br><span style="color: hsl(120, 100%, 40%);">+ while (1); \</span><br><span style="color: hsl(120, 100%, 40%);">+ } \</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /// Performs the same duty as the ASSERT() macro</span><br><span style="color: hsl(0, 100%, 40%);">- /// \param condition Condition to verify.</span><br><span style="color: hsl(0, 100%, 40%);">- #define SANITY_CHECK(condition) ASSERT(condition, ...)</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Performs the same duty as the ASSERT() macro</span><br><span style="color: hsl(120, 100%, 40%);">+ /// \param condition Condition to verify.</span><br><span style="color: hsl(120, 100%, 40%);">+ #define SANITY_CHECK(condition) ASSERT(condition, ...)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- #else</span><br><span style="color: hsl(0, 100%, 40%);">- /// Checks that the given condition is true, otherwise displays an error</span><br><span style="color: hsl(0, 100%, 40%);">- /// message and stops the program execution.</span><br><span style="color: hsl(0, 100%, 40%);">- /// \param condition Condition to verify.</span><br><span style="color: hsl(0, 100%, 40%);">- #define ASSERT(condition) { \</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(condition)) { \</span><br><span style="color: hsl(0, 100%, 40%);">- printf("-F- ASSERT: %s %s:%d\n\r", #condition, __BASE_FILE__, __LINE__); \</span><br><span style="color: hsl(0, 100%, 40%);">- while (1); \</span><br><span style="color: hsl(0, 100%, 40%);">- } \</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- #define SANITY_ERROR "Sanity check failed at %s:%d\n\r"</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- /// Performs the same duty as the ASSERT() macro, except a default error</span><br><span style="color: hsl(0, 100%, 40%);">- /// message is output if the condition is false.</span><br><span style="color: hsl(0, 100%, 40%);">- /// \param condition Condition to verify.</span><br><span style="color: hsl(0, 100%, 40%);">- #define SANITY_CHECK(condition) ASSERT(condition, SANITY_ERROR, __FILE__, __LINE__)</span><br><span style="color: hsl(0, 100%, 40%);">- #endif</span><br><span style="color: hsl(120, 100%, 40%);">+ #else</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Checks that the given condition is true, otherwise displays an error</span><br><span style="color: hsl(120, 100%, 40%);">+ /// message and stops the program execution.</span><br><span style="color: hsl(120, 100%, 40%);">+ /// \param condition Condition to verify.</span><br><span style="color: hsl(120, 100%, 40%);">+ #define ASSERT(condition) { \</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(condition)) { \</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("-F- ASSERT: %s %s:%d\n\r", #condition, __BASE_FILE__, __LINE__); \</span><br><span style="color: hsl(120, 100%, 40%);">+ while (1); \</span><br><span style="color: hsl(120, 100%, 40%);">+ } \</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ #define SANITY_ERROR "Sanity check failed at %s:%d\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ /// Performs the same duty as the ASSERT() macro, except a default error</span><br><span style="color: hsl(120, 100%, 40%);">+ /// message is output if the condition is false.</span><br><span style="color: hsl(120, 100%, 40%);">+ /// \param condition Condition to verify.</span><br><span style="color: hsl(120, 100%, 40%);">+ #define SANITY_CHECK(condition) ASSERT(condition, SANITY_ERROR, __FILE__, __LINE__)</span><br><span style="color: hsl(120, 100%, 40%);">+ #endif</span><br><span> #endif</span><br><span> </span><br><span> </span><br><span>diff --git a/firmware/libcommon/include/cciddriver.h b/firmware/libcommon/include/cciddriver.h</span><br><span>index ee5e028..f9be027 100644</span><br><span>--- a/firmware/libcommon/include/cciddriver.h</span><br><span>+++ b/firmware/libcommon/include/cciddriver.h</span><br><span>@@ -145,129 +145,129 @@</span><br><span> /// 6.1.11.2 PIN Verification Data Structure</span><br><span> typedef struct</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /// Number of seconds.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bTimerOut;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Several parameters for the PIN format options</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmFormatString;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Define the length of the PIN to present in the APDU command</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmPINBlockString;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Allows the length PIN insertion in the APDU command</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmPINLengthFormat;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Minimum PIN size in digit and Maximum PIN size in digit</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char wPINMaxExtraDigit;</span><br><span style="color: hsl(0, 100%, 40%);">- /// The value is a bit wise OR operation.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bEntryValidationCondition;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Number of messages to display for the PIN modify command</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bNumberMessage;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Language used to display the messages.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char wLangId;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Message index in the Reader message table</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bMsgIndex;</span><br><span style="color: hsl(0, 100%, 40%);">- /// T=1 I-block prologue field to use</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bTeoPrologue[3];</span><br><span style="color: hsl(0, 100%, 40%);">- /// APDU to send to the ICC</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char abPINApdu[255];</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Number of seconds.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bTimerOut;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Several parameters for the PIN format options</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmFormatString;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Define the length of the PIN to present in the APDU command</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmPINBlockString;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Allows the length PIN insertion in the APDU command</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmPINLengthFormat;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Minimum PIN size in digit and Maximum PIN size in digit</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char wPINMaxExtraDigit;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// The value is a bit wise OR operation.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bEntryValidationCondition;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Number of messages to display for the PIN modify command</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bNumberMessage;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Language used to display the messages.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char wLangId;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Message index in the Reader message table</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bMsgIndex;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// T=1 I-block prologue field to use</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bTeoPrologue[3];</span><br><span style="color: hsl(120, 100%, 40%);">+ /// APDU to send to the ICC</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char abPINApdu[255];</span><br><span> }__attribute__ ((packed)) S_ccid_PIN_Verification;</span><br><span> </span><br><span> </span><br><span> /// 6.1.11.7 PIN Modification Data Structure</span><br><span> typedef struct</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /// Number of seconds. If 00h then CCID default value is used.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bTimeOut;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Several parameters for the PIN format options (defined in § 6.1.11.4)</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmFormatString4;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Define the length of the PIN to present in the APDU command</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmPINBlockString;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmPinLengthFormat;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Insertion position offset in byte for the current PIN</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bInsertionOffsetOld;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Insertion position offset in byte for the new PIN</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bInsertionOffsetNew;</span><br><span style="color: hsl(0, 100%, 40%);">- /// XXYYh</span><br><span style="color: hsl(0, 100%, 40%);">- /// XX: Minimum PIN size in digit</span><br><span style="color: hsl(0, 100%, 40%);">- /// YY: Maximum PIN size in digit</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char wPINMaxExtraDigit;</span><br><span style="color: hsl(0, 100%, 40%);">- /// 00h,01h,02h,03h</span><br><span style="color: hsl(0, 100%, 40%);">- /// 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)</span><br><span style="color: hsl(0, 100%, 40%);">- /// Indicates if the current PIN must be entered and set in the same APDU field of not.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bConfirmPIN;</span><br><span style="color: hsl(0, 100%, 40%);">- /// The value is a bit wise OR operation.</span><br><span style="color: hsl(0, 100%, 40%);">- /// 01h Max size reached</span><br><span style="color: hsl(0, 100%, 40%);">- /// 02h Validation key pressed</span><br><span style="color: hsl(0, 100%, 40%);">- /// 04h Timeout occurred</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bEntryValidationCondition;</span><br><span style="color: hsl(0, 100%, 40%);">- /// 00h,01h,02h,03h,or FFh</span><br><span style="color: hsl(0, 100%, 40%);">- /// Number of messages to display for the PIN modify command.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bNumberMessage;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Language used to display the messages. The 16 bit</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char wLangId;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Message index in the Reader message table (should be 00h or 01h).</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bMsgIndex1;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Message index in the Reader message table (should be 01h or 02h).</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bMsgIndex2;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Message index in the Reader message table (should be 02h).</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bMsgIndex3;</span><br><span style="color: hsl(0, 100%, 40%);">- /// T=1 I-block prologue field to use. Significant only if protocol in use is T=1.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bTeoPrologue[3];</span><br><span style="color: hsl(0, 100%, 40%);">- /// Byte array APDU to send to the ICC</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char abPINApdu[255];</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Number of seconds. If 00h then CCID default value is used.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bTimeOut;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Several parameters for the PIN format options (defined in § 6.1.11.4)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmFormatString4;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Define the length of the PIN to present in the APDU command</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmPINBlockString;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Allows the length PIN insertion in the APDU command (defined in § 6.1.11.6)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmPinLengthFormat;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Insertion position offset in byte for the current PIN</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bInsertionOffsetOld;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Insertion position offset in byte for the new PIN</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bInsertionOffsetNew;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// XXYYh</span><br><span style="color: hsl(120, 100%, 40%);">+ /// XX: Minimum PIN size in digit</span><br><span style="color: hsl(120, 100%, 40%);">+ /// YY: Maximum PIN size in digit</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char wPINMaxExtraDigit;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 00h,01h,02h,03h</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 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)</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Indicates if the current PIN must be entered and set in the same APDU field of not.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bConfirmPIN;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// The value is a bit wise OR operation.</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 01h Max size reached</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 02h Validation key pressed</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 04h Timeout occurred</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bEntryValidationCondition;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 00h,01h,02h,03h,or FFh</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Number of messages to display for the PIN modify command.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bNumberMessage;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Language used to display the messages. The 16 bit</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char wLangId;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Message index in the Reader message table (should be 00h or 01h).</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bMsgIndex1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Message index in the Reader message table (should be 01h or 02h).</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bMsgIndex2;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Message index in the Reader message table (should be 02h).</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bMsgIndex3;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// T=1 I-block prologue field to use. Significant only if protocol in use is T=1.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bTeoPrologue[3];</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Byte array APDU to send to the ICC</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char abPINApdu[255];</span><br><span> }__attribute__ ((packed)) S_ccid_PIN_Modification;</span><br><span> </span><br><span> /// Protocol Data Structure for Protocol T=0 (bProtocolNum=0, dwLength=00000005h)</span><br><span> typedef struct</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(0, 100%, 40%);">- /// clock rate conversion factor</span><br><span style="color: hsl(0, 100%, 40%);">- /// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(0, 100%, 40%);">- /// baud rate conversion factor</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmFindexDindex;</span><br><span style="color: hsl(0, 100%, 40%);">- /// For T=0 ,B0 0b, B7-2 000000b</span><br><span style="color: hsl(0, 100%, 40%);">- /// B1 Convention used (b1=0 for direct, b1=1 for inverse)</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmTCCKST0; // 0 to 2</span><br><span style="color: hsl(0, 100%, 40%);">- /// Extra Guardtime between two characters. Add 0 to 254 etu to the normal </span><br><span style="color: hsl(0, 100%, 40%);">- /// guardtime of 12etu. FFh is the same as 00h.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bGuardTimeT0; // 0 to FF</span><br><span style="color: hsl(0, 100%, 40%);">- /// WI for T=0 used to define WWT</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bWaitingIntegerT0; // 0 to FF</span><br><span style="color: hsl(0, 100%, 40%);">- /// ICC Clock Stop Support</span><br><span style="color: hsl(0, 100%, 40%);">- /// 00 = Stopping the Clock is not allowed</span><br><span style="color: hsl(0, 100%, 40%);">- /// 01 = Stop with Clock signal Low</span><br><span style="color: hsl(0, 100%, 40%);">- /// 02 = Stop with Clock signal High</span><br><span style="color: hsl(0, 100%, 40%);">- /// 03 = Stop with Clock either High or Low</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bClockStop; // 0 to 3</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(120, 100%, 40%);">+ /// clock rate conversion factor</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(120, 100%, 40%);">+ /// baud rate conversion factor</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmFindexDindex;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// For T=0 ,B0 0b, B7-2 000000b</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B1 Convention used (b1=0 for direct, b1=1 for inverse)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmTCCKST0; // 0 to 2</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Extra Guardtime between two characters. Add 0 to 254 etu to the normal </span><br><span style="color: hsl(120, 100%, 40%);">+ /// guardtime of 12etu. FFh is the same as 00h.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bGuardTimeT0; // 0 to FF</span><br><span style="color: hsl(120, 100%, 40%);">+ /// WI for T=0 used to define WWT</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bWaitingIntegerT0; // 0 to FF</span><br><span style="color: hsl(120, 100%, 40%);">+ /// ICC Clock Stop Support</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 00 = Stopping the Clock is not allowed</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 01 = Stop with Clock signal Low</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 02 = Stop with Clock signal High</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 03 = Stop with Clock either High or Low</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bClockStop; // 0 to 3</span><br><span> } __attribute__ ((packed)) S_ccid_protocol_t0;</span><br><span> </span><br><span> </span><br><span> /// Protocol Data Structure for Protocol T=1 (bProtocolNum=1, dwLength=00000007h)</span><br><span> typedef struct</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(0, 100%, 40%);">- /// clock rate conversion factor</span><br><span style="color: hsl(0, 100%, 40%);">- /// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(0, 100%, 40%);">- /// baud rate conversion factor</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmFindexDindex;</span><br><span style="color: hsl(0, 100%, 40%);">- /// For T=1, B7-2 000100b</span><br><span style="color: hsl(0, 100%, 40%);">- /// B0 Checksum type (b0=0 for LRC, b0=1 for CRC</span><br><span style="color: hsl(0, 100%, 40%);">- /// B1 Convention used (b1=0 for direct, b1=1 for inverse)</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h</span><br><span style="color: hsl(0, 100%, 40%);">- /// Extra Guardtime (0 to 254 etu between two characters). </span><br><span style="color: hsl(0, 100%, 40%);">- /// If value is FFh, then guardtime is reduced by 1.</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bGuardTimeT1; // 0 to FF</span><br><span style="color: hsl(0, 100%, 40%);">- /// B7-4 = BWI</span><br><span style="color: hsl(0, 100%, 40%);">- /// B3-0 = CWI</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmWaitingIntegersT1; // 0 to 9</span><br><span style="color: hsl(0, 100%, 40%);">- /// ICC Clock Stop Support</span><br><span style="color: hsl(0, 100%, 40%);">- /// 00 = Stopping the Clock is not allowed</span><br><span style="color: hsl(0, 100%, 40%);">- /// 01 = Stop with Clock signal Low</span><br><span style="color: hsl(0, 100%, 40%);">- /// 02 = Stop with Clock signal High</span><br><span style="color: hsl(0, 100%, 40%);">- /// 03 = Stop with Clock either High or Low</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bClockStop; // 0 to 3</span><br><span style="color: hsl(0, 100%, 40%);">- /// Size of negotiated IFSC</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bIFSC; // 0 to FE</span><br><span style="color: hsl(0, 100%, 40%);">- /// Nad value used by CCID</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bNadValue; // 0 to FF</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B7-4 FI Index into the table 7 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(120, 100%, 40%);">+ /// clock rate conversion factor</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B3-0 DI - Index into the table 8 in ISO/IEC 7816-3:1997 selecting a </span><br><span style="color: hsl(120, 100%, 40%);">+ /// baud rate conversion factor</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmFindexDindex;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// For T=1, B7-2 000100b</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B0 Checksum type (b0=0 for LRC, b0=1 for CRC</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B1 Convention used (b1=0 for direct, b1=1 for inverse)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmTCCKST1; // 10h, 11h, 12h, 13h</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Extra Guardtime (0 to 254 etu between two characters). </span><br><span style="color: hsl(120, 100%, 40%);">+ /// If value is FFh, then guardtime is reduced by 1.</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bGuardTimeT1; // 0 to FF</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B7-4 = BWI</span><br><span style="color: hsl(120, 100%, 40%);">+ /// B3-0 = CWI</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmWaitingIntegersT1; // 0 to 9</span><br><span style="color: hsl(120, 100%, 40%);">+ /// ICC Clock Stop Support</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 00 = Stopping the Clock is not allowed</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 01 = Stop with Clock signal Low</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 02 = Stop with Clock signal High</span><br><span style="color: hsl(120, 100%, 40%);">+ /// 03 = Stop with Clock either High or Low</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bClockStop; // 0 to 3</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Size of negotiated IFSC</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bIFSC; // 0 to FE</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Nad value used by CCID</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bNadValue; // 0 to FF</span><br><span> } __attribute__ ((packed)) S_ccid_protocol_t1;</span><br><span> </span><br><span> </span><br><span>@@ -357,8 +357,8 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> </span><br><span> extern unsigned char RDRtoPCHardwareError( unsigned char bSlot, </span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bSeq, </span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bHardwareErrorCode );</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bSeq, </span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bHardwareErrorCode );</span><br><span> </span><br><span> /*</span><br><span> #if !defined(NOAUTOCALLBACK)</span><br><span>@@ -368,13 +368,13 @@</span><br><span> extern void CCID_SmartCardRequest( void );</span><br><span> extern void CCIDDriver_Initialize( void );</span><br><span> extern unsigned char CCID_Read(void *pBuffer,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dLength,</span><br><span style="color: hsl(0, 100%, 40%);">- TransferCallback fCallback,</span><br><span style="color: hsl(0, 100%, 40%);">- void *pArgument);</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ TransferCallback fCallback,</span><br><span style="color: hsl(120, 100%, 40%);">+ void *pArgument);</span><br><span> extern unsigned char CCID_Write(void *pBuffer,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dLength,</span><br><span style="color: hsl(0, 100%, 40%);">- TransferCallback fCallback,</span><br><span style="color: hsl(0, 100%, 40%);">- void *pArgument);</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ TransferCallback fCallback,</span><br><span style="color: hsl(120, 100%, 40%);">+ void *pArgument);</span><br><span> extern unsigned char CCID_Insertion( void );</span><br><span> extern unsigned char CCID_Removal( void );</span><br><span> </span><br><span>diff --git a/firmware/libcommon/include/iso7816_4.h b/firmware/libcommon/include/iso7816_4.h</span><br><span>index 7c371b2..e2215c7 100644</span><br><span>--- a/firmware/libcommon/include/iso7816_4.h</span><br><span>+++ b/firmware/libcommon/include/iso7816_4.h</span><br><span>@@ -76,9 +76,9 @@</span><br><span> </span><br><span> extern void ISO7816_IccPowerOff(void);</span><br><span> extern uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *pMessage,</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t wLength,</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t *retlen);</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t *pMessage,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t wLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t *retlen);</span><br><span> extern void ISO7816_Escape( void );</span><br><span> extern void ISO7816_RestartClock(void);</span><br><span> extern void ISO7816_StopClock( void );</span><br><span>diff --git a/firmware/libcommon/include/simtrace.h b/firmware/libcommon/include/simtrace.h</span><br><span>index 5edea17..0486581 100644</span><br><span>--- a/firmware/libcommon/include/simtrace.h</span><br><span>+++ b/firmware/libcommon/include/simtrace.h</span><br><span>@@ -65,19 +65,19 @@</span><br><span> /// device using the CCID driver.</span><br><span> typedef struct {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /// Configuration descriptor</span><br><span style="color: hsl(0, 100%, 40%);">- USBConfigurationDescriptor configuration;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Interface descriptor</span><br><span style="color: hsl(0, 100%, 40%);">- USBInterfaceDescriptor interface;</span><br><span style="color: hsl(0, 100%, 40%);">- /// CCID descriptor</span><br><span style="color: hsl(0, 100%, 40%);">- CCIDDescriptor ccid;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bulk OUT endpoint descriptor</span><br><span style="color: hsl(0, 100%, 40%);">- USBEndpointDescriptor bulkOut;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bulk IN endpoint descriptor</span><br><span style="color: hsl(0, 100%, 40%);">- USBEndpointDescriptor bulkIn;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Interrupt OUT endpoint descriptor</span><br><span style="color: hsl(0, 100%, 40%);">- USBEndpointDescriptor interruptIn;</span><br><span style="color: hsl(0, 100%, 40%);">- DFURT_IF_DESCRIPTOR_STRUCT</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Configuration descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ USBConfigurationDescriptor configuration;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Interface descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ USBInterfaceDescriptor interface;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// CCID descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ CCIDDescriptor ccid;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bulk OUT endpoint descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ USBEndpointDescriptor bulkOut;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bulk IN endpoint descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ USBEndpointDescriptor bulkIn;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Interrupt OUT endpoint descriptor</span><br><span style="color: hsl(120, 100%, 40%);">+ USBEndpointDescriptor interruptIn;</span><br><span style="color: hsl(120, 100%, 40%);">+ DFURT_IF_DESCRIPTOR_STRUCT</span><br><span> } __attribute__ ((packed)) CCIDDriverConfigurationDescriptors;</span><br><span> </span><br><span> extern const USBConfigurationDescriptor *configurationDescriptorsArr[];</span><br><span>diff --git a/firmware/libcommon/source/cciddriver.c b/firmware/libcommon/source/cciddriver.c</span><br><span>index 8cf28ca..1dbdf23 100644</span><br><span>--- a/firmware/libcommon/source/cciddriver.c</span><br><span>+++ b/firmware/libcommon/source/cciddriver.c</span><br><span>@@ -83,24 +83,24 @@</span><br><span> /// Driver structure for an CCID device</span><br><span> typedef struct {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /// CCID message</span><br><span style="color: hsl(0, 100%, 40%);">- S_ccid_bulk_in_header sCcidMessage;</span><br><span style="color: hsl(0, 100%, 40%);">- /// CCID command</span><br><span style="color: hsl(0, 100%, 40%);">- S_ccid_bulk_out_header sCcidCommand;</span><br><span style="color: hsl(0, 100%, 40%);">- /// Interrupt message answer</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char BufferINT[4];</span><br><span style="color: hsl(0, 100%, 40%);">- /// Buffer data of message</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char ProtocolDataStructure[10];</span><br><span style="color: hsl(0, 100%, 40%);">- /// Protocol used</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bProtocol;</span><br><span style="color: hsl(0, 100%, 40%);">- /// SlotStatus</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bit 0 = Slot 0 current state</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bit 1 = Slot 0 changed status</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bit 2 = Slot 1 current state</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bit 3 = Slot 1 changed status</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bit 4 = Slot 2 current state</span><br><span style="color: hsl(0, 100%, 40%);">- /// Bit 5 = Slot 2 changed status</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char SlotStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// CCID message</span><br><span style="color: hsl(120, 100%, 40%);">+ S_ccid_bulk_in_header sCcidMessage;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// CCID command</span><br><span style="color: hsl(120, 100%, 40%);">+ S_ccid_bulk_out_header sCcidCommand;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Interrupt message answer</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char BufferINT[4];</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Buffer data of message</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char ProtocolDataStructure[10];</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Protocol used</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bProtocol;</span><br><span style="color: hsl(120, 100%, 40%);">+ /// SlotStatus</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bit 0 = Slot 0 current state</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bit 1 = Slot 0 changed status</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bit 2 = Slot 1 current state</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bit 3 = Slot 1 changed status</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bit 4 = Slot 2 current state</span><br><span style="color: hsl(120, 100%, 40%);">+ /// Bit 5 = Slot 2 changed status</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char SlotStatus;</span><br><span> </span><br><span> } CCIDDriver;</span><br><span> </span><br><span>@@ -121,7 +121,7 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> void CCIDDriver_Initialize( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- configurationDescriptorsFS = (CCIDDriverConfigurationDescriptors *) configurationDescriptorsArr[CFG_NUM_CCID-1];</span><br><span style="color: hsl(120, 100%, 40%);">+ configurationDescriptorsFS = (CCIDDriverConfigurationDescriptors *) configurationDescriptorsArr[CFG_NUM_CCID-1];</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -137,25 +137,25 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void RDRtoPCSlotStatus( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_SLOTSTATUS;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_SLOTSTATUS;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (ccidDriver.SlotStatus == ICC_INSERTED_EVENT) {</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0; /* ICC present and active card */</span><br><span style="color: hsl(0, 100%, 40%);">- } else if (ccidDriver.SlotStatus == ICC_NOT_PRESENT) {</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 2; /* No ICC present*/</span><br><span style="color: hsl(0, 100%, 40%);">- } else{</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("Strange bStatus");</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- // 00h Clock running</span><br><span style="color: hsl(0, 100%, 40%);">- // 01h Clock stopped in state L</span><br><span style="color: hsl(0, 100%, 40%);">- // 02h Clock stopped in state H</span><br><span style="color: hsl(0, 100%, 40%);">- // 03h Clock stopped in an unknown state</span><br><span style="color: hsl(0, 100%, 40%);">- // All other values are Reserved for Future Use.</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ccidDriver.SlotStatus == ICC_INSERTED_EVENT) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0; /* ICC present and active card */</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (ccidDriver.SlotStatus == ICC_NOT_PRESENT) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 2; /* No ICC present*/</span><br><span style="color: hsl(120, 100%, 40%);">+ } else{</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("Strange bStatus");</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // 00h Clock running</span><br><span style="color: hsl(120, 100%, 40%);">+ // 01h Clock stopped in state L</span><br><span style="color: hsl(120, 100%, 40%);">+ // 02h Clock stopped in state H</span><br><span style="color: hsl(120, 100%, 40%);">+ // 03h Clock stopped in an unknown state</span><br><span style="color: hsl(120, 100%, 40%);">+ // All other values are Reserved for Future Use.</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -164,71 +164,71 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void RDRtoPCDatablock_ATR( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char i;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char Atr[ATR_SIZE_MAX];</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char length;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t status; </span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char i;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char Atr[ATR_SIZE_MAX];</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char length;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t status; </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_Datablock_ATR( Atr, &length );</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_Decode_ATR( Atr );</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_Datablock_ATR( Atr, &length );</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_Decode_ATR( Atr );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (status == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Timeout occured while reading ATR");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Timeout occured while reading ATR");</span><br><span> // FIXME: react properly to timeout..</span><br><span> // return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> // FIXME: More tests? Is bProtocol = Atr[3] ?</span><br><span style="color: hsl(0, 100%, 40%);">- if( length > 5 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.ProtocolDataStructure[1] = Atr[3]&0x0F; // TD(1)</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.bProtocol = Atr[3]&0x0F; // TD(1)</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("Protocol data structure: 0x%x\n\r",</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.ProtocolDataStructure[1]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( length > 5 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.ProtocolDataStructure[1] = Atr[3]&0x0F; // TD(1)</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.bProtocol = Atr[3]&0x0F; // TD(1)</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("Protocol data structure: 0x%x\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.ProtocolDataStructure[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // S_ccid_protocol_t0</span><br><span style="color: hsl(0, 100%, 40%);">- // bmFindexDindex</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.ProtocolDataStructure[0] = Atr[2]; // TA(1)</span><br><span style="color: hsl(120, 100%, 40%);">+ // S_ccid_protocol_t0</span><br><span style="color: hsl(120, 100%, 40%);">+ // bmFindexDindex</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.ProtocolDataStructure[0] = Atr[2]; // TA(1)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // bmTCCKST0</span><br><span style="color: hsl(0, 100%, 40%);">- // For T=0 ,B0 0b, B7-2 000000b</span><br><span style="color: hsl(0, 100%, 40%);">- // B1 Convention used (b1=0 for direct, b1=1 for inverse)</span><br><span style="color: hsl(120, 100%, 40%);">+ // bmTCCKST0</span><br><span style="color: hsl(120, 100%, 40%);">+ // For T=0 ,B0 0b, B7-2 000000b</span><br><span style="color: hsl(120, 100%, 40%);">+ // B1 Convention used (b1=0 for direct, b1=1 for inverse)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // bGuardTimeT0</span><br><span style="color: hsl(0, 100%, 40%);">- // Extra Guardtime between two characters. Add 0 to 254 etu to the normal </span><br><span style="color: hsl(0, 100%, 40%);">- // guardtime of 12etu. FFh is the same as 00h.</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.ProtocolDataStructure[2] = Atr[4]; // TC(1)</span><br><span style="color: hsl(0, 100%, 40%);">- // AT91C_BASE_US0->US_TTGR = 0; // TC1</span><br><span style="color: hsl(120, 100%, 40%);">+ // bGuardTimeT0</span><br><span style="color: hsl(120, 100%, 40%);">+ // Extra Guardtime between two characters. Add 0 to 254 etu to the normal </span><br><span style="color: hsl(120, 100%, 40%);">+ // guardtime of 12etu. FFh is the same as 00h.</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.ProtocolDataStructure[2] = Atr[4]; // TC(1)</span><br><span style="color: hsl(120, 100%, 40%);">+ // AT91C_BASE_US0->US_TTGR = 0; // TC1</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // bWaitingIntegerT0</span><br><span style="color: hsl(0, 100%, 40%);">- // WI for T=0 used to define WWT</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.ProtocolDataStructure[3] = Atr[7]; // TC(2)</span><br><span style="color: hsl(120, 100%, 40%);">+ // bWaitingIntegerT0</span><br><span style="color: hsl(120, 100%, 40%);">+ // WI for T=0 used to define WWT</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.ProtocolDataStructure[3] = Atr[7]; // TC(2)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // bClockStop</span><br><span style="color: hsl(0, 100%, 40%);">- // ICC Clock Stop Support</span><br><span style="color: hsl(0, 100%, 40%);">- // 00 = Stopping the Clock is not allowed</span><br><span style="color: hsl(0, 100%, 40%);">- // 01 = Stop with Clock signal Low</span><br><span style="color: hsl(0, 100%, 40%);">- // 02 = Stop with Clock signal High</span><br><span style="color: hsl(0, 100%, 40%);">- // 03 = Stop with Clock either High or Low</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.ProtocolDataStructure[4] = 0x00; // 0 to 3</span><br><span style="color: hsl(120, 100%, 40%);">+ // bClockStop</span><br><span style="color: hsl(120, 100%, 40%);">+ // ICC Clock Stop Support</span><br><span style="color: hsl(120, 100%, 40%);">+ // 00 = Stopping the Clock is not allowed</span><br><span style="color: hsl(120, 100%, 40%);">+ // 01 = Stop with Clock signal Low</span><br><span style="color: hsl(120, 100%, 40%);">+ // 02 = Stop with Clock signal High</span><br><span style="color: hsl(120, 100%, 40%);">+ // 03 = Stop with Clock either High or Low</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.ProtocolDataStructure[4] = 0x00; // 0 to 3</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_DATABLOCK;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = length; // Size of ATR</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSizeToSend += length; // Size of ATR</span><br><span style="color: hsl(0, 100%, 40%);">- // bChainParameter: 00 the response APDU begins and ends in this command</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_DATABLOCK;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = length; // Size of ATR</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSizeToSend += length; // Size of ATR</span><br><span style="color: hsl(120, 100%, 40%);">+ // bChainParameter: 00 the response APDU begins and ends in this command</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for( i=0; i<length; i++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ for( i=0; i<length; i++ ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[i] = Atr[i];</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[i] = Atr[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Set the slot to an active status</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Set the slot to an active status</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -243,17 +243,17 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void RDRtoPCDatablock( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- //TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ //TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_DATABLOCK;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSizeToSend += ccidDriver.sCcidMessage.wLength;</span><br><span style="color: hsl(0, 100%, 40%);">- // bChainParameter: 00 the response APDU begins and ends in this command</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_DATABLOCK;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSizeToSend += ccidDriver.sCcidMessage.wLength;</span><br><span style="color: hsl(120, 100%, 40%);">+ // bChainParameter: 00 the response APDU begins and ends in this command</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Set the slot to an active status</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Set the slot to an active status</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -265,34 +265,34 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void RDRtoPCParameters( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_PARAMETERS;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_PARAMETERS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- //ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ //ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( ccidDriver.ProtocolDataStructure[1] == PROTOCOL_TO ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if( ccidDriver.ProtocolDataStructure[1] == PROTOCOL_TO ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // T=0</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = sizeof(S_ccid_protocol_t0);</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = PROTOCOL_TO;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ // T=0</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = sizeof(S_ccid_protocol_t0);</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = PROTOCOL_TO;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // T=1</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = sizeof(S_ccid_protocol_t1);</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = PROTOCOL_T1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ // T=1</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = sizeof(S_ccid_protocol_t1);</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = PROTOCOL_T1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSizeToSend += ccidDriver.sCcidMessage.wLength;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSizeToSend += ccidDriver.sCcidMessage.wLength;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for( i=0; i<ccidDriver.sCcidMessage.wLength; i++ ) {</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[i] = ccidDriver.ProtocolDataStructure[i];</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ for( i=0; i<ccidDriver.sCcidMessage.wLength; i++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[i] = ccidDriver.ProtocolDataStructure[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> }</span><br><span> </span><br><span>@@ -303,23 +303,23 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void RDRtoPCEscape( unsigned char length, unsigned char *data_send_from_CCID )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_ESCAPE;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_ESCAPE;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = length;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = length;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = 0; // bRFU</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = 0; // bRFU</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for( i=0; i<length; i++ ) {</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[i] = data_send_from_CCID[i];</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ for( i=0; i<length; i++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[i] = data_send_from_CCID[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -328,23 +328,23 @@</span><br><span> /// PC_to_RDR_SetDataRateAndClockFrequency</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void RDRtoPCDataRateAndClockFrequency( unsigned int dwClockFrequency, </span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dwDataRate )</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dwDataRate )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_DATARATEANDCLOCKFREQUENCY;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_DATARATEANDCLOCKFREQUENCY;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = 8;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = 0; // bRFU</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = 0; // bRFU</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[0] = dwClockFrequency;</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[4] = dwDataRate;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[0] = dwClockFrequency;</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[4] = dwDataRate;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -354,27 +354,27 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRIccPowerOn( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(0, 100%, 40%);">- if( CCID_FEATURES_AUTO_VOLT == (configurationDescriptorsFS->ccid.dwFeatures & CCID_FEATURES_AUTO_VOLT) ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ if( CCID_FEATURES_AUTO_VOLT == (configurationDescriptorsFS->ccid.dwFeatures & CCID_FEATURES_AUTO_VOLT) ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- //bPowerSelect = ccidDriver.sCcidCommand.bSpecific_0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidCommand.bSpecific_0 = VOLTS_AUTO;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ //bPowerSelect = ccidDriver.sCcidCommand.bSpecific_0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidCommand.bSpecific_0 = VOLTS_AUTO;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_warm_reset();</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_warm_reset();</span><br><span> // ISO7816_cold_reset();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // for emulation only //JCB </span><br><span style="color: hsl(0, 100%, 40%);">- if ( ccidDriver.sCcidCommand.bSpecific_0 != VOLTS_5_0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // for emulation only //JCB </span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ccidDriver.sCcidCommand.bSpecific_0 != VOLTS_5_0 ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("POWER_NOT_SUPPORTED\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("POWER_NOT_SUPPORTED\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCDatablock_ATR();</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCDatablock_ATR();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -384,23 +384,23 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRIccPowerOff( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bStatus;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_IccPowerOff();</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_IccPowerOff();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- //JCB stub</span><br><span style="color: hsl(0, 100%, 40%);">- bStatus = ICC_BS_PRESENT_NOTACTIVATED;</span><br><span style="color: hsl(120, 100%, 40%);">+ //JCB stub</span><br><span style="color: hsl(120, 100%, 40%);">+ bStatus = ICC_BS_PRESENT_NOTACTIVATED;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Set the slot to an inactive status</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Set the slot to an inactive status</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // if error, see Table 6.1-2 errors</span><br><span style="color: hsl(120, 100%, 40%);">+ // if error, see Table 6.1-2 errors</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Return the slot status to the host</span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCSlotStatus();</span><br><span style="color: hsl(120, 100%, 40%);">+ // Return the slot status to the host</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCSlotStatus();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -409,13 +409,13 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRGetSlotStatus( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Return the slot status to the host</span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCSlotStatus();</span><br><span style="color: hsl(120, 100%, 40%);">+ // Return the slot status to the host</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCSlotStatus();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -425,69 +425,69 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRXfrBlock( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t msglen = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t ret;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t msglen = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t ret;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("PCtoRDRXfrBlock\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("PCtoRDRXfrBlock\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Check the block length</span><br><span style="color: hsl(0, 100%, 40%);">- if ( ccidDriver.sCcidCommand.wLength > (configurationDescriptorsFS->ccid.dwMaxCCIDMessageLength-10) ) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Err block/msg len");</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- // check bBWI</span><br><span style="color: hsl(0, 100%, 40%);">- else if ( 0 != ccidDriver.sCcidCommand.bSpecific_0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check the block length</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ccidDriver.sCcidCommand.wLength > (configurationDescriptorsFS->ccid.dwMaxCCIDMessageLength-10) ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Err block/msg len");</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bError = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // check bBWI</span><br><span style="color: hsl(120, 100%, 40%);">+ else if ( 0 != ccidDriver.sCcidCommand.bSpecific_0 ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("Bad bBWI\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("Bad bBWI\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // APDU or TPDU</span><br><span style="color: hsl(0, 100%, 40%);">- switch(configurationDescriptorsFS->ccid.dwFeatures </span><br><span style="color: hsl(0, 100%, 40%);">- & (CCID_FEATURES_EXC_TPDU|CCID_FEATURES_EXC_SAPDU|CCID_FEATURES_EXC_APDU)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // APDU or TPDU</span><br><span style="color: hsl(120, 100%, 40%);">+ switch(configurationDescriptorsFS->ccid.dwFeatures </span><br><span style="color: hsl(120, 100%, 40%);">+ & (CCID_FEATURES_EXC_TPDU|CCID_FEATURES_EXC_SAPDU|CCID_FEATURES_EXC_APDU)) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case CCID_FEATURES_EXC_TPDU:</span><br><span style="color: hsl(0, 100%, 40%);">- if (ccidDriver.ProtocolDataStructure[1] == PROTOCOL_TO) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("APDU cmd: %x %x %x ..", ccidDriver.sCcidCommand.APDU[0], ccidDriver.sCcidCommand.APDU[1],ccidDriver.sCcidCommand.APDU[2] );</span><br><span style="color: hsl(120, 100%, 40%);">+ case CCID_FEATURES_EXC_TPDU:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ccidDriver.ProtocolDataStructure[1] == PROTOCOL_TO) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("APDU cmd: %x %x %x ..", ccidDriver.sCcidCommand.APDU[0], ccidDriver.sCcidCommand.APDU[1],ccidDriver.sCcidCommand.APDU[2] );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Send commande APDU</span><br><span style="color: hsl(0, 100%, 40%);">- ret = ISO7816_XfrBlockTPDU_T0( ccidDriver.sCcidCommand.APDU ,</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData,</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidCommand.wLength,</span><br><span style="color: hsl(0, 100%, 40%);">- &msglen );</span><br><span style="color: hsl(0, 100%, 40%);">- if (ret != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("APDU could not be sent: (US_CSR = 0x%x)", ret);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- if (ccidDriver.ProtocolDataStructure[1] == PROTOCOL_T1) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not supported T=1\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not supported 0x%x\n\r", ccidDriver.ProtocolDataStructure[1]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Send commande APDU</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = ISO7816_XfrBlockTPDU_T0( ccidDriver.sCcidCommand.APDU ,</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData,</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidCommand.wLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ &msglen );</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ret != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("APDU could not be sent: (US_CSR = 0x%x)", ret);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ccidDriver.ProtocolDataStructure[1] == PROTOCOL_T1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not supported T=1\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not supported 0x%x\n\r", ccidDriver.ProtocolDataStructure[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case CCID_FEATURES_EXC_APDU:</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not supported CCID_FEATURES_EXC_APDU\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case CCID_FEATURES_EXC_APDU:</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not supported CCID_FEATURES_EXC_APDU\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = msglen;</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("USB: 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\n\r", ccidDriver.sCcidMessage.abData[0], </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[1], </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[2], </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[3],</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.abData[4] );</span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCDatablock();</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = msglen;</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("USB: 0x%X, 0x%X, 0x%X, 0x%X, 0x%X\n\r", ccidDriver.sCcidMessage.abData[0], </span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[1], </span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[2], </span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[3],</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.abData[4] );</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCDatablock();</span><br><span> </span><br><span> }</span><br><span> </span><br><span>@@ -497,21 +497,21 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRGetParameters( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // We support only one slot</span><br><span style="color: hsl(120, 100%, 40%);">+ // We support only one slot</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // bmIccStatus</span><br><span style="color: hsl(0, 100%, 40%);">- if( ISO7816_StatusReset() ) {</span><br><span style="color: hsl(0, 100%, 40%);">- // 0: An ICC is present and active (power is on and stable, RST is inactive</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- // 1: An ICC is present and inactive (not activated or shut down by hardware error)</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ // bmIccStatus</span><br><span style="color: hsl(120, 100%, 40%);">+ if( ISO7816_StatusReset() ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // 0: An ICC is present and active (power is on and stable, RST is inactive</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ // 1: An ICC is present and inactive (not activated or shut down by hardware error)</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCParameters();</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCParameters();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -520,12 +520,12 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRResetParameters( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.SlotStatus = ICC_NOT_PRESENT;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = ccidDriver.SlotStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.SlotStatus = ICC_NOT_PRESENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = ccidDriver.SlotStatus;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCParameters();</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCParameters();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -534,13 +534,13 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRSetParameters( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.SlotStatus = ccidDriver.sCcidCommand.bSlot;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = ccidDriver.SlotStatus;</span><br><span style="color: hsl(0, 100%, 40%);">- // Not all feature supported</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.SlotStatus = ccidDriver.sCcidCommand.bSlot;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = ccidDriver.SlotStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Not all feature supported</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCParameters();</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCParameters();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -551,13 +551,13 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDREscape( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // If needed by the user</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_Escape();</span><br><span style="color: hsl(120, 100%, 40%);">+ // If needed by the user</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_Escape();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // stub, return all value send</span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCEscape( ccidDriver.sCcidCommand.wLength, ccidDriver.sCcidCommand.APDU); </span><br><span style="color: hsl(120, 100%, 40%);">+ // stub, return all value send</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCEscape( ccidDriver.sCcidCommand.wLength, ccidDriver.sCcidCommand.APDU); </span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -566,18 +566,18 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRICCClock( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( 0 == ccidDriver.sCcidCommand.bSpecific_0 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- // restarts the clock</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_RestartClock();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- // stop clock in the state shown in the bClockStop field</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_StopClock();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( 0 == ccidDriver.sCcidCommand.bSpecific_0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // restarts the clock</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_RestartClock();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ // stop clock in the state shown in the bClockStop field</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_StopClock();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCSlotStatus( ); </span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCSlotStatus( ); </span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -587,22 +587,22 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRtoAPDU( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bmChanges;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bClassGetResponse;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bClassEnvelope;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bmChanges;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bClassGetResponse;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bClassEnvelope;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( configurationDescriptorsFS->ccid.dwFeatures == (CCID_FEATURES_EXC_SAPDU|CCID_FEATURES_EXC_APDU) ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if( configurationDescriptorsFS->ccid.dwFeatures == (CCID_FEATURES_EXC_SAPDU|CCID_FEATURES_EXC_APDU) ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bmChanges = ccidDriver.sCcidCommand.bSpecific_0;</span><br><span style="color: hsl(0, 100%, 40%);">- bClassGetResponse = ccidDriver.sCcidCommand.bSpecific_1;</span><br><span style="color: hsl(0, 100%, 40%);">- bClassEnvelope = ccidDriver.sCcidCommand.bSpecific_2;</span><br><span style="color: hsl(120, 100%, 40%);">+ bmChanges = ccidDriver.sCcidCommand.bSpecific_0;</span><br><span style="color: hsl(120, 100%, 40%);">+ bClassGetResponse = ccidDriver.sCcidCommand.bSpecific_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ bClassEnvelope = ccidDriver.sCcidCommand.bSpecific_2;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_toAPDU();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_toAPDU();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCSlotStatus(); </span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCSlotStatus(); </span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -612,9 +612,9 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRSecure( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("For user\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("For user\n\r");</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -627,10 +627,10 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRMechanical( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not implemented\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not implemented\n\r");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCSlotStatus();</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCSlotStatus();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -641,9 +641,9 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRAbort( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCSlotStatus();</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCSlotStatus();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -653,24 +653,24 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void PCtoRDRSetDataRateAndClockFrequency( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dwClockFrequency;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dwDataRate;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dwClockFrequency;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dwDataRate;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- dwClockFrequency = ccidDriver.sCcidCommand.APDU[0]</span><br><span style="color: hsl(0, 100%, 40%);">- + (ccidDriver.sCcidCommand.APDU[1]<<8)</span><br><span style="color: hsl(0, 100%, 40%);">- + (ccidDriver.sCcidCommand.APDU[2]<<16)</span><br><span style="color: hsl(0, 100%, 40%);">- + (ccidDriver.sCcidCommand.APDU[3]<<24);</span><br><span style="color: hsl(120, 100%, 40%);">+ dwClockFrequency = ccidDriver.sCcidCommand.APDU[0]</span><br><span style="color: hsl(120, 100%, 40%);">+ + (ccidDriver.sCcidCommand.APDU[1]<<8)</span><br><span style="color: hsl(120, 100%, 40%);">+ + (ccidDriver.sCcidCommand.APDU[2]<<16)</span><br><span style="color: hsl(120, 100%, 40%);">+ + (ccidDriver.sCcidCommand.APDU[3]<<24);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- dwDataRate = ccidDriver.sCcidCommand.APDU[4]</span><br><span style="color: hsl(0, 100%, 40%);">- + (ccidDriver.sCcidCommand.APDU[5]<<8)</span><br><span style="color: hsl(0, 100%, 40%);">- + (ccidDriver.sCcidCommand.APDU[6]<<16)</span><br><span style="color: hsl(0, 100%, 40%);">- + (ccidDriver.sCcidCommand.APDU[7]<<24);</span><br><span style="color: hsl(120, 100%, 40%);">+ dwDataRate = ccidDriver.sCcidCommand.APDU[4]</span><br><span style="color: hsl(120, 100%, 40%);">+ + (ccidDriver.sCcidCommand.APDU[5]<<8)</span><br><span style="color: hsl(120, 100%, 40%);">+ + (ccidDriver.sCcidCommand.APDU[6]<<16)</span><br><span style="color: hsl(120, 100%, 40%);">+ + (ccidDriver.sCcidCommand.APDU[7]<<24);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SetDataRateandClockFrequency( dwClockFrequency, dwDataRate );</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SetDataRateandClockFrequency( dwClockFrequency, dwDataRate );</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- RDRtoPCDataRateAndClockFrequency( dwClockFrequency, dwDataRate );</span><br><span style="color: hsl(120, 100%, 40%);">+ RDRtoPCDataRateAndClockFrequency( dwClockFrequency, dwDataRate );</span><br><span> </span><br><span> }</span><br><span> </span><br><span>@@ -679,20 +679,20 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void vCCIDCommandNotSupported( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- // Command not supported</span><br><span style="color: hsl(0, 100%, 40%);">- // vCCIDReportError(CMD_NOT_SUPPORTED);</span><br><span style="color: hsl(120, 100%, 40%);">+ // Command not supported</span><br><span style="color: hsl(120, 100%, 40%);">+ // vCCIDReportError(CMD_NOT_SUPPORTED);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("CMD_NOT_SUPPORTED\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("CMD_NOT_SUPPORTED\n\r");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Header fields settings</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_SLOTSTATUS;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.wLength = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Header fields settings</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bMessageType = RDR_TO_PC_SLOTSTATUS;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.wLength = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSpecific = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus |= ICC_CS_FAILED;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus |= ICC_CS_FAILED;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Send the response to the host</span><br><span style="color: hsl(0, 100%, 40%);">- //vCCIDSendResponse();</span><br><span style="color: hsl(120, 100%, 40%);">+ // Send the response to the host</span><br><span style="color: hsl(120, 100%, 40%);">+ //vCCIDSendResponse();</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -700,15 +700,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void vCCIDSendResponse( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bStatus;</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- do {</span><br><span style="color: hsl(0, 100%, 40%);">- bStatus = CCID_Write((void*)&ccidDriver.sCcidMessage,</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSizeToSend, 0, 0 );</span><br><span style="color: hsl(0, 100%, 40%);">- } while (bStatus != USBD_STATUS_SUCCESS);</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ bStatus = CCID_Write((void*)&ccidDriver.sCcidMessage,</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSizeToSend, 0, 0 );</span><br><span style="color: hsl(120, 100%, 40%);">+ } while (bStatus != USBD_STATUS_SUCCESS);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("bStatus: 0x%x\n\r", bStatus);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("bStatus: 0x%x\n\r", bStatus);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -717,133 +717,133 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void CCIDCommandDispatcher( void *pArg, uint8_t status, uint32_t transferred, uint32_t remaining )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char MessageToSend = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char MessageToSend = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (status != USBD_STATUS_SUCCESS) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("USB error: %d", status);</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Command: 0x%X 0x%x 0x%X 0x%X 0x%X 0x%X 0x%X\n\r\n\r",</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.bMessageType,</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.wLength,</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.bSlot,</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.bSeq,</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.bSpecific_0,</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.bSpecific_1,</span><br><span style="color: hsl(0, 100%, 40%);">- (unsigned int)ccidDriver.sCcidCommand.bSpecific_2);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != USBD_STATUS_SUCCESS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("USB error: %d", status);</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Command: 0x%X 0x%x 0x%X 0x%X 0x%X 0x%X 0x%X\n\r\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.bMessageType,</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.wLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.bSlot,</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.bSeq,</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.bSpecific_0,</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.bSpecific_1,</span><br><span style="color: hsl(120, 100%, 40%);">+ (unsigned int)ccidDriver.sCcidCommand.bSpecific_2);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Check the slot number</span><br><span style="color: hsl(0, 100%, 40%);">- if ( ccidDriver.sCcidCommand.bSlot > 0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check the slot number</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( ccidDriver.sCcidCommand.bSlot > 0 ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("BAD_SLOT_NUMBER\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("BAD_SLOT_NUMBER\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("typ=0x%X\n\r", ccidDriver.sCcidCommand.bMessageType);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("typ=0x%X\n\r", ccidDriver.sCcidCommand.bMessageType);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bStatus = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bStatus = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSeq = ccidDriver.sCcidCommand.bSeq;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSlot = ccidDriver.sCcidCommand.bSlot;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSeq = ccidDriver.sCcidCommand.bSeq;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSlot = ccidDriver.sCcidCommand.bSlot;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.sCcidMessage.bSizeToSend = sizeof(S_ccid_bulk_in_header)-(ABDATA_SIZE+1);</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.sCcidMessage.bSizeToSend = sizeof(S_ccid_bulk_in_header)-(ABDATA_SIZE+1);</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Command dispatcher</span><br><span style="color: hsl(0, 100%, 40%);">- switch ( ccidDriver.sCcidCommand.bMessageType ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Command dispatcher</span><br><span style="color: hsl(120, 100%, 40%);">+ switch ( ccidDriver.sCcidCommand.bMessageType ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_ICCPOWERON:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRIccPowerOn();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_ICCPOWERON:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRIccPowerOn();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_ICCPOWEROFF:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRIccPowerOff();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_ICCPOWEROFF:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRIccPowerOff();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_GETSLOTSTATUS:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRGetSlotStatus();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_GETSLOTSTATUS:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRGetSlotStatus();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_XFRBLOCK:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRXfrBlock();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_XFRBLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRXfrBlock();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_GETPARAMETERS:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRGetParameters();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_GETPARAMETERS:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRGetParameters();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_RESETPARAMETERS:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRResetParameters();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_RESETPARAMETERS:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRResetParameters();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_SETPARAMETERS:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRSetParameters();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_SETPARAMETERS:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRSetParameters();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_ESCAPE:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDREscape();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_ESCAPE:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDREscape();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_ICCCLOCK:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRICCClock();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_ICCCLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRICCClock();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_T0APDU:</span><br><span style="color: hsl(0, 100%, 40%);">- // Only CCIDs reporting a short or extended APDU level in the dwFeatures </span><br><span style="color: hsl(0, 100%, 40%);">- // field of the CCID class descriptor may take this command into account.</span><br><span style="color: hsl(0, 100%, 40%);">- if( (CCID_FEATURES_EXC_SAPDU == (CCID_FEATURES_EXC_SAPDU&configurationDescriptorsFS->ccid.dwFeatures))</span><br><span style="color: hsl(0, 100%, 40%);">- || (CCID_FEATURES_EXC_APDU == (CCID_FEATURES_EXC_APDU &configurationDescriptorsFS->ccid.dwFeatures)) ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_T0APDU:</span><br><span style="color: hsl(120, 100%, 40%);">+ // Only CCIDs reporting a short or extended APDU level in the dwFeatures </span><br><span style="color: hsl(120, 100%, 40%);">+ // field of the CCID class descriptor may take this command into account.</span><br><span style="color: hsl(120, 100%, 40%);">+ if( (CCID_FEATURES_EXC_SAPDU == (CCID_FEATURES_EXC_SAPDU&configurationDescriptorsFS->ccid.dwFeatures))</span><br><span style="color: hsl(120, 100%, 40%);">+ || (CCID_FEATURES_EXC_APDU == (CCID_FEATURES_EXC_APDU &configurationDescriptorsFS->ccid.dwFeatures)) ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // command supported</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRtoAPDU();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- // command not supported</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("Not supported: PC_TO_RDR_T0APDU\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- vCCIDCommandNotSupported();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ // command supported</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRtoAPDU();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ // command not supported</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("Not supported: PC_TO_RDR_T0APDU\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ vCCIDCommandNotSupported();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_SECURE:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRSecure();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_SECURE:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRSecure();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_MECHANICAL:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRMechanical();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_MECHANICAL:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRMechanical();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_ABORT:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRAbort();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_ABORT:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRAbort();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY:</span><br><span style="color: hsl(0, 100%, 40%);">- PCtoRDRSetDataRateAndClockFrequency();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY:</span><br><span style="color: hsl(120, 100%, 40%);">+ PCtoRDRSetDataRateAndClockFrequency();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("default: Not supported: 0x%X\n\r", ccidDriver.sCcidCommand.bMessageType);</span><br><span style="color: hsl(0, 100%, 40%);">- vCCIDCommandNotSupported();</span><br><span style="color: hsl(0, 100%, 40%);">- MessageToSend = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("default: Not supported: 0x%X\n\r", ccidDriver.sCcidCommand.bMessageType);</span><br><span style="color: hsl(120, 100%, 40%);">+ vCCIDCommandNotSupported();</span><br><span style="color: hsl(120, 100%, 40%);">+ MessageToSend = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( MessageToSend == 1 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- vCCIDSendResponse();</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( MessageToSend == 1 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vCCIDSendResponse();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -853,49 +853,49 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> static void CCID_RequestHandler(const USBGenericRequest *pRequest)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("CCID_RHl\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("CCID_RHl\n\r");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Check if this is a class request</span><br><span style="color: hsl(0, 100%, 40%);">- if (USBGenericRequest_GetType(pRequest) == USBGenericRequest_CLASS) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check if this is a class request</span><br><span style="color: hsl(120, 100%, 40%);">+ if (USBGenericRequest_GetType(pRequest) == USBGenericRequest_CLASS) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Check if the request is supported</span><br><span style="color: hsl(0, 100%, 40%);">- switch (USBGenericRequest_GetRequest(pRequest)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check if the request is supported</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (USBGenericRequest_GetRequest(pRequest)) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case CCIDGenericRequest_ABORT:</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("CCIDGenericRequest_ABORT\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case CCIDGenericRequest_ABORT:</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("CCIDGenericRequest_ABORT\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case CCIDGenericRequest_GET_CLOCK_FREQUENCIES:</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not supported: CCIDGenericRequest_GET_CLOCK_FREQUENCIES\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- // A CCID with bNumClockSupported equal to 00h does not have </span><br><span style="color: hsl(0, 100%, 40%);">- // to support this request</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case CCIDGenericRequest_GET_CLOCK_FREQUENCIES:</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not supported: CCIDGenericRequest_GET_CLOCK_FREQUENCIES\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ // A CCID with bNumClockSupported equal to 00h does not have </span><br><span style="color: hsl(120, 100%, 40%);">+ // to support this request</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- case CCIDGenericRequest_GET_DATA_RATES:</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not supported: CCIDGenericRequest_GET_DATA_RATES\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- // A CCID with bNumDataRatesSupported equal to 00h does not have </span><br><span style="color: hsl(0, 100%, 40%);">- // to support this request.</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case CCIDGenericRequest_GET_DATA_RATES:</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not supported: CCIDGenericRequest_GET_DATA_RATES\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ // A CCID with bNumDataRatesSupported equal to 00h does not have </span><br><span style="color: hsl(120, 100%, 40%);">+ // to support this request.</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_WARNING( "CCIDDriver_RequestHandler: Unsupported request (%d)\n\r",</span><br><span style="color: hsl(0, 100%, 40%);">- USBGenericRequest_GetRequest(pRequest));</span><br><span style="color: hsl(0, 100%, 40%);">- USBD_Stall(0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_WARNING( "CCIDDriver_RequestHandler: Unsupported request (%d)\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+ USBGenericRequest_GetRequest(pRequest));</span><br><span style="color: hsl(120, 100%, 40%);">+ USBD_Stall(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- else if (USBGenericRequest_GetType(pRequest) == USBGenericRequest_STANDARD) {</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (USBGenericRequest_GetType(pRequest) == USBGenericRequest_STANDARD) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Forward request to the standard handler</span><br><span style="color: hsl(0, 100%, 40%);">- USBDDriver_RequestHandler(USBD_GetDriver(), pRequest);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Forward request to the standard handler</span><br><span style="color: hsl(120, 100%, 40%);">+ USBDDriver_RequestHandler(USBD_GetDriver(), pRequest);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Unsupported request type</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_WARNING( "CCIDDriver_RequestHandler: Unsupported request type (%d)\n\r",</span><br><span style="color: hsl(0, 100%, 40%);">- USBGenericRequest_GetType(pRequest));</span><br><span style="color: hsl(0, 100%, 40%);">- USBD_Stall(0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Unsupported request type</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_WARNING( "CCIDDriver_RequestHandler: Unsupported request type (%d)\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+ USBGenericRequest_GetType(pRequest));</span><br><span style="color: hsl(120, 100%, 40%);">+ USBD_Stall(0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -910,7 +910,7 @@</span><br><span> // not static function</span><br><span> void USBDCallbacks_RequestReceived(const USBGenericRequest *request)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- CCID_RequestHandler(request);</span><br><span style="color: hsl(120, 100%, 40%);">+ CCID_RequestHandler(request);</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span>@@ -920,17 +920,17 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> void CCID_SmartCardRequest( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bStatus;</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("CCID_req\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("CCID_req\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- do {</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bStatus = CCID_Read( (void*)&ccidDriver.sCcidCommand,</span><br><span style="color: hsl(0, 100%, 40%);">- sizeof(S_ccid_bulk_out_header),</span><br><span style="color: hsl(0, 100%, 40%);">- (TransferCallback)&CCIDCommandDispatcher,</span><br><span style="color: hsl(0, 100%, 40%);">- (void*)0 );</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- while (0);</span><br><span style="color: hsl(120, 100%, 40%);">+ bStatus = CCID_Read( (void*)&ccidDriver.sCcidCommand,</span><br><span style="color: hsl(120, 100%, 40%);">+ sizeof(S_ccid_bulk_out_header),</span><br><span style="color: hsl(120, 100%, 40%);">+ (TransferCallback)&CCIDCommandDispatcher,</span><br><span style="color: hsl(120, 100%, 40%);">+ (void*)0 );</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ while (0);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -943,11 +943,11 @@</span><br><span> /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS</span><br><span> //------------------------------------------------------------------------------</span><br><span> unsigned char CCID_Read(void *pBuffer,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dLength,</span><br><span style="color: hsl(0, 100%, 40%);">- TransferCallback fCallback,</span><br><span style="color: hsl(0, 100%, 40%);">- void *pArgument)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ TransferCallback fCallback,</span><br><span style="color: hsl(120, 100%, 40%);">+ void *pArgument)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return USBD_Read(CCID_EPT_DATA_OUT, pBuffer, dLength, fCallback, pArgument);</span><br><span style="color: hsl(120, 100%, 40%);">+ return USBD_Read(CCID_EPT_DATA_OUT, pBuffer, dLength, fCallback, pArgument);</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -959,11 +959,11 @@</span><br><span> /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS</span><br><span> //------------------------------------------------------------------------------</span><br><span> unsigned char CCID_Write(void *pBuffer,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int dLength,</span><br><span style="color: hsl(0, 100%, 40%);">- TransferCallback fCallback,</span><br><span style="color: hsl(0, 100%, 40%);">- void *pArgument)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int dLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ TransferCallback fCallback,</span><br><span style="color: hsl(120, 100%, 40%);">+ void *pArgument)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return USBD_Write(CCID_EPT_DATA_IN, pBuffer, dLength, fCallback, pArgument);</span><br><span style="color: hsl(120, 100%, 40%);">+ return USBD_Write(CCID_EPT_DATA_IN, pBuffer, dLength, fCallback, pArgument);</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -973,15 +973,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> unsigned char CCID_Insertion( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Build the Interrupt-IN message</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[0] = RDR_TO_PC_NOTIFYSLOTCHANGE;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[1] = ICC_INSERTED_EVENT;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.SlotStatus = ICC_INSERTED_EVENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Build the Interrupt-IN message</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[0] = RDR_TO_PC_NOTIFYSLOTCHANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[1] = ICC_INSERTED_EVENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.SlotStatus = ICC_INSERTED_EVENT;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Notify the host that a ICC is inserted</span><br><span style="color: hsl(0, 100%, 40%);">- return USBD_Write( CCID_EPT_NOTIFICATION, ccidDriver.BufferINT, 2, 0, 0 );</span><br><span style="color: hsl(120, 100%, 40%);">+ // Notify the host that a ICC is inserted</span><br><span style="color: hsl(120, 100%, 40%);">+ return USBD_Write( CCID_EPT_NOTIFICATION, ccidDriver.BufferINT, 2, 0, 0 );</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -991,15 +991,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> unsigned char CCID_Removal( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Build the Interrupt-IN message</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[0] = RDR_TO_PC_NOTIFYSLOTCHANGE;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[1] = ICC_NOT_PRESENT;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.SlotStatus = ICC_NOT_PRESENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Build the Interrupt-IN message</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[0] = RDR_TO_PC_NOTIFYSLOTCHANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[1] = ICC_NOT_PRESENT;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.SlotStatus = ICC_NOT_PRESENT;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Notify the host that a ICC is inserted</span><br><span style="color: hsl(0, 100%, 40%);">- return USBD_Write( CCID_EPT_NOTIFICATION, ccidDriver.BufferINT, 2, 0, 0 );</span><br><span style="color: hsl(120, 100%, 40%);">+ // Notify the host that a ICC is inserted</span><br><span style="color: hsl(120, 100%, 40%);">+ return USBD_Write( CCID_EPT_NOTIFICATION, ccidDriver.BufferINT, 2, 0, 0 );</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -1014,19 +1014,19 @@</span><br><span> /// \return USBD_STATUS_LOCKED or USBD_STATUS_SUCCESS</span><br><span> //------------------------------------------------------------------------------</span><br><span> unsigned char RDRtoPCHardwareError( unsigned char bSlot, </span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bSeq, </span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char bHardwareErrorCode )</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bSeq, </span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char bHardwareErrorCode )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG(".");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG(".");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Build the Interrupt-IN message</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[0] = RDR_TO_PC_HARDWAREERROR;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[1] = bSlot;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[2] = bSeq;</span><br><span style="color: hsl(0, 100%, 40%);">- ccidDriver.BufferINT[3] = bHardwareErrorCode;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Build the Interrupt-IN message</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[0] = RDR_TO_PC_HARDWAREERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[1] = bSlot;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[2] = bSeq;</span><br><span style="color: hsl(120, 100%, 40%);">+ ccidDriver.BufferINT[3] = bHardwareErrorCode;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Notify the host that a ICC is inserted</span><br><span style="color: hsl(0, 100%, 40%);">- return USBD_Write( CCID_EPT_NOTIFICATION, ccidDriver.BufferINT, 4, 0, 0 );</span><br><span style="color: hsl(120, 100%, 40%);">+ // Notify the host that a ICC is inserted</span><br><span style="color: hsl(120, 100%, 40%);">+ return USBD_Write( CCID_EPT_NOTIFICATION, ccidDriver.BufferINT, 4, 0, 0 );</span><br><span> }</span><br><span> </span><br><span> #endif /* HAVE_CCID */</span><br><span>diff --git a/firmware/libcommon/source/iso7816_4.c b/firmware/libcommon/source/iso7816_4.c</span><br><span>index 7219741..ac15306 100644</span><br><span>--- a/firmware/libcommon/source/iso7816_4.c</span><br><span>+++ b/firmware/libcommon/source/iso7816_4.c</span><br><span>@@ -76,45 +76,45 @@</span><br><span> */</span><br><span> uint32_t ISO7816_GetChar( uint8_t *pCharToReceive, Usart_info *usart)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t status;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t timeout=0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t status;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t timeout=0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- Usart *us_base = usart->base;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t us_id = usart->id;</span><br><span style="color: hsl(120, 100%, 40%);">+ Usart *us_base = usart->base;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t us_id = usart->id;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( usart->state == USART_SEND ) {</span><br><span style="color: hsl(0, 100%, 40%);">- while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span style="color: hsl(0, 100%, 40%);">- usart->state = USART_RCV;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( usart->state == USART_SEND ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while((us_base->US_CSR & US_CSR_TXEMPTY) == 0) {}</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span style="color: hsl(120, 100%, 40%);">+ usart->state = USART_RCV;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Wait USART ready for reception */</span><br><span style="color: hsl(0, 100%, 40%);">- while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Wait USART ready for reception */</span><br><span style="color: hsl(120, 100%, 40%);">+ while( ((us_base->US_CSR & US_CSR_RXRDY) == 0) ) {</span><br><span> WDT_Restart(WDT);</span><br><span style="color: hsl(0, 100%, 40%);">- if(timeout++ > 12000 * (BOARD_MCK/1000000)) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_WARNING("TimeOut\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- return( 0 );</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if(timeout++ > 12000 * (BOARD_MCK/1000000)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_WARNING("TimeOut\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ return( 0 );</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* At least one complete character has been received and US_RHR has not yet been read. */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* At least one complete character has been received and US_RHR has not yet been read. */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Get a char */</span><br><span style="color: hsl(0, 100%, 40%);">- *pCharToReceive = ((us_base->US_RHR) & 0xFF);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Get a char */</span><br><span style="color: hsl(120, 100%, 40%);">+ *pCharToReceive = ((us_base->US_RHR) & 0xFF);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|</span><br><span style="color: hsl(0, 100%, 40%);">- US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|</span><br><span style="color: hsl(0, 100%, 40%);">- (1<<10)));</span><br><span style="color: hsl(120, 100%, 40%);">+ status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|</span><br><span style="color: hsl(120, 100%, 40%);">+ US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|</span><br><span style="color: hsl(120, 100%, 40%);">+ (1<<10)));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status); </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_CR = US_CR_RSTSTA;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("R:0x%" PRIX32 "\n\r", status); </span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("R:0x%" PRIX32 "\n\r", us_base->US_CSR);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Nb:0x%" PRIX32 "\n\r", us_base->US_NER );</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_CR = US_CR_RSTSTA;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Return status */</span><br><span style="color: hsl(0, 100%, 40%);">- return( status );</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Return status */</span><br><span style="color: hsl(120, 100%, 40%);">+ return( status );</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -125,50 +125,50 @@</span><br><span> */</span><br><span> uint32_t ISO7816_SendChar( uint8_t CharToSend, Usart_info *usart )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t status;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t status;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- Usart *us_base = usart->base;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t us_id = usart->id;</span><br><span style="color: hsl(120, 100%, 40%);">+ Usart *us_base = usart->base;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t us_id = usart->id;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( usart->state == USART_RCV ) {</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span style="color: hsl(0, 100%, 40%);">- usart->state = USART_SEND;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( usart->state == USART_RCV ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span style="color: hsl(120, 100%, 40%);">+ usart->state = USART_SEND;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Wait USART ready for transmit */</span><br><span style="color: hsl(0, 100%, 40%);">- int i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- while((us_base->US_CSR & (US_CSR_TXRDY)) == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- i++;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(i%1000000)) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("s: %x ", us_base->US_CSR);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("s: %x\r\n", us_base->US_RHR & 0xFF);</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_CR = US_CR_RSTTX;</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_CR = US_CR_RSTRX;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* There is no character in the US_THR */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Wait USART ready for transmit */</span><br><span style="color: hsl(120, 100%, 40%);">+ int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ while((us_base->US_CSR & (US_CSR_TXRDY)) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ i++;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(i%1000000)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("s: %x ", us_base->US_CSR);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("s: %x\r\n", us_base->US_RHR & 0xFF);</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_CR = US_CR_RSTTX;</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_CR = US_CR_RSTRX;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* There is no character in the US_THR */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Transmit a char */</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_THR = CharToSend;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Transmit a char */</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_THR = CharToSend;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_ERROR("Sx%02X\r\n", CharToSend);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_ERROR("Sx%02X\r\n", CharToSend);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|</span><br><span style="color: hsl(0, 100%, 40%);">- US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|</span><br><span style="color: hsl(0, 100%, 40%);">- (1<<10)));</span><br><span style="color: hsl(120, 100%, 40%);">+ status = (us_base->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|</span><br><span style="color: hsl(120, 100%, 40%);">+ US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|</span><br><span style="color: hsl(120, 100%, 40%);">+ (1<<10)));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32</span><br><span style="color: hsl(0, 100%, 40%);">- ", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",</span><br><span style="color: hsl(0, 100%, 40%);">- status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),</span><br><span style="color: hsl(0, 100%, 40%);">- ((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_CR = US_CR_RSTSTA;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("******* status: 0x%" PRIX32 " (Overrun: %" PRIX32</span><br><span style="color: hsl(120, 100%, 40%);">+ ", NACK: %" PRIX32 ", Timeout: %" PRIX32 ", underrun: %" PRIX32 ")\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+ status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),</span><br><span style="color: hsl(120, 100%, 40%);">+ ((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("E (USART CSR reg):0x%" PRIX32 "\n\r", us_base->US_CSR);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("Nb (Number of errors):0x%" PRIX32 "\n\r", us_base->US_NER );</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_CR = US_CR_RSTSTA;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Return status */</span><br><span style="color: hsl(0, 100%, 40%);">- return( status );</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Return status */</span><br><span style="color: hsl(120, 100%, 40%);">+ return( status );</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -177,10 +177,10 @@</span><br><span> */</span><br><span> static void ISO7816_IccPowerOn( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Set RESET Master Card */</span><br><span style="color: hsl(0, 100%, 40%);">- if (st_pinIso7816RstMC) {</span><br><span style="color: hsl(0, 100%, 40%);">- PIO_Set(st_pinIso7816RstMC);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set RESET Master Card */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (st_pinIso7816RstMC) {</span><br><span style="color: hsl(120, 100%, 40%);">+ PIO_Set(st_pinIso7816RstMC);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /*----------------------------------------------------------------------------</span><br><span>@@ -192,10 +192,10 @@</span><br><span> */</span><br><span> void ISO7816_IccPowerOff( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Clear RESET Master Card */</span><br><span style="color: hsl(0, 100%, 40%);">- if (st_pinIso7816RstMC) {</span><br><span style="color: hsl(0, 100%, 40%);">- PIO_Clear(st_pinIso7816RstMC);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clear RESET Master Card */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (st_pinIso7816RstMC) {</span><br><span style="color: hsl(120, 100%, 40%);">+ PIO_Clear(st_pinIso7816RstMC);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -207,159 +207,159 @@</span><br><span> * \return 0 on success, content of US_CSR otherwise</span><br><span> */</span><br><span> uint32_t ISO7816_XfrBlockTPDU_T0(const uint8_t *pAPDU,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *pMessage,</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t wLength,</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t *retlen )</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t *pMessage,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t wLength,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t *retlen )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t NeNc;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t indexApdu = 4;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t indexMsg = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t SW1 = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t procByte;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t cmdCase;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t status = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t NeNc;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t indexApdu = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t indexMsg = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t SW1 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t procByte;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t cmdCase;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t status = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("wlength=%d\n\r",wLength);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("pAPDU[0]=0x%X\n\r",pAPDU[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("pAPDU[1]=0x%X\n\r",pAPDU[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("pAPDU[2]=0x%X\n\r",pAPDU[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("pAPDU[3]=0x%X\n\r",pAPDU[3]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("pAPDU[4]=0x%X\n\r",pAPDU[4]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("pAPDU[5]=0x%X\n\r",pAPDU[5]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("wlength=%d\n\r",wLength);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SendChar( pAPDU[0], &usart_sim ); /* CLA */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SendChar( pAPDU[1], &usart_sim ); /* INS */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SendChar( pAPDU[2], &usart_sim ); /* P1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SendChar( pAPDU[3], &usart_sim ); /* P2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SendChar( pAPDU[4], &usart_sim ); /* P3 */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle the four structures of command APDU */</span><br><span style="color: hsl(0, 100%, 40%);">- indexApdu = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle the four structures of command APDU */</span><br><span style="color: hsl(120, 100%, 40%);">+ indexApdu = 5;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if( wLength == 4 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE1;</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else if( wLength == 5) {</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE2;</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(0, 100%, 40%);">- if (NeNc == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = 256;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else if( wLength == 6) {</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE3;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else if( wLength == 7) {</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(0, 100%, 40%);">- if( NeNc == 0 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE2;</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = (pAPDU[5]<<8)+pAPDU[6];</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE3;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(0, 100%, 40%);">- if( NeNc == 0 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE3;</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc = (pAPDU[5]<<8)+pAPDU[6];</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- cmdCase = CASE3;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( wLength == 4 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE1;</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else if( wLength == 5) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE2;</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (NeNc == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = 256;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else if( wLength == 6) {</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE3;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else if( wLength == 7) {</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if( NeNc == 0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE2;</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = (pAPDU[5]<<8)+pAPDU[6];</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE3;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = pAPDU[4]; /* C5 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if( NeNc == 0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE3;</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc = (pAPDU[5]<<8)+pAPDU[6];</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmdCase = CASE3;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("CASE=0x%X NeNc=0x%X\n\r", cmdCase, NeNc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle Procedure Bytes */</span><br><span style="color: hsl(0, 100%, 40%);">- do {</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&procByte, &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("procByte: 0x%X\n\r", procByte);</span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle NULL */</span><br><span style="color: hsl(0, 100%, 40%);">- if ( procByte == ISO_NULL_VAL ) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("INS\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle SW1 */</span><br><span style="color: hsl(0, 100%, 40%);">- else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("SW1\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- SW1 = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle INS */</span><br><span style="color: hsl(0, 100%, 40%);">- else if ( pAPDU[1] == procByte) {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("HdlINS\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- if (cmdCase == CASE2) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* receive data from card */</span><br><span style="color: hsl(0, 100%, 40%);">- do {</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- } while(( 0 != --NeNc) && (status == 0) );</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Send data */</span><br><span style="color: hsl(0, 100%, 40%);">- do {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("Send %X", pAPDU[indexApdu]);</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- } while( 0 != --NeNc );</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- /* Handle INS ^ 0xff */</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- #pragma GCC diagnostic push</span><br><span style="color: hsl(0, 100%, 40%);">- #pragma GCC diagnostic ignored "-Wsign-compare"</span><br><span style="color: hsl(0, 100%, 40%);">- if ( pAPDU[1] == (procByte ^ 0xff)) {</span><br><span style="color: hsl(0, 100%, 40%);">- #pragma GCC diagnostic pop</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("HdlINS+\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- if (cmdCase == CASE2) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* receive data from card */</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- NeNc--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- /* ?? */</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_INFO("procByte=0x%X\n\r", procByte);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- } while (NeNc != 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle Procedure Bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&procByte, &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("procByte: 0x%X\n\r", procByte);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle NULL */</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( procByte == ISO_NULL_VAL ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("INS\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle SW1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ else if ( ((procByte & 0xF0) ==0x60) || ((procByte & 0xF0) ==0x90) ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("SW1\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ SW1 = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle INS */</span><br><span style="color: hsl(120, 100%, 40%);">+ else if ( pAPDU[1] == procByte) {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("HdlINS\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmdCase == CASE2) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* receive data from card */</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ } while(( 0 != --NeNc) && (status == 0) );</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Send data */</span><br><span style="color: hsl(120, 100%, 40%);">+ do {</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("Send %X", pAPDU[indexApdu]);</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ } while( 0 != --NeNc );</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Handle INS ^ 0xff */</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ #pragma GCC diagnostic push</span><br><span style="color: hsl(120, 100%, 40%);">+ #pragma GCC diagnostic ignored "-Wsign-compare"</span><br><span style="color: hsl(120, 100%, 40%);">+ if ( pAPDU[1] == (procByte ^ 0xff)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ #pragma GCC diagnostic pop</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("HdlINS+\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cmdCase == CASE2) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* receive data from card */</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("Rcv: 0x%X\n\r", pMessage[indexMsg-1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_SendChar(pAPDU[indexApdu++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ NeNc--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ?? */</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_INFO("procByte=0x%X\n\r", procByte);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ } while (NeNc != 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Status Bytes */</span><br><span style="color: hsl(0, 100%, 40%);">- if (SW1 == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- pMessage[indexMsg++] = procByte;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Status Bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (SW1 == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ pMessage[indexMsg++] = procByte;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pMessage[indexMsg++], &usart_sim); /* SW2 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_WARNING("SW1=0x%X, SW2=0x%X\n\r", pMessage[indexMsg-2], pMessage[indexMsg-1]);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *retlen = indexMsg;</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ *retlen = indexMsg;</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span> </span><br><span> }</span><br><span> </span><br><span>@@ -368,7 +368,7 @@</span><br><span> */</span><br><span> void ISO7816_Escape( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("For user, if needed\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("For user, if needed\n\r");</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -376,8 +376,8 @@</span><br><span> */</span><br><span> void ISO7816_RestartClock( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("ISO7816_RestartClock\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_BRGR = 13;</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("ISO7816_RestartClock\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_BRGR = 13;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -385,8 +385,8 @@</span><br><span> */</span><br><span> void ISO7816_StopClock( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("ISO7816_StopClock\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_BRGR = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("ISO7816_StopClock\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_BRGR = 0;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -394,8 +394,8 @@</span><br><span> */</span><br><span> void ISO7816_toAPDU( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("ISO7816_toAPDU\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("Not supported at this time\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("ISO7816_toAPDU\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("Not supported at this time\n\r");</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -406,64 +406,64 @@</span><br><span> */</span><br><span> uint32_t ISO7816_Datablock_ATR( uint8_t* pAtr, uint8_t* pLength )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t i;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t j;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t y;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t status = 0; </span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t j;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t y;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t status = 0; </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pLength = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ *pLength = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Read ATR TS */</span><br><span style="color: hsl(0, 100%, 40%);">- // FIXME: There should always be a check for the GetChar return value..0 means timeout</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[0], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Read ATR TS */</span><br><span style="color: hsl(120, 100%, 40%);">+ // FIXME: There should always be a check for the GetChar return value..0 means timeout</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[0], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Read ATR T0 */</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[1], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- y = pAtr[1] & 0xF0;</span><br><span style="color: hsl(0, 100%, 40%);">- i = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Read ATR T0 */</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[1], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ y = pAtr[1] & 0xF0;</span><br><span style="color: hsl(120, 100%, 40%);">+ i = 2;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Read ATR Ti */</span><br><span style="color: hsl(0, 100%, 40%);">- while (y && (status == 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Read ATR Ti */</span><br><span style="color: hsl(120, 100%, 40%);">+ while (y && (status == 0)) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x10) { /* TA[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x20) { /* TB[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x40) { /* TC[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x80) { /* TD[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[i], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- y = pAtr[i++] & 0xF0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- y = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x10) { /* TA[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x20) { /* TB[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x40) { /* TC[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x80) { /* TD[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[i], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ y = pAtr[i++] & 0xF0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ y = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Historical Bytes */</span><br><span style="color: hsl(0, 100%, 40%);">- y = pAtr[1] & 0x0F;</span><br><span style="color: hsl(0, 100%, 40%);">- for( j=0; (j < y) && (status == 0); j++ ) {</span><br><span style="color: hsl(0, 100%, 40%);">- status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Historical Bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+ y = pAtr[1] & 0x0F;</span><br><span style="color: hsl(120, 100%, 40%);">+ for( j=0; (j < y) && (status == 0); j++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ status = ISO7816_GetChar(&pAtr[i++], &usart_sim);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (status != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (status != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pLength = i;</span><br><span style="color: hsl(0, 100%, 40%);">- return status;</span><br><span style="color: hsl(120, 100%, 40%);">+ *pLength = i;</span><br><span style="color: hsl(120, 100%, 40%);">+ return status;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -473,18 +473,18 @@</span><br><span> */</span><br><span> void ISO7816_SetDataRateandClockFrequency( uint32_t dwClockFrequency, uint32_t dwDataRate )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ClockFrequency;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ClockFrequency;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Define the baud rate divisor register */</span><br><span style="color: hsl(0, 100%, 40%);">- /* CD = MCK / SCK */</span><br><span style="color: hsl(0, 100%, 40%);">- /* SCK = FIDI x BAUD = 372 x 9600 */</span><br><span style="color: hsl(0, 100%, 40%);">- /* BOARD_MCK */</span><br><span style="color: hsl(0, 100%, 40%);">- /* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */</span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Define the baud rate divisor register */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* CD = MCK / SCK */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SCK = FIDI x BAUD = 372 x 9600 */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* BOARD_MCK */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_BRGR = BOARD_MCK / (dwClockFrequency*1000);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;</span><br><span style="color: hsl(120, 100%, 40%);">+ ClockFrequency = BOARD_MCK / USART_SIM->US_BRGR;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_FIDI = (ClockFrequency)/dwDataRate;</span><br><span> </span><br><span> }</span><br><span> </span><br><span>@@ -494,10 +494,10 @@</span><br><span> */</span><br><span> uint8_t ISO7816_StatusReset( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (st_pinIso7816RstMC) {</span><br><span style="color: hsl(0, 100%, 40%);">- return PIO_Get(st_pinIso7816RstMC);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (st_pinIso7816RstMC) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return PIO_Get(st_pinIso7816RstMC);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -505,16 +505,16 @@</span><br><span> */</span><br><span> void ISO7816_cold_reset( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- volatile uint32_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+ volatile uint32_t i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* tb: wait ??? cycles*/</span><br><span style="color: hsl(0, 100%, 40%);">- for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* tb: wait ??? cycles*/</span><br><span style="color: hsl(120, 100%, 40%);">+ for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_RHR;</span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_RHR;</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_IccPowerOn();</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_IccPowerOn();</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -522,20 +522,20 @@</span><br><span> */</span><br><span> void ISO7816_warm_reset( void )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- volatile uint32_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+ volatile uint32_t i;</span><br><span> </span><br><span> // Clears Reset</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_IccPowerOff();</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_IccPowerOff();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* tb: wait ??? cycles */</span><br><span style="color: hsl(0, 100%, 40%);">- for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ /* tb: wait ??? cycles */</span><br><span style="color: hsl(120, 100%, 40%);">+ for( i=0; i<(400*(BOARD_MCK/1000000)); i++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_RHR;</span><br><span style="color: hsl(0, 100%, 40%);">- USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_RHR;</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_SIM->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;</span><br><span> </span><br><span> // Sets Reset</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_IccPowerOn();</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_IccPowerOn();</span><br><span> }</span><br><span> </span><br><span> /**</span><br><span>@@ -544,99 +544,99 @@</span><br><span> */</span><br><span> void ISO7816_Decode_ATR( uint8_t* pAtr )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t i;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t j;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t y;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t offset;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t j;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t y;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t offset;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- printf("ATR: Answer To Reset:\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TS = 0x%X Initial character ",pAtr[0]);</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[0] == 0x3B ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("ATR: Answer To Reset:\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TS = 0x%X Initial character ",pAtr[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[0] == 0x3B ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("Direct Convention\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[0] == 0x3F ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Direct Convention\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[0] == 0x3F ) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("Inverse Convention\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("BAD Convention\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Inverse Convention\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("BAD Convention\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" Presence further interface byte:\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[1]&0x80 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TA ");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[1]&0x40 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TB ");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[1]&0x20 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TC ");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[1]&0x10 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TD ");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if( pAtr[1] != 0 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" present\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("T0 = 0x%X Format caracter\n\r",pAtr[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" Presence further interface byte:\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[1]&0x80 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TA ");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[1]&0x40 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TB ");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[1]&0x20 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TC ");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[1]&0x10 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TD ");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if( pAtr[1] != 0 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" present\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- i = 2;</span><br><span style="color: hsl(0, 100%, 40%);">- y = pAtr[1] & 0xF0;</span><br><span style="color: hsl(120, 100%, 40%);">+ i = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ y = pAtr[1] & 0xF0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Read ATR Ti */</span><br><span style="color: hsl(0, 100%, 40%);">- offset = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- while (y) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Read ATR Ti */</span><br><span style="color: hsl(120, 100%, 40%);">+ offset = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (y) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x10) { /* TA[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TA[%d] = 0x%X ", offset, pAtr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- if( offset == 1 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("FI = %d ", (pAtr[i]>>8));</span><br><span style="color: hsl(0, 100%, 40%);">- printf("DI = %d", (pAtr[i]&0x0F));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- i++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x20) { /* TB[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- i++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x40) { /* TC[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TC[%d] = 0x%X ", offset, pAtr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- if( offset == 1 ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Extra Guard Time: N = %d", pAtr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- i++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (y & 0x80) { /* TD[i] */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- y = pAtr[i++] & 0xF0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(0, 100%, 40%);">- y = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- offset++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x10) { /* TA[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TA[%d] = 0x%X ", offset, pAtr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if( offset == 1 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("FI = %d ", (pAtr[i]>>8));</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("DI = %d", (pAtr[i]&0x0F));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ i++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x20) { /* TB[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TB[%d] = 0x%X\n\r", offset, pAtr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ i++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x40) { /* TC[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TC[%d] = 0x%X ", offset, pAtr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if( offset == 1 ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Extra Guard Time: N = %d", pAtr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ i++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (y & 0x80) { /* TD[i] */</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("TD[%d] = 0x%X\n\r", offset, pAtr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ y = pAtr[i++] & 0xF0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span style="color: hsl(120, 100%, 40%);">+ y = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ offset++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Historical Bytes */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Historical bytes:\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">- y = pAtr[1] & 0x0F;</span><br><span style="color: hsl(0, 100%, 40%);">- for( j=0; j < y; j++ ) {</span><br><span style="color: hsl(0, 100%, 40%);">- printf(" 0x%X", pAtr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- i++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\r\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Historical Bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Historical bytes:\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ y = pAtr[1] & 0x0F;</span><br><span style="color: hsl(120, 100%, 40%);">+ for( j=0; j < y; j++ ) {</span><br><span style="color: hsl(120, 100%, 40%);">+ printf(" 0x%X", pAtr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ i++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("\n\r\n\r");</span><br><span> </span><br><span> }</span><br><span> </span><br><span> void ISO7816_Set_Reset_Pin(const Pin *pPinIso7816RstMC) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Pin ISO7816 initialize */</span><br><span style="color: hsl(0, 100%, 40%);">- st_pinIso7816RstMC = (Pin *)pPinIso7816RstMC;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Pin ISO7816 initialize */</span><br><span style="color: hsl(120, 100%, 40%);">+ st_pinIso7816RstMC = (Pin *)pPinIso7816RstMC;</span><br><span> }</span><br><span> </span><br><span> /** Initializes a ISO driver</span><br><span>@@ -644,46 +644,46 @@</span><br><span> */</span><br><span> void ISO7816_Init( Usart_info *usart, bool master_clock )</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t clk;</span><br><span style="color: hsl(0, 100%, 40%);">- TRACE_DEBUG("ISO_Init\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t clk;</span><br><span style="color: hsl(120, 100%, 40%);">+ TRACE_DEBUG("ISO_Init\n\r");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- Usart *us_base = usart->base;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t us_id = usart->id;</span><br><span style="color: hsl(120, 100%, 40%);">+ Usart *us_base = usart->base;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t us_id = usart->id;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (master_clock == true) {</span><br><span style="color: hsl(0, 100%, 40%);">- clk = US_MR_USCLKS_MCK;</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- clk = US_MR_USCLKS_SCK;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (master_clock == true) {</span><br><span style="color: hsl(120, 100%, 40%);">+ clk = US_MR_USCLKS_MCK;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ clk = US_MR_USCLKS_SCK;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- USART_Configure( us_base,</span><br><span style="color: hsl(0, 100%, 40%);">- US_MR_USART_MODE_IS07816_T_0</span><br><span style="color: hsl(0, 100%, 40%);">- | clk</span><br><span style="color: hsl(0, 100%, 40%);">- | US_MR_NBSTOP_1_BIT</span><br><span style="color: hsl(0, 100%, 40%);">- | US_MR_PAR_EVEN</span><br><span style="color: hsl(0, 100%, 40%);">- | US_MR_CHRL_8_BIT</span><br><span style="color: hsl(0, 100%, 40%);">- | US_MR_CLKO</span><br><span style="color: hsl(0, 100%, 40%);">- | US_MR_INACK /* Inhibit errors */</span><br><span style="color: hsl(0, 100%, 40%);">- | (3<<24), /* MAX_ITERATION */</span><br><span style="color: hsl(0, 100%, 40%);">- 1,</span><br><span style="color: hsl(0, 100%, 40%);">- 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ USART_Configure( us_base,</span><br><span style="color: hsl(120, 100%, 40%);">+ US_MR_USART_MODE_IS07816_T_0</span><br><span style="color: hsl(120, 100%, 40%);">+ | clk</span><br><span style="color: hsl(120, 100%, 40%);">+ | US_MR_NBSTOP_1_BIT</span><br><span style="color: hsl(120, 100%, 40%);">+ | US_MR_PAR_EVEN</span><br><span style="color: hsl(120, 100%, 40%);">+ | US_MR_CHRL_8_BIT</span><br><span style="color: hsl(120, 100%, 40%);">+ | US_MR_CLKO</span><br><span style="color: hsl(120, 100%, 40%);">+ | US_MR_INACK /* Inhibit errors */</span><br><span style="color: hsl(120, 100%, 40%);">+ | (3<<24), /* MAX_ITERATION */</span><br><span style="color: hsl(120, 100%, 40%);">+ 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ 0);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Disable interrupts */</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_IDR = (uint32_t) -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Disable interrupts */</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_IDR = (uint32_t) -1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Configure USART */</span><br><span style="color: hsl(0, 100%, 40%);">- PMC_EnablePeripheral(us_id);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Configure USART */</span><br><span style="color: hsl(120, 100%, 40%);">+ PMC_EnablePeripheral(us_id);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_FIDI = 372; /* by default */</span><br><span style="color: hsl(0, 100%, 40%);">- /* Define the baud rate divisor register */</span><br><span style="color: hsl(0, 100%, 40%);">- /* CD = MCK / SCK */</span><br><span style="color: hsl(0, 100%, 40%);">- /* SCK = FIDI x BAUD = 372 x 9600 */</span><br><span style="color: hsl(0, 100%, 40%);">- /* BOARD_MCK */</span><br><span style="color: hsl(0, 100%, 40%);">- /* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */</span><br><span style="color: hsl(0, 100%, 40%);">- if (master_clock == true) {</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_BRGR = BOARD_MCK / (372*9600);</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- us_base->US_BRGR = US_BRGR_CD(1);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_FIDI = 372; /* by default */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Define the baud rate divisor register */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* CD = MCK / SCK */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SCK = FIDI x BAUD = 372 x 9600 */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* BOARD_MCK */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* CD = MCK/(FIDI x BAUD) = 48000000 / (372x9600) = 13 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (master_clock == true) {</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_BRGR = BOARD_MCK / (372*9600);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ us_base->US_BRGR = US_BRGR_CD(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span>diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c</span><br><span>index bc91273..c7362cf 100644</span><br><span>--- a/firmware/libcommon/source/mode_cardemu.c</span><br><span>+++ b/firmware/libcommon/source/mode_cardemu.c</span><br><span>@@ -202,7 +202,7 @@</span><br><span> csr = usart->US_CSR & usart->US_IMR;</span><br><span> </span><br><span> if (csr & US_CSR_RXRDY) {</span><br><span style="color: hsl(0, 100%, 40%);">- byte = (usart->US_RHR) & 0xFF;</span><br><span style="color: hsl(120, 100%, 40%);">+ byte = (usart->US_RHR) & 0xFF;</span><br><span> if (rbuf_write(&ci->rb, byte) < 0)</span><br><span> TRACE_ERROR("rbuf overrun\r\n");</span><br><span> }</span><br><span>diff --git a/firmware/libcommon/source/mode_ccid.c b/firmware/libcommon/source/mode_ccid.c</span><br><span>index 77d4158..516826e 100644</span><br><span>--- a/firmware/libcommon/source/mode_ccid.c</span><br><span>+++ b/firmware/libcommon/source/mode_ccid.c</span><br><span>@@ -84,11 +84,11 @@</span><br><span> static void ISR_PioSmartCard(const Pin * pPin)</span><br><span> {</span><br><span> /* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?</span><br><span style="color: hsl(0, 100%, 40%);">- printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);</span><br><span style="color: hsl(0, 100%, 40%);">- printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);</span><br><span> Output:</span><br><span style="color: hsl(0, 100%, 40%);">- +++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10</span><br><span style="color: hsl(0, 100%, 40%);">- +++++ Mask: 0x100 = 1<<8</span><br><span style="color: hsl(120, 100%, 40%);">+ +++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10</span><br><span style="color: hsl(120, 100%, 40%);">+ +++++ Mask: 0x100 = 1<<8</span><br><span> */</span><br><span> // PA10 is DTXD, which is the debug uart transmit pin</span><br><span> </span><br><span>diff --git a/firmware/libcommon/source/stdio.c b/firmware/libcommon/source/stdio.c</span><br><span>index 32bd617..505c895 100644</span><br><span>--- a/firmware/libcommon/source/stdio.c</span><br><span>+++ b/firmware/libcommon/source/stdio.c</span><br><span>@@ -76,8 +76,8 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int PutChar(char *pStr, char c)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- *pStr = c;</span><br><span style="color: hsl(0, 100%, 40%);">- return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ *pStr = c;</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -89,15 +89,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int PutString(char *pStr, const char *pSource)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- signed int num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int num = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while (*pSource != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while (*pSource != 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pStr++ = *pSource++;</span><br><span style="color: hsl(0, 100%, 40%);">- num++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ *pStr++ = *pSource++;</span><br><span style="color: hsl(120, 100%, 40%);">+ num++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return num;</span><br><span style="color: hsl(120, 100%, 40%);">+ return num;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -110,38 +110,38 @@</span><br><span> // \param value Integer value.</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int PutUnsignedInt(</span><br><span style="color: hsl(0, 100%, 40%);">- char *pStr,</span><br><span style="color: hsl(0, 100%, 40%);">- char fill,</span><br><span style="color: hsl(0, 100%, 40%);">- signed int width,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int value)</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pStr,</span><br><span style="color: hsl(120, 100%, 40%);">+ char fill,</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int width,</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int value)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- signed int num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int num = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Take current digit into account when calculating width</span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Take current digit into account when calculating width</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Recursively write upper digits</span><br><span style="color: hsl(0, 100%, 40%);">- if ((value / 10) > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Recursively write upper digits</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((value / 10) > 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- num = PutUnsignedInt(pStr, fill, width, value / 10);</span><br><span style="color: hsl(0, 100%, 40%);">- pStr += num;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- // Write filler characters</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ num = PutUnsignedInt(pStr, fill, width, value / 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr += num;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write filler characters</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while (width > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while (width > 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- PutChar(pStr, fill);</span><br><span style="color: hsl(0, 100%, 40%);">- pStr++;</span><br><span style="color: hsl(0, 100%, 40%);">- num++;</span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ PutChar(pStr, fill);</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr++;</span><br><span style="color: hsl(120, 100%, 40%);">+ num++;</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Write lower digit</span><br><span style="color: hsl(0, 100%, 40%);">- num += PutChar(pStr, (value % 10) + '0');</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write lower digit</span><br><span style="color: hsl(120, 100%, 40%);">+ num += PutChar(pStr, (value % 10) + '0');</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return num;</span><br><span style="color: hsl(120, 100%, 40%);">+ return num;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -154,69 +154,69 @@</span><br><span> // \param value Signed integer value.</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int PutSignedInt(</span><br><span style="color: hsl(0, 100%, 40%);">- char *pStr,</span><br><span style="color: hsl(0, 100%, 40%);">- char fill,</span><br><span style="color: hsl(0, 100%, 40%);">- signed int width,</span><br><span style="color: hsl(0, 100%, 40%);">- signed int value)</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pStr,</span><br><span style="color: hsl(120, 100%, 40%);">+ char fill,</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int width,</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int value)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- signed int num = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int absolute;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int absolute;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Compute absolute value</span><br><span style="color: hsl(0, 100%, 40%);">- if (value < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Compute absolute value</span><br><span style="color: hsl(120, 100%, 40%);">+ if (value < 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- absolute = -value;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ absolute = -value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- absolute = value;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ absolute = value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Take current digit into account when calculating width</span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Take current digit into account when calculating width</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Recursively write upper digits</span><br><span style="color: hsl(0, 100%, 40%);">- if ((absolute / 10) > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Recursively write upper digits</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((absolute / 10) > 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (value < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- num = PutSignedInt(pStr, fill, width, -(absolute / 10));</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (value < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ num = PutSignedInt(pStr, fill, width, -(absolute / 10));</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- num = PutSignedInt(pStr, fill, width, absolute / 10);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- pStr += num;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ num = PutSignedInt(pStr, fill, width, absolute / 10);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr += num;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Reserve space for sign</span><br><span style="color: hsl(0, 100%, 40%);">- if (value < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Reserve space for sign</span><br><span style="color: hsl(120, 100%, 40%);">+ if (value < 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Write filler characters</span><br><span style="color: hsl(0, 100%, 40%);">- while (width > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write filler characters</span><br><span style="color: hsl(120, 100%, 40%);">+ while (width > 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- PutChar(pStr, fill);</span><br><span style="color: hsl(0, 100%, 40%);">- pStr++;</span><br><span style="color: hsl(0, 100%, 40%);">- num++;</span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ PutChar(pStr, fill);</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr++;</span><br><span style="color: hsl(120, 100%, 40%);">+ num++;</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Write sign</span><br><span style="color: hsl(0, 100%, 40%);">- if (value < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write sign</span><br><span style="color: hsl(120, 100%, 40%);">+ if (value < 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- num += PutChar(pStr, '-');</span><br><span style="color: hsl(0, 100%, 40%);">- pStr++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ num += PutChar(pStr, '-');</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Write lower digit</span><br><span style="color: hsl(0, 100%, 40%);">- num += PutChar(pStr, (absolute % 10) + '0');</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write lower digit</span><br><span style="color: hsl(120, 100%, 40%);">+ num += PutChar(pStr, (absolute % 10) + '0');</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return num;</span><br><span style="color: hsl(120, 100%, 40%);">+ return num;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -230,51 +230,51 @@</span><br><span> // \param value Hexadecimal value.</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int PutHexa(</span><br><span style="color: hsl(0, 100%, 40%);">- char *pStr,</span><br><span style="color: hsl(0, 100%, 40%);">- char fill,</span><br><span style="color: hsl(0, 100%, 40%);">- signed int width,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char maj,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int value)</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pStr,</span><br><span style="color: hsl(120, 100%, 40%);">+ char fill,</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int width,</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char maj,</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int value)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- signed int num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int num = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Decrement width</span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Decrement width</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Recursively output upper digits</span><br><span style="color: hsl(0, 100%, 40%);">- if ((value >> 4) > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Recursively output upper digits</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((value >> 4) > 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- num += PutHexa(pStr, fill, width, maj, value >> 4);</span><br><span style="color: hsl(0, 100%, 40%);">- pStr += num;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- // Write filler chars</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ num += PutHexa(pStr, fill, width, maj, value >> 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr += num;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write filler chars</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while (width > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while (width > 0) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- PutChar(pStr, fill);</span><br><span style="color: hsl(0, 100%, 40%);">- pStr++;</span><br><span style="color: hsl(0, 100%, 40%);">- num++;</span><br><span style="color: hsl(0, 100%, 40%);">- width--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ PutChar(pStr, fill);</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr++;</span><br><span style="color: hsl(120, 100%, 40%);">+ num++;</span><br><span style="color: hsl(120, 100%, 40%);">+ width--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Write current digit</span><br><span style="color: hsl(0, 100%, 40%);">- if ((value & 0xF) < 10) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write current digit</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((value & 0xF) < 10) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- PutChar(pStr, (value & 0xF) + '0');</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else if (maj) {</span><br><span style="color: hsl(120, 100%, 40%);">+ PutChar(pStr, (value & 0xF) + '0');</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (maj) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- PutChar(pStr, (value & 0xF) - 10 + 'A');</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ PutChar(pStr, (value & 0xF) - 10 + 'A');</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- PutChar(pStr, (value & 0xF) - 10 + 'a');</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- num++;</span><br><span style="color: hsl(120, 100%, 40%);">+ PutChar(pStr, (value & 0xF) - 10 + 'a');</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ num++;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return num;</span><br><span style="color: hsl(120, 100%, 40%);">+ return num;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -292,91 +292,91 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int vsnprintf(char *pStr, size_t length, const char *pFormat, va_list ap)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char fill;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char width;</span><br><span style="color: hsl(0, 100%, 40%);">- signed int num = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- size_t size = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ char fill;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char width;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int num = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t size = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Clear the string</span><br><span style="color: hsl(0, 100%, 40%);">- if (pStr) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Clear the string</span><br><span style="color: hsl(120, 100%, 40%);">+ if (pStr) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pStr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ *pStr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Phase string</span><br><span style="color: hsl(0, 100%, 40%);">- while (*pFormat != 0 && size < length) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Phase string</span><br><span style="color: hsl(120, 100%, 40%);">+ while (*pFormat != 0 && size < length) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Normal character</span><br><span style="color: hsl(0, 100%, 40%);">- if (*pFormat != '%') {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Normal character</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*pFormat != '%') {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pStr++ = *pFormat++;</span><br><span style="color: hsl(0, 100%, 40%);">- size++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- // Escaped '%'</span><br><span style="color: hsl(0, 100%, 40%);">- else if (*(pFormat+1) == '%') {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pStr++ = *pFormat++;</span><br><span style="color: hsl(120, 100%, 40%);">+ size++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Escaped '%'</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (*(pFormat+1) == '%') {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pStr++ = '%';</span><br><span style="color: hsl(0, 100%, 40%);">- pFormat += 2;</span><br><span style="color: hsl(0, 100%, 40%);">- size++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- // Token delimiter</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pStr++ = '%';</span><br><span style="color: hsl(120, 100%, 40%);">+ pFormat += 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ size++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Token delimiter</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- fill = ' ';</span><br><span style="color: hsl(0, 100%, 40%);">- width = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- pFormat++;</span><br><span style="color: hsl(120, 100%, 40%);">+ fill = ' ';</span><br><span style="color: hsl(120, 100%, 40%);">+ width = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ pFormat++;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Parse filler</span><br><span style="color: hsl(0, 100%, 40%);">- if (*pFormat == '0') {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Parse filler</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*pFormat == '0') {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- fill = '0';</span><br><span style="color: hsl(0, 100%, 40%);">- pFormat++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ fill = '0';</span><br><span style="color: hsl(120, 100%, 40%);">+ pFormat++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Parse width</span><br><span style="color: hsl(0, 100%, 40%);">- while ((*pFormat >= '0') && (*pFormat <= '9')) {</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- width = (width*10) + *pFormat-'0';</span><br><span style="color: hsl(0, 100%, 40%);">- pFormat++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Parse width</span><br><span style="color: hsl(120, 100%, 40%);">+ while ((*pFormat >= '0') && (*pFormat <= '9')) {</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ width = (width*10) + *pFormat-'0';</span><br><span style="color: hsl(120, 100%, 40%);">+ pFormat++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Check if there is enough space</span><br><span style="color: hsl(0, 100%, 40%);">- if (size + width > length) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Check if there is enough space</span><br><span style="color: hsl(120, 100%, 40%);">+ if (size + width > length) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- width = length - size;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- </span><br><span style="color: hsl(0, 100%, 40%);">- // Parse type</span><br><span style="color: hsl(0, 100%, 40%);">- switch (*pFormat) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 'd': </span><br><span style="color: hsl(0, 100%, 40%);">- case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 's': num = PutString(pStr, va_arg(ap, char *)); break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- return EOF;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ width = length - size;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ // Parse type</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (*pFormat) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 'd': </span><br><span style="color: hsl(120, 100%, 40%);">+ case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 's': num = PutString(pStr, va_arg(ap, char *)); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ return EOF;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- pFormat++;</span><br><span style="color: hsl(0, 100%, 40%);">- pStr += num;</span><br><span style="color: hsl(0, 100%, 40%);">- size += num;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ pFormat++;</span><br><span style="color: hsl(120, 100%, 40%);">+ pStr += num;</span><br><span style="color: hsl(120, 100%, 40%);">+ size += num;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // NULL-terminated (final \0 is not counted)</span><br><span style="color: hsl(0, 100%, 40%);">- if (size < length) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // NULL-terminated (final \0 is not counted)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (size < length) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pStr = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- else {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pStr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ else {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *(--pStr) = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- size--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ *(--pStr) = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ size--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return size;</span><br><span style="color: hsl(120, 100%, 40%);">+ return size;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -390,14 +390,14 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int snprintf(char *pString, size_t length, const char *pFormat, ...)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- va_list ap;</span><br><span style="color: hsl(0, 100%, 40%);">- signed int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ va_list ap;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- va_start(ap, pFormat);</span><br><span style="color: hsl(0, 100%, 40%);">- rc = vsnprintf(pString, length, pFormat, ap);</span><br><span style="color: hsl(0, 100%, 40%);">- va_end(ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ va_start(ap, pFormat);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = vsnprintf(pString, length, pFormat, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ va_end(ap);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -410,7 +410,7 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int vsprintf(char *pString, const char *pFormat, va_list ap)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ return vsnprintf(pString, MAX_STRING_SIZE, pFormat, ap);</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -422,17 +422,17 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int vfprintf(FILE *pStream, const char *pFormat, va_list ap)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char pStr[MAX_STRING_SIZE];</span><br><span style="color: hsl(0, 100%, 40%);">- char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";</span><br><span style="color: hsl(120, 100%, 40%);">+ char pStr[MAX_STRING_SIZE];</span><br><span style="color: hsl(120, 100%, 40%);">+ char pError[] = "stdio.c: increase MAX_STRING_SIZE\n\r";</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Write formatted string in buffer</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Write formatted string in buffer</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsprintf(pStr, pFormat, ap) >= MAX_STRING_SIZE) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- fputs(pError, stderr);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ fputs(pError, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Display string</span><br><span style="color: hsl(0, 100%, 40%);">- return fputs(pStr, pStream);</span><br><span style="color: hsl(120, 100%, 40%);">+ // Display string</span><br><span style="color: hsl(120, 100%, 40%);">+ return fputs(pStr, pStream);</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -443,7 +443,7 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int vprintf(const char *pFormat, va_list ap)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return vfprintf(stdout, pFormat, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ return vfprintf(stdout, pFormat, ap);</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -454,15 +454,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int fprintf(FILE *pStream, const char *pFormat, ...)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- va_list ap;</span><br><span style="color: hsl(0, 100%, 40%);">- signed int result;</span><br><span style="color: hsl(120, 100%, 40%);">+ va_list ap;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int result;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Forward call to vfprintf</span><br><span style="color: hsl(0, 100%, 40%);">- va_start(ap, pFormat);</span><br><span style="color: hsl(0, 100%, 40%);">- result = vfprintf(pStream, pFormat, ap);</span><br><span style="color: hsl(0, 100%, 40%);">- va_end(ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ // Forward call to vfprintf</span><br><span style="color: hsl(120, 100%, 40%);">+ va_start(ap, pFormat);</span><br><span style="color: hsl(120, 100%, 40%);">+ result = vfprintf(pStream, pFormat, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ va_end(ap);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return result;</span><br><span style="color: hsl(120, 100%, 40%);">+ return result;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -472,15 +472,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int printf(const char *pFormat, ...)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- va_list ap;</span><br><span style="color: hsl(0, 100%, 40%);">- signed int result;</span><br><span style="color: hsl(120, 100%, 40%);">+ va_list ap;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int result;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Forward call to vprintf</span><br><span style="color: hsl(0, 100%, 40%);">- va_start(ap, pFormat);</span><br><span style="color: hsl(0, 100%, 40%);">- result = vprintf(pFormat, ap);</span><br><span style="color: hsl(0, 100%, 40%);">- va_end(ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ // Forward call to vprintf</span><br><span style="color: hsl(120, 100%, 40%);">+ va_start(ap, pFormat);</span><br><span style="color: hsl(120, 100%, 40%);">+ result = vprintf(pFormat, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ va_end(ap);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return result;</span><br><span style="color: hsl(120, 100%, 40%);">+ return result;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -490,15 +490,15 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int sprintf(char *pStr, const char *pFormat, ...)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- va_list ap;</span><br><span style="color: hsl(0, 100%, 40%);">- signed int result;</span><br><span style="color: hsl(120, 100%, 40%);">+ va_list ap;</span><br><span style="color: hsl(120, 100%, 40%);">+ signed int result;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Forward call to vsprintf</span><br><span style="color: hsl(0, 100%, 40%);">- va_start(ap, pFormat);</span><br><span style="color: hsl(0, 100%, 40%);">- result = vsprintf(pStr, pFormat, ap);</span><br><span style="color: hsl(0, 100%, 40%);">- va_end(ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ // Forward call to vsprintf</span><br><span style="color: hsl(120, 100%, 40%);">+ va_start(ap, pFormat);</span><br><span style="color: hsl(120, 100%, 40%);">+ result = vsprintf(pStr, pFormat, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ va_end(ap);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return result;</span><br><span style="color: hsl(120, 100%, 40%);">+ return result;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -507,6 +507,6 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> signed int puts(const char *pStr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- return fputs(pStr, stdout);</span><br><span style="color: hsl(120, 100%, 40%);">+ return fputs(pStr, stdout);</span><br><span> }</span><br><span> </span><br><span>diff --git a/firmware/libcommon/source/string.c b/firmware/libcommon/source/string.c</span><br><span>index dbbb0e9..0d789a0 100644</span><br><span>--- a/firmware/libcommon/source/string.c</span><br><span>+++ b/firmware/libcommon/source/string.c</span><br><span>@@ -61,33 +61,33 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> void * memcpy(void *pDestination, const void *pSource, size_t num)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char *pByteDestination;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char *pByteSource;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int *pAlignedSource = (unsigned int *) pSource;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int *pAlignedDestination = (unsigned int *) pDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char *pByteDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char *pByteSource;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int *pAlignedSource = (unsigned int *) pSource;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int *pAlignedDestination = (unsigned int *) pDestination;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // If num is more than 4 bytes, and both dest. and source are aligned,</span><br><span style="color: hsl(0, 100%, 40%);">- // then copy dwords</span><br><span style="color: hsl(0, 100%, 40%);">- if ((((unsigned int) pAlignedDestination & 0x3) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- && (((unsigned int) pAlignedSource & 0x3) == 0)</span><br><span style="color: hsl(0, 100%, 40%);">- && (num >= 4)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // If num is more than 4 bytes, and both dest. and source are aligned,</span><br><span style="color: hsl(120, 100%, 40%);">+ // then copy dwords</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((((unsigned int) pAlignedDestination & 0x3) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ && (((unsigned int) pAlignedSource & 0x3) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ && (num >= 4)) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while (num >= 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while (num >= 4) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pAlignedDestination++ = *pAlignedSource++;</span><br><span style="color: hsl(0, 100%, 40%);">- num -= 4;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ *pAlignedDestination++ = *pAlignedSource++;</span><br><span style="color: hsl(120, 100%, 40%);">+ num -= 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Copy remaining bytes</span><br><span style="color: hsl(0, 100%, 40%);">- pByteDestination = (unsigned char *) pAlignedDestination;</span><br><span style="color: hsl(0, 100%, 40%);">- pByteSource = (unsigned char *) pAlignedSource;</span><br><span style="color: hsl(0, 100%, 40%);">- while (num--) {</span><br><span style="color: hsl(120, 100%, 40%);">+ // Copy remaining bytes</span><br><span style="color: hsl(120, 100%, 40%);">+ pByteDestination = (unsigned char *) pAlignedDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ pByteSource = (unsigned char *) pAlignedSource;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (num--) {</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- *pByteDestination++ = *pByteSource++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ *pByteDestination++ = *pByteSource++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return pDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ return pDestination;</span><br><span> }</span><br><span> </span><br><span> //------------------------------------------------------------------------------</span><br><span>@@ -99,23 +99,23 @@</span><br><span> //------------------------------------------------------------------------------</span><br><span> void * memset(void *pBuffer, int value, size_t num)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned char *pByteDestination;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int *pAlignedDestination = (unsigned int *) pBuffer;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned char *pByteDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int *pAlignedDestination = (unsigned int *) pBuffer;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int alignedValue = (value << 24) | (value << 16) | (value << 8) | value;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- // Set words if possible</span><br><span style="color: hsl(0, 100%, 40%);">- if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {</span><br><span style="color: hsl(0, 100%, 40%);">- while (num >= 4) {</span><br><span style="color: hsl(0, 100%, 40%);">- *pAlignedDestination++ = alignedValue;</span><br><span style="color: hsl(0, 100%, 40%);">- num -= 4;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- // Set remaining bytes</span><br><span style="color: hsl(0, 100%, 40%);">- pByteDestination = (unsigned char *) pAlignedDestination;</span><br><span style="color: hsl(0, 100%, 40%);">- while (num--) {</span><br><span style="color: hsl(0, 100%, 40%);">- *pByteDestination++ = value;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return pBuffer;</span><br><span style="color: hsl(120, 100%, 40%);">+ // Set words if possible</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((((unsigned int) pAlignedDestination & 0x3) == 0) && (num >= 4)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ while (num >= 4) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pAlignedDestination++ = alignedValue;</span><br><span style="color: hsl(120, 100%, 40%);">+ num -= 4;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ // Set remaining bytes</span><br><span style="color: hsl(120, 100%, 40%);">+ pByteDestination = (unsigned char *) pAlignedDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (num--) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pByteDestination++ = value;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return pBuffer;</span><br><span> }</span><br><span> </span><br><span> //-----------------------------------------------------------------------------</span><br><span>@@ -126,16 +126,16 @@</span><br><span> //-----------------------------------------------------------------------------</span><br><span> char * strchr(const char *pString, int character)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char * p = (char *)pString;</span><br><span style="color: hsl(0, 100%, 40%);">- char c = character & 0xFF;</span><br><span style="color: hsl(120, 100%, 40%);">+ char * p = (char *)pString;</span><br><span style="color: hsl(120, 100%, 40%);">+ char c = character & 0xFF;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while(*p != c) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (*p == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- p++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return p;</span><br><span style="color: hsl(120, 100%, 40%);">+ while(*p != c) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*p == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ p++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return p;</span><br><span> }</span><br><span> </span><br><span> //-----------------------------------------------------------------------------</span><br><span>@@ -144,12 +144,12 @@</span><br><span> //-----------------------------------------------------------------------------</span><br><span> size_t strlen(const char *pString)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int length = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int length = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while(*pString++ != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- length++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return length;</span><br><span style="color: hsl(120, 100%, 40%);">+ while(*pString++ != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ length++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return length;</span><br><span> }</span><br><span> </span><br><span> </span><br><span>@@ -161,14 +161,14 @@</span><br><span> //-----------------------------------------------------------------------------</span><br><span> char * strrchr(const char *pString, int character)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char *p = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *p = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while(*pString != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (*pString++ == character) {</span><br><span style="color: hsl(0, 100%, 40%);">- p = (char*)pString;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return p;</span><br><span style="color: hsl(120, 100%, 40%);">+ while(*pString != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*pString++ == character) {</span><br><span style="color: hsl(120, 100%, 40%);">+ p = (char*)pString;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return p;</span><br><span> }</span><br><span> </span><br><span> //-----------------------------------------------------------------------------</span><br><span>@@ -179,10 +179,10 @@</span><br><span> //-----------------------------------------------------------------------------</span><br><span> char * strcpy(char *pDestination, const char *pSource)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char *pSaveDest = pDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pSaveDest = pDestination;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);</span><br><span style="color: hsl(0, 100%, 40%);">- return pSaveDest;</span><br><span style="color: hsl(120, 100%, 40%);">+ for(; (*pDestination = *pSource) != 0; ++pSource, ++pDestination);</span><br><span style="color: hsl(120, 100%, 40%);">+ return pSaveDest;</span><br><span> }</span><br><span> </span><br><span> //-----------------------------------------------------------------------------</span><br><span>@@ -196,22 +196,22 @@</span><br><span> //-----------------------------------------------------------------------------</span><br><span> int strncmp(const char *pString1, const char *pString2, size_t count)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- int r;</span><br><span style="color: hsl(120, 100%, 40%);">+ int r;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while(count) {</span><br><span style="color: hsl(0, 100%, 40%);">- r = *pString1 - *pString2;</span><br><span style="color: hsl(0, 100%, 40%);">- if (r == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (*pString1 == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- pString1++;</span><br><span style="color: hsl(0, 100%, 40%);">- pString2++;</span><br><span style="color: hsl(0, 100%, 40%);">- count--;</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return r;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ while(count) {</span><br><span style="color: hsl(120, 100%, 40%);">+ r = *pString1 - *pString2;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (r == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*pString1 == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ pString1++;</span><br><span style="color: hsl(120, 100%, 40%);">+ pString2++;</span><br><span style="color: hsl(120, 100%, 40%);">+ count--;</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return r;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span> }</span><br><span> </span><br><span> //-----------------------------------------------------------------------------</span><br><span>@@ -223,17 +223,17 @@</span><br><span> //-----------------------------------------------------------------------------</span><br><span> char * strncpy(char *pDestination, const char *pSource, size_t count)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char *pSaveDest = pDestination;</span><br><span style="color: hsl(120, 100%, 40%);">+ char *pSaveDest = pDestination;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- while (count) {</span><br><span style="color: hsl(0, 100%, 40%);">- *pDestination = *pSource;</span><br><span style="color: hsl(0, 100%, 40%);">- if (*pSource == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- pDestination++;</span><br><span style="color: hsl(0, 100%, 40%);">- pSource++;</span><br><span style="color: hsl(0, 100%, 40%);">- count--;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return pSaveDest;</span><br><span style="color: hsl(120, 100%, 40%);">+ while (count) {</span><br><span style="color: hsl(120, 100%, 40%);">+ *pDestination = *pSource;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (*pSource == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ pDestination++;</span><br><span style="color: hsl(120, 100%, 40%);">+ pSource++;</span><br><span style="color: hsl(120, 100%, 40%);">+ count--;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return pSaveDest;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9918">change 9918</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9918"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I86783eba0827b58303b10310e9f6b9625e1a27f1 </div>
<div style="display:none"> Gerrit-Change-Number: 9918 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>