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