00001
00037 #ifndef _SCD_HAL_H_
00038 #define _SCD_HAL_H_
00039
00040
00041 #define ICC_CLK_MODE 0 // Set to:
00042
00043
00044
00045
00046
00047
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
00055 #define F_CPU 16000000UL // Change this to the correct frequency (generally CLK = CLK_IO)
00056 #define MAX_WAIT_TERMINAL (30 * F_CPU) // How many cycles to wait for a terminal response
00057
00058
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
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
00113
00115 void EnableTerminalResetInterrupt();
00116
00118 void DisableTerminalResetInterrupt();
00119
00121 uint16_t GetTerminalFreq();
00122
00124 uint8_t GetTerminalIOLine();
00125
00127 uint8_t GetTerminalResetLine();
00128
00130 uint8_t WaitTerminalResetIOLow(uint32_t max_wait);
00131
00133 uint8_t ReadTimerT2();
00134
00136 void StartTimerT2();
00137
00139 void StopTimerT2();
00140
00142 void IncrementCounter();
00143
00145 uint16_t ReadCounterTerminal();
00146
00148 void StartCounterTerminal();
00149
00151 void StopCounterTerminal();
00152
00154 void PauseCounterTerminal();
00155
00157 uint8_t SendByteTerminalParity(uint8_t byte, uint8_t inverse_convention);
00158
00160 void SendByteTerminalNoParity(uint8_t byte, uint8_t inverse_convention);
00161
00163 uint8_t GetByteTerminalParity(
00164 uint8_t inverse_convention,
00165 uint8_t *r_byte,
00166 uint32_t max_wait);
00167
00169 uint8_t GetByteTerminalNoParity(
00170 uint8_t inverse_convention,
00171 uint8_t *r_byte,
00172 uint32_t max_wait);
00173
00175 void LoopTerminalETU(uint8_t nEtus);
00176
00177
00180
00181 uint8_t IsICCInserted();
00182
00184 uint8_t IsICCPowered();
00185
00187 uint8_t PowerUpIcc();
00188
00190 void PowerDownICC();
00191
00193 void LoopICCETU(uint8_t nEtus);
00194
00196 uint8_t WaitForICCData(uint32_t max_cycles);
00197
00199 uint8_t GetByteICCNoParity(uint8_t inverse_convention, uint8_t *r_byte);
00200
00202 uint8_t GetByteICCParity(uint8_t inverse_convention, uint8_t *r_byte);
00203
00205 void SendByteICCNoParity(uint8_t byte, uint8_t inverse_convention);
00206
00208 uint8_t SendByteICCParity(uint8_t byte, uint8_t inverse_convention);
00209
00211 void SetICCResetLine(uint8_t high);
00212
00214 uint8_t ActivateICC(uint8_t warm);
00215
00217 void DeactivateICC();
00218
00220 void EnableICCInsertInterrupt();
00221
00223 void DisableICCInsertInterrupt();
00224
00225 #endif // _SCD_HAL_H_