You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.7 KiB
132 lines
3.7 KiB
/*
|
|
* 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__ */
|