• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef ESE_TEQ1_PRIVATE_H__
17 #define ESE_TEQ1_PRIVATE_H__ 1
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /*
24  * Enable T=1 format to reduce to case integers.
25  * Ensure there are tests to map TEQ1_X() to the shorthand below.
26  */
27 #define I(S, M) I_##S##_##M
28 #define I_0_0 0
29 #define I_0_1 32
30 #define I_1_0 64
31 #define I_1_1 96
32 #define R(S, O, P) R_ ## S ##_## O ##_## P
33 #define R_0_0_0 128
34 #define R_0_0_1 129
35 #define R_0_1_0 130
36 #define R_0_1_1 131
37 #define R_1_0_0 144
38 #define R_1_0_1 145
39 #define R_1_1_0 146
40 #define R_1_1_1 147
41 
42 #define _S(x) x
43 #define S(N, R) S_##N##_##R
44 #define S_RESYNC_REQUEST 192
45 #define S_IFS_REQUEST 193
46 #define S_ABORT_REQUEST 194
47 #define S_WTX_REQUEST 195
48 #define S_RESYNC_RESPONSE 224
49 #define S_IFS_RESPONSE 225
50 #define S_ABORT_RESPONSE 226
51 #define S_WTX_RESPONSE 227
52 
53 #define TEQ1_RULE(TX, RX) (((TX & 255) << 8)|(RX & 255))
54 
55 struct Teq1State {
56   uint8_t wait_mult;
57   uint8_t ifs;
58   uint8_t errors;
59   int retransmits;
60   const char *last_error_message;
61   struct Teq1CardState *card_state;
62   struct {
63     const struct EseSgBuffer *tx;
64     struct EseSgBuffer *rx;
65     uint32_t tx_offset;
66     uint32_t tx_count;
67     uint32_t tx_total;
68     uint32_t rx_offset;
69     uint32_t rx_count;
70     uint32_t rx_total;
71   } app_data;
72 };
73 
74 #define TEQ1_INIT_STATE(TX_BUFS, TX_LEN, TX_TOTAL_LEN, RX_BUFS, RX_LEN, RX_TOTAL_LEN, CSTATE) \
75   { \
76     .wait_mult = 1, \
77     .ifs = IFSC, \
78     .errors = 0, \
79     .retransmits = 0, \
80     .last_error_message = NULL, \
81     .card_state = (CSTATE), \
82     .app_data = { \
83       .tx = (TX_BUFS), \
84       .rx = (RX_BUFS), \
85       .tx_offset = 0, \
86       .tx_count = (TX_LEN), \
87       .tx_total = (TX_TOTAL_LEN), \
88       .rx_offset = 0, \
89       .rx_count = (RX_LEN), \
90       .rx_total = (RX_TOTAL_LEN), \
91     }, \
92   }
93 
94 enum RuleResult {
95   kRuleResultComplete,
96   kRuleResultAbort,
97   kRuleResultContinue,
98   kRuleResultHardFail,
99   kRuleResultResetDevice,
100   kRuleResultResetSession,
101   kRuleResultRetransmit,
102   kRuleResultSingleShot,
103 };
104 
105 
106 const char *teq1_rule_result_to_name(enum RuleResult result);
107 const char *teq1_pcb_to_name(uint8_t pcb);
108 int teq1_transmit(struct EseInterface *ese,
109                   const struct Teq1ProtocolOptions *opts,
110                   struct Teq1Frame *frame);
111 int teq1_receive(struct EseInterface *ese,
112                  const struct Teq1ProtocolOptions *opts,
113                  float timeout,
114                  struct Teq1Frame *frame);
115 uint8_t teq1_fill_info_block(struct Teq1State *state, struct Teq1Frame *frame);
116 void teq1_get_app_data(struct Teq1State *state, const struct Teq1Frame *frame);
117 uint8_t teq1_frame_error_check(struct Teq1State *state,
118                                struct Teq1Frame *tx_frame,
119                                struct Teq1Frame *rx_frame);
120 enum RuleResult teq1_rules(struct Teq1State *state,
121                            struct Teq1Frame *tx_frame,
122                            struct Teq1Frame *rx_frame,
123                            struct Teq1Frame *next_tx);
124 
125 #define teq1_dump_transmit(_B, _L) teq1_dump_buf("TX", (_B), (_L))
126 #define teq1_dump_receive(_B, _L) teq1_dump_buf("RX", (_B), (_L))
127 
128 #ifdef __cplusplus
129 }  /* extern "C" */
130 #endif
131 #endif  /* ESE_TEQ1_PRIVATE_H__ */
132