The Smart Card Detective (SCD)
scd_hal.h
Go to the documentation of this file.
00001 
00037 #ifndef _SCD_HAL_H_
00038 #define _SCD_HAL_H_
00039 
00040 
00041 #define ICC_CLK_MODE 0                   // Set to:
00042                                          // 0 for ICC_CLK = 4 MHz
00043                                          // 1 for ICC_CLK = 2 MHz
00044                                          // 2 for ICC_CLK = 1 MHz
00045                                          // 3 for ICC_CLK = 800 KHz
00046                                          // 4 for ICC_CLK = 500 KHz
00047                                          // 5 for external clock - update parameters below as necessary!
00048 #define ETU_TERMINAL 372
00049 #define ETU_HALF(X) ((unsigned int) ((X)/2))
00050 #define ETU_LESS_THAN_HALF(X) ((unsigned int) ((X)*0.46))
00051 #define ETU_EXTENDED(X) ((unsigned int) ((X)*1.075))
00052 #define ICC_VCC_DELAY_US 50   
00053 #define PULL_UP_HIZ_ICC 1                       // Set to 1 to enable pull-ups when setting
00054                                                                         // the I/O-ICC line to Hi-Z
00055 #define F_CPU 16000000UL                // Change this to the correct frequency (generally CLK = CLK_IO)
00056 #define MAX_WAIT_TERMINAL (1 * F_CPU)   // How many cycles to wait for a terminal response
00057 
00058 /* Hardcoded values for ICC clock - selected based on ICC_CLK_MODE above */
00059 #if (ICC_CLK_MODE == 0)
00060 #define ICC_CLK_OCR0A 1                 // F_TIMER0 = CLK_IO / 4
00061 #define ICC_CLK_TCCR1B 0x09             // F_TIMER1 = CLK_IO
00062 #define ETU_ICC 1488                    // 372 * 4
00063 #define ICC_RST_WAIT 50000              // Used for card reset; 50000 * ((CLK_IO / 4) / F_TIMER0)
00064 #elif (ICC_CLK_MODE == 1)
00065 #define ICC_CLK_OCR0A 3                 // F_TIMER0 = CLK_IO / 8
00066 #define ICC_CLK_TCCR1B 0x0A             // F_TIMER1 = CLK_IO / 8
00067 #define ETU_ICC 372                     // 372 * 1
00068 #define ICC_RST_WAIT 100000             // Used for card reset; 50000 * ((CLK_IO / 4) / F_TIMER0)
00069 #elif (ICC_CLK_MODE == 2)
00070 #define ICC_CLK_OCR0A 7                 // F_TIMER0 = CLK_IO / 16
00071 #define ICC_CLK_TCCR1B 0x0A             // F_TIMER1 = CLK_IO / 8
00072 #define ETU_ICC 744                     // 372 * 2
00073 #define ICC_RST_WAIT 200000             // Used for card reset; 50000 * ((CLK_IO / 4) / F_TIMER0)
00074 #elif (ICC_CLK_MODE == 3)
00075 #define ICC_CLK_OCR0A 9                 // F_TIMER0 = CLK_IO / 20
00076 #define ICC_CLK_TCCR1B 0x0A             // F_TIMER1 = CLK_IO / 8
00077 #define ETU_ICC 930                     // 372 * 2.5
00078 #define ICC_RST_WAIT 250000             // Used for card reset; 50000 * ((CLK_IO / 4) / F_TIMER0)
00079 #elif (ICC_CLK_MODE == 4)
00080 #define ICC_CLK_OCR0A 15                // F_TIMER0 = CLK_IO / 32
00081 #define ICC_CLK_TCCR1B 0x0A             // F_TIMER1 = CLK_IO / 8
00082 #define ETU_ICC 1488                    // 372 * 4
00083 #define ICC_RST_WAIT 400000             // Used for card reset; 50000 * ((CLK_IO / 4) / F_TIMER0)
00084 #elif (ICC_CLK_MODE == 5)
00085 #define ICC_CLK_OCR0A 0                 // TIMER 0 not used, F_EXT = 1MHz
00086 #define ICC_CLK_TCCR1B 0x0A             // F_TIMER1 = CLK_IO / 8
00087 #define ETU_ICC 744                     // 372 * 2
00088 #define ICC_RST_WAIT 200000             // Used for card reset; 50000 * ((CLK_IO / 4) / F_TIMER0)
00089 #endif
00090 
00091 /* General SCD functions */
00092 
00094 uint32_t GetCounter();
00095 
00097 void SetCounter();
00098 
00100 void ResetCounter();
00101 
00103 void EnableWDT(uint16_t ms);
00104 
00106 void DisableWDT();
00107 
00109 void ResetWDT();
00110 
00111 
00112 /* SCD to Terminal functions */
00113 
00115 void EnableTerminalResetInterrupt();
00116 
00118 void DisableTerminalResetInterrupt();
00119 
00121 uint16_t GetTerminalFreq();
00122 
00124 uint16_t IsTerminalClock();
00125 
00127 uint8_t GetTerminalIOLine();
00128 
00130 uint8_t GetTerminalResetLine();
00131 
00133 uint8_t WaitTerminalResetIOLow(uint32_t max_wait);
00134 
00136 uint8_t ReadTimerT2();
00137 
00139 void StartTimerT2();
00140 
00142 void StopTimerT2();
00143 
00145 void IncrementCounter();
00146 
00148 uint16_t ReadCounterTerminal();
00149 
00151 void StartCounterTerminal();
00152 
00154 void StopCounterTerminal();
00155 
00157 void PauseCounterTerminal();
00158 
00160 uint8_t SendByteTerminalParity(uint8_t byte, uint8_t inverse_convention);
00161 
00163 void SendByteTerminalNoParity(uint8_t byte, uint8_t inverse_convention);
00164 
00166 uint8_t GetByteTerminalParity(
00167         uint8_t inverse_convention,
00168         uint8_t *r_byte,
00169         uint32_t max_wait);
00170 
00172 uint8_t GetByteTerminalNoParity(
00173         uint8_t inverse_convention,
00174         uint8_t *r_byte,
00175         uint32_t max_wait);
00176 
00178 void LoopTerminalETU(uint8_t nEtus);
00179 
00180 
00183 
00184 uint8_t IsICCInserted();
00185 
00187 uint8_t IsICCPowered();
00188 
00190 uint8_t PowerUpIcc();
00191 
00193 void PowerDownICC();
00194 
00196 void LoopICCETU(uint8_t nEtus);
00197 
00199 uint8_t WaitForICCData(uint32_t max_cycles);
00200 
00202 uint8_t GetByteICCNoParity(uint8_t inverse_convention, uint8_t *r_byte);
00203 
00205 uint8_t GetByteICCParity(uint8_t inverse_convention, uint8_t *r_byte);
00206 
00208 void SendByteICCNoParity(uint8_t byte, uint8_t inverse_convention);
00209 
00211 uint8_t SendByteICCParity(uint8_t byte, uint8_t inverse_convention);
00212 
00214 void SetICCResetLine(uint8_t high);
00215 
00217 uint8_t ActivateICC(uint8_t warm);
00218 
00220 void DeactivateICC();
00221 
00223 void EnableICCInsertInterrupt();
00224 
00226 void DisableICCInsertInterrupt();
00227 
00228 #endif // _SCD_HAL_H_
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines