blob: 3cc13116f35586c5a4a76ccbb728e6861608a248 [file] [log] [blame]
Christina Quastdb7b1ab2015-03-03 12:34:36 +01001/* ----------------------------------------------------------------------------
2 * ATMEL Microcontroller Software Support
3 * ----------------------------------------------------------------------------
4 * Copyright (c) 2009, Atmel Corporation
5 *
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * - Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the disclaimer below.
13 *
14 * Atmel's name may not be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * ----------------------------------------------------------------------------
28 */
29
30/*------------------------------------------------------------------------------
31 * Headers
32 *------------------------------------------------------------------------------*/
33
34#include "board.h"
35
36#include <string.h>
37
38/*------------------------------------------------------------------------------
39 * Internal definitions
40 *------------------------------------------------------------------------------*/
41/** Maximum ucSize in bytes of the smartcard answer to a command.*/
42#define MAX_ANSWER_SIZE 10
43
44/** Maximum ATR ucSize in bytes.*/
45#define MAX_ATR_SIZE 55
46
47
48/*------------------------------------------------------------------------------
49 * Internal variables
50 *------------------------------------------------------------------------------*/
51
52/** ISO7816 pins */
53static const Pin pinsISO7816[] = {PINS_ISO7816};
Christina Quast53a76082015-03-04 19:01:34 +010054/** Bus switch pins */
55static const Pin pinsBus[] = {PINS_BUS_DEFAULT};
56/* SIMcard power pin */
57static const Pin pinsPower[] = {PWR_PINS};
Christina Quastdb7b1ab2015-03-03 12:34:36 +010058/** ISO7816 RST pin */
59static const Pin pinIso7816RstMC = PIN_ISO7816_RSTMC;
60static uint8_t sim_inserted = 0;
61
62/*------------------------------------------------------------------------------
63 * Optional smartcard detection
64 *------------------------------------------------------------------------------*/
65
66#ifdef SMARTCARD_CONNECT_PIN
67
68/** Smartcard detection pin.*/
69static const Pin pinSmartCard = SMARTCARD_CONNECT_PIN;
70
71/**
72 * PIO interrupt service routine. Checks if the smartcard has been connected
73 * or disconnected.
74 */
75static void ISR_PioSmartCard( const Pin *pPin )
76{
77/* FIXME: why is pinSmartCard.pio->PIO_ISR the wrong number?
78 printf("+++++ Trying to check for pending interrupts (PIO ISR: 0x%X)\n\r", pinSmartCard.pio->PIO_ISR);
79 printf("+++++ Mask: 0x%X\n\r", pinSmartCard.mask);
80Output:
81 +++++ Trying to check for pending interrupts (PIO ISR: 0x400)) = 1<<10
82 +++++ Mask: 0x100 = 1<<8
83*/
84 // PA10 is DTXD, which is the debug uart transmit pin
85
86 printf("Interrupt!!\n\r");
87 /* Check all pending interrupts */
88 // FIXME: this if condition is not always true...
89// if ( (pinSmartCard.pio->PIO_ISR & pinSmartCard.mask) != 0 )
90 {
91 /* Check current level on pin */
92 if ( PIO_Get( &pinSmartCard ) == 0 )
93 {
94 sim_inserted = 1;
95 printf( "-I- Smartcard inserted\n\r" ) ;
96 CCID_Insertion();
97 }
98 else
99 {
100 sim_inserted = 0;
101 printf( "-I- Smartcard removed\n\r" ) ;
102 CCID_Removal();
103 }
104 }
105}
106
107/**
108 * Configures the smartcard detection pin to trigger an interrupt.
109 */
110static void ConfigureCardDetection( void )
111{
112 printf("+++++ Configure PIOs\n\r");
113 PIO_Configure( &pinSmartCard, 1 ) ;
114 NVIC_EnableIRQ( PIOA_IRQn );
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100115 PIO_EnableIt( &pinSmartCard ) ;
116}
117
118#else
119
120/**
121 * Dummy implementation.
122 */
123static void ConfigureCardDetection( void )
124{
125 printf( "-I- Smartcard detection not supported.\n\r" ) ;
126}
127
128#endif
129
130
131/*-----------------------------------------------------------------------------
132 * Initialization and run
133 *-----------------------------------------------------------------------------*/
Christina Quast53a76082015-03-04 19:01:34 +0100134extern CCIDDriverConfigurationDescriptors configurationDescriptorCCID;
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100135
Christina Quast95d66162015-04-09 22:38:47 +0200136void CCID_configure ( void ) {
137 CCIDDriver_Initialize();
138// FIXME: Do we need to set priority?: NVIC_SetPriority( PIOA_IRQn, 10);
139 PIO_ConfigureIt( &pinSmartCard, ISR_PioSmartCard ) ;
140}
141
142void CCID_exit ( void ) {
143 PIO_DisableIt( &pinSmartCard ) ;
144}
145
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100146void CCID_init( void )
147{
Christina Quast53a76082015-03-04 19:01:34 +0100148 uint8_t pAtr[MAX_ATR_SIZE];
149 uint8_t ucSize ;
150
Christina Quast53a76082015-03-04 19:01:34 +0100151 // FIXME: do we want to print ATR?
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100152 /* Initialize Atr buffer */
153 memset( pAtr, 0, sizeof( pAtr ) ) ;
154
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100155 ConfigureCardDetection() ;
156
Christina Quast53a76082015-03-04 19:01:34 +0100157 // Configure ISO7816 driver
158 PIO_Configure(pinsISO7816, PIO_LISTSIZE(pinsISO7816));
159 PIO_Configure(pinsBus, PIO_LISTSIZE(pinsBus));
160 PIO_Configure(pinsPower, PIO_LISTSIZE(pinsPower));
161
162 /* power up the card */
163// PIO_Set(&pinsPower[0]);
164
165 ISO7816_Init( &pinIso7816RstMC ) ;
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100166
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100167 /* Read ATR */
168 ISO7816_warm_reset() ;
169
170 ISO7816_Datablock_ATR( pAtr, &ucSize ) ;
171
172 /* Decode ATR and print it */
173 ISO7816_Decode_ATR( pAtr ) ;
174
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100175 // FIXME. what if smcard is not inserted?
176 if(PIO_Get(&pinSmartCard) == 0) {
177 printf("SIM card inserted\n\r");
178 CCID_Insertion();
179 }
180}
181
182void CCID_run( void )
183{
Christina Quast53a76082015-03-04 19:01:34 +0100184
185 //if (USBD_Read(INT, pBuffer, dLength, fCallback, pArgument);
186
Christina Quastdb7b1ab2015-03-03 12:34:36 +0100187 CCID_SmartCardRequest();
188}