Home | History | Annotate | Download | only in libese-teq1
      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