mirror of https://gerrit.osmocom.org/simtrace2
Remove mains/ and sub-files
This commit is contained in:
parent
58c1ae31ee
commit
f5cd7efede
|
@ -1,355 +0,0 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* \page usart_iso7816 USART ISO7816 Example
|
||||
*
|
||||
* \section Purpose
|
||||
* This example sends ISO 7816 commands to a smartcard connected to the
|
||||
* evaluation kits on sam3s.
|
||||
*
|
||||
* \section Requirements
|
||||
* This example can be used on sam3s evaluation kit. Please connect the
|
||||
* smartcard contacts with following pins which could be easily wired from
|
||||
* the board.
|
||||
* - <b>SAM3S-EK -- SMARTCARD</b>
|
||||
* - PA11 -- RST
|
||||
* - TXD1(PA22) -- I/O
|
||||
* - SCK1(PA23) -- CLK
|
||||
*
|
||||
* \section Description
|
||||
* The iso7816 software provide in this examples is use to transform APDU
|
||||
* commands to TPDU commands for the smart card.
|
||||
* The iso7816 provide here is for the protocol T=0 only.
|
||||
* The send and the receive of a character is made under polling.
|
||||
* In the file ISO7816_Init is defined all pins of the card. User must have to
|
||||
* change this pins according to his environment.
|
||||
* The driver is compliant with CASE 1, 2, 3 of the ISO7816-4 specification.
|
||||
*
|
||||
* \section Usage
|
||||
* -# Build the program and download it inside the evaluation board. Please
|
||||
* refer to the <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6224.pdf">SAM-BA User Guide</a>,
|
||||
* the <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6310.pdf">GNU-Based Software Development</a>
|
||||
* application note or to the <a href="ftp://ftp.iar.se/WWWfiles/arm/Guides/EWARM_UserGuide.ENU.pdf">IAR EWARM User Guide</a>,
|
||||
* depending on your chosen solution.
|
||||
* -# On the computer, open and configure a terminal application (e.g.
|
||||
* HyperTerminal on Microsoft Windows) with these settings:
|
||||
* - 115200 bauds
|
||||
* - 8 data bits
|
||||
* - No parity
|
||||
* - 1 stop bit
|
||||
* - No flow control
|
||||
* -# Connect the card reader to sam3s-ek board:
|
||||
* <table border="1" cellpadding="2" cellspacing="0">
|
||||
* <tr><td>C1: Vcc: 7816_3V5V </td><td> C5: Gnd</td> <td> C4: RFU</td></tr>
|
||||
* <tr><td> C2: Reset: 7816_RST</td> <td> C6: Vpp</td> <td> C8: RFU</td></tr>
|
||||
* <tr><td> C3: Clock: 7816_CLK</td> <td> C7: 7816_IO</td> </tr>
|
||||
* </table>
|
||||
* If necessary,another pin must be connected on the card reader for detecting the
|
||||
* insertion and removal: 7816_IRQ.
|
||||
* On Atmel boards, all this pins can be easily connecting with jumpers.
|
||||
* -# Start the application. The following traces shall appear on the terminal:
|
||||
* \code
|
||||
* -- USART ISO7816 Example xxx --
|
||||
* -- xxxxxx-xx
|
||||
* -- Compiled: xxx xx xxxx xx:xx:xx --
|
||||
* Display the ATR
|
||||
* \endcode
|
||||
*
|
||||
* \section References
|
||||
* - usart_iso7816/main.c
|
||||
* - iso7816_4.c
|
||||
* - pio.h
|
||||
* - usart.h
|
||||
*
|
||||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
* This file contains all the specific code for the usart_iso7816 example.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal definitions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Maximum ucSize in bytes of the smartcard answer to a command.*/
|
||||
#define MAX_ANSWER_SIZE 10
|
||||
|
||||
/** Maximum ATR ucSize in bytes.*/
|
||||
#define MAX_ATR_SIZE 55
|
||||
|
||||
/** USB states */
|
||||
/// Use for power management
|
||||
#define STATE_IDLE 0
|
||||
/// The USB device is in suspend state
|
||||
#define STATE_SUSPEND 4
|
||||
/// The USB device is in resume state
|
||||
#define STATE_RESUME 5
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
/** USB state: suspend, resume, idle */
|
||||
unsigned char USBState = STATE_IDLE;
|
||||
|
||||
/** Test command #1.*/
|
||||
static const uint8_t testCommand1[] = {0x00, 0x10, 0x00, 0x00};
|
||||
/** Test command #2.*/
|
||||
static const uint8_t testCommand2[] = {0x00, 0x20, 0x00, 0x00, 0x02};
|
||||
/** Test command #3.*/
|
||||
static const uint8_t testCommand3[] = {0x00, 0x30, 0x00, 0x00, 0x02, 0x0A, 0x0B};
|
||||
/* Select MF */
|
||||
static const uint8_t testCommand4[] = {0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00};
|
||||
/** ISO7816 pins */
|
||||
static const Pin pinsISO7816[] = {PINS_ISO7816};
|
||||
/** ISO7816 RST pin */
|
||||
static const Pin pinIso7816RstMC = PIN_ISO7816_RSTMC;
|
||||
static uint8_t sim_inserted = 0;
|
||||
|
||||
static const Pin pPwr[] = {
|
||||
/* Enable power converter 4.5-6V to 3.3V; low: off */
|
||||
{SIM_PWEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT},
|
||||
|
||||
/* Enable second power converter: VCC_PHONE to VCC_SIM; high: off */
|
||||
{VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
|
||||
};
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Optional smartcard detection
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef SMARTCARD_CONNECT_PIN
|
||||
|
||||
/** Smartcard detection pin.*/
|
||||
static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
|
||||
|
||||
/**
|
||||
* PIO interrupt service routine. Checks if the smartcard has been connected
|
||||
* or disconnected.
|
||||
*/
|
||||
static void ISR_PioSmartCard( const Pin *pPin )
|
||||
{
|
||||
/* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?
|
||||
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
|
||||
printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
Output:
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
*/
|
||||
// PA10 is DTXD, which is the debug uart transmit pin
|
||||
|
||||
printf("Interrupt!!\n\r");
|
||||
/* Check all pending interrupts */
|
||||
// FIXME: this if condition is not always true...
|
||||
// if ( (pinSmartCard.pio->PIO_ISR & pinSmartCard.mask) != 0 )
|
||||
{
|
||||
/* Check current level on pin */
|
||||
if ( PIO_Get( &pinSmartCard ) == 0 )
|
||||
{
|
||||
sim_inserted = 1;
|
||||
printf( "-I- Smartcard inserted\n\r" ) ;
|
||||
CCID_Insertion();
|
||||
}
|
||||
else
|
||||
{
|
||||
sim_inserted = 0;
|
||||
printf( "-I- Smartcard removed\n\r" ) ;
|
||||
CCID_Removal();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the smartcard detection pin to trigger an interrupt.
|
||||
*/
|
||||
static void ConfigureCardDetection( void )
|
||||
{
|
||||
printf("+++++ Configure PIOs\n\r");
|
||||
PIO_Configure( &pinSmartCard, 1 ) ;
|
||||
NVIC_EnableIRQ( PIOA_IRQn );
|
||||
// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
|
||||
PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ;
|
||||
PIO_EnableIt( &pinSmartCard ) ;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Dummy implementation.
|
||||
*/
|
||||
static void ConfigureCardDetection( void )
|
||||
{
|
||||
printf( "-I- Smartcard detection not supported.\n\r" ) ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* USB
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
// FIXME: Implement those two functions
|
||||
//------------------------------------------------------------------------------
|
||||
/// Put the CPU in 32kHz, disable PLL, main oscillator
|
||||
/// Put voltage regulator in standby mode
|
||||
//------------------------------------------------------------------------------
|
||||
void LowPowerMode(void)
|
||||
{
|
||||
// FIXME: Implement low power consumption mode?
|
||||
// PMC_CPUInIdleMode();
|
||||
}
|
||||
//------------------------------------------------------------------------------
|
||||
/// Put voltage regulator in normal mode
|
||||
/// Return the CPU to normal speed 48MHz, enable PLL, main oscillator
|
||||
//------------------------------------------------------------------------------
|
||||
void NormalPowerMode(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Main
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the DBGU and ISO7816 driver, and starts some tests.
|
||||
* \return Unused (ANSI-C compatibility)
|
||||
*/
|
||||
extern int main( void )
|
||||
{
|
||||
uint8_t pAtr[MAX_ATR_SIZE] ;
|
||||
uint8_t ucSize ;
|
||||
|
||||
LED_Configure(LED_NUM_GREEN);
|
||||
LED_Set(LED_NUM_GREEN);
|
||||
|
||||
/* Disable watchdog*/
|
||||
WDT_Disable( WDT ) ;
|
||||
|
||||
/* Initialize Atr buffer */
|
||||
memset( pAtr, 0, sizeof( pAtr ) ) ;
|
||||
|
||||
printf("%s", "=====================================================\n\r");
|
||||
printf( "-- USART ISO7816 Example %s --\n\r", SOFTPACK_VERSION ) ;
|
||||
printf( "-- %s\n\r", BOARD_NAME ) ;
|
||||
printf( "-- Compiled: %s %s --\n\r", __DATE__, __TIME__ ) ;
|
||||
printf("%s", "=====================================================\n\r");
|
||||
|
||||
|
||||
PIO_InitializeInterrupts(0);
|
||||
|
||||
/* Configure IT on Smart Card */
|
||||
ConfigureCardDetection() ;
|
||||
|
||||
/* Configure Phone SIM connection*/
|
||||
/* Pin phone_sim_connect[] = {PIN_SC_SW, PIN_IO_SW};
|
||||
PIO_Configure( phone_sim_connect, PIO_LISTSIZE(phone_sim_connect) );
|
||||
*/
|
||||
|
||||
/* Configure ISO7816 driver */
|
||||
PIO_Configure( pinsISO7816, PIO_LISTSIZE( pinsISO7816 ) ) ;
|
||||
PIO_Configure(pPwr, PIO_LISTSIZE(pPwr));
|
||||
|
||||
// Card has no power until now
|
||||
PIO_Set(&pPwr[0]);
|
||||
|
||||
// FIXME: RST seems to be allways low here
|
||||
TRACE_DEBUG("******* Reset State1 (1 if the Pin RstMC is high): 0x%X", ISO7816_StatusReset());
|
||||
|
||||
ISO7816_Init( pinIso7816RstMC ) ;
|
||||
|
||||
TRACE_DEBUG("******* Reset State2 (1 if the Pin RstMC is high): 0x%X", ISO7816_StatusReset());
|
||||
|
||||
/* Read ATR */
|
||||
ISO7816_warm_reset() ;
|
||||
|
||||
ISO7816_Datablock_ATR( pAtr, &ucSize ) ;
|
||||
TRACE_DEBUG("******* Reset State3 (1 if the Pin RstMC is high): 0x%X", ISO7816_StatusReset());
|
||||
|
||||
/* Decode ATR */
|
||||
ISO7816_Decode_ATR( pAtr ) ;
|
||||
|
||||
// FIXME: RST seems to be allways high
|
||||
TRACE_DEBUG("******* Reset State4 (1 if the Pin RstMC is high): 0x%X", ISO7816_StatusReset());
|
||||
//SendReceiveCommands() ;
|
||||
|
||||
CCIDDriver_Initialize();
|
||||
|
||||
// FIXME: Or do I need to call VBUS_CONFIGURE() here instead, which will call USBD_Connect() later?
|
||||
USBD_Connect();
|
||||
// FIXME: USB clock? USB PMC?
|
||||
NVIC_EnableIRQ( UDP_IRQn );
|
||||
|
||||
// FIXME: At some point USBD_IrqHandler() should get called and set USBD_STATE_CONFIGURED
|
||||
while (USBD_GetState() < USBD_STATE_CONFIGURED) {
|
||||
int i = 1;
|
||||
if ((i%10000) == 0) {
|
||||
TRACE_DEBUG("%d: USB State: %x\n\r", i, USBD_GetState());
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
// FIXME. what if smcard is not inserted?
|
||||
if(PIO_Get(&pinSmartCard) == 0) {
|
||||
printf("SIM card inserted\n\r");
|
||||
CCID_Insertion();
|
||||
}
|
||||
|
||||
// Infinite loop
|
||||
while (1) {
|
||||
|
||||
if( USBState == STATE_SUSPEND ) {
|
||||
TRACE_DEBUG("suspend !\n\r");
|
||||
LowPowerMode();
|
||||
USBState = STATE_IDLE;
|
||||
}
|
||||
if( USBState == STATE_RESUME ) {
|
||||
// Return in normal MODE
|
||||
TRACE_DEBUG("resume !\n\r");
|
||||
NormalPowerMode();
|
||||
USBState = STATE_IDLE;
|
||||
}
|
||||
CCID_SmartCardRequest();
|
||||
}
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
// Xtal: Default internal 4MHz
|
||||
#include <SAM3S2B.h>
|
||||
//#include <SAM3S.h>
|
||||
|
||||
int main () {
|
||||
int i,j;
|
||||
//i=1000;
|
||||
//j=10000;
|
||||
PMC->PMC_WPMR = 0x504D4300;// Disable write protect
|
||||
PMC->PMC_PCER0 = (1<<11);// Enable PIO clock
|
||||
PIOA->PIO_PER = (1<<19); //Enable PIO
|
||||
PIOA->PIO_OER = (1<<19); //Enable Output
|
||||
|
||||
while (1) {
|
||||
PIOA->PIO_CODR = (1<<18);// Turn LED on
|
||||
for (i=1;i<1000;i++) // Waiting
|
||||
for (j=1;j<3000;j++);
|
||||
PIOA->PIO_SODR = (1<<18);// Turn LED off
|
||||
for (i=1;i<1000;i++) // Waiting
|
||||
for (j=1;j<2000;j++);
|
||||
}
|
||||
}
|
|
@ -1,55 +0,0 @@
|
|||
#include "board.h"
|
||||
#include "pio.h"
|
||||
|
||||
const Pin statusled = {PIO_PA18, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
|
||||
const Pin statusled2 = {PIO_PA17, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
|
||||
const Pin io = PIN_PHONE_IO;
|
||||
|
||||
int main()
|
||||
{
|
||||
register int i = 0;
|
||||
register int b = 0;
|
||||
|
||||
PIO_Configure(&io, PIO_LISTSIZE(io));
|
||||
PIO_Clear(&io);
|
||||
|
||||
PIO_Configure(&statusled, PIO_LISTSIZE(statusled));
|
||||
PIO_Clear(&statusled);
|
||||
PIO_Configure(&statusled2, PIO_LISTSIZE(statusled2));
|
||||
PIO_Clear(&statusled2);
|
||||
|
||||
for(;;) {
|
||||
i = i+1;
|
||||
if ((i%100000) == 0) {
|
||||
switch(b) {
|
||||
case 0:
|
||||
PIO_Set(&statusled);
|
||||
b=1;
|
||||
PIO_Set(&io);
|
||||
break;
|
||||
case 1:
|
||||
PIO_Set(&statusled2);
|
||||
PIO_Set(&statusled);
|
||||
b = 2;
|
||||
PIO_Clear(&io);
|
||||
break;
|
||||
case 2:
|
||||
PIO_Clear(&statusled);
|
||||
b = 3;
|
||||
PIO_Set(&io);
|
||||
break;
|
||||
case 3:
|
||||
PIO_Clear(&statusled2);
|
||||
b = 0;
|
||||
break;
|
||||
PIO_Clear(&io);
|
||||
default:
|
||||
b = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
/* vim: set ts=4: */
|
|
@ -1,45 +0,0 @@
|
|||
#include "board.h"
|
||||
#include "pio.h"
|
||||
|
||||
const Pin statusled = {PIO_PA18, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
|
||||
const Pin statusled2 = {PIO_PA17, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
|
||||
|
||||
int main()
|
||||
{
|
||||
register int i = 0;
|
||||
register int b = 0;
|
||||
|
||||
PIO_Configure(&statusled, PIO_LISTSIZE(statusled));
|
||||
PIO_Clear(&statusled);
|
||||
PIO_Configure(&statusled2, PIO_LISTSIZE(statusled2));
|
||||
PIO_Clear(&statusled2);
|
||||
|
||||
for(;;) {
|
||||
i = i+1;
|
||||
if ((i%100000) == 0) {
|
||||
switch(b) {
|
||||
case 0:
|
||||
PIO_Set(&statusled);
|
||||
b=1;
|
||||
break;
|
||||
case 1:
|
||||
PIO_Set(&statusled2);
|
||||
PIO_Set(&statusled);
|
||||
b = 2;
|
||||
break;
|
||||
case 2:
|
||||
PIO_Clear(&statusled);
|
||||
b = 3;
|
||||
break;
|
||||
case 3:
|
||||
PIO_Clear(&statusled2);
|
||||
b = 0;
|
||||
break;
|
||||
default:
|
||||
b = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
#include "board.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
extern void UART_PutString(const char *str, int len);
|
||||
|
||||
void Configure_LEDs() {
|
||||
LED_Configure(LED_NUM_RED);
|
||||
LED_Configure(LED_NUM_GREEN);
|
||||
}
|
||||
|
||||
int main() {
|
||||
size_t ret = 0;
|
||||
|
||||
Configure_LEDs();
|
||||
|
||||
ret = printf("Clockval: %d\r\n", BOARD_MCK);
|
||||
|
||||
if (ret < 0){
|
||||
LED_Clear(LED_NUM_GREEN);
|
||||
LED_Set(LED_NUM_RED);
|
||||
} else {
|
||||
LED_Clear(LED_NUM_RED);
|
||||
LED_Set(LED_NUM_GREEN);
|
||||
|
||||
while (1) {
|
||||
printf("Clockval**++????: %d\r\n", BOARD_MCK);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,381 +0,0 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* \page usart_iso7816 USART ISO7816 Example
|
||||
*
|
||||
* \section Purpose
|
||||
* This example sends ISO 7816 commands to a smartcard connected to the
|
||||
* evaluation kits on sam3s.
|
||||
*
|
||||
* \section Requirements
|
||||
* This example can be used on sam3s evaluation kit. Please connect the
|
||||
* smartcard contacts with following pins which could be easily wired from
|
||||
* the board.
|
||||
* - <b>SAM3S-EK -- SMARTCARD</b>
|
||||
* - PA11 -- RST
|
||||
* - TXD1(PA22) -- I/O
|
||||
* - SCK1(PA23) -- CLK
|
||||
*
|
||||
* \section Description
|
||||
* The iso7816 software provide in this examples is use to transform APDU
|
||||
* commands to TPDU commands for the smart card.
|
||||
* The iso7816 provide here is for the protocol T=0 only.
|
||||
* The send and the receive of a character is made under polling.
|
||||
* In the file ISO7816_Init is defined all pins of the card. User must have to
|
||||
* change this pins according to his environment.
|
||||
* The driver is compliant with CASE 1, 2, 3 of the ISO7816-4 specification.
|
||||
*
|
||||
* \section Usage
|
||||
* -# Build the program and download it inside the evaluation board. Please
|
||||
* refer to the <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6224.pdf">SAM-BA User Guide</a>,
|
||||
* the <a href="http://www.atmel.com/dyn/resources/prod_documents/doc6310.pdf">GNU-Based Software Development</a>
|
||||
* application note or to the <a href="ftp://ftp.iar.se/WWWfiles/arm/Guides/EWARM_UserGuide.ENU.pdf">IAR EWARM User Guide</a>,
|
||||
* depending on your chosen solution.
|
||||
* -# On the computer, open and configure a terminal application (e.g.
|
||||
* HyperTerminal on Microsoft Windows) with these settings:
|
||||
* - 115200 bauds
|
||||
* - 8 data bits
|
||||
* - No parity
|
||||
* - 1 stop bit
|
||||
* - No flow control
|
||||
* -# Connect the card reader to sam3s-ek board:
|
||||
* <table border="1" cellpadding="2" cellspacing="0">
|
||||
* <tr><td>C1: Vcc: 7816_3V5V </td><td> C5: Gnd</td> <td> C4: RFU</td></tr>
|
||||
* <tr><td> C2: Reset: 7816_RST</td> <td> C6: Vpp</td> <td> C8: RFU</td></tr>
|
||||
* <tr><td> C3: Clock: 7816_CLK</td> <td> C7: 7816_IO</td> </tr>
|
||||
* </table>
|
||||
* If necessary,another pin must be connected on the card reader for detecting the
|
||||
* insertion and removal: 7816_IRQ.
|
||||
* On Atmel boards, all this pins can be easily connecting with jumpers.
|
||||
* -# Start the application. The following traces shall appear on the terminal:
|
||||
* \code
|
||||
* -- USART ISO7816 Example xxx --
|
||||
* -- xxxxxx-xx
|
||||
* -- Compiled: xxx xx xxxx xx:xx:xx --
|
||||
* Display the ATR
|
||||
* \endcode
|
||||
*
|
||||
* \section References
|
||||
* - usart_iso7816/main.c
|
||||
* - iso7816_4.c
|
||||
* - pio.h
|
||||
* - usart.h
|
||||
*
|
||||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
* This file contains all the specific code for the usart_iso7816 example.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal definitions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Maximum ucSize in bytes of the smartcard answer to a command.*/
|
||||
#define MAX_ANSWER_SIZE 10
|
||||
|
||||
/** Maximum ATR ucSize in bytes.*/
|
||||
#define MAX_ATR_SIZE 55
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Test command #1.*/
|
||||
static const uint8_t testCommand1[] = {0x00, 0x10, 0x00, 0x00};
|
||||
/** Test command #2.*/
|
||||
static const uint8_t testCommand2[] = {0x00, 0x20, 0x00, 0x00, 0x02};
|
||||
/** Test command #3.*/
|
||||
static const uint8_t testCommand3[] = {0x00, 0x30, 0x00, 0x00, 0x02, 0x0A, 0x0B};
|
||||
/* Select MF */
|
||||
static const uint8_t testCommand4[] = {0x00, 0xa4, 0x00, 0x00, 0x02, 0x3f, 0x00};
|
||||
/** ISO7816 pins */
|
||||
static const Pin pinsISO7816[] = {PINS_ISO7816};
|
||||
/** ISO7816 RST pin */
|
||||
static const Pin pinIso7816RstMC = PIN_ISO7816_RSTMC;
|
||||
static uint8_t sim_inserted = 0;
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Optional smartcard detection
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef SMARTCARD_CONNECT_PIN
|
||||
|
||||
/** Smartcard detection pin.*/
|
||||
static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
|
||||
|
||||
/**
|
||||
* PIO interrupt service routine. Checks if the smartcard has been connected
|
||||
* or disconnected.
|
||||
*/
|
||||
static void ISR_PioSmartCard( const Pin *pPin )
|
||||
{
|
||||
/* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?
|
||||
printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
|
||||
printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
|
||||
Output:
|
||||
+++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
|
||||
+++++ Mask: 0x100 = 1<<8
|
||||
*/
|
||||
/* Check all pending interrupts */
|
||||
if ( (pinSmartCard.pio->PIO_ISR & pinSmartCard.mask) != 0 )
|
||||
{
|
||||
/* Check current level on pin */
|
||||
if ( PIO_Get( &pinSmartCard ) == 0 )
|
||||
{
|
||||
sim_inserted = 1;
|
||||
printf( "-I- Smartcard inserted\n\r" ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
sim_inserted = 0;
|
||||
printf( "-I- Smartcard removed\n\r" ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the smartcard detection pin to trigger an interrupt.
|
||||
*/
|
||||
static void ConfigureCardDetection( void )
|
||||
{
|
||||
printf("+++++ Configure PIOs\n\r");
|
||||
PIO_Configure( &pinSmartCard, 1 ) ;
|
||||
NVIC_EnableIRQ( PIOA_IRQn );
|
||||
// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
|
||||
PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ;
|
||||
PIO_EnableIt( &pinSmartCard ) ;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Dummy implementation.
|
||||
*/
|
||||
static void ConfigureCardDetection( void )
|
||||
{
|
||||
printf( "-I- Smartcard detection not supported.\n\r" ) ;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Displays a menu which enables the user to send several commands to the
|
||||
* smartcard and check its answers.
|
||||
*/
|
||||
static void SendReceiveCommands( void )
|
||||
{
|
||||
uint8_t pMessage[MAX_ANSWER_SIZE];
|
||||
uint8_t ucSize ;
|
||||
uint8_t ucKey ;
|
||||
uint8_t command;
|
||||
uint8_t i;
|
||||
|
||||
/* Clear message buffer */
|
||||
memset( pMessage, 0, sizeof( pMessage ) ) ;
|
||||
|
||||
/* Display menu */
|
||||
printf( "-I- The following three commands can be sent:\n\r" ) ;
|
||||
printf( " 1. " ) ;
|
||||
for ( i=0 ; i < sizeof( testCommand1 ) ; i++ )
|
||||
{
|
||||
printf( "0x%X ", testCommand1[i] ) ;
|
||||
}
|
||||
printf( "\n\r 2. " ) ;
|
||||
|
||||
for ( i=0 ; i < sizeof( testCommand2 ) ; i++ )
|
||||
{
|
||||
printf( "0x%X ", testCommand2[i] ) ;
|
||||
}
|
||||
printf( "\n\r 3. " ) ;
|
||||
|
||||
for ( i=0 ; i < sizeof( testCommand3 ) ; i++ )
|
||||
{
|
||||
printf( "0x%X ", testCommand3[i] ) ;
|
||||
}
|
||||
printf( "\n\r 4. " ) ;
|
||||
|
||||
for ( i=0 ; i < sizeof( testCommand4 ) ; i++ )
|
||||
{
|
||||
printf( "0x%X ", testCommand4[i] ) ;
|
||||
}
|
||||
printf( "\n\r" ) ;
|
||||
|
||||
/* Get user input */
|
||||
ucKey = 0 ;
|
||||
while ( ucKey != 'q' )
|
||||
{
|
||||
printf( "\r " ) ;
|
||||
printf( "\rChoice ? (q to quit): " ) ;
|
||||
#if defined ( __GNUC__ )
|
||||
fflush(stdout);
|
||||
#endif
|
||||
ucKey = UART_GetChar() ;
|
||||
printf( "%c", ucKey ) ;
|
||||
command = ucKey - '0';
|
||||
|
||||
/* Check user input */
|
||||
ucSize = 0 ;
|
||||
if ( command == 1 )
|
||||
{
|
||||
printf( "\n\r-I- Sending command " ) ;
|
||||
for ( i=0 ; i < sizeof( testCommand1 ) ; i++ )
|
||||
{
|
||||
printf( "0x%02X ", testCommand1[i] ) ;
|
||||
}
|
||||
printf( "...\n\r" ) ;
|
||||
ucSize = ISO7816_XfrBlockTPDU_T0( testCommand1, pMessage, sizeof( testCommand1 ) ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( command == 2 )
|
||||
{
|
||||
printf( "\n\r-I- Sending command " ) ;
|
||||
for ( i=0 ; i < sizeof( testCommand2 ) ; i++ )
|
||||
{
|
||||
printf("0x%02X ", testCommand2[i] ) ;
|
||||
}
|
||||
printf( "...\n\r" ) ;
|
||||
ucSize = ISO7816_XfrBlockTPDU_T0( testCommand2, pMessage, sizeof( testCommand2 ) ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( command == 3 )
|
||||
{
|
||||
printf( "\n\r-I- Sending command " ) ;
|
||||
for ( i=0 ; i < sizeof( testCommand3 ) ; i++ )
|
||||
{
|
||||
printf( "0x%02X ", testCommand3[i] ) ;
|
||||
}
|
||||
printf( "...\n\r" ) ;
|
||||
ucSize = ISO7816_XfrBlockTPDU_T0( testCommand3, pMessage, sizeof( testCommand3 ) ) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( command == 4 )
|
||||
{
|
||||
printf( "\n\r-I- Sending command " ) ;
|
||||
for ( i=0 ; i < sizeof( testCommand4 ) ; i++ )
|
||||
{
|
||||
printf( "0x%02X ", testCommand4[i] ) ;
|
||||
}
|
||||
printf( "...\n\r" ) ;
|
||||
ucSize = ISO7816_XfrBlockTPDU_T0( testCommand4, pMessage, sizeof( testCommand4 ) ) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Output smartcard answer */
|
||||
if ( ucSize > 0 )
|
||||
{
|
||||
printf( "\n\rAnswer: " ) ;
|
||||
for ( i=0 ; i < ucSize ; i++ )
|
||||
{
|
||||
printf( "0x%02X ", pMessage[i] ) ;
|
||||
}
|
||||
printf( "\n\r" ) ;
|
||||
}
|
||||
}
|
||||
|
||||
printf( "Quitting ...\n\r" ) ;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the DBGU and ISO7816 driver, and starts some tests.
|
||||
* \return Unused (ANSI-C compatibility)
|
||||
*/
|
||||
extern int main( void )
|
||||
{
|
||||
uint8_t pAtr[MAX_ATR_SIZE] ;
|
||||
uint8_t ucSize ;
|
||||
|
||||
LED_Configure(LED_NUM_GREEN);
|
||||
LED_Set(LED_NUM_GREEN);
|
||||
|
||||
/* Disable watchdog*/
|
||||
WDT_Disable( WDT ) ;
|
||||
|
||||
/* Initialize Atr buffer */
|
||||
memset( pAtr, 0, sizeof( pAtr ) ) ;
|
||||
|
||||
printf( "-- USART ISO7816 Example %s --\n\r", SOFTPACK_VERSION ) ;
|
||||
printf( "-- %s\n\r", BOARD_NAME ) ;
|
||||
printf( "-- Compiled: %s %s --\n\r", __DATE__, __TIME__ ) ;
|
||||
|
||||
/* Configure IT on Smart Card */
|
||||
ConfigureCardDetection() ;
|
||||
|
||||
/* Configure ISO7816 driver */
|
||||
PIO_Configure( pinsISO7816, PIO_LISTSIZE( pinsISO7816 ) ) ;
|
||||
|
||||
// FIXME: RST seems to be allways low here
|
||||
printf("******* Reset State1 (1 if the Pin RstMC is high): 0x%X\n\r", ISO7816_StatusReset());
|
||||
|
||||
ISO7816_Init( pinIso7816RstMC ) ;
|
||||
|
||||
printf("******* Reset State2 (1 if the Pin RstMC is high): 0x%X\n\r", ISO7816_StatusReset());
|
||||
|
||||
/* Read ATR */
|
||||
ISO7816_warm_reset() ;
|
||||
|
||||
ISO7816_Datablock_ATR( pAtr, &ucSize ) ;
|
||||
printf("******* Reset State3 (1 if the Pin RstMC is high): 0x%X\n\r", ISO7816_StatusReset());
|
||||
|
||||
/* Decode ATR */
|
||||
ISO7816_Decode_ATR( pAtr ) ;
|
||||
|
||||
// FIXME: RST seems to be allways high
|
||||
printf("******* Reset State4 (1 if the Pin RstMC is high): 0x%X\n\r", ISO7816_StatusReset());
|
||||
|
||||
/* Allow user to send some commands */
|
||||
SendReceiveCommands() ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
|
@ -1,387 +0,0 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal definitions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Maximum ucSize in bytes of the smartcard answer to a command.*/
|
||||
#define MAX_ANSWER_SIZE 10
|
||||
|
||||
/** Maximum ATR ucSize in bytes.*/
|
||||
#define MAX_ATR_SIZE 55
|
||||
|
||||
/** USB states */
|
||||
/// Use for power management
|
||||
#define STATE_IDLE 0
|
||||
/// The USB device is in suspend state
|
||||
#define STATE_SUSPEND 4
|
||||
/// The USB device is in resume state
|
||||
#define STATE_RESUME 5
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
/** USB state: suspend, resume, idle */
|
||||
unsigned char USBState = STATE_IDLE;
|
||||
|
||||
/** ISO7816 pins */
|
||||
static const Pin pinsISO7816_PHONE[] = {PINS_ISO7816_PHONE};
|
||||
/** ISO7816 RST pin */
|
||||
static const Pin pinIso7816RstMC = PIN_ISO7816_RST_PHONE;
|
||||
static uint8_t sim_inserted = 0;
|
||||
|
||||
static const Pin pPwr[] = {
|
||||
/* Enable power converter 4.5-6V to 3.3V; low: off */
|
||||
{SIM_PWEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT},
|
||||
|
||||
/* Enable second power converter: VCC_PHONE to VCC_SIM; high: off */
|
||||
{VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
|
||||
};
|
||||
|
||||
// SuperSIM ATR: 3B 9A 94 00 92 02 75 93 11 00 01 02 02 19
|
||||
static const uint8_t ATR[] = {0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19};
|
||||
#define NONE 0
|
||||
#define SEND_ATR 1
|
||||
#define AFTER_ATR 2
|
||||
static uint8_t phone_state = NONE;
|
||||
|
||||
|
||||
#define ISO7816_PHONE_RST {PIO_PA24, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
|
||||
static const Pin pinPhoneRST = ISO7816_PHONE_RST;
|
||||
//#define ISO7816_PHONE_CLK {PIO_PA23A_SCK1, PIOA, ID_PIOA, PIO_INPUT, PIO_PULLUP | PIO_DEBOUNCE | PIO_DEGLITCH | PIO_IT_EDGE }
|
||||
//static const Pin pinPhoneClk = ISO7816_PHONE_CLK;
|
||||
|
||||
/* ===================================================*/
|
||||
/* Taken from iso7816_4.c */
|
||||
/* ===================================================*/
|
||||
/** Flip flop for send and receive char */
|
||||
#define USART_SEND 0
|
||||
#define USART_RCV 1
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*-----------------------------------------------------------------------------*/
|
||||
/** Variable for state of send and receive froom USART */
|
||||
static uint8_t StateUsartGlobal = USART_RCV;
|
||||
/** Pin reset master card */
|
||||
static Pin st_pinIso7816RstMC;
|
||||
|
||||
static uint32_t char_stat = 0;
|
||||
static char rcvdChar = 0;
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Interrupt routines
|
||||
*-----------------------------------------------------------------------------*/
|
||||
/*
|
||||
* char_stat is zero if no error occured.
|
||||
* Otherwise it is filled with the content of the status register.
|
||||
*/
|
||||
void USART1_IrqHandler( void )
|
||||
{
|
||||
uint32_t stat;
|
||||
char_stat = 0;
|
||||
// Rcv buf full
|
||||
/* if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) {
|
||||
TRACE_DEBUG("Rcv buf full");
|
||||
USART_DisableIt(USART1, US_IDR_RXBUFF);
|
||||
}
|
||||
*/
|
||||
uint32_t csr = USART_PHONE->US_CSR;
|
||||
|
||||
// printf(".\n\r");
|
||||
|
||||
if (csr & US_CSR_TXRDY) {
|
||||
/* transmit buffer empty, nothing to transmit */
|
||||
}
|
||||
if (csr & US_CSR_RXRDY) {
|
||||
stat = (csr&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (stat == 0 ) {
|
||||
/* Get a char */
|
||||
rcvdChar = ((USART_PHONE->US_RHR) & 0xFF);
|
||||
} /* else: error occured */
|
||||
char_stat = stat;
|
||||
}
|
||||
}
|
||||
|
||||
static void ISR_PhoneRST( const Pin *pPin)
|
||||
{
|
||||
TRACE_DEBUG("+++++++++ Interrupt!! ISR:0x%x, CSR:0x%x\n\r", pinPhoneRST.pio->PIO_ISR, USART1->US_CSR);
|
||||
phone_state = SEND_ATR;
|
||||
PIO_DisableIt( &pinPhoneRST ) ;
|
||||
}
|
||||
|
||||
static void Config_PhoneRST_IrqHandler()
|
||||
{
|
||||
PIO_Configure( &pinPhoneRST, 1);
|
||||
// PIO_Configure( &pinPhoneClk, 1);
|
||||
PIO_ConfigureIt( &pinPhoneRST, ISR_PhoneRST ) ;
|
||||
// PIO_ConfigureIt( &pinPhoneClk, ISR_PhoneRST ) ;
|
||||
PIO_EnableIt( &pinPhoneRST ) ;
|
||||
// PIO_EnableIt( &pinPhoneClk ) ;
|
||||
NVIC_EnableIRQ( PIOA_IRQn );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a character from ISO7816
|
||||
* \param pCharToReceive Pointer for store the received char
|
||||
* \return 0: if timeout else status of US_CSR
|
||||
*/
|
||||
static uint32_t ISO7816_GetChar( uint8_t *pCharToReceive )
|
||||
{
|
||||
uint32_t status;
|
||||
uint32_t timeout=0;
|
||||
|
||||
TRACE_DEBUG("--");
|
||||
|
||||
if( StateUsartGlobal == USART_SEND ) {
|
||||
while((USART_PHONE->US_CSR & US_CSR_TXEMPTY) == 0) {}
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
StateUsartGlobal = USART_RCV;
|
||||
}
|
||||
|
||||
/* Wait USART ready for reception */
|
||||
while( ((USART_PHONE->US_CSR & US_CSR_RXRDY) == 0) ) {
|
||||
if(timeout++ > 12000 * (BOARD_MCK/1000000)) {
|
||||
TRACE_DEBUG("TimeOut\n\r");
|
||||
return( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
/* At least one complete character has been received and US_RHR has not yet been read. */
|
||||
|
||||
/* Get a char */
|
||||
*pCharToReceive = ((USART_PHONE->US_RHR) & 0xFF);
|
||||
|
||||
status = (USART_PHONE->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("R:0x%X\n\r", status);
|
||||
TRACE_DEBUG("R:0x%X\n\r", USART_PHONE->US_CSR);
|
||||
TRACE_DEBUG("Nb:0x%X\n\r", USART_PHONE->US_NER );
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a char to ISO7816
|
||||
* \param CharToSend char to be send
|
||||
* \return status of US_CSR
|
||||
*/
|
||||
static uint32_t ISO7816_SendChar( uint8_t CharToSend )
|
||||
{
|
||||
uint32_t status;
|
||||
|
||||
TRACE_DEBUG("********** Send char: %c (0x%X)\n\r", CharToSend, CharToSend);
|
||||
|
||||
if( StateUsartGlobal == USART_RCV ) {
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA | US_CR_RSTIT | US_CR_RSTNACK;
|
||||
StateUsartGlobal = USART_SEND;
|
||||
}
|
||||
|
||||
/* Wait USART ready for transmit */
|
||||
while((USART_PHONE->US_CSR & US_CSR_TXRDY) == 0) {}
|
||||
/* There is no character in the US_THR */
|
||||
|
||||
/* Transmit a char */
|
||||
USART_PHONE->US_THR = CharToSend;
|
||||
|
||||
status = (USART_PHONE->US_CSR&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (status != 0 ) {
|
||||
TRACE_DEBUG("******* status: 0x%X (Overrun: %d, NACK: %d, Timeout: %d, underrun: %d)\n\r",
|
||||
status, ((status & US_CSR_OVRE)>> 5), ((status & US_CSR_NACK) >> 13),
|
||||
((status & US_CSR_TIMEOUT) >> 8), ((status & (1 << 10)) >> 10));
|
||||
|
||||
TRACE_DEBUG("E (USART CSR reg):0x%X\n\r", USART_PHONE->US_CSR);
|
||||
TRACE_DEBUG("Nb (Number of errors):0x%X\n\r", USART_PHONE->US_NER );
|
||||
USART_PHONE->US_CR = US_CR_RSTSTA;
|
||||
}
|
||||
|
||||
/* Return status */
|
||||
return( status );
|
||||
}
|
||||
|
||||
|
||||
/** Initializes a ISO driver
|
||||
* \param pPinIso7816RstMC Pin ISO 7816 Rst MC
|
||||
*/
|
||||
void _ISO7816_Init( const Pin pPinIso7816RstMC )
|
||||
{
|
||||
TRACE_DEBUG("ISO_Init\n\r");
|
||||
|
||||
/* Pin ISO7816 initialize */
|
||||
st_pinIso7816RstMC = pPinIso7816RstMC;
|
||||
|
||||
USART_Configure( USART_PHONE,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
// Nope, we aren't master:
|
||||
// | US_MR_USCLKS_MCK
|
||||
| US_MR_USCLKS_SCK
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO /** TODO: This field was set in the original simtrace firmware..why? */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
/*
|
||||
SYNC = 0 (async mode)
|
||||
OVER = 0 (oversampling by 8?)
|
||||
FIDI = 372 (default val on startup before other value is negotiated)
|
||||
USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK
|
||||
CD = 1 ? --> US_BRGR_CD(1)
|
||||
*/
|
||||
USART_PHONE->US_FIDI = 372;
|
||||
// USART_PHONE->US_IDR = (uint32_t) -1;
|
||||
USART_PHONE->US_BRGR = US_BRGR_CD(1);
|
||||
// USART_PHONE->US_BRGR = BOARD_MCK / (372*9600);
|
||||
USART_PHONE->US_TTGR = 5;
|
||||
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(ID_USART_PHONE);
|
||||
|
||||
USART1->US_IDR = 0xffffffff;
|
||||
USART_EnableIt( USART1, US_IER_RXRDY) ;
|
||||
/* enable USART1 interrupt */
|
||||
NVIC_EnableIRQ( USART1_IRQn ) ;
|
||||
|
||||
// USART_PHONE->US_IER = US_IER_RXRDY | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | US_IER_NACK | US_IER_ITER;
|
||||
|
||||
USART_SetTransmitterEnabled(USART_PHONE, 1);
|
||||
USART_SetReceiverEnabled(USART_PHONE, 1);
|
||||
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Main
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Initializes the DBGU and ISO7816 driver, and starts some tests.
|
||||
* \return Unused (ANSI-C compatibility)
|
||||
*/
|
||||
extern int main( void )
|
||||
{
|
||||
uint8_t pAtr[MAX_ATR_SIZE] ;
|
||||
uint8_t ucSize ;
|
||||
static uint8_t buff[100];
|
||||
|
||||
LED_Configure(LED_NUM_GREEN);
|
||||
LED_Set(LED_NUM_GREEN);
|
||||
|
||||
/* Disable watchdog*/
|
||||
WDT_Disable( WDT ) ;
|
||||
|
||||
PIO_InitializeInterrupts(0);
|
||||
|
||||
/* Configure ISO7816 driver */
|
||||
PIO_Configure( pinsISO7816_PHONE, PIO_LISTSIZE( pinsISO7816_PHONE ) ) ;
|
||||
PIO_Configure(pPwr, PIO_LISTSIZE( pPwr ));
|
||||
|
||||
Config_PhoneRST_IrqHandler();
|
||||
|
||||
_ISO7816_Init(pinIso7816RstMC);
|
||||
|
||||
// FIXME: Or do I need to call VBUS_CONFIGURE() here instead, which will call USBD_Connect() later?
|
||||
// USBD_Connect();
|
||||
// FIXME: USB clock? USB PMC?
|
||||
// NVIC_EnableIRQ( UDP_IRQn );
|
||||
|
||||
|
||||
|
||||
// USART_EnableIt( USART_PHONE, US_IER_RXRDY) ;
|
||||
|
||||
// FIXME: At some point USBD_IrqHandler() should get called and set USBD_STATE_CONFIGURED
|
||||
/* while (USBD_GetState() < USBD_STATE_CONFIGURED) {
|
||||
int i = 1;
|
||||
if ((i%10000) == 0) {
|
||||
TRACE_DEBUG("%d: USB State: %x\n\r", i, USBD_GetState());
|
||||
}
|
||||
i++;
|
||||
}
|
||||
*/
|
||||
printf("***** START \n\r");
|
||||
TRACE_DEBUG("%s", "Start while loop\n\r");
|
||||
while (1) {
|
||||
// printf(".\n\r");
|
||||
|
||||
uint8_t j;
|
||||
/* for( j=0; j < 100; j++ ) {
|
||||
// ISO7816_GetChar(&buff[j++]);
|
||||
}
|
||||
*/
|
||||
// for( j=0; j < 1000; j++ ) {
|
||||
/* printf("0x%x ", buff[j++]);
|
||||
if ((j % 40)==0) {
|
||||
printf("\n\r");
|
||||
}
|
||||
*/
|
||||
// }
|
||||
//ISO7816_GetChar(&buff[0]);
|
||||
//printf("buf: 0x%x\n\r", buff[0]);
|
||||
|
||||
uint32_t ret=-1;
|
||||
|
||||
if (phone_state == SEND_ATR) {
|
||||
printf("*");
|
||||
TRACE_DEBUG("Send char %x %x %x ..", ATR[0], ATR[1], ATR[2]);
|
||||
for (j=0; j < sizeof(ATR)/sizeof(ATR[0]); j++) {
|
||||
ret = ISO7816_SendChar(ATR[j]);
|
||||
TRACE_DEBUG("ret: 0x%x\n\r", ret);
|
||||
}
|
||||
phone_state = AFTER_ATR;
|
||||
PIO_EnableIt( &pinPhoneRST ) ;
|
||||
} else {
|
||||
// printf("Nothing to do\n\r");
|
||||
}
|
||||
if (rcvdChar != 0) {
|
||||
printf("Received _%x_ \n\r", rcvdChar);
|
||||
rcvdChar = 0;
|
||||
}
|
||||
}
|
||||
return 0 ;
|
||||
}
|
|
@ -1,194 +0,0 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Headers
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal definitions
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
/** Maximum ucSize in bytes of the smartcard answer to a command.*/
|
||||
#define MAX_ANSWER_SIZE 10
|
||||
|
||||
/** Maximum ATR ucSize in bytes.*/
|
||||
#define MAX_ATR_SIZE 55
|
||||
|
||||
/* Sniffer configuration */
|
||||
#ifdef PIN_SC_SW
|
||||
#undef PIN_SC_SW
|
||||
#endif
|
||||
#define PIN_SC_SW {PIO_PA20, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}
|
||||
|
||||
#ifdef PIN_IO_SW
|
||||
#undef PIN_IO_SW
|
||||
#endif
|
||||
#define PIN_IO_SW {PIO_PA19, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT}
|
||||
|
||||
#define PINS_BUS PIN_SC_SW, PIN_IO_SW
|
||||
|
||||
#define PINS_SIM_SNIFF_SIM PIN_PHONE_IO, PIN_PHONE_CLK
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*------------------------------------------------------------------------------*/
|
||||
/** ISO7816 pins */
|
||||
static const Pin pinsISO7816_sniff[] = {PINS_SIM_SNIFF_SIM};
|
||||
static const Pin pins_bus[] = {PINS_BUS};
|
||||
static const Pin pPwr[] = {
|
||||
/* Enable power converter 4.5-6V to 3.3V; low: off */
|
||||
{SIM_PWEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT},
|
||||
|
||||
/* Enable second power converter: VCC_PHONE to VCC_SIM; high: off */
|
||||
{VCC_FWD, PIOA, ID_PIOA, PIO_OUTPUT_1, PIO_DEFAULT}
|
||||
};
|
||||
|
||||
uint32_t char_stat = 0;
|
||||
uint8_t rcvdChar = 0;
|
||||
|
||||
/*-----------------------------------------------------------------------------
|
||||
* Interrupt routines
|
||||
*-----------------------------------------------------------------------------*/
|
||||
/*
|
||||
* char_stat is zero if no error occured.
|
||||
* Otherwise it is filled with the content of the status register.
|
||||
*/
|
||||
void USART1_IrqHandler( void )
|
||||
{
|
||||
uint32_t stat;
|
||||
char_stat = 0;
|
||||
// Rcv buf full
|
||||
/* if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) {
|
||||
TRACE_DEBUG("Rcv buf full");
|
||||
USART_DisableIt(USART1, US_IDR_RXBUFF);
|
||||
}
|
||||
*/
|
||||
uint32_t csr = USART_PHONE->US_CSR;
|
||||
|
||||
if (csr & US_CSR_TXRDY) {
|
||||
/* transmit buffer empty, nothing to transmit */
|
||||
}
|
||||
if (csr & US_CSR_RXRDY) {
|
||||
stat = (csr&(US_CSR_OVRE|US_CSR_FRAME|
|
||||
US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
|
||||
(1<<10)));
|
||||
|
||||
if (stat == 0 ) {
|
||||
/* Get a char */
|
||||
rcvdChar = ((USART_PHONE->US_RHR) & 0xFF);
|
||||
} /* else: error occured */
|
||||
char_stat = stat;
|
||||
}
|
||||
}
|
||||
|
||||
/** Initializes a ISO driver
|
||||
* \param pPinIso7816RstMC Pin ISO 7816 Rst MC
|
||||
*/
|
||||
void _ISO7816_Init( )
|
||||
{
|
||||
TRACE_DEBUG("ISO_Init\n\r");
|
||||
|
||||
USART_Configure( USART_PHONE,
|
||||
US_MR_USART_MODE_IS07816_T_0
|
||||
// Nope, we aren't master:
|
||||
// | US_MR_USCLKS_MCK
|
||||
| US_MR_USCLKS_SCK
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_EVEN
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_CLKO /** TODO: This field was set in the original simtrace firmware..why? */
|
||||
| (3<<24), /* MAX_ITERATION */
|
||||
1,
|
||||
0);
|
||||
/*
|
||||
SYNC = 0 (async mode)
|
||||
OVER = 0 (oversampling by 8?)
|
||||
FIDI = 372 (default val on startup before other value is negotiated)
|
||||
USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK
|
||||
CD = 1 ? --> US_BRGR_CD(1)
|
||||
*/
|
||||
USART_PHONE->US_FIDI = 372;
|
||||
USART_PHONE->US_BRGR = US_BRGR_CD(1);
|
||||
// USART_PHONE->US_BRGR = BOARD_MCK / (372*9600);
|
||||
USART_PHONE->US_TTGR = 5;
|
||||
|
||||
/* Configure USART */
|
||||
PMC_EnablePeripheral(ID_USART_PHONE);
|
||||
|
||||
USART1->US_IDR = 0xffffffff;
|
||||
USART_EnableIt( USART1, US_IER_RXRDY) ;
|
||||
/* enable USART1 interrupt */
|
||||
NVIC_EnableIRQ( USART1_IRQn ) ;
|
||||
|
||||
// USART_PHONE->US_IER = US_IER_RXRDY | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | US_IER_NACK | US_IER_ITER;
|
||||
|
||||
USART_SetReceiverEnabled(USART_PHONE, 1);
|
||||
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Main
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
extern int main( void )
|
||||
{
|
||||
uint8_t ucSize ;
|
||||
static uint8_t buff[100];
|
||||
|
||||
LED_Configure(LED_NUM_GREEN);
|
||||
LED_Set(LED_NUM_GREEN);
|
||||
|
||||
/* Disable watchdog*/
|
||||
WDT_Disable( WDT ) ;
|
||||
|
||||
PIO_InitializeInterrupts(0);
|
||||
|
||||
/* Configure ISO7816 driver */
|
||||
PIO_Configure( pinsISO7816_sniff, PIO_LISTSIZE( pinsISO7816_sniff ) ) ;
|
||||
PIO_Configure( pins_bus, PIO_LISTSIZE( pins_bus) ) ;
|
||||
PIO_Configure(pPwr, PIO_LISTSIZE( pPwr ));
|
||||
|
||||
_ISO7816_Init( );
|
||||
|
||||
printf("***** START \n\r");
|
||||
while (1) {
|
||||
// printf(".\n\r");
|
||||
|
||||
if (rcvdChar != 0) {
|
||||
printf("Received _%x_ \n\r", rcvdChar);
|
||||
rcvdChar = 0;
|
||||
}
|
||||
}
|
||||
return 0 ;
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
#include "board.h"
|
||||
#include "spi.h"
|
||||
#include "pio.h"
|
||||
#include "pmc.h"
|
||||
#include "usart.h"
|
||||
|
||||
#define BUFFER_SIZE 20
|
||||
|
||||
/** Pins to configure for the application.*/
|
||||
const Pin pins[] = { BOARD_PIN_USART_RXD,
|
||||
BOARD_PIN_USART_TXD
|
||||
// PIN_USART1_SCK,
|
||||
// BOARD_PIN_USART_RTS,
|
||||
// BOARD_PIN_USART_CTS,
|
||||
// PINS_SPI,
|
||||
// PIN_SPI_NPCS0_PA11
|
||||
};
|
||||
|
||||
char Buffer[BUFFER_SIZE] = "Hello World";
|
||||
/**
|
||||
* \brief Configures USART in synchronous mode,8N1
|
||||
* * \param mode 1 for master, 0 for slave
|
||||
* */
|
||||
static void _ConfigureUsart(uint32_t freq )
|
||||
{
|
||||
uint32_t mode;
|
||||
/* MASTER; mode = US_MR_USART_MODE_NORMAL
|
||||
| US_MR_USCLKS_MCK
|
||||
| US_MR_CHMODE_NORMAL
|
||||
| US_MR_CLKO
|
||||
| US_MR_SYNC // FIXME: sync or not sync?
|
||||
| US_MR_MSBF
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_NO ;
|
||||
*/
|
||||
|
||||
|
||||
// Slave mode:
|
||||
mode = US_MR_USART_MODE_NORMAL
|
||||
// | US_MR_USCLKS_SCK // we don't have serial clock, do we?
|
||||
| US_MR_CHMODE_NORMAL
|
||||
// | US_MR_SYNC
|
||||
| US_MR_MSBF
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_NO;
|
||||
|
||||
/* Enable the peripheral clock in the PMC */
|
||||
PMC_EnablePeripheral( BOARD_ID_USART ) ;
|
||||
|
||||
/* Configure the USART in the desired mode @USART_SPI_CLK bauds*/
|
||||
USART_Configure( BOARD_USART_BASE, mode, freq, BOARD_MCK ) ;
|
||||
|
||||
/* enable USART1 interrupt */
|
||||
// NVIC_EnableIRQ( USART1_IRQn ) ;
|
||||
|
||||
/* Enable receiver & transmitter */
|
||||
USART_SetTransmitterEnabled( BOARD_USART_BASE, 1 ) ;
|
||||
USART_SetReceiverEnabled( BOARD_USART_BASE, 1 ) ;
|
||||
}
|
||||
|
||||
int main() {
|
||||
/* Configure pins */
|
||||
PIO_Configure( pins, PIO_LISTSIZE( pins ) ) ;
|
||||
|
||||
_ConfigureUsart( 1000000UL);
|
||||
|
||||
USART_WriteBuffer(BOARD_USART_BASE, Buffer, BUFFER_SIZE);
|
||||
|
||||
// FIXME: do we need to call USARTEnable?
|
||||
|
||||
|
||||
// FIXME: do we need to call USARTDisable?
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,144 +0,0 @@
|
|||
#include "board.h"
|
||||
#include "spi.h"
|
||||
#include "pio.h"
|
||||
#include "pmc.h"
|
||||
#include "usart.h"
|
||||
|
||||
#define BUFFER_SIZE 20
|
||||
|
||||
const Pin statusled = {LED_GREEN, PIOA, ID_PIOA, PIO_OUTPUT_0, PIO_DEFAULT};
|
||||
|
||||
/*
|
||||
* Describes the type and attribute of one PIO pin or a group of similar pins.
|
||||
* The #type# field can have the following values:
|
||||
* - PIO_PERIPH_A
|
||||
* - PIO_PERIPH_B
|
||||
* - PIO_OUTPUT_0
|
||||
* - PIO_OUTPUT_1
|
||||
* - PIO_INPUT
|
||||
*
|
||||
* The #attribute# field is a bitmask that can either be set to PIO_DEFAULt,
|
||||
* or combine (using bitwise OR '|') any number of the following constants:
|
||||
* - PIO_PULLUP
|
||||
* - PIO_DEGLITCH
|
||||
* - PIO_DEBOUNCE
|
||||
* - PIO_OPENDRAIN
|
||||
* - PIO_IT_LOW_LEVEL
|
||||
* - PIO_IT_HIGH_LEVEL
|
||||
* - PIO_IT_FALL_EDGE
|
||||
* - PIO_IT_RISE_EDGE
|
||||
*/
|
||||
#if 0
|
||||
typedef struct _Pin
|
||||
{
|
||||
/* Bitmask indicating which pin(s) to configure. */
|
||||
uint32_t mask;
|
||||
/* Pointer to the PIO controller which has the pin(s). */
|
||||
Pio *pio;
|
||||
/* Peripheral ID of the PIO controller which has the pin(s). */
|
||||
uint8_t id;
|
||||
/* Pin type. */
|
||||
uint8_t type;
|
||||
/* Pin attribute. */
|
||||
uint8_t attribute;
|
||||
} Pin ; */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
/** Pins to configure for the application.*/
|
||||
const Pin pins[] = { BOARD_PIN_USART_RXD,
|
||||
BOARD_PIN_USART_TXD
|
||||
// PIN_USART1_SCK,
|
||||
// BOARD_PIN_USART_RTS,
|
||||
// BOARD_PIN_USART_CTS,
|
||||
// PINS_SPI,
|
||||
// PIN_SPI_NPCS0_PA11
|
||||
};
|
||||
|
||||
char Buffer[BUFFER_SIZE] = "Hello World";
|
||||
/**
|
||||
* \brief Configures USART in synchronous mode,8N1
|
||||
* * \param mode 1 for master, 0 for slave
|
||||
* */
|
||||
static void _ConfigureUsart(uint32_t freq )
|
||||
{
|
||||
uint32_t mode;
|
||||
|
||||
/* MASTER; mode = US_MR_USART_MODE_NORMAL
|
||||
| US_MR_USCLKS_MCK
|
||||
| US_MR_CHMODE_NORMAL
|
||||
| US_MR_CLKO
|
||||
| US_MR_SYNC // FIXME: sync or not sync?
|
||||
| US_MR_MSBF
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_NO ;
|
||||
*/
|
||||
|
||||
// Slave mode:
|
||||
mode = US_MR_USART_MODE_NORMAL
|
||||
| US_MR_USCLKS_SCK // we don't have serial clock, do we?
|
||||
| US_MR_CHMODE_NORMAL
|
||||
// | US_MR_SYNC
|
||||
| US_MR_MSBF
|
||||
| US_MR_CHRL_8_BIT
|
||||
| US_MR_NBSTOP_1_BIT
|
||||
| US_MR_PAR_NO;
|
||||
|
||||
/* Enable the peripheral clock in the PMC */
|
||||
PMC_EnablePeripheral( BOARD_ID_USART ) ;
|
||||
|
||||
/* Configure the USART in the desired mode @USART_SPI_CLK bauds*/
|
||||
USART_Configure( BOARD_USART_BASE, mode, freq, BOARD_MCK ) ;
|
||||
UART_Configure(9600, BOARD_MCK);
|
||||
|
||||
/* enable USART1 interrupt */
|
||||
// NVIC_EnableIRQ( USART1_IRQn ) ;
|
||||
|
||||
/* Enable receiver & transmitter */
|
||||
USART_SetTransmitterEnabled( BOARD_USART_BASE, 1 ) ;
|
||||
USART_SetReceiverEnabled( BOARD_USART_BASE, 1 ) ;
|
||||
}
|
||||
|
||||
int main() {
|
||||
register int i = 0;
|
||||
register int state = 0;
|
||||
/* Configure pins */
|
||||
|
||||
// FIXME: initialize system clock done in lowlevelinit?
|
||||
|
||||
PIO_Configure(&statusled, PIO_LISTSIZE(statusled));
|
||||
PIO_Clear(&statusled);
|
||||
|
||||
PIO_Configure( pins, PIO_LISTSIZE( pins ) ) ;
|
||||
|
||||
_ConfigureUsart( 1000000UL);
|
||||
|
||||
while(1) {
|
||||
USART_WriteBuffer(BOARD_USART_BASE, Buffer, BUFFER_SIZE);
|
||||
|
||||
i = i+1;
|
||||
if ((i%500000) == 0) {
|
||||
switch(state) {
|
||||
case 0:
|
||||
PIO_Set(&statusled);
|
||||
state=1;
|
||||
break;
|
||||
case 1:
|
||||
PIO_Clear(&statusled);
|
||||
state = 2;
|
||||
break;
|
||||
default:
|
||||
state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: do we need to call USARTEnable?
|
||||
|
||||
|
||||
// FIXME: do we need to call USARTDisable?
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,358 +0,0 @@
|
|||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Internal variables
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/** Standard USB device descriptor for the CDC serial driver */
|
||||
const USBDeviceDescriptor deviceDescriptor = {
|
||||
|
||||
sizeof(USBDeviceDescriptor),
|
||||
USBGenericDescriptor_DEVICE,
|
||||
USBDeviceDescriptor_USB2_00,
|
||||
0xff,
|
||||
// CDCDeviceDescriptor_CLASS,
|
||||
0xff,
|
||||
// CDCDeviceDescriptor_SUBCLASS,
|
||||
0xff,
|
||||
// CDCDeviceDescriptor_PROTOCOL,
|
||||
BOARD_USB_ENDPOINTS_MAXPACKETSIZE(0),
|
||||
ATMEL_VENDOR_ID,
|
||||
SIMTRACE_PRODUCT_ID,
|
||||
1, /* Release number */
|
||||
0, /* No string descriptor for manufacturer */
|
||||
1, /* Index of product string descriptor is #1 */
|
||||
0, /* No string descriptor for serial number */
|
||||
2 /* Device has 2 possible configurations */
|
||||
};
|
||||
|
||||
typedef struct _SIMTraceDriverConfigurationDescriptors {
|
||||
|
||||
/** Standard configuration descriptor. */
|
||||
USBConfigurationDescriptor configuration;
|
||||
/** Data interface descriptor. */
|
||||
USBInterfaceDescriptor data;
|
||||
/** Data OUT endpoint descriptor. */
|
||||
USBEndpointDescriptor dataOut;
|
||||
/** Data IN endpoint descriptor. */
|
||||
USBEndpointDescriptor dataIn;
|
||||
|
||||
} __attribute__ ((packed)) SIMTraceDriverConfigurationDescriptor;
|
||||
|
||||
const SIMTraceDriverConfigurationDescriptor configurationDescriptorsFS1 = {
|
||||
/* Standard configuration descriptor */
|
||||
{
|
||||
sizeof(USBConfigurationDescriptor),
|
||||
USBGenericDescriptor_CONFIGURATION,
|
||||
sizeof(SIMTraceDriverConfigurationDescriptor),
|
||||
2, /* There are two interfaces in this configuration */
|
||||
1, /* This is configuration #1 */
|
||||
2, /* Second string descriptor for this configuration */
|
||||
USBD_BMATTRIBUTES,
|
||||
USBConfigurationDescriptor_POWER(100)
|
||||
},
|
||||
/* Communication class interface standard descriptor */
|
||||
{
|
||||
sizeof(USBInterfaceDescriptor),
|
||||
USBGenericDescriptor_INTERFACE,
|
||||
0, /* This is interface #0 */
|
||||
0, /* This is alternate setting #0 for this interface */
|
||||
2, /* This interface uses 2 endpoints */
|
||||
//CDCCommunicationInterfaceDescriptor_CLASS,
|
||||
0xff,
|
||||
// CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL,
|
||||
0,
|
||||
// CDCCommunicationInterfaceDescriptor_NOPROTOCOL,
|
||||
0,
|
||||
1 /* Second in string descriptor for this interface */
|
||||
},
|
||||
/* Bulk-OUT endpoint standard descriptor */
|
||||
#define DATAOUT 1
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
|
||||
DATAOUT),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(DATAOUT),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 /* Must be 0 for full-speed bulk endpoints */
|
||||
},
|
||||
/* Bulk-IN endpoint descriptor */
|
||||
#define DATAIN 2
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
|
||||
DATAIN),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(DATAIN),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 /* Must be 0 for full-speed bulk endpoints */
|
||||
}
|
||||
};
|
||||
|
||||
const SIMTraceDriverConfigurationDescriptor configurationDescriptorsFS2 = {
|
||||
/** Second configuration **/
|
||||
{
|
||||
sizeof(USBConfigurationDescriptor),
|
||||
USBGenericDescriptor_CONFIGURATION,
|
||||
sizeof(SIMTraceDriverConfigurationDescriptor),
|
||||
2, /* There are two interfaces in this configuration */
|
||||
2, /* This is configuration #2 */
|
||||
3, /* Third string descriptor for this configuration */
|
||||
USBD_BMATTRIBUTES,
|
||||
USBConfigurationDescriptor_POWER(100)
|
||||
},
|
||||
/* Communication class interface standard descriptor */
|
||||
{
|
||||
sizeof(USBInterfaceDescriptor),
|
||||
USBGenericDescriptor_INTERFACE,
|
||||
0, /* This is interface #0 */
|
||||
0, /* This is alternate setting #0 for this interface */
|
||||
2, /* This interface uses 2 endpoints */
|
||||
//CDCCommunicationInterfaceDescriptor_CLASS,
|
||||
0xff,
|
||||
// CDCCommunicationInterfaceDescriptor_ABSTRACTCONTROLMODEL,
|
||||
0,
|
||||
// CDCCommunicationInterfaceDescriptor_NOPROTOCOL,
|
||||
0,
|
||||
3 /* Third in string descriptor for this interface */
|
||||
},
|
||||
/* Bulk-OUT endpoint standard descriptor */
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_OUT,
|
||||
DATAOUT),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(DATAOUT),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 /* Must be 0 for full-speed bulk endpoints */
|
||||
},
|
||||
/* Bulk-IN endpoint descriptor */
|
||||
{
|
||||
sizeof(USBEndpointDescriptor),
|
||||
USBGenericDescriptor_ENDPOINT,
|
||||
USBEndpointDescriptor_ADDRESS(USBEndpointDescriptor_IN,
|
||||
DATAIN),
|
||||
USBEndpointDescriptor_BULK,
|
||||
MIN(BOARD_USB_ENDPOINTS_MAXPACKETSIZE(DATAIN),
|
||||
USBEndpointDescriptor_MAXBULKSIZE_FS),
|
||||
0 /* Must be 0 for full-speed bulk endpoints */
|
||||
}
|
||||
};
|
||||
|
||||
const SIMTraceDriverConfigurationDescriptor *configurationDescriptorsFSarr[] = {
|
||||
&configurationDescriptorsFS1,
|
||||
&configurationDescriptorsFS2
|
||||
};
|
||||
|
||||
const unsigned char someString[] = {
|
||||
USBStringDescriptor_LENGTH(4),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('S'),
|
||||
USBStringDescriptor_UNICODE('O'),
|
||||
USBStringDescriptor_UNICODE('M'),
|
||||
USBStringDescriptor_UNICODE('E'),
|
||||
};
|
||||
|
||||
const unsigned char productStringDescriptor[] = {
|
||||
|
||||
USBStringDescriptor_LENGTH(13),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('S'),
|
||||
USBStringDescriptor_UNICODE('I'),
|
||||
USBStringDescriptor_UNICODE('M'),
|
||||
USBStringDescriptor_UNICODE('T'),
|
||||
USBStringDescriptor_UNICODE('R'),
|
||||
USBStringDescriptor_UNICODE('A'),
|
||||
USBStringDescriptor_UNICODE('C'),
|
||||
USBStringDescriptor_UNICODE('E'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('~')
|
||||
};
|
||||
|
||||
const unsigned char productStringDescriptor2[] = {
|
||||
|
||||
USBStringDescriptor_LENGTH(13),
|
||||
USBGenericDescriptor_STRING,
|
||||
USBStringDescriptor_UNICODE('S'),
|
||||
USBStringDescriptor_UNICODE('I'),
|
||||
USBStringDescriptor_UNICODE('M'),
|
||||
USBStringDescriptor_UNICODE('T'),
|
||||
USBStringDescriptor_UNICODE('R'),
|
||||
USBStringDescriptor_UNICODE('A'),
|
||||
USBStringDescriptor_UNICODE('C'),
|
||||
USBStringDescriptor_UNICODE('E'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('2'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('~'),
|
||||
USBStringDescriptor_UNICODE('~')
|
||||
};
|
||||
|
||||
/** List of string descriptors used by the device */
|
||||
const unsigned char *stringDescriptors[] = {
|
||||
/* FIXME: Is it true that I can't use the string desc #0,
|
||||
* because 0 also stands for "no string desc"?
|
||||
* on the other hand, dmesg output:
|
||||
* "string descriptor 0 malformed (err = -61), defaulting to 0x0409" */
|
||||
0,
|
||||
productStringDescriptor,
|
||||
someString,
|
||||
productStringDescriptor2,
|
||||
};
|
||||
|
||||
const USBDDriverDescriptors driverDescriptors = {
|
||||
|
||||
&deviceDescriptor,
|
||||
(USBConfigurationDescriptor **) &(configurationDescriptorsFSarr), /* full-speed configuration descriptor */
|
||||
0, /* No full-speed device qualifier descriptor */
|
||||
0, /* No full-speed other speed configuration */
|
||||
0, /* No high-speed device descriptor */
|
||||
0, /* No high-speed configuration descriptor */
|
||||
0, /* No high-speed device qualifier descriptor */
|
||||
0, /* No high-speed other speed configuration descriptor */
|
||||
stringDescriptors,
|
||||
4 /* 4 string descriptors in list */
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* \brief Configure 48MHz Clock for USB
|
||||
*/
|
||||
static void _ConfigureUsbClock(void)
|
||||
{
|
||||
/* Enable PLLB for USB */
|
||||
// FIXME: are these the dividers I actually need?
|
||||
// FIXME: I could just use PLLA, since it has a frequ of 48Mhz anyways?
|
||||
PMC->CKGR_PLLBR = CKGR_PLLBR_DIVB(5)
|
||||
| CKGR_PLLBR_MULB(0xc) /* MULT+1=0xd*/
|
||||
| CKGR_PLLBR_PLLBCOUNT_Msk;
|
||||
while((PMC->PMC_SR & PMC_SR_LOCKB) == 0);
|
||||
/* USB Clock uses PLLB */
|
||||
PMC->PMC_USB = PMC_USB_USBDIV(0) /* /1 (no divider) */
|
||||
| PMC_USB_USBS; /* PLLB */
|
||||
}
|
||||
|
||||
|
||||
void SIMtraceDriver_Initialize( void )
|
||||
{
|
||||
// Get std USB driver
|
||||
USBDDriver *pUsbd = USBD_GetDriver();
|
||||
|
||||
TRACE_DEBUG(".");
|
||||
|
||||
// Initialize standard USB driver
|
||||
USBDDriver_Initialize(pUsbd,
|
||||
&driverDescriptors,
|
||||
// FIXME: 2 interface settings supported in MITM mode
|
||||
0); // Multiple interface settings not supported
|
||||
|
||||
USBD_Init();
|
||||
TRACE_DEBUG("%s", "leaving");
|
||||
}
|
||||
|
||||
/*
|
||||
void USBDDriverCallbacks_ConfigurationChanged(unsigned char cfgnum)
|
||||
{
|
||||
printf("Configuration change requested: %c\n\r", cfgnum);
|
||||
}
|
||||
|
||||
void USBDCallbacks_RequestReceived(const USBGenericRequest *request)
|
||||
{
|
||||
printf("RequestHandler called %d\n\r", USBGenericRequest_GetType(request));
|
||||
}
|
||||
*/
|
||||
/*----------------------------------------------------------------------------
|
||||
* Main
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief usb_cdc_serial Application entry point.
|
||||
*
|
||||
* Initializes drivers and start the USB <-> Serial bridge.
|
||||
*/
|
||||
int main(void)
|
||||
{
|
||||
uint8_t isUsbConnected = 0;
|
||||
|
||||
LED_Configure(LED_NUM_GREEN);
|
||||
LED_Set(LED_NUM_GREEN);
|
||||
|
||||
/* Disable watchdog */
|
||||
WDT_Disable( WDT );
|
||||
|
||||
PIO_InitializeInterrupts(0);
|
||||
|
||||
// NVIC_EnableIRQ(UDP_IRQn);
|
||||
|
||||
/* Enable UPLL for USB */
|
||||
// _ConfigureUsbClock();
|
||||
|
||||
/* CDC serial driver initialization */
|
||||
// CDCDSerialDriver_Initialize(&driverDescriptors);
|
||||
SIMtraceDriver_Initialize();
|
||||
// CCIDDriver_Initialize();
|
||||
|
||||
USBD_Connect();
|
||||
|
||||
NVIC_EnableIRQ( UDP_IRQn );
|
||||
|
||||
printf("**** Start");
|
||||
|
||||
while (1) {
|
||||
/* Device is not configured */
|
||||
if (USBD_GetState() < USBD_STATE_CONFIGURED) {
|
||||
|
||||
if (isUsbConnected) {
|
||||
isUsbConnected = 0;
|
||||
// TC_Stop(TC0, 0);
|
||||
}
|
||||
}
|
||||
else if (isUsbConnected == 0) {
|
||||
printf("USB is now configured\n\r");
|
||||
|
||||
isUsbConnected = 1;
|
||||
// TC_Start(TC0, 0);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue