/* * Copyright (c) 2020 Fingerprint Cards AB * * 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 * * https://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. */ /** * @file fpc_com_chain.h * @brief Communication chain type definitions. */ #ifndef FPC_COM_CHAIN_H #define FPC_COM_CHAIN_H #include #include "fpc_com_result.h" #include "fpc_hcp_common.h" #include "fpc_com_packets.h" /** * @brief Communication chain private variables. */ typedef struct fpc_com_chain_private fpc_com_chain_private_t; /** Communication chain private struct */ struct fpc_com_chain_private { /** HCP packet */ fpc_hcp_packet_t *hcp_packet; /** HCP sequence length */ uint16_t hcp_seq_len; /** HCP sequence number */ uint16_t hcp_seq_nr; }; /** * @brief Communication chain. */ typedef struct fpc_com_chain fpc_com_chain_t; /** Communication chain struct */ struct fpc_com_chain { /** Initialization status */ bool initialized; /** * @name HCP Layer * @{ */ /** Argument allocator interface function */ void *(*argument_allocator)(fpc_hcp_cmd_t cmd, fpc_hcp_arg_t arg, uint16_t size, bool *free_data, void *context); /** Argument free interface function */ void (*argument_free)(fpc_hcp_cmd_t cmd, fpc_hcp_arg_data_t *arg_data, void *context); /** @} */ /** CRC calculation interface function */ uint32_t (*crc_calc)(uint32_t start, const void *data, uint32_t size); /** * @name Application Layer * @{ */ /** Application layer transmit interface function */ fpc_com_result_t (*app_tx)(fpc_com_chain_t *chain); /** Application layer receive interface function */ fpc_com_result_t (*app_rx)(fpc_com_chain_t *chain); /** Application layer overhead get interface function */ uint16_t (*app_overhead_get)(uint16_t *offset); /** Application packet sizes */ uint16_t app_packet_size[2]; /** Application MTU sizes */ uint16_t app_mtu_size[2]; /** Application MTU buffers */ uint8_t *app_mtu_buffer[2]; /** @} */ /** * @name Transport Layer * @{ */ /** Transport layer transmit interface function */ fpc_com_result_t (*tsp_tx)(fpc_com_packet_tsp_t *packet, fpc_com_chain_t *chain); /** Transport layer receive interface function */ fpc_com_result_t (*tsp_rx)(fpc_com_packet_tsp_t *packet, fpc_com_chain_t *chain); /** Transport layer overhead get interface function */ uint16_t (*tsp_overhead_get)(uint16_t *offset); /** @} */ /** * @name Link Layer * @{ */ /** Link layer overhead get interface function */ uint16_t (*link_overhead_get)(uint16_t *offset); /** Communication channel */ fpc_com_channel_t channel; /** @} */ /** * @name Physical Layer * @{ */ /** Physical layer transmit interface function */ fpc_com_result_t (*phy_tx)(uint16_t size, const uint8_t *buffer, uint32_t timeout, void *session); /** Physical layer receive interface function */ fpc_com_result_t (*phy_rx)(uint16_t size, uint8_t *buffer, uint32_t timeout, void *session); /** Physical MTU sizes */ uint16_t phy_mtu_size[2]; /** Physical MTU buffers */ uint8_t *phy_mtu_buffer[2]; /** Physical transmit timeout */ uint32_t phy_timeout_tx; /** Physical receive timeout */ uint32_t phy_timeout_rx; /** @} */ /** Communication change private variables */ fpc_com_chain_private_t private_vars; /** * @brief User session pointer. * User private stuff, to be able to pass necessary info from the layer that * calls hcp down to the user's TX and RX functions (phy_tx/rx), to enable * multi threaded applications at the host side. */ void *session; /** * @brief User context pointer. * User private stuff, to be able to pass nessecary context to argument_allocator and * argument_free. */ void *context; }; /** * @brief Communication chain direction type. */ typedef enum { FPC_COM_CHAIN_TX = 0, FPC_COM_CHAIN_RX = 1, } fpc_com_chain_dir_t; #endif /* FPC_COM_CHAIN_H */