/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ESE_TEQ1_PRIVATE_H__ #define ESE_TEQ1_PRIVATE_H__ 1 #ifdef __cplusplus extern "C" { #endif /* * Enable T=1 format to reduce to case integers. * Ensure there are tests to map TEQ1_X() to the shorthand below. */ #define I(S, M) I_##S##_##M #define I_0_0 0 #define I_0_1 32 #define I_1_0 64 #define I_1_1 96 #define R(S, O, P) R_ ## S ##_## O ##_## P #define R_0_0_0 128 #define R_0_0_1 129 #define R_0_1_0 130 #define R_0_1_1 131 #define R_1_0_0 144 #define R_1_0_1 145 #define R_1_1_0 146 #define R_1_1_1 147 #define _S(x) x #define S(N, R) S_##N##_##R #define S_RESYNC_REQUEST 192 #define S_IFS_REQUEST 193 #define S_ABORT_REQUEST 194 #define S_WTX_REQUEST 195 #define S_RESYNC_RESPONSE 224 #define S_IFS_RESPONSE 225 #define S_ABORT_RESPONSE 226 #define S_WTX_RESPONSE 227 #define TEQ1_RULE(TX, RX) (((TX & 255) << 8)|(RX & 255)) struct Teq1State { uint8_t wait_mult; uint8_t ifs; uint8_t errors; int retransmits; const char *last_error_message; struct Teq1CardState *card_state; struct { const struct EseSgBuffer *tx; struct EseSgBuffer *rx; uint32_t tx_offset; uint32_t tx_count; uint32_t tx_total; uint32_t rx_offset; uint32_t rx_count; uint32_t rx_total; } app_data; }; #define TEQ1_INIT_STATE(TX_BUFS, TX_LEN, TX_TOTAL_LEN, RX_BUFS, RX_LEN, RX_TOTAL_LEN, CSTATE) \ { \ .wait_mult = 1, \ .ifs = IFSC, \ .errors = 0, \ .retransmits = 0, \ .last_error_message = NULL, \ .card_state = (CSTATE), \ .app_data = { \ .tx = (TX_BUFS), \ .rx = (RX_BUFS), \ .tx_offset = 0, \ .tx_count = (TX_LEN), \ .tx_total = (TX_TOTAL_LEN), \ .rx_offset = 0, \ .rx_count = (RX_LEN), \ .rx_total = (RX_TOTAL_LEN), \ }, \ } enum RuleResult { kRuleResultComplete, kRuleResultAbort, kRuleResultContinue, kRuleResultHardFail, kRuleResultResetDevice, kRuleResultResetSession, kRuleResultRetransmit, kRuleResultSingleShot, }; const char *teq1_rule_result_to_name(enum RuleResult result); const char *teq1_pcb_to_name(uint8_t pcb); int teq1_transmit(struct EseInterface *ese, const struct Teq1ProtocolOptions *opts, struct Teq1Frame *frame); int teq1_receive(struct EseInterface *ese, const struct Teq1ProtocolOptions *opts, float timeout, struct Teq1Frame *frame); uint8_t teq1_fill_info_block(struct Teq1State *state, struct Teq1Frame *frame); void teq1_get_app_data(struct Teq1State *state, const struct Teq1Frame *frame); uint8_t teq1_frame_error_check(struct Teq1State *state, struct Teq1Frame *tx_frame, struct Teq1Frame *rx_frame); enum RuleResult teq1_rules(struct Teq1State *state, struct Teq1Frame *tx_frame, struct Teq1Frame *rx_frame, struct Teq1Frame *next_tx); #define teq1_dump_transmit(_B, _L) teq1_dump_buf("TX", (_B), (_L)) #define teq1_dump_receive(_B, _L) teq1_dump_buf("RX", (_B), (_L)) #ifdef __cplusplus } /* extern "C" */ #endif #endif /* ESE_TEQ1_PRIVATE_H__ */