xref: /aosp_15_r20/external/libese/libese-teq1/include/ese/teq1.h (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
1*5c4dab75SAndroid Build Coastguard Worker /*
2*5c4dab75SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*5c4dab75SAndroid Build Coastguard Worker  *
4*5c4dab75SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*5c4dab75SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*5c4dab75SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*5c4dab75SAndroid Build Coastguard Worker  *
8*5c4dab75SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*5c4dab75SAndroid Build Coastguard Worker  *
10*5c4dab75SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*5c4dab75SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*5c4dab75SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*5c4dab75SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*5c4dab75SAndroid Build Coastguard Worker  * limitations under the License.
15*5c4dab75SAndroid Build Coastguard Worker  */
16*5c4dab75SAndroid Build Coastguard Worker 
17*5c4dab75SAndroid Build Coastguard Worker #ifndef ESE_TEQ1_H_
18*5c4dab75SAndroid Build Coastguard Worker #define ESE_TEQ1_H_ 1
19*5c4dab75SAndroid Build Coastguard Worker 
20*5c4dab75SAndroid Build Coastguard Worker #ifdef __cplusplus
21*5c4dab75SAndroid Build Coastguard Worker extern "C" {
22*5c4dab75SAndroid Build Coastguard Worker #endif
23*5c4dab75SAndroid Build Coastguard Worker 
24*5c4dab75SAndroid Build Coastguard Worker #include <ese/ese.h>
25*5c4dab75SAndroid Build Coastguard Worker #include <ese/bit_spec.h>
26*5c4dab75SAndroid Build Coastguard Worker 
27*5c4dab75SAndroid Build Coastguard Worker /* Reserved codes for T=1 devices in EseOperation­>errors. */
28*5c4dab75SAndroid Build Coastguard Worker enum Teq1Error {
29*5c4dab75SAndroid Build Coastguard Worker  kTeq1ErrorHardFail = 0,
30*5c4dab75SAndroid Build Coastguard Worker  kTeq1ErrorAbort,
31*5c4dab75SAndroid Build Coastguard Worker  kTeq1ErrorDeviceReset,
32*5c4dab75SAndroid Build Coastguard Worker  kTeq1ErrorMax,
33*5c4dab75SAndroid Build Coastguard Worker };
34*5c4dab75SAndroid Build Coastguard Worker 
35*5c4dab75SAndroid Build Coastguard Worker /* For use in constant initializers libese-hw errors. */
36*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_ERROR_MESSAGES \
37*5c4dab75SAndroid Build Coastguard Worker   [kTeq1ErrorHardFail] = "T=1 suffered hard failure", \
38*5c4dab75SAndroid Build Coastguard Worker   [kTeq1ErrorAbort] = "T=1 aborting due to errors", \
39*5c4dab75SAndroid Build Coastguard Worker   [kTeq1ErrorDeviceReset] = "T=1 unable to recover even after device reset"
40*5c4dab75SAndroid Build Coastguard Worker 
41*5c4dab75SAndroid Build Coastguard Worker enum pcb_type {
42*5c4dab75SAndroid Build Coastguard Worker   kPcbTypeInfo0 = 0x0,
43*5c4dab75SAndroid Build Coastguard Worker   kPcbTypeInfo1 = 0x1,
44*5c4dab75SAndroid Build Coastguard Worker   kPcbTypeReceiveReady = 0x2,
45*5c4dab75SAndroid Build Coastguard Worker   kPcbTypeSupervisory = 0x3,
46*5c4dab75SAndroid Build Coastguard Worker };
47*5c4dab75SAndroid Build Coastguard Worker 
48*5c4dab75SAndroid Build Coastguard Worker enum super_type {
49*5c4dab75SAndroid Build Coastguard Worker   kSuperTypeResync = 0x0,
50*5c4dab75SAndroid Build Coastguard Worker   kSuperTypeIFS = 0x1,
51*5c4dab75SAndroid Build Coastguard Worker   kSuperTypeAbort = 0x2,
52*5c4dab75SAndroid Build Coastguard Worker   kSuperTypeWTX = 0x3,
53*5c4dab75SAndroid Build Coastguard Worker };
54*5c4dab75SAndroid Build Coastguard Worker 
55*5c4dab75SAndroid Build Coastguard Worker struct PcbSpec {
56*5c4dab75SAndroid Build Coastguard Worker   struct bit_spec type;
57*5c4dab75SAndroid Build Coastguard Worker   struct bit_spec data;
58*5c4dab75SAndroid Build Coastguard Worker   struct {
59*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec more_data;
60*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec send_seq;
61*5c4dab75SAndroid Build Coastguard Worker   } I;
62*5c4dab75SAndroid Build Coastguard Worker   struct {
63*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec parity_err;
64*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec other_err;
65*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec next_seq;
66*5c4dab75SAndroid Build Coastguard Worker   } R;
67*5c4dab75SAndroid Build Coastguard Worker   struct {
68*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec type;
69*5c4dab75SAndroid Build Coastguard Worker     struct bit_spec response;
70*5c4dab75SAndroid Build Coastguard Worker   } S;
71*5c4dab75SAndroid Build Coastguard Worker };
72*5c4dab75SAndroid Build Coastguard Worker 
73*5c4dab75SAndroid Build Coastguard Worker const static struct PcbSpec PCB = {
74*5c4dab75SAndroid Build Coastguard Worker   .type = { .value = 3, .shift = 6, },
75*5c4dab75SAndroid Build Coastguard Worker   .data = { .value = 63, .shift = 0, },
76*5c4dab75SAndroid Build Coastguard Worker   .I = {
77*5c4dab75SAndroid Build Coastguard Worker     .more_data = { .value = 1, .shift = 5, },
78*5c4dab75SAndroid Build Coastguard Worker     .send_seq = { .value = 1, .shift = 6, },
79*5c4dab75SAndroid Build Coastguard Worker   },
80*5c4dab75SAndroid Build Coastguard Worker   .R = {
81*5c4dab75SAndroid Build Coastguard Worker     /* char parity or redundancy code err */
82*5c4dab75SAndroid Build Coastguard Worker     .parity_err = { .value = 1, .shift = 0, },
83*5c4dab75SAndroid Build Coastguard Worker     /* any other errors */
84*5c4dab75SAndroid Build Coastguard Worker     .other_err = { .value = 1, .shift = 1, },
85*5c4dab75SAndroid Build Coastguard Worker     /* If the same seq as last frame, then err even if other bits are 0. */
86*5c4dab75SAndroid Build Coastguard Worker     .next_seq = { .value = 1, .shift = 4, },
87*5c4dab75SAndroid Build Coastguard Worker   },
88*5c4dab75SAndroid Build Coastguard Worker   .S = {
89*5c4dab75SAndroid Build Coastguard Worker     .type = { .value = 3, .shift = 0, },
90*5c4dab75SAndroid Build Coastguard Worker     .response = { .value = 1, .shift = 5, },
91*5c4dab75SAndroid Build Coastguard Worker   },
92*5c4dab75SAndroid Build Coastguard Worker };
93*5c4dab75SAndroid Build Coastguard Worker 
94*5c4dab75SAndroid Build Coastguard Worker struct Teq1Header {
95*5c4dab75SAndroid Build Coastguard Worker   uint8_t NAD;
96*5c4dab75SAndroid Build Coastguard Worker   uint8_t PCB;
97*5c4dab75SAndroid Build Coastguard Worker   uint8_t LEN;
98*5c4dab75SAndroid Build Coastguard Worker };
99*5c4dab75SAndroid Build Coastguard Worker #define TEQ1HEADER_SIZE 3
100*5c4dab75SAndroid Build Coastguard Worker #define TEQ1FRAME_SIZE INF_LEN + 1 + TEQ1HEADER_SIZE
101*5c4dab75SAndroid Build Coastguard Worker 
102*5c4dab75SAndroid Build Coastguard Worker #define INF_LEN 254
103*5c4dab75SAndroid Build Coastguard Worker #define IFSC 254
104*5c4dab75SAndroid Build Coastguard Worker struct Teq1Frame {
105*5c4dab75SAndroid Build Coastguard Worker   union {
106*5c4dab75SAndroid Build Coastguard Worker     uint8_t val[sizeof(struct Teq1Header) + INF_LEN + 1];
107*5c4dab75SAndroid Build Coastguard Worker     struct {
108*5c4dab75SAndroid Build Coastguard Worker       struct Teq1Header header;
109*5c4dab75SAndroid Build Coastguard Worker       union {
110*5c4dab75SAndroid Build Coastguard Worker         uint8_t INF[INF_LEN + 1]; /* Up to 254 with trailing LRC byte. */
111*5c4dab75SAndroid Build Coastguard Worker       };
112*5c4dab75SAndroid Build Coastguard Worker       /* If CRC was supported, it would be uint16_t. */
113*5c4dab75SAndroid Build Coastguard Worker     };
114*5c4dab75SAndroid Build Coastguard Worker   };
115*5c4dab75SAndroid Build Coastguard Worker };
116*5c4dab75SAndroid Build Coastguard Worker 
117*5c4dab75SAndroid Build Coastguard Worker 
118*5c4dab75SAndroid Build Coastguard Worker /*
119*5c4dab75SAndroid Build Coastguard Worker  * Required to be the header for all EseInterface pad[]s for
120*5c4dab75SAndroid Build Coastguard Worker  * cards implementing T=1.
121*5c4dab75SAndroid Build Coastguard Worker  */
122*5c4dab75SAndroid Build Coastguard Worker struct Teq1CardState {
123*5c4dab75SAndroid Build Coastguard Worker   union {
124*5c4dab75SAndroid Build Coastguard Worker     struct {
125*5c4dab75SAndroid Build Coastguard Worker       int card:1;
126*5c4dab75SAndroid Build Coastguard Worker       int interface:1;
127*5c4dab75SAndroid Build Coastguard Worker     };
128*5c4dab75SAndroid Build Coastguard Worker     uint8_t seq_bits;
129*5c4dab75SAndroid Build Coastguard Worker   } seq;
130*5c4dab75SAndroid Build Coastguard Worker };
131*5c4dab75SAndroid Build Coastguard Worker 
132*5c4dab75SAndroid Build Coastguard Worker /* Set "last sent" to 1 so we start at 0. */
133*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_INIT_CARD_STATE(CARD) \
134*5c4dab75SAndroid Build Coastguard Worker   (CARD)->seq.card = 1; \
135*5c4dab75SAndroid Build Coastguard Worker   (CARD)->seq.interface = 1;
136*5c4dab75SAndroid Build Coastguard Worker 
137*5c4dab75SAndroid Build Coastguard Worker /*
138*5c4dab75SAndroid Build Coastguard Worker  * Used by devices implementing T=1 to set specific options
139*5c4dab75SAndroid Build Coastguard Worker  * or callback behavior.
140*5c4dab75SAndroid Build Coastguard Worker  */
141*5c4dab75SAndroid Build Coastguard Worker struct Teq1ProtocolOptions;
142*5c4dab75SAndroid Build Coastguard Worker typedef int (teq1_protocol_preprocess_op_t)(const struct Teq1ProtocolOptions *const, struct Teq1Frame *, int);
143*5c4dab75SAndroid Build Coastguard Worker 
144*5c4dab75SAndroid Build Coastguard Worker struct Teq1ProtocolOptions {
145*5c4dab75SAndroid Build Coastguard Worker   uint8_t host_address;  /* NAD to listen for */
146*5c4dab75SAndroid Build Coastguard Worker   uint8_t node_address;  /* NAD to send to */
147*5c4dab75SAndroid Build Coastguard Worker   float bwt;
148*5c4dab75SAndroid Build Coastguard Worker   float etu;
149*5c4dab75SAndroid Build Coastguard Worker   /*
150*5c4dab75SAndroid Build Coastguard Worker    * If not NULL, is called immediately before transmit (1)
151*5c4dab75SAndroid Build Coastguard Worker    * and immediately after receive.
152*5c4dab75SAndroid Build Coastguard Worker    */
153*5c4dab75SAndroid Build Coastguard Worker   teq1_protocol_preprocess_op_t *preprocess;
154*5c4dab75SAndroid Build Coastguard Worker };
155*5c4dab75SAndroid Build Coastguard Worker 
156*5c4dab75SAndroid Build Coastguard Worker /* PCB bits */
157*5c4dab75SAndroid Build Coastguard Worker #define kTeq1PcbType (3 << 6)
158*5c4dab75SAndroid Build Coastguard Worker 
159*5c4dab75SAndroid Build Coastguard Worker /* I-block bits */
160*5c4dab75SAndroid Build Coastguard Worker #define kTeq1InfoType        (0 << 6)
161*5c4dab75SAndroid Build Coastguard Worker #define kTeq1InfoMoreBit     (1 << 5)
162*5c4dab75SAndroid Build Coastguard Worker #define kTeq1InfoSeqBit      (1 << 6)
163*5c4dab75SAndroid Build Coastguard Worker 
164*5c4dab75SAndroid Build Coastguard Worker /* R-block bits */
165*5c4dab75SAndroid Build Coastguard Worker #define kTeq1RrType         (1 << 7)
166*5c4dab75SAndroid Build Coastguard Worker #define kTeq1RrSeqBit       (1 << 4)
167*5c4dab75SAndroid Build Coastguard Worker #define kTeq1RrParityError  (1)
168*5c4dab75SAndroid Build Coastguard Worker #define kTeq1RrOtherError   (1 << 1)
169*5c4dab75SAndroid Build Coastguard Worker 
170*5c4dab75SAndroid Build Coastguard Worker /* S-block bits */
171*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperType      (3 << 6)
172*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperRequestBit (0)
173*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperResponseBit (1 << 5)
174*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperResyncBit (0)
175*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperIfsBit (1)
176*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperAbortBit (1 << 1)
177*5c4dab75SAndroid Build Coastguard Worker #define kTeq1SuperWtxBit (3)
178*5c4dab75SAndroid Build Coastguard Worker 
179*5c4dab75SAndroid Build Coastguard Worker /* I(Seq, More-bit) */
180*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_I(S, M) ((S) << 6) | ((M) << 5)
181*5c4dab75SAndroid Build Coastguard Worker 
182*5c4dab75SAndroid Build Coastguard Worker /* R(Seq, Other Error, Parity Error) */
183*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_R(S, O, P) (kTeq1RrType | ((S) << 4) | (P) | ((O) << 1))
184*5c4dab75SAndroid Build Coastguard Worker /* S_<TYPE>(response) */
185*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_S_RESYNC(R) (kTeq1SuperType | ((R) << 5) | kTeq1SuperResyncBit)
186*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_S_WTX(R)  (kTeq1SuperType | ((R) << 5) | kTeq1SuperWtxBit)
187*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_S_ABORT(R) (kTeq1SuperType | ((R) << 5) | kTeq1SuperAbortBit)
188*5c4dab75SAndroid Build Coastguard Worker #define TEQ1_S_IFS(R) (kTeq1SuperType | ((R) << 5) | kTeq1SuperIfsBit)
189*5c4dab75SAndroid Build Coastguard Worker 
190*5c4dab75SAndroid Build Coastguard Worker uint32_t teq1_transceive(struct EseInterface *ese,
191*5c4dab75SAndroid Build Coastguard Worker                          const struct Teq1ProtocolOptions *opts,
192*5c4dab75SAndroid Build Coastguard Worker                          const struct EseSgBuffer *tx_bufs, uint8_t tx_segs,
193*5c4dab75SAndroid Build Coastguard Worker                          struct EseSgBuffer *rx_bufs, uint8_t rx_segs);
194*5c4dab75SAndroid Build Coastguard Worker 
195*5c4dab75SAndroid Build Coastguard Worker uint8_t teq1_compute_LRC(const struct Teq1Frame *frame);
196*5c4dab75SAndroid Build Coastguard Worker 
197*5c4dab75SAndroid Build Coastguard Worker #define teq1_trace_header() ALOGI("%-20s --- %20s", "Interface", "Card")
198*5c4dab75SAndroid Build Coastguard Worker #define teq1_trace_transmit(PCB, LEN) ALOGI("%-20s --> %20s [%3hhu]", teq1_pcb_to_name(PCB), "", LEN)
199*5c4dab75SAndroid Build Coastguard Worker #define teq1_trace_receive(PCB, LEN) ALOGI("%-20s <-- %20s [%3hhu]", "", teq1_pcb_to_name(PCB), LEN)
200*5c4dab75SAndroid Build Coastguard Worker 
201*5c4dab75SAndroid Build Coastguard Worker #ifdef __cplusplus
202*5c4dab75SAndroid Build Coastguard Worker }  /* extern "C" */
203*5c4dab75SAndroid Build Coastguard Worker #endif
204*5c4dab75SAndroid Build Coastguard Worker #endif  /* ESE_TEQ1_H_ */
205