1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11 /**************************************************************************/
12 /**************************************************************************/
13 /** */
14 /** USBX Component */
15 /** */
16 /** Device CCID Class */
17 /** */
18 /**************************************************************************/
19 /**************************************************************************/
20
21 /**************************************************************************/
22 /* */
23 /* COMPONENT DEFINITION RELEASE */
24 /* */
25 /* ux_device_class_ccid.h PORTABLE C */
26 /* 6.3.0 */
27 /* AUTHOR */
28 /* */
29 /* Chaoqiong Xiao, Microsoft Corporation */
30 /* */
31 /* DESCRIPTION */
32 /* */
33 /* This file defines the equivalences for the USBX Device Class CCID */
34 /* (Smart-Card Integrated Circuit(s) Card) component. */
35 /* */
36 /* RELEASE HISTORY */
37 /* */
38 /* DATE NAME DESCRIPTION */
39 /* */
40 /* 04-25-2022 Chaoqiong Xiao Initial Version 6.1.11 */
41 /* 03-08-2023 Chaoqiong Xiao Modified comment(s), */
42 /* added standalone support, */
43 /* resulting in version 6.2.1 */
44 /* 10-31-2023 Yajun xia, CQ Xiao Modified comment(s), */
45 /* added error checks support, */
46 /* resulting in version 6.3.0 */
47 /* */
48 /**************************************************************************/
49
50 #ifndef UX_DEVICE_CLASS_CCID_H
51 #define UX_DEVICE_CLASS_CCID_H
52
53 /* Determine if a C++ compiler is being used. If so, ensure that standard
54 C is used to process the API information. */
55
56 #ifdef __cplusplus
57
58 /* Yes, C++ compiler is present. Use standard C. */
59 extern "C" {
60 #endif
61
62 /* Internal option: enable the basic USBX error checking. This define is typically used
63 while debugging application. */
64 #if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_CCID_ENABLE_ERROR_CHECKING)
65 #define UX_DEVICE_CLASS_CCID_ENABLE_ERROR_CHECKING
66 #endif
67
68
69 /* Notification/interrupt endpoint buffer size, must be larger than max packet size in framework, and aligned in 4-bytes. */
70 #define UX_DEVICE_CLASS_CCID_INTERRUPT_BUFFER_SIZE 16
71
72 /* Bulk endpoints buffer size, must be larger than dwMaxCCIDMessageLength and wMaxPacketSize in framework, and aligned in 4-bytes. */
73 #define UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE UX_SLAVE_REQUEST_DATA_MAX_LENGTH
74
75
76 #if !defined(UX_DEVICE_STANDALONE)
77
78 /* Define CCID max number of slots, 32 for 32 bit data width. */
79 #define UX_DEVICE_CLASS_CCID_MAX_N_SLOTS (4*8)
80 #else
81
82 /* To optimize the max number of slots fixed to 1. */
83 #define UX_DEVICE_CLASS_CCID_MAX_N_SLOTS 1
84 #endif
85
86 /* Thread stack size, for RTOS mode only. */
87 #define UX_DEVICE_CLASS_CCID_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
88 #define UX_DEVICE_CLASS_CCID_NOTIFY_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
89 #define UX_DEVICE_CLASS_CCID_RUNNER_THREAD_STACK_SIZE UX_THREAD_STACK_SIZE
90
91 /* Define CCID Class USB Class constants. */
92 #define UX_DEVICE_CLASS_CCID_CLASS 0x0B
93
94 #define UX_DEVICE_CLASS_CCID_SUBCLASS 0
95
96 #define UX_DEVICE_CLASS_CCID_PROTOCOL 0
97
98 #define UX_DEVICE_CLASS_CCID_BCD_CCID_1_10 0x0110
99
100 #define UX_DEVICE_CLASS_CCID_VOLTAGE_SUPPORT_5_0 1u
101 #define UX_DEVICE_CLASS_CCID_VOLTAGE_SUPPORT_3_0 2u
102 #define UX_DEVICE_CLASS_CCID_VOLTAGE_SUPPORT_1_8 4u
103
104 #define UX_DEVICE_CLASS_CCID_PROTOCOLS_T0 1u
105 #define UX_DEVICE_CLASS_CCID_PROTOCOLS_T1 2u
106
107 #define UX_DEVICE_CLASS_CCID_SYNCH_PROTOCOLS_2_WIRE 1u
108 #define UX_DEVICE_CLASS_CCID_SYNCH_PROTOCOLS_3_WIRE 2u
109 #define UX_DEVICE_CLASS_CCID_SYNCH_PROTOCOLS_I2C 4u
110
111 #define UX_DEVICE_CLASS_CCID_MECHANICAL_NO_SPECIAL 0u
112 #define UX_DEVICE_CLASS_CCID_MECHANICAL_ACCEPT 1u
113 #define UX_DEVICE_CLASS_CCID_MECHANICAL_EJECT 2u
114 #define UX_DEVICE_CLASS_CCID_MECHANICAL_CAPTURE 4u
115 #define UX_DEVICE_CLASS_CCID_MECHANICAL_LOCK_UNLOCK 8u
116
117 #define UX_DEVICE_CLASS_CCID_FEATURES_NO_SPECIAL 0u
118 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_PARAMETER_ATR 2u
119 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_ACTIVATION 4u
120 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_VOLTAGE 8u
121 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_CLOCK_FREQUENCY 0x10u
122 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_BAUD_RATE 0x20u
123 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_PARAMETER_NEGOTIATION 0x40u
124 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_PPS 0x80u
125 #define UX_DEVICE_CLASS_CCID_FEATURES_CAN_SET_ICC_IN_CLOCK_STOP 0x100u
126 #define UX_DEVICE_CLASS_CCID_FEATURES_NAD_NOT_0_ACCEPTED 0x200u
127 #define UX_DEVICE_CLASS_CCID_FEATURES_AUTO_IFSD_EXCHANGE_1ST 0x400u
128 #define UX_DEVICE_CLASS_CCID_FEATURES_TPUD_EXCHANGES 0x10000u
129 #define UX_DEVICE_CLASS_CCID_FEATURES_SHORT_APUD_EXCHANGES 0x20000u
130 #define UX_DEVICE_CLASS_CCID_FEATURES_SHORT_AND_EXTENDED_APUD_EXCHANGES 0x40000u
131 #define UX_DEVICE_CLASS_CCID_FEATURES_WAKEUP_ON_INSERTION_REMOVAL 0x100000u
132
133 #define UX_DEVICE_CLASS_CCID_LCD_LAYOUT_NO_LCD 0
134 #define UX_DEVICE_CLASS_CCID_LCD_LAYOUT(n_lines,n_per_line) (((n_lines) << 8) | (n_per_line))
135
136 #define UX_DEVICE_CLASS_CCID_PIN_SUPPORT_VERIFICATION 1u
137 #define UX_DEVICE_CLASS_CCID_PIN_SUPPORT_MODIFICATION 2u
138
139 #define UX_DEVICE_CLASS_CCID_MAX_CCID_MESSAGE_EXT_APDU_MIN (261+10)
140 #define UX_DEVICE_CLASS_CCID_MAX_CCID_MESSAGE_EXT_APDU_MAX (65544+10)
141
142
143 /* Device CCID Requests */
144 #define UX_DEVICE_CLASS_CCID_ABORT 0x01
145 #define UX_DEVICE_CLASS_CCID_GET_CLOCK_FREQUENCIES 0x02
146 #define UX_DEVICE_CLASS_CCID_GET_DATA_RATES 0x03
147
148
149 /* CCID message offsets, values. */
150
151 /* General. */
152 #define UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_LENGTH 10
153
154 #define UX_DEVICE_CLASS_CCID_OFFSET_MESSAGE_TYPE 0
155 #define UX_DEVICE_CLASS_CCID_OFFSET_LENGTH 1
156 #define UX_DEVICE_CLASS_CCID_OFFSET_SLOT 5
157 #define UX_DEVICE_CLASS_CCID_OFFSET_SEQ 6
158
159 #define UX_DEVICE_CLASS_CCID_OFFSET_DATA 10
160
161 /* PC_to_RDR_IccPowerOn. */
162 #define UX_DEVICE_CLASS_CCID_OFFSET_POWER_SELECT 7
163 #define UX_DEVICE_CLASS_CCID_POWER_SELECT_AUTO 0
164 #define UX_DEVICE_CLASS_CCID_POWER_SELECT_5_0_V 1
165 #define UX_DEVICE_CLASS_CCID_POWER_SELECT_3_0_V 2
166 #define UX_DEVICE_CLASS_CCID_POWER_SELECT_1_8_V 3
167
168 /* PC_to_RDR_XfrBlock/PC_to_RDR_Secure. */
169 #define UX_DEVICE_CLASS_CCID_OFFSET_BWI 7
170 #define UX_DEVICE_CLASS_CCID_OFFSET_LEVEL_PARAMETER 8
171 #define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_RFU 0x00u
172 #define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_BEGIN_END 0x00u
173 #define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_BEGIN_CONTINUE 0x01u
174 #define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_CONTINUE_END 0x02u
175 #define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_CONTINUE 0x03u
176 #define UX_DEVICE_CLASS_CCID_LEVEL_PARAMETER_EMPTY_DATA 0x10u
177
178 /* PC_to_RDR_SetParameters. */
179 #define UX_DEVICE_CLASS_CCID_OFFSET_SET_PARAMETERS_PROTOCOL_NUM 7
180
181 #define UX_DEVICE_CLASS_CCID_PROTOCOL_T_0 0
182 #define UX_DEVICE_CLASS_CCID_PROTOCOL_T_1 1
183 #define UX_DEVICE_CLASS_CCID_PROTOCOL_2_WIRE 0x80
184 #define UX_DEVICE_CLASS_CCID_PROTOCOL_3_WIRE 0x81
185 #define UX_DEVICE_CLASS_CCID_PROTOCOL_I2C 0x82
186
187 /* Parameters. */
188 #define UX_DEVICE_CLASS_CCID_OFFSET_FI_DI 10
189
190 #define UX_DEVICE_CLASS_CCID_OFFSET_TCCKS_T0 11
191 #define UX_DEVICE_CLASS_CCID_OFFSET_GUARD_TIME_T0 12
192 #define UX_DEVICE_CLASS_CCID_OFFSET_WAITING_INTEGER_T0 13
193 #define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_STOP_T0 14
194
195 #define UX_DEVICE_CLASS_CCID_OFFSET_TCCKS_T1 11
196 #define UX_DEVICE_CLASS_CCID_OFFSET_GUARD_TIME_T1 12
197 #define UX_DEVICE_CLASS_CCID_OFFSET_WAITING_INTEGERS_T1 13
198 #define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_STOP_T1 14
199 #define UX_DEVICE_CLASS_CCID_OFFSET_IFSC 15
200 #define UX_DEVICE_CLASS_CCID_OFFSET_NAD_VALUE 16
201
202 /* PC_to_RDR_IccClock. */
203 #define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_COMMAND 7
204 #define UX_DEVICE_CLASS_CCID_CLOCK_COMMAND_RESTART 0
205 #define UX_DEVICE_CLASS_CCID_CLOCK_COMMAND_STOP 1
206
207 /* PC_to_RDR_T0APDU. */
208 #define UX_DEVICE_CLASS_CCID_OFFSET_CHANGES 7
209 #define UX_DEVICE_CLASS_CCID_OFFSET_CLASS_GET_RESPONSE 8
210 #define UX_DEVICE_CLASS_CCID_OFFSET_CLASS_ENVELOPE 9
211 #define UX_DEVICE_CLASS_CCID_CHANGE_CLASS_GET_RESPONSE (1u << 0)
212 #define UX_DEVICE_CLASS_CCID_CHANGE_CLASS_ENVELOPE (1u << 1)
213
214 /* PC_to_RDR_Secure. */
215 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_OPERATION 10
216 #define UX_DEVICE_CLASS_CCID_PIN_VERIFICATION 0
217 #define UX_DEVICE_CLASS_CCID_PIN_MODIFICATION 1
218 #define UX_DEVICE_CLASS_CCID_PIN_TRANSFER 2
219 #define UX_DEVICE_CLASS_CCID_PIN_WAIT_ICC_RESP 3
220 #define UX_DEVICE_CLASS_CCID_PIN_CANCEL 4
221 #define UX_DEVICE_CLASS_CCID_PIN_RESEND_I_BLOCK 5
222 #define UX_DEVICE_CLASS_CCID_PIN_NEXT_APDU 6
223
224 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_DATA 11
225
226 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_TIME_OUT 11
227 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_FORMAT_STRING 12
228
229 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_FORMAT_TYPE_MASK (0x3u << 0)
230 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_BINARY (0x0u << 0)
231 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_BCD (0x1u << 0)
232 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_ASCII (0x2u << 0)
233 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_JUSTIFICATION (0x1u << 2)
234 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_LEFT_JUSTIFY (0x0u << 2)
235 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_RIGHT_JUSTIFY (0x1u << 2)
236 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_POSITION_MASK (0xFu << 3)
237 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_POSITION(v) (((v) >> 3) & 0xFu)
238 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_UNIT_TYPE (0x1u << 7)
239 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_UNIT_BITS (0x0u << 7)
240 #define UX_DEVICE_CLASS_CCID_FORMAT_STRING_UNIT_BYTES (0x1u << 7)
241
242 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_PIN_BLOCK_STRING 13
243 #define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_LENGTH_BITS_MASK (0xFu << 3)
244 #define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_BLOCK_SIZE_BYTES_MASK (0xFu << 0)
245 #define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_LENGTH_BITS(v) ((v) >> 4) & 0xFu)
246 #define UX_DEVICE_CLASS_CCID_PIN_BLOCK_STRING_PIN_BLOCK_SIZE_BYTES(v) ((v) >> 0) & 0xFu)
247
248 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_PIN_LENGTH_FORMAT 14
249 #define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_UNIT_TYPE (1u << 4)
250 #define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_UNIT_BITS (0u << 4)
251 #define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_UNIT_BYTES (1u << 4)
252 #define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_POSITION_MASK (0xFu << 0)
253 #define UX_DEVICE_CLASS_CCID_PIN_LENGTH_FORMAT_POSITION(v) (((v) << 0) & 0xFu)
254
255 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_TIME_OUT 11
256 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_FORMAT_STRING 12
257 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_BLOCK_STRING 13
258 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_LENGTH_FORMAT 14
259
260 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_MAX_EXTRA_DIGIT 15
261 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_MAX_EXTRA_DIGIT_MIN 16
262 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_MAX_EXTRA_DIGIT_MAX 15
263
264 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_ENTRY_VALIDATION_CONDITION 17
265 #define UX_DEVICE_CLASS_CCID_PIN_ENTRY_VALIDATION_MAX_SIZE 1u
266 #define UX_DEVICE_CLASS_CCID_PIN_ENTRY_VALIDATION_KEY_PRESS 2u
267 #define UX_DEVICE_CLASS_CCID_PIN_ENTRY_VALIDATION_TIMEOUT 4u
268
269 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_NUMBER_MESSAGE 18
270 #define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_NO 0
271 #define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_1 0
272 #define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_2 0
273 #define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_3 0
274 #define UX_DEVICE_CLASS_CCID_PIN_NUMBER_MESSAGE_DEFAULT 0xFF
275
276 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_LANG_ID 19
277 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_MSG_INDEX 21
278 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_TEO_PROLOGUE 22
279 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_VERIFI_PIN_APDU 25
280
281 #define UX_DEVICE_CLASS_CCID_PIN_MESSAGE_INSERT_PROMPT 0
282 #define UX_DEVICE_CLASS_CCID_PIN_MESSAGE_MODIFY_PROMPT 1
283 #define UX_DEVICE_CLASS_CCID_PIN_MESSAGE_NEW_CONFIRM_PROMPT 2
284
285 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TIME_OUT 11
286 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_FORMAT_STRING 12
287 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_BLOCK_STRING 13
288 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_LENGTH_FORMAT 14
289
290 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_INSERTION_OFFSET_OLD 15
291 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_INSERTION_OFFSET_NEW 16
292
293 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_MAX_EXTRA_DIGIT 17
294 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_MAX_EXTRA_DIGIT_MIN 18
295 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_MAX_EXTRA_DIGIT_MAX 17
296
297 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_CONFIRM_PIN 19
298 #define UX_DEVICE_CLASS_CCID_CONFIRM_PIN_CONFIRM_REQUESTED (1u << 0)
299 #define UX_DEVICE_CLASS_CCID_CONFIRM_PIN_ENTRY_REQUESTED (1u << 1)
300
301 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_ENTRY_VALIDATION_CONDITION 20
302 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_NUMBER_MESSAGE 21
303 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_LANG_ID 22
304 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_MSG_INDEX1 24
305 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_MSG_INDEX2 25
306 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_MSG_INDEX3 26
307 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TEO_PROLOGUE1 25
308 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TEO_PROLOGUE2 26
309 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_TEO_PROLOGUE3 27
310 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_APDU1 28
311 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_APDU2 29
312 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_MODIFI_PIN_APDU3 30
313
314 #define UX_DEVICE_CLASS_CCID_OFFSET_PIN_NEXT_APDU_TEO_PROLOGUE 11
315
316 /* PC_to_RDR_Mechanical. */
317 #define UX_DEVICE_CLASS_CCID_OFFSET_FUNCTION 7
318 #define UX_DEVICE_CLASS_CCID_FUNCTION_ACCEPT_CARD 0x01
319 #define UX_DEVICE_CLASS_CCID_FUNCTION_EJECT_CARD 0x02
320 #define UX_DEVICE_CLASS_CCID_FUNCTION_CAPTURE_CARD 0x03
321 #define UX_DEVICE_CLASS_CCID_FUNCTION_LOCK_CARD 0x04
322 #define UX_DEVICE_CLASS_CCID_FUNCTION_UNLOCK_CARD 0x05
323
324 /* PC_to_RDR_SetDataRateAndClockFrequency/RDR_to_PC_DataRateAndClockFrequency. */
325 #define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_FREQUENCY 10
326 #define UX_DEVICE_CLASS_CCID_OFFSET_DATA_RATE 14
327
328 /* RDR_to_PC_ */
329 #define UX_DEVICE_CLASS_CCID_OFFSET_STATUS 7
330 #define UX_DEVICE_CLASS_CCID_OFFSET_ERROR 8
331
332 /* RDR_to_PC_DataBlock. */
333 #define UX_DEVICE_CLASS_CCID_OFFSET_CHAIN_PARAMETER 9
334 #define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_BEGIN_END 0x00
335 #define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_BEGIN_CONTINUE 0x01
336 #define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_CONTINUE_END 0x02
337 #define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_CONTINUE 0x03
338 #define UX_DEVICE_CLASS_CCID_CHAIN_PARAMETER_EMPTY 0x10
339
340 /* RDR_to_PC_SlotStatus. */
341 #define UX_DEVICE_CLASS_CCID_OFFSET_CLOCK_STATUS 9
342
343 /* RDR_to_PC_Parameters. */
344 #define UX_DEVICE_CLASS_CCID_OFFSET_PARAMETERS_PROTOCOL_NUM 9
345
346 #define UX_DEVICE_CLASS_CCID_PARAMETERS_T0_LENGTH 5
347 #define UX_DEVICE_CLASS_CCID_PARAMETERS_T1_LENGTH 7
348
349 /* RDR_to_PC_NotifySlotChange. */
350 #define UX_DEVICE_CLASS_CCID_OFFSET_SLOT_ICC_STATE 1
351
352 /* RDR_to_PC_HardwareError. */
353 #define UX_DEVICE_CLASS_CCID_OFFSET_HW_ERROR_SLOT 1
354 #define UX_DEVICE_CLASS_CCID_OFFSET_HW_ERROR_SEQ 2
355 #define UX_DEVICE_CLASS_CCID_OFFSET_HW_ERROR_CODE 3
356 #define UX_DEVICE_CLASS_CCID_HW_ERROR_OVERCURRENT 1
357
358
359 /* CCID bMessageTypes. */
360 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON 0x62
361 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_OFF 0x63
362 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_SLOT_STATUS 0x64
363 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK 0x6F
364 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_PARAMETERS 0x6C
365 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_RESET_PARAMETERS 0x6D
366 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS 0x61
367 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ESCAPE 0x6B
368 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK 0x6E
369 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU 0x6A
370 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE 0x69
371 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL 0x71
372 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_ABORT 0x72
373 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQ 0x73
374
375 #define UX_DEVICE_CLASS_CCID_N_COMMANDS 14
376
377 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK 0x80
378 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS 0x81
379 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS 0x82
380 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_ESCAPE 0x83
381 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQ 0x84
382
383 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_NOTIFY_SLOT_CHANGE 0x50
384 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_HARDWARE_ERROR 0x51
385
386 #define UX_DEVICE_CLASS_CCID_COMMAND_ABORTABLE(bMessageType) \
387 (((bMessageType) == 0x62) || ((bMessageType) == 0x6F) || \
388 ((bMessageType) == 0x6B) || ((bMessageType) == 0x69) || \
389 ((bMessageType) == 0x71) || ((bMessageType) == 0x72))
390
391 #define UX_DEVICE_CLASS_CCID_COMMAND_HW_ERROR_CHECK(bMessageType) \
392 (((bMessageType) != 0x63) && ((bMessageType) != 0x6B) && \
393 ((bMessageType) != 0x6A) && ((bMessageType) != 0x72) && \
394 ((bMessageType) != 0x73))
395
396 #define UX_DEVICE_CLASS_CCID_COMMAND_AUTO_SEQUENCE_CHECK(bMessageType) \
397 (((bMessageType) != 0x62) && ((bMessageType) != 0x65) && \
398 ((bMessageType) != 0x6B) && ((bMessageType) != 0x6A) && \
399 ((bMessageType) != 0x72) && ((bMessageType) != 0x73))
400
401 #define UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_BLOCK(m) \
402 ((m) == 0x62 || (m) == 0x6F || (m) == 0x69)
403 #define UX_DEVICE_CLASS_CCID_COMMAND_RESP_SLOT_STATUS(m) \
404 ((m) == 0x63 || (m) == 0x64 || (m) == 0x6E || (m) == 0x6A || \
405 (m) == 0x71 || (m) == 0x72 || (m) == 0x65)
406 #define UX_DEVICE_CLASS_CCID_COMMAND_RESP_PARAMETERS(m) \
407 ((m) == 0x6C || (m) == 0x6D || (m) == 0x61)
408 #define UX_DEVICE_CLASS_CCID_COMMAND_RESP_ESCAPE(m) \
409 ((m) == 0x6B)
410 #define UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_RATE_AND_CLOCK_FREQ(m) \
411 ((m) == 0x73)
412
413 #define UX_DEVICE_CLASS_CCID_COMMAND_RESP_TYPE(m) \
414 (UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_BLOCK(m) ? 0x80 : \
415 UX_DEVICE_CLASS_CCID_COMMAND_RESP_SLOT_STATUS(m) ? 0x81 : \
416 UX_DEVICE_CLASS_CCID_COMMAND_RESP_PARAMETERS(m) ? 0x82 : \
417 UX_DEVICE_CLASS_CCID_COMMAND_RESP_ESCAPE(m) ? 0x83 : \
418 UX_DEVICE_CLASS_CCID_COMMAND_RESP_DATA_RATE_AND_CLOCK_FREQ(m) ? 0x84 : \
419 0)
420
421 /* CCID Slot error binary code. */
422 #define UX_DEVICE_CLASS_CCID_CMD_ABORTED 0xFF
423 #define UX_DEVICE_CLASS_CCID_ICC_MUTE 0xFE
424 #define UX_DEVICE_CLASS_CCID_XFR_PARITY_ERROR 0xFD
425 #define UX_DEVICE_CLASS_CCID_XFR_OVERRUN 0xFC
426 #define UX_DEVICE_CLASS_CCID_HW_ERROR 0xFB
427 #define UX_DEVICE_CLASS_CCID_BAD_ATR_TS 0xF8
428 #define UX_DEVICE_CLASS_CCID_BAD_ATR_TCK 0xF7
429 #define UX_DEVICE_CLASS_CCID_ICC_PROTOCOL_NOT_SUPPORTED 0xF6
430 #define UX_DEVICE_CLASS_CCID_ICC_CLASS_NOT_SUPPORTED 0xF5
431 #define UX_DEVICE_CLASS_CCID_PROCEDURE_BYTE_CONFLICT 0xF4
432 #define UX_DEVICE_CLASS_CCID_DEACTIVATED_PROTOCOL 0xF3
433 #define UX_DEVICE_CLASS_CCID_BUSY_WITH_AUTO_SEQUENCE 0xF2
434 #define UX_DEVICE_CLASS_CCID_PIN_TIMEOUT 0xF0
435 #define UX_DEVICE_CLASS_CCID_PIN_CANCELLED 0xEF
436 #define UX_DEVICE_CLASS_CCID_CMD_SLOT_BUSY 0xE0
437
438
439 /* CCID bStatus. */
440 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_TIME_EXTENSION 0x80
441
442 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_ACTIVE (0x0u)
443 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_INACTIVE (0x1u)
444 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_NOT_PRESENT (0x2u)
445 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_ICC_MASK (0x3u)
446
447 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_NO_ERROR (0x0u << 6)
448 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_FAILED (0x1u << 6)
449 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_TIME_EXTENSION (0x2u << 6)
450 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS_CMD_MASK (0x3u << 6)
451
452 #define UX_DEVICE_CLASS_CCID_SLOT_STATUS(bmICCStatus, bmCommandStatus) ((bmICCStatus) | ((bmCommandStatus) << 6))
453 #define UX_DEVICE_CLASS_CCID_ICC_ACTIVE 0
454 #define UX_DEVICE_CLASS_CCID_ICC_INACTIVE 1
455 #define UX_DEVICE_CLASS_CCID_ICC_NOT_PRESENT 2
456 #define UX_DEVICE_CLASS_CCID_CMD_NO_ERROR 0
457 #define UX_DEVICE_CLASS_CCID_CMD_FAILED 1
458 #define UX_DEVICE_CLASS_CCID_CMD_TIME_EXTENSION 2
459
460
461 /* CCID events. */
462 #define UX_DEVICE_CLASS_CCID_EVENT_SLOT(n) (1u<<(n))
463
464
465 /* CCID flags. */
466 #define UX_DEVICE_CLASS_CCID_FLAG_ABORTABLE 0x80u
467 #define UX_DEVICE_CLASS_CCID_FLAG_BUSY 0x40u
468
469 #define UX_DEVICE_CLASS_CCID_FLAG_NOTIFY_CHANGE 0x01u
470 #define UX_DEVICE_CLASS_CCID_FLAG_NOTIFY_HW_ERROR 0x02u
471
472 #define UX_DEVICE_CLASS_CCID_FLAG_AUTO_SEQUENCING 0x04u
473 #define UX_DEVICE_CLASS_CCID_FLAG_HW_ERROR 0x08u
474
475
476 #define UX_DEVICE_CLASS_CCID_COMMAND_FLAG_ABORTABLE(bMessageType) \
477 (UX_DEVICE_CLASS_CCID_COMMAND_ABORTABLE(bMessageType) ? \
478 UX_DEVICE_CLASS_CCID_FLAG_ABORTABLE : 0)
479
480 #define UX_DEVICE_CLASS_CCID_COMMAND_FLAG_AUTO_SEQUENCE_CHECK(bMessageType) \
481 (UX_DEVICE_CLASS_CCID_COMMAND_AUTO_SEQUENCE_CHECK(bMessageType) ? \
482 UX_DEVICE_CLASS_CCID_FLAG_AUTO_SEQUENCING : 0)
483
484 #define UX_DEVICE_CLASS_CCID_COMMAND_FLAG_HW_ERROR_CHECK(bMessageType) \
485 (UX_DEVICE_CLASS_CCID_COMMAND_HW_ERROR_CHECK(bMessageType) ? \
486 UX_DEVICE_CLASS_CCID_FLAG_HW_ERROR : 0)
487
488 #define UX_DEVICE_CLASS_CCID_COMMAND_FLAGS(bMessageType) \
489 (UX_DEVICE_CLASS_CCID_COMMAND_FLAG_ABORTABLE(bMessageType) | \
490 UX_DEVICE_CLASS_CCID_COMMAND_FLAG_AUTO_SEQUENCE_CHECK(bMessageType) | \
491 UX_DEVICE_CLASS_CCID_COMMAND_FLAG_HW_ERROR_CHECK(bMessageType))
492
493
494 /* CCID message structures. */
495
496 /* General message for both PC_to_RDR and RDR_to_PC. */
497 typedef struct UX_DEVICE_CLASS_CCID_MESSAGES_STRUCT
498 {
499 UCHAR *ux_device_class_ccid_messages_pc_to_rdr;
500 UCHAR *ux_device_class_ccid_messages_rdr_to_pc;
501 ULONG ux_device_class_ccid_messages_rdr_to_pc_length; /* Total buffer length including header. */
502 } UX_DEVICE_CLASS_CCID_MESSAGES;
503
504 /* Define CCID message header. */
505 typedef struct UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_STRUCT
506 {
507 UCHAR bMessageType;
508 UCHAR dwLength[4];
509 UCHAR bSlot;
510 UCHAR bSeq;
511 UCHAR bRFU[3];
512 } UX_DEVICE_CLASS_CCID_MESSAGE_HEADER;
513 #define UX_DEVICE_CLASS_CCID_MESSAGE_TYPE(msg) (((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->bMessageType)
514 #define UX_DEVICE_CLASS_CCID_MESSAGE_LENGTH_GET(msg) _ux_utility_long_get(((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->dwLength)
515 #define UX_DEVICE_CLASS_CCID_MESSAGE_LENGTH_SET(msg,len) _ux_utility_long_put(((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->dwLength, (len))
516 #define UX_DEVICE_CLASS_CCID_MESSAGE_SLOT(msg) (((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->bSlot)
517 #define UX_DEVICE_CLASS_CCID_MESSAGE_SEQ(msg) (((UX_DEVICE_CLASS_CCID_MESSAGE_HEADER*)(msg))->bSeq)
518 #define UX_DEVICE_CLASS_CCID_MESSAGE_DATA(msg) (((UCHAR *)(msg) + UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_LENGTH))
519
520 /* Define CCID PC_to_RDR_IccPowerOn. */
521 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON_HEADER_STRUCT
522 {
523 UCHAR bMessageType;
524 UCHAR dwLength[4];
525 UCHAR bSlot;
526 UCHAR bSeq;
527 UCHAR bPowerSelect;
528 UCHAR bRFU[2];
529 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON_HEADER;
530 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_POWER_SELECT(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_ON_HEADER*)(msg))->bPowerSelect)
531
532 /* Define CCID PC_to_RDR_IccPowerOff. */
533 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_POWER_OFF_HEADER;
534
535 /* Define CCID PC_to_RDR_GetSlotStatus. */
536 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_SLOT_STATUS_HEADER;
537
538 /* Define CCID PC_to_RDR_XfrBlock. */
539 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER_STRUCT
540 {
541 UCHAR bMessageType;
542 UCHAR dwLength[4];
543 UCHAR bSlot;
544 UCHAR bSeq;
545 UCHAR bBWI;
546 USHORT wLevelParameter;
547 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER;
548 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_BWI(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER*)(msg))->bBWI)
549 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_LEVEL_PARAMETER(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER*)(msg))->wLevelParameter)
550
551 /* Define CCID PC_to_RDR_GetParameters. */
552 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_GET_PARAMETERS_HEADER;
553
554 /* Define CCID PC_to_RDR_ResetParameters. */
555 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_RESET_PARAMETERS_HEADER;
556
557 /* Define CCID PC_to_RDR_SetParameters. */
558 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_HEADER_STRUCT
559 {
560 UCHAR bMessageType;
561 UCHAR dwLength[4];
562 UCHAR bSlot;
563 UCHAR bSeq;
564 UCHAR bProtocolNum;
565 UCHAR bRFU[2];
566 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_HEADER;
567 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PROTOCOL_NUM(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_HEADER*)(msg))->bProtocolNum)
568 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T0_STRUCT
569 {
570 UCHAR bMessageType;
571 UCHAR dwLength[4];
572 UCHAR bSlot;
573 UCHAR bSeq;
574 UCHAR bProtocolNum;
575 UCHAR bRFU[2];
576 UCHAR bmFindexDindex;
577 UCHAR bmTCCKST0;
578 UCHAR bGuardTimeT0;
579 UCHAR bWaitingIntegerT0;
580 UCHAR bClockStop;
581 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T0;
582 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T0_LENGTH 5
583 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T1_STRUCT
584 {
585 UCHAR bMessageType;
586 UCHAR dwLength[4];
587 UCHAR bSlot;
588 UCHAR bSeq;
589 UCHAR bProtocolNum;
590 UCHAR bRFU[2];
591 UCHAR bmFindexDindex;
592 UCHAR bmTCCKST1;
593 UCHAR bGuardTimeT1;
594 UCHAR bmWaitingIntegersT1;
595 UCHAR bClockStop;
596 UCHAR bIFSC;
597 UCHAR bNadValue;
598 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T1;
599 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_PARAMETERS_T1_LENGTH 7
600
601 /* Define CCID PC_to_RDR_Escape. */
602 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_ESCAPE_HEADER;
603
604 /* Define CCID PC_to_RDR_IccClock. */
605 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK_HEADER_STRUCT
606 {
607 UCHAR bMessageType;
608 UCHAR dwLength[4];
609 UCHAR bSlot;
610 UCHAR bSeq;
611 UCHAR bClockCommand;
612 UCHAR bRFU[2];
613 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK_HEADER;
614 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_CLOCK_COMMAND(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_ICC_CLOCK_HEADER*)(msg))->bClockCommand)
615
616 /* Define CCID PC_to_RDR_T0APDU. */
617 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER_STRUCT
618 {
619 UCHAR bMessageType;
620 UCHAR dwLength[4];
621 UCHAR bSlot;
622 UCHAR bSeq;
623 UCHAR bmChanges;
624 UCHAR bClassGetResponse;
625 UCHAR bClassEnvelope;
626 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER;
627 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_CHANGES(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER*)(msg))->bmChanges)
628 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_CLASS_GET_RESP(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER*)(msg))->bClassGetResponse)
629 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_CLASS_ENVELOPE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_T0_APDU_HEADER*)(msg))->bClassEnvelope)
630
631 /* Define CCID PC_to_RDR_Secure. */
632 typedef UX_DEVICE_CLASS_CCID_PC_TO_RDR_XFR_BLOCK_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_HEADER;
633
634 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER_STRUCT
635 {
636 UCHAR bMessageType;
637 UCHAR dwLength[4];
638 UCHAR bSlot;
639 UCHAR bSeq;
640 UCHAR bBWI;
641 USHORT wLevelParameter;
642 UCHAR bPINOperation;
643 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER;
644 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_BWI(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER*)(msg))->bBWI)
645 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_LEVEL_PARAMETER(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER*)(msg))->wLevelParameter)
646 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_OPERATION(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_HEADER*)(msg))->bPINOperation)
647
648 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_STRUCT
649 {
650 UCHAR bMessageType;
651 UCHAR dwLength[4];
652 UCHAR bSlot;
653 UCHAR bSeq;
654 UCHAR bBWI;
655 USHORT wLevelParameter;
656 UCHAR bPINOperation;
657
658 UCHAR bTimeOut;
659 UCHAR bmFormatString;
660 UCHAR bmPINBlockString;
661 UCHAR bmPINLengthFormat;
662
663 UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
664 UCHAR bEntryValidationCondition;
665 UCHAR bNumberMessage;
666 UCHAR wLangId[2];
667 UCHAR bMsgIndex;
668 UCHAR bTeoPrologue[3];
669 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION;
670 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_TIMEOUT(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bTimeOut)
671 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_FORMAT_STRING(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bmFormatString)
672 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_BLOCK_STRING(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bmPINBlockString)
673 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_LENGTH_FORMAT(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION*)(msg))->bmPINLengthFormat)
674
675 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_PIN_MAX_EXTRA_DIGIT(msg) _ux_utility_short_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wPINMaxExtraDigit)
676 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_PIN_MIN_PIN_SIZE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wPINMaxExtraDigit[1])
677 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_PIN_MAX_PIN_SIZE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wPINMaxExtraDigit[0])
678 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_ENTRY_VALIDATION_CONDITION(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bEntryValidationCondition)
679 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_NUMBER_MESSAGE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bNumberMessage)
680 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_LANG_ID(msg) _ux_utility_short_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->wLangId)
681 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_MESSAGE_INDEX(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bMsgIndex)
682 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_TEO_PROLOGUE(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SECURE_PIN_VERIFICATION*)(msg))->bTeoPrologue)
683 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_DATA(msg) ((UCHAR*)(msg) + 25)
684 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_VERIFICATION_APDU(msg) ((UCHAR*)(msg) + 25)
685
686 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION_STRUCT
687 {
688 UCHAR bMessageType;
689 UCHAR dwLength[4];
690 UCHAR bSlot;
691 UCHAR bSeq;
692 UCHAR bBWI;
693 USHORT wLevelParameter;
694 UCHAR bPINOperation;
695
696 UCHAR bTimeOut;
697 UCHAR bmFormatString;
698 UCHAR bmPINBlockString;
699 UCHAR bmPINLengthFormat;
700
701 UCHAR bInsertionOffsetOld;
702 UCHAR bInsertionOffsetNew;
703 UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
704 UCHAR bConfirmPIN;
705 UCHAR bEntryValidationCondition;
706 UCHAR bNumberMessage;
707 UCHAR wLangId[2];
708 UCHAR bMsgIndex1;
709 UCHAR bTeoPrologue[3];
710 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION;
711 typedef UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1;
712 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1_TEO_PROLOGUE(msg) ((UCHAR*)(msg) + 25)
713 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1_DATA(msg) ((UCHAR*)(msg) + 28)
714 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION1_APDU(msg) ((UCHAR*)(msg) + 28)
715 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_STRUCT
716 {
717 UCHAR bMessageType;
718 UCHAR dwLength[4];
719 UCHAR bSlot;
720 UCHAR bSeq;
721 UCHAR bBWI;
722 USHORT wLevelParameter;
723 UCHAR bPINOperation;
724 UCHAR bTimeOut;
725 UCHAR bmFormatString;
726 UCHAR bmPINBlockString;
727 UCHAR bmPINLengthFormat;
728 UCHAR bInsertionOffsetOld;
729 UCHAR bInsertionOffsetNew;
730 UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
731 UCHAR bConfirmPIN;
732 UCHAR bEntryValidationCondition;
733 UCHAR bNumberMessage;
734 UCHAR wLangId[2];
735 UCHAR bMsgIndex1;
736 UCHAR bMsgIndex2;
737 UCHAR bTeoPrologue[3];
738 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2;
739 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_TEO_PROLOGUE(msg) ((UCHAR*)(msg) + 26)
740 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_DATA(msg) ((UCHAR*)(msg) + 29)
741 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION2_APDU(msg) ((UCHAR*)(msg) + 29)
742 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_STRUCT
743 {
744 UCHAR bMessageType;
745 UCHAR dwLength[4];
746 UCHAR bSlot;
747 UCHAR bSeq;
748 UCHAR bBWI;
749 USHORT wLevelParameter;
750 UCHAR bPINOperation;
751 UCHAR bTimeOut;
752 UCHAR bmFormatString;
753 UCHAR bmPINBlockString;
754 UCHAR bmPINLengthFormat;
755 UCHAR bInsertionOffsetOld;
756 UCHAR bInsertionOffsetNew;
757 UCHAR wPINMaxExtraDigit[2]; /* XXYY, XX: min size, YY: max size. */
758 UCHAR bConfirmPIN;
759 UCHAR bEntryValidationCondition;
760 UCHAR bNumberMessage;
761 UCHAR wLangId[2];
762 UCHAR bMsgIndex1;
763 UCHAR bMsgIndex2;
764 UCHAR bMsgIndex3;
765 UCHAR bTeoPrologue[3];
766 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3;
767 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_TEO_PROLOGUE(msg) ((UCHAR*)(msg) + 27)
768 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_DATA(msg) ((UCHAR*)(msg) + 30)
769 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_PIN_MODIFICATION3_APDU(msg) ((UCHAR*)(msg) + 30)
770
771
772 /* Define CCID PC_to_RDR_Mechanical. */
773 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_HEADER_STRUCT
774 {
775 UCHAR bMessageType;
776 UCHAR dwLength[4];
777 UCHAR bSlot;
778 UCHAR bSeq;
779 UCHAR bFunction;
780 UCHAR bRFU[2];
781 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_HEADER;
782 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_FUNCTION(msg) (((UX_DEVICE_CLASS_CCID_PC_TO_RDR_MECHANICAL_HEADER*)(msg))->bFunction)
783
784 /* Define CCID PC_to_RDR_Abort. */
785 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_ABORT_HEADER;
786
787 /* Define CCID PC_to_RDR_SetDataRateAndClockFrequency. */
788 typedef UX_DEVICE_CLASS_CCID_MESSAGE_HEADER UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY_HEADER;
789 typedef struct UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY_STRUCT
790 {
791 UCHAR bMessageType;
792 UCHAR dwLength[4];
793 UCHAR bSlot;
794 UCHAR bSeq;
795 UCHAR bRFU[3];
796 UCHAR dwClockFrequency[4];
797 UCHAR dwDataRate[4];
798 } UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY;
799 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_CLOCK_FREQUENCY_GET(msg) _ux_utility_long_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwClockFrequency)
800 #define UX_DEVICE_CLASS_CCID_PC_TO_RDR_DATA_RATE_GET(msg) _ux_utility_long_get(((UX_DEVICE_CLASS_CCID_PC_TO_RDR_SET_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwDataRate)
801
802 /* Define CCID RDR_to_PC_ header. */
803 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER_STRUCT
804 {
805 UCHAR bMessageType;
806 UCHAR dwLength[4];
807 UCHAR bSlot;
808 UCHAR bSeq;
809 UCHAR bStatus;
810 UCHAR bError;
811 UCHAR bRFU;
812 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER;
813 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_STATUS(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER*)(msg))->bStatus)
814 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_ERROR(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER*)(msg))->bError)
815
816 /* Define CCID Slot Status Register. */
817 typedef struct UX_DEVICE_CLASS_CCID_SLOT_STATUS_REGISTER_BITMAP_STRUCT
818 {
819 UCHAR bmICCStatus:2;
820 UCHAR bmRFU:4;
821 UCHAR bmCommandStatus:2;
822 } UX_DEVICE_CLASS_CCID_SLOT_STATUS_REGISTER_BITMAP;
823
824 /* Define CCID RDR_to_PC_DataBlock. */
825 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK_HEADER_STRUCT
826 {
827 UCHAR bMessageType;
828 UCHAR dwLength[4];
829 UCHAR bSlot;
830 UCHAR bSeq;
831 UCHAR bStatus;
832 UCHAR bError;
833 UCHAR bChainParameter;
834 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK_HEADER;
835 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_CHAIN_PARAMETER(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_BLOCK_HEADER*)(msg))->bChainParameter)
836
837 /* Define CCID RDR_to_PC_SlotStatus. */
838 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS_HEADER_STRUCT
839 {
840 UCHAR bMessageType;
841 UCHAR dwLength[4];
842 UCHAR bSlot;
843 UCHAR bSeq;
844 UCHAR bStatus;
845 UCHAR bError;
846 UCHAR bClockStatus;
847 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS_HEADER;
848 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_CLOCK_STATUS(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_SLOT_STATUS_HEADER*)(msg))->bClockStatus)
849
850 /* Define CCID RDR_to_PC_Parameters. */
851 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_HEADER_STRUCT
852 {
853 UCHAR bMessageType;
854 UCHAR dwLength[4];
855 UCHAR bSlot;
856 UCHAR bSeq;
857 UCHAR bStatus;
858 UCHAR bError;
859 UCHAR bProtocolNum;
860 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_HEADER;
861 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PROTOCOL_NUM(msg) (((UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_HEADER*)(msg))->bProtocolNum)
862
863 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T0_STRUCT
864 {
865 UCHAR bMessageType;
866 UCHAR dwLength[4];
867 UCHAR bSlot;
868 UCHAR bSeq;
869 UCHAR bStatus;
870 UCHAR bError;
871 UCHAR bProtocolNum;
872 UCHAR bmFindexDindex;
873 UCHAR bmTCCKST0;
874 UCHAR bGuardTimeT0;
875 UCHAR bWaitingIntegerT0;
876 UCHAR bClockStop;
877 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T0;
878 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T0_LENGTH 5
879
880 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T1_STRUCT
881 {
882 UCHAR bMessageType;
883 UCHAR dwLength[4];
884 UCHAR bSlot;
885 UCHAR bSeq;
886 UCHAR bStatus;
887 UCHAR bError;
888 UCHAR bProtocolNum;
889 UCHAR bmFindexDindex;
890 UCHAR bmTCCKST1;
891 UCHAR bGuardTimeT1;
892 UCHAR bmWaitingIntegersT1;
893 UCHAR bClockStop;
894 UCHAR bIFSC;
895 UCHAR bNadValue;
896 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T1;
897 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_PARAMETERS_T1_LENGTH 7
898
899 /* Define CCID RDR_to_PC_Escape. */
900 typedef UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER UX_DEVICE_CLASS_CCID_RDR_TO_PC_ESCAPE_HEADER;
901
902 /* Define CCID RDR_to_PC_DataRateAndClockFrequency. */
903 typedef UX_DEVICE_CLASS_CCID_RDR_TO_PC_HEADER UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY_HEADER;
904 typedef struct UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY_STRUCT
905 {
906 UCHAR bMessageType;
907 UCHAR dwLength[4];
908 UCHAR bSlot;
909 UCHAR bSeq;
910 UCHAR bStatus;
911 UCHAR bError;
912 UCHAR bRFU;
913 UCHAR dwClockFrequency[4];
914 UCHAR dwDataRate[4];
915 } UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY;
916 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_CLOCK_FREQUENCY_SET(msg,v) _ux_utility_long_put(((UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwClockFrequency,(v))
917 #define UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_SET(msg,v) _ux_utility_long_put(((UX_DEVICE_CLASS_CCID_RDR_TO_PC_DATA_RATE_AND_CLOCK_FREQUENCY*)(msg))->dwDataRate,(v))
918
919
920 /* Define CCID message command handles, if command handle is not defined device
921 reports command not supported to host.
922 In RTOS mode return normal status code (_SUCCESS/_ERROR/...).
923 In standalone mode return task state status code (_STATE_NEXT/_STATE_ERROR/...). */
924 typedef UINT (*UX_DEVICE_CLASS_CCID_HANDLE)(ULONG slot, UX_DEVICE_CLASS_CCID_MESSAGES*);
925 typedef struct UX_DEVICE_CLASS_CCID_HANDLES_STRUCT
926 {
927 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_icc_power_on;
928 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_icc_power_off;
929 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_get_slot_status;
930 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_xfr_block;
931 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_get_parameters;
932 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_reset_parameters;
933 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_set_parameters;
934 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_escape;
935 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_icc_clock;
936 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_t0_apdu;
937 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_secure;
938 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_mechanical;
939 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_abort;
940 UX_DEVICE_CLASS_CCID_HANDLE ux_device_class_ccid_handles_set_data_rate_and_clock_frequency;
941 } UX_DEVICE_CLASS_CCID_HANDLES;
942
943 typedef struct UX_DEVICE_CLASS_CCID_COMMAND_SETT_STRUCT
944 {
945 UCHAR ux_device_class_ccid_command_sett_command_type;
946 UCHAR ux_device_class_ccid_command_sett_response_type;
947 UCHAR ux_device_class_ccid_command_sett_flags;
948 CHAR ux_device_class_ccid_command_sett_handle_index;
949 } UX_DEVICE_CLASS_CCID_COMMAND_SETT;
950
951
952 /* Define CCID slot structure. */
953 typedef struct UX_DEVICE_CLASS_CCID_SLOT_STRUCT
954 {
955 CHAR ux_device_class_ccid_slot_runner;
956 UCHAR ux_device_class_ccid_slot_flags;
957
958 UCHAR ux_device_class_ccid_slot_icc_status;
959 UCHAR ux_device_class_ccid_slot_clock_status;
960
961 UCHAR ux_device_class_ccid_slot_hw_error;
962 UCHAR ux_device_class_ccid_slot_hw_error_seq;
963
964 UCHAR ux_device_class_ccid_slot_aborting_seq;
965 UCHAR ux_device_class_ccid_slot_aborting;
966 } UX_DEVICE_CLASS_CCID_SLOT;
967
968 /* Define CCID runner structure. */
969 typedef struct UX_DEVICE_CLASS_CCID_RUNNER_STRUCT
970 {
971 struct UX_DEVICE_CLASS_CCID_STRUCT
972 *ux_device_class_ccid_runner_ccid;
973 UCHAR *ux_device_class_ccid_runner_command;
974 UCHAR *ux_device_class_ccid_runner_response;
975
976 CHAR ux_device_class_ccid_runner_slot;
977 CHAR ux_device_class_ccid_runner_id;
978 CHAR ux_device_class_ccid_runner_command_index;
979 #if !defined(UX_DEVICE_STANDALONE)
980 UCHAR reserved;
981
982 UX_THREAD ux_device_class_ccid_runner_thread;
983 UCHAR *ux_device_class_ccid_runner_thread_stack;
984 #else
985 UCHAR ux_device_class_ccid_runner_state;
986
987 UX_DEVICE_CLASS_CCID_HANDLE
988 ux_device_class_ccid_runner_handle;
989 UX_DEVICE_CLASS_CCID_MESSAGES
990 ux_device_class_ccid_runner_messages;
991 #endif
992 } UX_DEVICE_CLASS_CCID_RUNNER;
993
994 /* Define Device CCID Class Calling Parameter structure */
995 typedef struct UX_DEVICE_CLASS_CCID_PARAMETER_STRUCT
996 {
997 VOID (*ux_device_class_ccid_instance_activate)(VOID *);
998 VOID (*ux_device_class_ccid_instance_deactivate)(VOID *);
999 UX_DEVICE_CLASS_CCID_HANDLES
1000 *ux_device_class_ccid_handles;
1001 ULONG *ux_device_class_ccid_clocks;
1002 ULONG *ux_device_class_ccid_data_rates;
1003 ULONG ux_device_class_ccid_max_transfer_length;
1004 UCHAR ux_device_class_ccid_max_n_slots;
1005 UCHAR ux_device_class_ccid_max_n_busy_slots;
1006 UCHAR ux_device_class_ccid_n_clocks;
1007 UCHAR ux_device_class_ccid_n_data_rates;
1008 } UX_DEVICE_CLASS_CCID_PARAMETER;
1009
1010
1011 /* Define CCID Class structure. */
1012
1013 typedef struct UX_DEVICE_CLASS_CCID_STRUCT
1014 {
1015 UX_SLAVE_INTERFACE *ux_device_class_ccid_interface;
1016 UX_SLAVE_ENDPOINT *ux_device_class_ccid_endpoint_out;
1017 UX_SLAVE_ENDPOINT *ux_device_class_ccid_endpoint_in;
1018 UX_SLAVE_ENDPOINT *ux_device_class_ccid_endpoint_notify;
1019
1020 #if UX_DEVICE_ENDPOINT_BUFFER_OWNER == 1
1021 UCHAR *ux_device_class_ccid_endpoint_buffer;
1022 #endif
1023
1024 UX_DEVICE_CLASS_CCID_PARAMETER
1025 ux_device_class_ccid_parameter;
1026
1027 UX_DEVICE_CLASS_CCID_RUNNER
1028 *ux_device_class_ccid_runners;
1029 UX_DEVICE_CLASS_CCID_SLOT
1030 *ux_device_class_ccid_slots;
1031
1032 UCHAR ux_device_class_ccid_header[UX_DEVICE_CLASS_CCID_MESSAGE_HEADER_LENGTH];
1033 SHORT ux_device_class_ccid_n_busy;
1034
1035 #if !defined(UX_DEVICE_STANDALONE)
1036 UX_THREAD ux_device_class_ccid_thread;
1037 UCHAR *ux_device_class_ccid_thread_stack;
1038
1039 UX_THREAD ux_device_class_ccid_notify_thread;
1040 UCHAR *ux_device_class_ccid_notify_thread_stack;
1041
1042 UX_EVENT_FLAGS_GROUP ux_device_class_ccid_events;
1043 UX_MUTEX ux_device_class_ccid_mutex;
1044 UX_MUTEX ux_device_class_ccid_response_mutex;
1045 UX_SEMAPHORE ux_device_class_ccid_notify_semaphore;
1046 #else
1047 ULONG ux_device_class_ccid_flags;
1048
1049 UCHAR ux_device_class_ccid_cmd_state;
1050 CHAR ux_device_class_ccid_cmd_index;
1051 UCHAR ux_device_class_ccid_rsp_state;
1052 UCHAR ux_device_class_ccid_notify_state;
1053 #endif
1054 } UX_DEVICE_CLASS_CCID;
1055
1056 /* Device CCID endpoint buffer settings (when CCID owns buffer). */
1057 #define UX_DEVICE_CLASS_CCID_ENDPOINT_BUFFER_SIZE_CALC_OVERFLOW \
1058 (UX_OVERFLOW_CHECK_MULC_ULONG(UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE, 2) || \
1059 UX_OVERFLOW_CHECK_ADD_ULONG(UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE * 2, \
1060 UX_DEVICE_CLASS_CCID_INTERRUPT_BUFFER_SIZE))
1061 #define UX_DEVICE_CLASS_CCID_ENDPOINT_BUFFER_SIZE (UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE * 2 + UX_DEVICE_CLASS_CCID_INTERRUPT_BUFFER_SIZE)
1062 #define UX_DEVICE_CLASS_CCID_BULKOUT_BUFFER(ccid) ((ccid) -> ux_device_class_ccid_endpoint_buffer)
1063 #define UX_DEVICE_CLASS_CCID_BULKIN_BUFFER(ccid) (UX_DEVICE_CLASS_CCID_BULKOUT_BUFFER(ccid) + UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE)
1064 #define UX_DEVICE_CLASS_CCID_INTERRUPTIN_BUFFER(ccid) (UX_DEVICE_CLASS_CCID_BULKIN_BUFFER(ccid) + UX_DEVICE_CLASS_CCID_BULK_BUFFER_SIZE)
1065
1066 /* Device CCID flags. */
1067 #define UX_DEVICE_CLASS_CCID_FLAG_LOCK 0x0001u
1068 #define UX_DEVICE_CLASS_CCID_FLAG_CMD_RSP 0x0010u
1069
1070 #if defined(UX_DEVICE_STANDALONE)
1071 #define _ux_device_class_ccid_lock(ccid) do { \
1072 UX_INTERRUPT_SAVE_AREA \
1073 UX_DISABLE \
1074 if (ccid->ux_device_class_ccid_flags & UX_DEVICE_CLASS_CCID_FLAG_LOCK) \
1075 { \
1076 UX_RESTORE \
1077 return(UX_BUSY); \
1078 } \
1079 ccid->ux_device_class_ccid_flags |= UX_DEVICE_CLASS_CCID_FLAG_LOCK; \
1080 UX_RESTORE \
1081 } while(0)
1082 #define _ux_device_class_ccid_unlock(ccid) do { \
1083 ccid->ux_device_class_ccid_flags &= ~UX_DEVICE_CLASS_CCID_FLAG_LOCK; \
1084 } while(0)
1085 #else
1086 #define _ux_device_class_ccid_lock(ccid) _ux_device_mutex_on(&ccid -> ux_device_class_ccid_mutex)
1087 #define _ux_device_class_ccid_unlock(ccid) _ux_device_mutex_off(&ccid -> ux_device_class_ccid_mutex)
1088 #endif
1089
1090 /* Device CCID states. */
1091 #define UX_DEVICE_CLASS_CCID_CMD_IDLE (UX_STATE_STEP + 0)
1092 #define UX_DEVICE_CLASS_CCID_CMD_START (UX_STATE_STEP + 1)
1093 #define UX_DEVICE_CLASS_CCID_CMD_WAIT (UX_STATE_STEP + 2)
1094 #define UX_DEVICE_CLASS_CCID_CMD_LOCK (UX_STATE_STEP + 3)
1095 #define UX_DEVICE_CLASS_CCID_CMD_PROCESS (UX_STATE_STEP + 4)
1096 #define UX_DEVICE_CLASS_CCID_CMD_RSP_START (UX_STATE_STEP + 5)
ccidCmdStateName(const UINT s)1097 static inline const char *ccidCmdStateName(const UINT s)
1098 {
1099 switch(s)
1100 {
1101 case UX_DEVICE_CLASS_CCID_CMD_IDLE: return("cmdIDLE");
1102 case UX_DEVICE_CLASS_CCID_CMD_START: return("cmdSTART");
1103 case UX_DEVICE_CLASS_CCID_CMD_WAIT: return("cmdWAIT");
1104 case UX_DEVICE_CLASS_CCID_CMD_LOCK: return("cmdLOCK");
1105 case UX_DEVICE_CLASS_CCID_CMD_PROCESS: return("cmdPROCESS");
1106 case UX_DEVICE_CLASS_CCID_CMD_RSP_START:return("cmdRSP_START");
1107 default: return("cmd?");
1108 }
1109 }
1110
1111 #define UX_DEVICE_CLASS_CCID_RUNNER_IDLE (UX_STATE_STEP + 0)
1112 #define UX_DEVICE_CLASS_CCID_RUNNER_START (UX_STATE_STEP + 1)
1113 #define UX_DEVICE_CLASS_CCID_RUNNER_HANDLE (UX_STATE_STEP + 2)
1114 #define UX_DEVICE_CLASS_CCID_RUNNER_RSP_START (UX_STATE_STEP + 3)
ccidRunnerStateName(const UINT s)1115 static inline const char *ccidRunnerStateName(const UINT s)
1116 {
1117 switch(s)
1118 {
1119 case UX_DEVICE_CLASS_CCID_RUNNER_IDLE: return("runnerIDLE");
1120 case UX_DEVICE_CLASS_CCID_RUNNER_START: return("runnerSTART");
1121 case UX_DEVICE_CLASS_CCID_RUNNER_HANDLE: return("runnerHANDLE");
1122 case UX_DEVICE_CLASS_CCID_RUNNER_RSP_START: return("runnerRSP_START");
1123 default: return("runner?");
1124 }
1125 }
1126
1127 #define UX_DEVICE_CLASS_CCID_RSP_IDLE (UX_STATE_STEP + 0)
1128 #define UX_DEVICE_CLASS_CCID_RSP_START (UX_STATE_STEP + 1)
1129 #define UX_DEVICE_CLASS_CCID_RSP_WAIT (UX_STATE_STEP + 2)
1130 #define UX_DEVICE_CLASS_CCID_RSP_LOCK (UX_STATE_STEP + 3)
1131 #define UX_DEVICE_CLASS_CCID_RSP_UPDATE (UX_STATE_STEP + 4)
1132 #define UX_DEVICE_CLASS_CCID_RSP_DONE (UX_STATE_STEP + 5)
ccidRspStateName(const UINT s)1133 static inline const char *ccidRspStateName(const UINT s)
1134 {
1135 switch(s)
1136 {
1137 case UX_DEVICE_CLASS_CCID_RSP_IDLE: return("rspIDLE");
1138 case UX_DEVICE_CLASS_CCID_RSP_START: return("rspSTART");
1139 case UX_DEVICE_CLASS_CCID_RSP_WAIT: return("rspWAIT");
1140 case UX_DEVICE_CLASS_CCID_RSP_LOCK: return("rspLOCK");
1141 case UX_DEVICE_CLASS_CCID_RSP_UPDATE: return("rspUPDATE");
1142 case UX_DEVICE_CLASS_CCID_RSP_DONE: return("rspDONE");
1143 default: return("rsp?");
1144 }
1145 }
1146
1147 #define UX_DEVICE_CLASS_CCID_NOTIFY_IDLE (UX_STATE_STEP + 0)
1148 #define UX_DEVICE_CLASS_CCID_NOTIFY_LOCK (UX_STATE_STEP + 1)
1149 #define UX_DEVICE_CLASS_CCID_NOTIFY_START (UX_STATE_STEP + 2)
1150 #define UX_DEVICE_CLASS_CCID_NOTIFY_WAIT (UX_STATE_STEP + 3)
ccidNotifyStateName(const UINT s)1151 static inline const char *ccidNotifyStateName(const UINT s)
1152 {
1153 switch(s)
1154 {
1155 case UX_DEVICE_CLASS_CCID_NOTIFY_IDLE: return("notifyIDLE");
1156 case UX_DEVICE_CLASS_CCID_NOTIFY_LOCK: return("notifyLOCK");
1157 case UX_DEVICE_CLASS_CCID_NOTIFY_START: return("notifySTART");
1158 case UX_DEVICE_CLASS_CCID_NOTIFY_WAIT: return("notifyWAIT");
1159 default: return("notify?");
1160 }
1161 }
1162
1163 /* Define Device CCID command settings. */
1164 extern const UX_DEVICE_CLASS_CCID_COMMAND_SETT _ux_device_class_ccid_command_sett[];
1165
1166 /* Define Device CCID Class prototypes. */
1167 UINT _ux_device_class_ccid_initialize(UX_SLAVE_CLASS_COMMAND *command);
1168 UINT _ux_device_class_ccid_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
1169 UINT _ux_device_class_ccid_activate(UX_SLAVE_CLASS_COMMAND *command);
1170 UINT _ux_device_class_ccid_deactivate(UX_SLAVE_CLASS_COMMAND *command);
1171 UINT _ux_device_class_ccid_control_request(UX_SLAVE_CLASS_COMMAND *command);
1172
1173 VOID _ux_device_class_ccid_thread_entry(ULONG ccid_instance);
1174 VOID _ux_device_class_ccid_notify_thread_entry(ULONG ccid_instance);
1175 VOID _ux_device_class_ccid_runner_thread_entry(ULONG runner_instance);
1176
1177 UINT _ux_device_class_ccid_tasks_run(VOID *instance);
1178 UINT _ux_device_class_ccid_notify_task_run(UX_DEVICE_CLASS_CCID *ccid);
1179 UINT _ux_device_class_ccid_runner_task_run(UX_DEVICE_CLASS_CCID *ccid);
1180
1181 UINT _ux_device_class_ccid_control_abort(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG seq);
1182
1183 UINT _ux_device_class_ccid_response(UX_DEVICE_CLASS_CCID *ccid, UCHAR *buffer, ULONG length);
1184
1185 UINT _ux_device_class_ccid_entry(UX_SLAVE_CLASS_COMMAND *command);
1186
1187 UINT _ux_device_class_ccid_icc_insert(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG seq_start);
1188 UINT _ux_device_class_ccid_icc_remove(UX_DEVICE_CLASS_CCID *ccid, ULONG slot);
1189 UINT _ux_device_class_ccid_auto_seq_start(UX_DEVICE_CLASS_CCID *ccid, ULONG slot);
1190 UINT _ux_device_class_ccid_auto_seq_done(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG icc_status);
1191 UINT _ux_device_class_ccid_time_extension(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG wt);
1192 UINT _ux_device_class_ccid_hardware_error(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG error);
1193
1194 UINT _uxe_device_class_ccid_icc_insert(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG seq_start);
1195 UINT _uxe_device_class_ccid_icc_remove(UX_DEVICE_CLASS_CCID *ccid, ULONG slot);
1196 UINT _uxe_device_class_ccid_auto_seq_done(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG icc_status);
1197 UINT _uxe_device_class_ccid_time_extension(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG wt);
1198 UINT _uxe_device_class_ccid_hardware_error(UX_DEVICE_CLASS_CCID *ccid, ULONG slot, ULONG error);
1199
1200 /* Define Device CCID Class API prototypes. */
1201
1202 #define ux_device_class_ccid_entry _ux_device_class_ccid_entry
1203
1204 #if defined(UX_DEVICE_CLASS_CCID_ENABLE_ERROR_CHECKING)
1205
1206 #define ux_device_class_ccid_icc_insert _uxe_device_class_ccid_icc_insert
1207 #define ux_device_class_ccid_icc_remove _uxe_device_class_ccid_icc_remove
1208 #define ux_device_class_ccid_auto_seq_done _uxe_device_class_ccid_auto_seq_done
1209 #define ux_device_class_ccid_time_extension _uxe_device_class_ccid_time_extension
1210 #define ux_device_class_ccid_hardware_error _uxe_device_class_ccid_hardware_error
1211
1212 #else
1213
1214 #define ux_device_class_ccid_icc_insert _ux_device_class_ccid_icc_insert
1215 #define ux_device_class_ccid_icc_remove _ux_device_class_ccid_icc_remove
1216 #define ux_device_class_ccid_auto_seq_done _ux_device_class_ccid_auto_seq_done
1217 #define ux_device_class_ccid_time_extension _ux_device_class_ccid_time_extension
1218 #define ux_device_class_ccid_hardware_error _ux_device_class_ccid_hardware_error
1219
1220 #endif
1221
1222 /* Determine if a C++ compiler is being used. If so, complete the standard
1223 C conditional started above. */
1224 #ifdef __cplusplus
1225 }
1226 #endif
1227
1228 #endif /* UX_DEVICE_CLASS_CCID_H */
1229