The Smart Card Detective (SCD)
|
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_