对比新文件 |
| | |
| | | /* |
| | | * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and |
| | | * its subsidiaries and affiliates (collectly called MKSEMI). |
| | | * |
| | | * All rights reserved. |
| | | * |
| | | * Redistribution and use in source and binary forms, with or without |
| | | * modification, are permitted provided that the following conditions are met: |
| | | * |
| | | * 1. Redistributions of source code must retain the above copyright notice, |
| | | * this list of conditions and the following disclaimer. |
| | | * |
| | | * 2. Redistributions in binary form, except as embedded into an MKSEMI |
| | | * integrated circuit in a product or a software update for such product, |
| | | * must reproduce the above copyright notice, this list of conditions and |
| | | * the following disclaimer in the documentation and/or other materials |
| | | * provided with the distribution. |
| | | * |
| | | * 3. Neither the name of MKSEMI nor the names of its contributors may be used |
| | | * to endorse or promote products derived from this software without |
| | | * specific prior written permission. |
| | | * |
| | | * 4. This software, with or without modification, must only be used with a |
| | | * MKSEMI integrated circuit. |
| | | * |
| | | * 5. Any software provided in binary form under this license must not be |
| | | * reverse engineered, decompiled, modified and/or disassembled. |
| | | * |
| | | * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED |
| | | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| | | * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| | | * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY |
| | | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| | | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| | | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| | | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| | | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| | | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| | | */ |
| | | |
| | | #ifndef UWB_API_H_ |
| | | #define UWB_API_H_ |
| | | #include "mk_common.h" |
| | | #include "mk_uwb.h" |
| | | #include "lib_ranging.h" |
| | | |
| | | /** |
| | | * @addtogroup MK8000_UCI_CMDS |
| | | * @{ |
| | | */ |
| | | |
| | | /** Fira Certification */ |
| | | #ifndef FIRA_TEST_EN |
| | | #define FIRA_TEST_EN (1) |
| | | #endif |
| | | |
| | | #ifndef MCTT_TEST_EN |
| | | #define MCTT_TEST_EN (0) |
| | | #endif |
| | | |
| | | #ifndef DYNAMIC_UPDATE_MAIN_ANTENNA_EN |
| | | #define DYNAMIC_UPDATE_MAIN_ANTENNA_EN (0) |
| | | #endif |
| | | |
| | | #ifndef UWB_DUAL_RADAR |
| | | #define UWB_DUAL_RADAR (0) |
| | | #endif |
| | | |
| | | #define RANGING_CORR (0) |
| | | |
| | | /// Session State Code |
| | | #define SESSION_STATE_INIT (0x00) |
| | | #define SESSION_STATE_DEINIT (0x01) |
| | | #define SESSION_STATE_ACTIVE (0x02) |
| | | #define SESSION_STATE_IDLE (0x03) |
| | | |
| | | /** UWBS is initialized and ready for UWB */ |
| | | #define DEVICE_STATE_READY (0x01) |
| | | /** UWBS is busy with UWB session */ |
| | | #define DEVICE_STATE_ACTIVE (0x02) |
| | | /** Error occurred within the UWBS */ |
| | | #define DEVICE_STATE_ERROR (0xFF) |
| | | #define DEVICE_STATE_NONE (0x00) |
| | | |
| | | // type of session, 0x01-0x9F RFU |
| | | #define SESSION_TYPE_RANGING (0x00) |
| | | #define SESSION_TYPE_RANGING_IN_BAND_DATA (0x01) |
| | | #define SESSION_TYPE_DATA_TRANSFER (0x02) |
| | | #define SESSION_TYPE_RANGING_ONLY (0x03) |
| | | #define SESSION_TYPE_IN_BAND_DATA (0x04) |
| | | #define SESSION_TYPE_RANGING_WITH_DATA (0x05) |
| | | // 0xA0-0x9F Reserved for Vendor Specific use case |
| | | // device test mode, 0xD1-0xDF RFU |
| | | #define SESSION_TYPE_DEVICE_TEST_MODE (0xD0) |
| | | // 0xE0-0xFE Vendor Specific use |
| | | #define SESSION_TYPE_VENDOR_RANGING_AND_RADAR (0xFD) |
| | | #define SESSION_TYPE_VENDOR_ALONE_RADAR (0xFE) |
| | | |
| | | #define FREQ_OFFSET_SAMPLES_NUM 5 |
| | | |
| | | #define INITIATION_NUM (4) |
| | | |
| | | // In Fira spec the number of controlees 1~8 |
| | | #ifndef RESPONDER_NUM_MAX |
| | | #define RESPONDER_NUM_MAX (8) |
| | | #endif |
| | | |
| | | #ifndef BIT_MAP_SIZE_MAX |
| | | #define BIT_MAP_SIZE_MAX (32) |
| | | #endif |
| | | |
| | | #define MEASUREMENT_NUM_MAX (RESPONDER_NUM_MAX) |
| | | #define SLOT_NUM_PER_ROUND(x) (4 + 2 * (x)) |
| | | #define SLOT_NUM_PER_ROUND_FOR_SS_TWR(x) (3 + 2 * (x)) |
| | | #define SLOT_NUM_PER_ROUND_FOR_NON_DEFERRED_DS_TWR(x) (2 + 2 * (x)) |
| | | #define SLOT_NUM_PER_ROUND_FOR_NON_DEFERRED_SS_TWR(x) (1 + (x)) |
| | | |
| | | #define UCI_MAJOR 1 |
| | | #define UCI_MINOR 1 |
| | | #define UCI_MAINTENANCE 0 |
| | | |
| | | #define MAC_MAJOR 1 |
| | | #define MAC_MINOR 3 |
| | | #define MAC_MAINTENANCE 0 |
| | | |
| | | #define PHY_MAJOR 1 |
| | | #define PHY_MINOR 3 |
| | | #define PHY_MAINTENANCE 0 |
| | | |
| | | #define UCI_TEST_MAJOR 1 |
| | | #define UCI_TEST_MINOR 1 |
| | | #define UCI_TEST_MAINTENANCE 0 |
| | | |
| | | #define UCI_HEADER_SIZE (4) |
| | | #define UCI_MAX_PAYLOAD_SIZE (255) |
| | | |
| | | #define UWB_MODE_IDLE 0 |
| | | #define UWB_MODE_READY 1 |
| | | #define UWB_MODE_TX 2 |
| | | #define UWB_MODE_RX 4 |
| | | #define UWB_MODE_RANGING 3 |
| | | #define UWB_MODE_TEST_PERIODIC_TX 6 |
| | | #define UWB_MODE_TEST_PER_RX 7 |
| | | #define UWB_MODE_TEST_RX 8 |
| | | #define UWB_MODE_VENDOR_RX 9 |
| | | #define UWB_MODE_VENDOR_CARRIER_TX 10 |
| | | #define UWB_MODE_TEST_SS_TWR 11 |
| | | |
| | | /** UWB status */ |
| | | enum UWB_STATUS_T |
| | | { |
| | | STATUS_OK = 0x00, |
| | | STATUS_REJECTED = 0x01, |
| | | STATUS_FAILED = 0x02, |
| | | STATUS_SYNTAX_ERROR = 0x03, |
| | | STATUS_INVALID_PARAM = 0x04, |
| | | STATUS_INVALID_RANGE = 0x05, |
| | | STATUS_INVALID_MESSAGE_SIZE = 0x06, |
| | | STATUS_UNKNOWN_GID = 0x07, |
| | | STATUS_UNKNOWN_OID = 0x08, |
| | | STATUS_READ_ONLY = 0x09, |
| | | STATUS_COMMAND_RETRY = 0x0A, |
| | | |
| | | STATUS_ERROR_SESSION_NOT_EXIST = 0x11, |
| | | STATUS_ERROR_SESSION_DUPLICATE = 0x12, |
| | | STATUS_ERROR_SESSION_ACTIVE = 0x13, |
| | | STATUS_ERROR_MAX_SESSIONS_EXCEEDED = 0x14, |
| | | STATUS_ERROR_SESSION_NOT_CONFIGURED = 0x15, |
| | | STATUS_ERROR_ACTIVE_SESSIONS_ONGOING = 0x16, |
| | | STATUS_ERROR_MULTICAST_LIST_FULL = 0x17, |
| | | STATUS_ERROR_ADDRESS_NOT_FOUND = 0x18, |
| | | STATUS_ERROR_ADDRESS_ALREADY_PRESENT = 0x19, |
| | | |
| | | STATUS_ERROR_UWB_INITIATION_TIME_TOO_OLD = 0x1A, |
| | | STATUS_OK_NEGATIVE_DISTANCE_REPORT = 0x1B, |
| | | |
| | | STATUS_RANGING_TX_FAILED = 0x20, |
| | | STATUS_RANGING_RX_TIMEOUT = 0x21, |
| | | STATUS_RANGING_RX_PHY_DEC_FAILED = 0x22, |
| | | STATUS_RANGING_RX_PHY_TOA_FAILED = 0x23, |
| | | STATUS_RANGING_RX_PHY_STS_FAILED = 0x24, |
| | | STATUS_RANGING_RX_MAC_DEC_FAILED = 0x25, |
| | | STATUS_RANGING_RX_MAC_IE_DEC_FAILED = 0x26, |
| | | STATUS_RANGING_RX_MAC_IE_MISSING = 0x27, |
| | | STATUS_ERROR_ROUND_INDEX_NOT_ACTIVATED = 0x28, |
| | | STATUS_ERROR_NUMBER_OF_ACTIVE_RANGING_ROUNDS_EXCEEDED = 0x29, |
| | | STATUS_ERROR_ROUND_INDEX_NOT_SET_AS_INITIATOR = 0x2A, |
| | | STATUS_ERROR_DL_TDOA_DEVICE_ADDRESS_NOT_MATCHING_IN_REPLY_TIME_LIST = 0x2B, |
| | | |
| | | STATUS_DEBUG_FLASH_IS_CLOSED = 0x30, |
| | | STATUS_DEBUG_ERASE_ERROR = 0x31, |
| | | STATUS_DEBUG_READ_MEM_ERROR = 0x32, |
| | | STATUS_DEBUG_WRITE_MEM_ERROR = 0x33, |
| | | STATUS_DEBUG_SE_INIT_FAILED = 0x33, |
| | | STATUS_DEBUG_SE_READ_AID_FAILED = 0x34, |
| | | STATUS_RANGING_RX_RESPONSE_OK = 0x35, |
| | | |
| | | /* Vendor Specific status code 0x55 - 0xFF */ |
| | | STATUS_VENDOR_RESERVED = 0xFF, |
| | | }; |
| | | |
| | | /** UCI Action */ |
| | | typedef enum |
| | | { |
| | | ACTION_ADD_DEV = 0, |
| | | ACTION_DELETE_DEV = 1, |
| | | } ACTION_T; |
| | | |
| | | /** UWB device type */ |
| | | enum DEV_TYPE_T |
| | | { |
| | | DEV_TYPE_CONTROLEE = 0, |
| | | DEV_TYPE_CONTROLLER = 1, |
| | | }; |
| | | |
| | | /** UWB device role */ |
| | | enum DEV_ROLE_T |
| | | { |
| | | DEV_ROLE_RESPONDER = 0, |
| | | DEV_ROLE_INITIATOR = 1, |
| | | DEV_ROLE_UT_SYNC_ANCHOR = 2, /*!< UT-Synchronization Anchor */ |
| | | DEV_ROLE_UT_ANCHOR = 3, /*!< UT-Anchor */ |
| | | DEV_ROLE_UT_TAG = 4, /*!< UT-Tag */ |
| | | DEV_ADVERTISER = 5, /*!< Advertiser */ |
| | | DEV_OBSERVER = 6, /*!< Observer */ |
| | | DEV_DT_ANCHOR = 7, /*!< DT-Anchor */ |
| | | DEV_DT_TAG = 8, /*!< DT-Tag */ |
| | | DEV_ROLE_GATE_CONTROLLER = 9, |
| | | DEV_ROLE_GATE_CONTROLEE = 10, |
| | | DEV_ROLE_TAG = 11, |
| | | }; |
| | | |
| | | /** UWB ranging method */ |
| | | enum RANGING_MODE_T |
| | | { |
| | | OWR_UL_TDOA = 0, |
| | | SS_TWR_DEFERRED = 1, |
| | | DS_TWR_DEFERRED = 2, |
| | | SS_TWR = 3, |
| | | DS_TWR = 4, |
| | | OWR_DL_TDOA = 5, |
| | | OWR_AOA = 6, |
| | | ESS_TWR_CONTENTION = 7, |
| | | DS_TWR_CONTENTION = 8, |
| | | HYBRID_MODE = 9, |
| | | DATA_TRANSFER_PHASE = 10, |
| | | TWS_MODE = 11, |
| | | UWB_AUDIO_MODE = 12, |
| | | }; |
| | | |
| | | /** Multi node mode */ |
| | | enum MULTI_NODE_MODE_T |
| | | { |
| | | UNICAST = 0, |
| | | ONE_TO_MANY = 1, |
| | | MANY_TO_MANY = 2, |
| | | }; |
| | | |
| | | /** OWR message type */ |
| | | enum OWR_MESSAGE_TYPE_T |
| | | { |
| | | OWR_BLINK_UTM = 0, |
| | | OWR_SYNV_UTM = 1, |
| | | OWR_POLL_DTM = 2, |
| | | OWR_RESPONSE_DTM = 3, |
| | | OWR_FINAL_DTM = 4, |
| | | OWR_AOA_ADV = 5, |
| | | }; |
| | | |
| | | /** UWB SFD ID */ |
| | | enum SFD_ID_T |
| | | { |
| | | SFD0_LEN8 = 0, |
| | | SFD1_LEN4 = 1, |
| | | SFD2_LEN8 = 2, |
| | | SFD3_LEN16 = 3, |
| | | SFD4_LEN32 = 4, |
| | | /* MKSEMI parameters */ |
| | | SFD5_NON_STD_LEN8 = 5, // non-std 8 |
| | | SFD6_NON_STD_LEN16 = 6, // non-std 16 |
| | | SFD7_STD_LONG_LEN64 = 7, // 15.4a long |
| | | }; |
| | | |
| | | /** UWB PSDU data rate */ |
| | | enum PSDU_DATA_RATE_T |
| | | { |
| | | BPS_6M8 = 0, // K = 3 |
| | | BPS_7M8 = 1, // K = 7 |
| | | BPS_27M2 = 2, // K = 3 |
| | | BPS_31M2 = 3, // K = 7 |
| | | BPS_850K = 4, // K = 3 |
| | | BPS_54M4 = 5, |
| | | BPS_110K = 6, |
| | | }; |
| | | |
| | | /** UWB Preamble length */ |
| | | enum PREAMBLE_DURATION_T |
| | | { |
| | | SYMBOLS_32 = 0, |
| | | SYMBOLS_64 = 1, |
| | | /* MKSEMI parameter */ |
| | | SYMBOLS_16 = 7, |
| | | SYMBOLS_24 = 8, |
| | | SYMBOLS_48 = 9, |
| | | SYMBOLS_96 = 10, |
| | | SYMBOLS_128 = 11, |
| | | SYMBOLS_256 = 12, |
| | | SYMBOLS_512 = 13, |
| | | SYMBOLS_1024 = 14, |
| | | SYMBOLS_2048 = 15, |
| | | SYMBOLS_4096 = 16, |
| | | }; |
| | | |
| | | /** UWB mean PRF mode */ |
| | | enum PRF_MODE_T |
| | | { |
| | | /* Fira standard parameter */ |
| | | PRF_62M4 = 0, // BPRF |
| | | PRF_124M8 = 1, // HPRF |
| | | PRF_249M6 = 2, // HPRF 27.2M 31.2M |
| | | /* MKSEMI parameters */ |
| | | PRF_154A_15M6 = 7, |
| | | PRF_154A_62M4 = 8, |
| | | PRF_PROPRI_15M6 = 9, |
| | | PRF_PROPRI_62M4 = 10, |
| | | }; |
| | | |
| | | /** UWB STS segments number */ |
| | | enum STS_SEGMENTS_NUM_T |
| | | { |
| | | STS_SEGMENTS_NO = 0, |
| | | STS_SEGMENTS_1 = 1, |
| | | STS_SEGMENTS_2 = 2, |
| | | STS_SEGMENTS_3 = 3, |
| | | STS_SEGMENTS_4 = 4, |
| | | }; |
| | | |
| | | /** UWB STS segments length */ |
| | | enum STS_SEGMENTS_LENGTH_T |
| | | { |
| | | // Fira parameters |
| | | STS_SEG_LEN32 = 0, |
| | | STS_SEG_LEN64 = 1, |
| | | STS_SEG_LEN128 = 2, |
| | | // MKSEMI MK8000 support sts segments length |
| | | STS_SEG_LEN16 = 7, |
| | | STS_SEG_LEN256 = 8, |
| | | }; |
| | | |
| | | /** UWB MAC address mode */ |
| | | enum MAC_ADDRESS_MODE_T |
| | | { |
| | | ARRD_SHORT_USE_SHORT = 0, // MAC address is 2 bytes and 2 bytes to be used in MAC header |
| | | ADDR_LONG_USE_SHORT = 1, // MAC address is 8 bytes and 2 bytes to be used in MAC header (Not supported) |
| | | ADDR_LONG_USE_LONG = 2, // MAC address is 8 bytes and 8 bytes to be used in MAC header |
| | | }; |
| | | |
| | | /** CRC type in MAC footer */ |
| | | enum MAC_FCS_TYPE_T |
| | | { |
| | | FCS_CRC_16 = 0, // CRC 16 (default) |
| | | FCS_CRC_32 = 1, // CRC 32 |
| | | }; |
| | | |
| | | /** UWB STS config */ |
| | | enum STS_CONFIG_T |
| | | { |
| | | STS_STATIC = 0, |
| | | STS_DYNAMIC = 1, |
| | | STS_DYNAMIC_SUB = 2, |
| | | }; |
| | | |
| | | /** UWB Rframe type */ |
| | | enum RFRAME_TYPE_T |
| | | { |
| | | SP0 = 0, |
| | | SP1 = 1, |
| | | SP3 = 3, |
| | | }; |
| | | |
| | | /** UWB ranging flow mode */ |
| | | enum RANGING_FLOW_MODE_T |
| | | { |
| | | RANGING_FLOW_FIRA = 0, |
| | | RANGING_FLOW_CUSTOM = 1, |
| | | RANGING_FLOW_CCC = 2, |
| | | RANGING_FLOW_NONE = 3, |
| | | RANGING_FLOW_SIMPLE = 4, |
| | | RANGING_FLOW_CONTENTION = 5, |
| | | RANGING_FLOW_DATA_TRANSFER = 6, |
| | | }; |
| | | |
| | | /** UWB ranging stage */ |
| | | enum RANGING_STAGE_T |
| | | { |
| | | // Simple/Custom |
| | | RANGING_IDLE = 0x00, |
| | | RANGING_SYNC = 0x01, |
| | | RANGING_POLL = 0x02, |
| | | RANGING_RESPONSE = 0x03, |
| | | RANGING_FINAL = 0x04, |
| | | RANGING_CFG = 0x05, |
| | | RANGING_RESULT = 0x06, |
| | | // CCC |
| | | RANGING_PRE_POLL = 0x07, |
| | | RANGING_FINAL_DATA = 0x08, |
| | | // FIRA |
| | | RANGING_RMM = 0x09, |
| | | RANGING_RCM = 0x0A, |
| | | RANGING_RIM = 0x0B, |
| | | RANGING_RRM = 0x0C, |
| | | RANGING_RFM = 0x0D, |
| | | RANGING_MRM = 0x0E, |
| | | RANGING_RRRM = 0x0F, |
| | | // Contention-based |
| | | RANGING_MRM_TX = 0x10, |
| | | RANGING_MRM_RX = 0x11, |
| | | // Data Transfer |
| | | RANGING_DTPCM = 0x12, |
| | | RANGING_DM_TX = 0x13, |
| | | RANGING_DM_RX = 0x14, |
| | | #if UWB_DUAL_RADAR |
| | | // Ranging Radar |
| | | RANGING_RADAR = 0x15, |
| | | #endif |
| | | }; |
| | | |
| | | /** UWB device config parameters */ |
| | | struct DEVICE_CFG_PARAM_T |
| | | { |
| | | uint8_t device_state; |
| | | uint8_t low_power_mode; |
| | | }; |
| | | |
| | | /** UWB application config parameters */ |
| | | struct APP_CFG_PARAM_T |
| | | { |
| | | uint8_t device_type; // 0x00 |
| | | uint8_t ranging_round_usage; // 0x01 |
| | | uint8_t sts_config; // 0x02 |
| | | uint8_t multi_node_mode; // 0x03 |
| | | |
| | | uint8_t ch_num; // 0x04 |
| | | uint8_t controlees_num; // 0x05 |
| | | uint8_t res1[2]; |
| | | |
| | | uint8_t src_dev_mac_addr[8]; // 0x06 |
| | | uint8_t dst_dev_mac_addr[64]; // 0x07 |
| | | |
| | | uint16_t slot_duration; // 0x08 |
| | | uint8_t res2[2]; |
| | | |
| | | uint32_t ranging_interval; // 0x09 |
| | | uint32_t sts_index; // 0x0A |
| | | |
| | | uint8_t mac_fcs_type; // 0x0B |
| | | uint8_t ranging_round_control; // 0x0C |
| | | uint8_t aoa_result_req; // 0x0D |
| | | uint8_t session_info_ntf_cfg; // 0x0E |
| | | |
| | | uint16_t near_proximity_cfg; // 0x0F |
| | | uint16_t far_proximity_cfg; // 0x10 |
| | | |
| | | uint8_t device_role; // 0x11 |
| | | uint8_t rframe_config; // 0x12 |
| | | uint8_t rssi_reporting; // 0x13 |
| | | uint8_t preamble_code_index; // 0x14 |
| | | |
| | | uint8_t sfd_id; // 0x15 |
| | | uint8_t psdu_data_rate; // 0x16 |
| | | uint8_t preamble_duration; // 0x17 |
| | | uint8_t link_layer_mode; // 0x18 |
| | | |
| | | uint8_t data_repetition_count; // 0x19 |
| | | uint8_t ranging_time_struct; // 0x1A |
| | | uint8_t slots_per_round; // 0x1B |
| | | uint8_t tx_adaptive_payload_pwr; // 0x1C |
| | | |
| | | int16_t azimuth_lower_bound; // 0x1D Octet[1:0] |
| | | int16_t azimuth_upper_bound; // 0x1D Octet[2:3] |
| | | int16_t elevation_lower_bound; // 0x1D Octet[5:4] |
| | | int16_t elevation_upper_bound; // 0x1D Octet[6:7] |
| | | |
| | | uint8_t responder_slot_idx; // 0x1E |
| | | uint8_t prf_mode; // 0x1F |
| | | uint8_t max_cap_size; // 0x20 Octet[0] |
| | | uint8_t min_cap_size; // 0x20 Octet[1] |
| | | |
| | | uint8_t tx_jitter_win_size; // 0x21 |
| | | uint8_t scheduled_mode; // 0x22 |
| | | uint8_t key_rotation; // 0x23 |
| | | uint8_t key_rotation_rate; // 0x24 |
| | | |
| | | uint8_t session_priority; // 0x25 |
| | | uint8_t mac_address_mode; // 0x26 |
| | | uint8_t vendor_id[2]; // 0x27 |
| | | |
| | | uint8_t static_sts_iv[6]; // 0x28 |
| | | uint8_t sts_segment_num; // 0x29 |
| | | uint8_t res3; |
| | | |
| | | uint16_t max_rr_retry; // 0x2A |
| | | uint8_t res4[2]; |
| | | #if FIRA_TEST_EN |
| | | uint32_t uwb_initiation_time; // 0x2B |
| | | #else |
| | | uint64_t uwb_initiation_time; // 0x2B |
| | | #endif |
| | | uint8_t hopping_mode; // 0x2C |
| | | uint8_t stride_length; // 0x2D |
| | | uint8_t result_report_config; // 0x2E |
| | | uint8_t inband_term_attempt_cnt; // 0x2F |
| | | |
| | | uint32_t sub_session_id; // 0x30 |
| | | |
| | | uint8_t bprf_phr_data_rate; // 0x31 |
| | | uint8_t res5; |
| | | uint16_t max_num_measurements; // 0x32 |
| | | |
| | | uint32_t ul_tdoa_tx_interval; // 0x33 |
| | | uint32_t ul_tdoa_random_window; // 0x34 |
| | | |
| | | uint8_t sts_segment_len; // 0x35 |
| | | uint8_t suspend_ranging_rounds; // 0x36 |
| | | uint8_t res6[2]; |
| | | |
| | | uint8_t ul_tdoa_ntf_report_config[3]; // 0x37 |
| | | uint8_t ul_tdoa_device_id[9]; // 0x38 |
| | | |
| | | uint8_t ul_tdoa_tx_timestamp; // 0x39 |
| | | uint8_t min_frames_per_rr; // 0x3A |
| | | uint16_t mtu_size; // 0x3B |
| | | |
| | | uint8_t inter_frame_interval; // 0x3C |
| | | uint8_t dl_tdoa_ranging_method; // 0x3D |
| | | uint8_t dl_tdoa_tx_timestamp_conf; // 0x3E |
| | | uint8_t dl_tdoa_hop_count; // 0x3F |
| | | |
| | | uint8_t dl_tdoa_anchor_cfo; // 0x40 |
| | | uint8_t res7[2]; |
| | | uint8_t dl_tdoa_anchor_location[13]; // 0x41 |
| | | uint8_t dl_tdoa_tx_active_ranging_rounds; // 0x42 |
| | | uint8_t dl_tdoa_block_striding; // 0x43 |
| | | uint8_t dl_tdoa_time_reference_anchor; // 0x44 |
| | | uint8_t res8; |
| | | |
| | | uint8_t session_key[16]; // 0x45 |
| | | uint8_t sub_session_key[16]; // 0x46 |
| | | |
| | | uint8_t data_trans_st_ntf_cfg; // 0x47 |
| | | uint8_t res9[2]; |
| | | uint8_t session_tb_ctrl; // 0x48 Octet[0] ctrl |
| | | uint32_t session_tb_sesshdl; // 0x48 Octet[1:4] session handle |
| | | uint32_t session_tb_offset; // 0x48 Octet[5:8] Session offset time in microseconds |
| | | |
| | | uint8_t dl_tdoa_responder_tof; // 0x49 |
| | | uint8_t secure_ranging_nefa_level; // 0x4A |
| | | uint8_t search_ranging_csw_length; // 0x4B |
| | | uint8_t app_data_endpoint; // 0x4C |
| | | |
| | | /* Reserved for Vendor Specific use 0xA0-0xDF */ |
| | | /* Additional configuration applicable only for CCC */ |
| | | uint32_t hop_mode_key; // 0xA0 |
| | | uint16_t ranging_proto_ver; // 0xA3 |
| | | uint16_t uwb_cfg_id; // 0xA4 |
| | | uint8_t pulseshape_combo; // 0xA5 |
| | | |
| | | /* Reserved for Vendor Specific Use */ |
| | | uint8_t tx_power_level; // 0xF2 |
| | | uint8_t rx_ant_id; // 0xF3 |
| | | uint8_t per_payload_check; // 0xF4 |
| | | /* Coded in us with bit 15 == 0 */ |
| | | /* Coded in ms when bit 15 == 1 */ |
| | | uint16_t ranging_anchor_resp_delay; // 0xF5 |
| | | uint16_t ranging_tag_resp_delay; // 0xF6 |
| | | |
| | | /* UWB radar channel num {5, 9} |
| | | * (default = 9) */ |
| | | uint8_t uwb_radar_channel_num; // 0xF7 Octet[0] |
| | | /* UWB radar STS segment length |
| | | * 0x00: UWB_RADAR_STS_SEGLEN16 |
| | | * 0x01: UWB_RADAR_STS_SEGLEN32 |
| | | * 0x02: UWB_RADAR_STS_SEGLEN64 |
| | | * (default = 0x02) */ |
| | | uint8_t uwb_radar_sts_len; // 0xF7 Octet[1] |
| | | /* UWB radar pulse period |
| | | * 0x0: UWB_RADAR_PULSE_PERIOD 16ns |
| | | * 0x1: UWB_RADAR_PULSE_PERIOD 32ns |
| | | * 0x2: UWB_RADAR_PULSE_PERIOD 64ns |
| | | * 0x3: UWB_RADAR_PULSE_PERIOD 128ns |
| | | * 0x4: UWB_RADAR_PULSE_PERIOD 256ns |
| | | * (default 64ns) */ |
| | | uint8_t uwb_radar_pulse_period; // 0xF7 Octet[2] |
| | | /* UWB radar rx filter gain level |
| | | * 0 ~ 21 (default = 15) */ |
| | | uint8_t uwb_radar_rx_gain_level; // 0xF7 Octet[3] |
| | | /* UWB radar lna gain level 0 ~ 5 |
| | | * (defalut = 5) */ |
| | | uint8_t uwb_radar_lna_gain_level; // 0xF7 Octet[4] |
| | | /* UWB radar tx power level */ |
| | | uint8_t uwb_radar_tx_power_level; // 0xF7 Octet[5] |
| | | /* UWB radar tx pulse width |
| | | * 0x00: 2ns (Bandwidth 500M) |
| | | * 0x01: 0.92ns (Bandwidth 900M) |
| | | * 0x02: 0.75ns (Bandwidth 1.3G) |
| | | * (defalut = 0x02) */ |
| | | uint8_t uwb_radar_bandwidth; // 0xF7 Octet[6] |
| | | /* UWB radar rx antenna port ID |
| | | * 0x00: UWB_RX_ANTENNA 0 |
| | | * 0x01: UWB_RX_ANTENNA 1 |
| | | * 0x02: UWB_RX_ANTENNA 2 |
| | | * (defalut = 0x00) */ |
| | | uint8_t uwb_radar_rx_ant_id; // 0xF7 Octet[7] |
| | | uint8_t uwb_radar_req; // 0xF7 Octet[8] |
| | | }; |
| | | |
| | | /** UWB test config parameters */ |
| | | struct TEST_CFG_PARAM_T |
| | | { |
| | | // 0 - No randomization (default) |
| | | // 1 - Take first byte of data supplied by command and it SHALL be used as a seed for randomizing PSDU across |
| | | // packets |
| | | uint8_t randomize_psdu; |
| | | // 0x00: STS_INDEX config value is used for all PER Rx/ Periodic TX test. (default) |
| | | // 0x01: STS_INDEX value SHALL be incremented for every frame in PER Rx/Periodic TX test |
| | | uint8_t sts_index_auto_inc; |
| | | uint8_t reserved; |
| | | // Number of packets (default 1000) |
| | | uint32_t num_packets; |
| | | // Gap between start of one packet to the next in us (default 2000us) |
| | | uint32_t t_gap; |
| | | // Max. time from the start of T_GAP to SFD found state in us (default 450us) |
| | | // The SFD detection timeout |
| | | uint32_t t_start; |
| | | // Max. time for which RX is looking for a packet from the start of T_GAP in us (default 750us) |
| | | uint32_t t_win; |
| | | // Start time tx |
| | | uint32_t rmarker_tx_start; |
| | | // Start time rx |
| | | uint32_t rmarker_rx_start; |
| | | }; |
| | | |
| | | /** UWB core device informantion */ |
| | | struct CORE_DEVICE_INFO_T |
| | | { |
| | | uint16_t uci_generic_version; |
| | | uint16_t mac_version; |
| | | uint16_t phy_version; |
| | | uint16_t uci_test_version; |
| | | }; |
| | | |
| | | /** UWB core device capability */ |
| | | struct CORE_DEVICE_CAPS_INFO_T |
| | | { |
| | | // TBD |
| | | uint8_t none; |
| | | }; |
| | | |
| | | /** UWB session controlee device */ |
| | | struct SESSION_CONTROLEE_DEV_T |
| | | { |
| | | uint8_t short_addr[2]; |
| | | uint8_t sub_session_id[4]; |
| | | }; |
| | | |
| | | /* Multicast update status */ |
| | | struct CONTROLEE_STATUS |
| | | { |
| | | #define CONTROLEE_STATUS_FIX_LEN (7) |
| | | #define STATUS_OK_MULTICAST_LIST_UPDATE (0x00) |
| | | #define STATUS_ERROR_MULTICAST_LIST_Full (0x01) |
| | | #define STATUS_ERROR_KEY_FETCH_FAIL (0x02) |
| | | #define STATUS_ERROR_SUB_SESSION_ID_NOT_FOUND (0x03) |
| | | #define STATUS_ERROR_ADDRESS_NOT_FOUND (0x07) |
| | | #define STATUS_ERROR_ADDRESS_ALREADY_PRESENT (0x08) |
| | | // Controlee short MAC address |
| | | uint8_t mac_addr[2]; |
| | | // Sub-session for which multicast update requested |
| | | uint8_t sub_sessionID[4]; |
| | | // Multicast update status |
| | | uint8_t status; |
| | | }; |
| | | |
| | | /** UWB RX TEST report */ |
| | | struct TEST_RX_T |
| | | { |
| | | uint32_t rx_done_ts_int; |
| | | const uint8_t *psdu_data; |
| | | uint16_t rx_done_ts_frac; |
| | | // Q9.7 |
| | | int16_t aoa_azimuth; |
| | | int16_t aoa_elevation; |
| | | uint16_t phr; |
| | | uint16_t psdu_data_len; |
| | | uint8_t toa_gap; |
| | | uint8_t status; |
| | | }; |
| | | |
| | | /** UWB PER RX report */ |
| | | struct TEST_PER_RX_T |
| | | { |
| | | uint8_t status; |
| | | uint8_t reserved[3]; |
| | | uint32_t attempts; |
| | | uint32_t acq_detect; |
| | | uint32_t acq_reject; |
| | | uint32_t rx_fail; |
| | | uint32_t sync_cir_ready; |
| | | uint32_t sfd_fail; |
| | | uint32_t sfd_found; |
| | | uint32_t phr_dec_error; |
| | | uint32_t phr_bit_error; |
| | | uint32_t psdu_dec_error; |
| | | uint32_t psdu_bit_error; |
| | | uint32_t sts_found; |
| | | uint32_t eof; |
| | | }; |
| | | |
| | | /* UWB test packet TX done indication */ |
| | | struct TEST_TX_DONE_IND_T |
| | | { |
| | | uint32_t phy_timer_count; |
| | | uint32_t timestamp_int; /*!< Integer part of timestamp 1/124.8Mhz ticks. */ |
| | | uint16_t timestamp_frac; /*!< Fractional part of timestamp in 1/(128 * 499.2Mhz) ticks */ |
| | | uint16_t length; |
| | | uint16_t status; |
| | | uint8_t *data; |
| | | }; |
| | | |
| | | /* UWB test packet RX done indication */ |
| | | struct TEST_RX_DONE_IND_T |
| | | { |
| | | uint32_t phy_timer_count; |
| | | uint32_t timestamp_int; /*!< Integer part of timestamp 1/124.8Mhz ticks. */ |
| | | uint16_t timestamp_frac; /*!< Fractional part of timestamp in 1/(128 * 499.2Mhz) ticks */ |
| | | uint16_t phr_bits; |
| | | int8_t rssi; |
| | | int8_t snr; |
| | | uint16_t length; |
| | | uint16_t status; |
| | | uint8_t *data; |
| | | }; |
| | | |
| | | /** UWB ranging measurement report */ |
| | | struct RANGING_MEASUREMENT_T |
| | | { |
| | | uint8_t mac_addr[8]; |
| | | uint8_t status; |
| | | uint8_t NLoS; |
| | | uint16_t distance; |
| | | // Q9.7 |
| | | int16_t aoa_azimuth; |
| | | int16_t aoa_elevation; |
| | | uint8_t aoa_azimuth_fom; |
| | | uint8_t aoa_elevation_fom; |
| | | // Q9.7 |
| | | int16_t aoa_dst_azimuth; |
| | | int16_t aoa_dst_elevation; |
| | | uint8_t aoa_dst_azimuth_fom; |
| | | uint8_t aoa_dst_elevation_fom; |
| | | uint8_t slot_idx; |
| | | uint8_t rfu[12]; |
| | | uint8_t reserved; |
| | | }; |
| | | |
| | | /** UWB ranging data report */ |
| | | struct RANGE_DATA_T |
| | | { |
| | | uint32_t sequence_num; |
| | | uint32_t session_id; |
| | | // unit: ms |
| | | uint32_t ranging_interval; |
| | | uint8_t rcr_ind; |
| | | uint8_t ranging_type; |
| | | uint8_t mac_addr_mode; |
| | | uint8_t measurements_num; |
| | | struct RANGING_MEASUREMENT_T measurements[MEASUREMENT_NUM_MAX]; |
| | | }; |
| | | |
| | | /** UWB test environment variable */ |
| | | struct TEST_ENV_T |
| | | { |
| | | uint8_t enable; |
| | | uint8_t sync_flag; |
| | | uint16_t tx_pkt_len; |
| | | uint8_t *tx_pkt_data; |
| | | uint32_t trx_count_packet; /* This variable used to count how many packets were received or sent */ |
| | | uint32_t sync_time; /* This variable is used to record the timestamp of the synchronization moment (unit:8ns) */ |
| | | }; |
| | | |
| | | /** UWB operations handler */ |
| | | struct UWB_OP_T |
| | | { |
| | | void (*session_configure)(void); |
| | | void (*session_start)(void); |
| | | void (*session_stop)(void); |
| | | void (*session_local_addr_set)(uint16_t short_addr); |
| | | void (*session_peer_addr_set)(uint16_t short_addr); |
| | | uint8_t (*session_responder_addr_add)(uint16_t addr); |
| | | void (*session_responder_list_clr)(void); |
| | | uint8_t (*session_responder_num_get)(void); |
| | | uint16_t (*session_responder_addr_get)(uint8_t idx); |
| | | uint8_t (*session_dynamic_update_responder_list)(uint8_t action, uint16_t addr); |
| | | void (*session_set_ccc_ursk)(const uint8_t *ursk); |
| | | void (*vendor_session_start)(void); |
| | | void (*vendor_session_stop)(void); |
| | | void (*vendor_session_configure)(void); |
| | | }; |
| | | |
| | | /** UWB application configuration */ |
| | | struct UWB_APP_CFG_T |
| | | { |
| | | struct UWB_CONFIG_T ppdu_params; |
| | | struct APP_CFG_PARAM_T session_param; |
| | | struct TEST_CFG_PARAM_T test_param; |
| | | |
| | | uint8_t uwb_mode; |
| | | uint8_t low_power_en; |
| | | uint8_t filter_en; |
| | | uint8_t session_type; |
| | | uint8_t session_count; |
| | | uint8_t session_state; |
| | | uint8_t ranging_stage; |
| | | uint8_t ranging_flow_mode; |
| | | uint8_t responder_num_max; |
| | | |
| | | uint16_t cal_rounds; |
| | | uint16_t cal_count; |
| | | uint16_t target_cm; |
| | | int32_t delay_rstu; |
| | | int32_t ant_cal_distance_sum; |
| | | uint32_t session_id; |
| | | uint32_t ranging_count; |
| | | |
| | | // report |
| | | int32_t rssi_total; |
| | | int16_t rssi_num; |
| | | int8_t rssi_min; |
| | | int8_t rssi_max; |
| | | }; |
| | | |
| | | #ifdef __cplusplus |
| | | extern "C" { |
| | | #endif |
| | | |
| | | extern struct UWB_APP_CFG_T uwb_app_config; |
| | | extern struct TEST_ENV_T test_env; |
| | | extern struct TEST_PER_RX_T uci_test_rx_per; |
| | | extern struct TEST_RX_T uci_test_rx; |
| | | |
| | | typedef void (*range_report_cb_t)(void *report); |
| | | typedef void (*test_periodic_tx_report_cb_t)(uint32_t *send_num_pkt); |
| | | typedef void (*test_per_rx_report_cb_t)(struct TEST_PER_RX_T *report); |
| | | typedef void (*test_rx_report_cb_t)(struct TEST_RX_T *report); |
| | | typedef void (*test_ss_twr_report_cb_t)(uint8_t *, uint32_t); |
| | | typedef void (*vendor_rx_report_cb_t)(const uint16_t *data_len, const uint8_t *data); |
| | | typedef uint8_t (*vendor_user_defined_data_process_cb_t)(uint16_t cmd_len, const uint8_t *p_cmd); |
| | | |
| | | // UWB API |
| | | |
| | | /** |
| | | * @brief Reset UWB subsystem, all the sessions context de-initialized/destroyed, internal states are re-initialized. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_core_device_reset(void); |
| | | |
| | | /** |
| | | * @brief Retrieve the device information like (UCI version and other vendor specific info). |
| | | * @param[out] info @ref CORE_DEVICE_INFO_T buffer for the return information. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_core_get_device_info(struct CORE_DEVICE_INFO_T *info); |
| | | |
| | | /** |
| | | * @brief Get the capability of the UWB subsystem. |
| | | * @param[out] info @ref CORE_DEVICE_CAPS_INFO_T buffer for the return information. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_core_get_caps_info(struct CORE_DEVICE_CAPS_INFO_T *info); |
| | | |
| | | /** |
| | | * @brief Set the configuration parameters on the UWB subsystem. |
| | | * @param[in] cfg @ref DEVICE_CFG_PARAM_T configuration to be set. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_core_set_config(struct DEVICE_CFG_PARAM_T *cfg); |
| | | |
| | | /** |
| | | * @brief Get UWBS device state. |
| | | * @return UWBS device state |
| | | */ |
| | | uint8_t uwbapi_get_device_state(void); |
| | | |
| | | /** |
| | | * @brief Get the current configuration parameters of the UWB subsystem. |
| | | * @param[out] cfg @ref DEVICE_CFG_PARAM_T buffer for the return configuration. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_core_get_config(struct DEVICE_CFG_PARAM_T *cfg); |
| | | |
| | | /** |
| | | * @brief Create a new UWB session. |
| | | * @param[in] session_id session ID. |
| | | * @param[in] session_type session type. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_init(uint32_t session_id, uint8_t session_type); |
| | | |
| | | /** |
| | | * @brief De-initialize the session, cleanup the UWB session data associated with the session ID. |
| | | * @param[in] session_id session ID. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_deinit(uint32_t session_id); |
| | | |
| | | /** |
| | | * @brief Set application configuration parameters for the requested UWB session. |
| | | * @param[in] session_id session ID. |
| | | * @param[in] param @ref APP_CFG_PARAM_T parameter to be set. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_set_app_config(uint32_t session_id, struct APP_CFG_PARAM_T *param); |
| | | |
| | | /** |
| | | * @brief Retrieve the current application configuration parameters of the requested UWB session. |
| | | * @param[in] session_id session ID. |
| | | * @param[out] param @ref APP_CFG_PARAM_T buffer for the return configuration. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_get_app_config(uint32_t session_id, struct APP_CFG_PARAM_T *param); |
| | | |
| | | /** |
| | | * @brief Retrieve number of UWB sessions in the system. |
| | | * @return The number of UWB sessions. |
| | | */ |
| | | uint8_t uwbapi_session_get_count(void); |
| | | |
| | | /** |
| | | * @brief Query the current state of the UWB session |
| | | * @param[in] session_id session ID. |
| | | * @return UWB session state |
| | | */ |
| | | uint8_t uwbapi_session_get_state(uint32_t session_id); |
| | | |
| | | /** |
| | | * @brief Set state for the UWB session |
| | | * @param[in] session_id session ID. |
| | | * @param[in] session_state sesstion state |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_update_state(uint32_t session_id, uint8_t session_state); |
| | | |
| | | /** |
| | | * @brief Add or delete controlees dynamically during multicast ranging. |
| | | * @param[in] action add or delete |
| | | * @param[in] controlees_num number of controlees to be added or deleted |
| | | * @param[in] session_id sesstion ID |
| | | * @param[in] controlee_list controlee list |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_update_controller_multicast_list(uint8_t action, |
| | | uint8_t controlees_num, |
| | | uint32_t session_id, |
| | | const struct SESSION_CONTROLEE_DEV_T *controlee_list, |
| | | struct CONTROLEE_STATUS *controlees_status_list); |
| | | |
| | | /** |
| | | * @brief Start the UWB session, while the UWB session is ongoing, the UWB subsystem shall report ranging result when the ranging round is complete. |
| | | * @param[in] session_id session ID. |
| | | * @param[in] func callback function to report ranging result. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_start(uint32_t session_id, range_report_cb_t func); |
| | | |
| | | /** |
| | | * @brief Stop the UWB session. |
| | | * @param[in] session_id session ID. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_session_stop(uint32_t session_id); |
| | | |
| | | /** |
| | | * @brief Get the number of times ranging has been attempted during the ranging session. |
| | | * @param[in] session_id session ID. |
| | | * @param[out] count buffer for the return ranging count value. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_range_get_ranging_count(uint32_t session_id, uint8_t *count); |
| | | |
| | | /** |
| | | * @brief Set the configuration parameters for the test session. |
| | | * @param[out] param @ref TEST_CFG_PARAM_T configuration parameters to be set. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_config_set(struct TEST_CFG_PARAM_T *param); |
| | | |
| | | /** |
| | | * @brief Get the current configuration parameters of the test session. |
| | | * @param[out] param @ref TEST_CFG_PARAM_T buffer for the return configuration parameters. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_config_get(struct TEST_CFG_PARAM_T *param); |
| | | |
| | | /** |
| | | * @brief Start periodic TX test. |
| | | * @param[in] psdu_len the length of packet to be sent periodically. |
| | | * @param[in] psdu_data the packet data to be sent periodically, including FCS. |
| | | * @param[in] func callback function to notify a configured number of packets have been sent. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_periodic_tx(uint16_t psdu_len, const uint8_t *psdu_data, test_periodic_tx_report_cb_t func); |
| | | |
| | | /** |
| | | * @brief Start packet error rate (PER) RX test. |
| | | * @param[in] psdu_len the length of packet to be received periodically. |
| | | * @param[in] psdu_data the packet data to be received periodically, including FCS. |
| | | * @param[in] func callback function to report PER result when a configured number of packets have been elapsed. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_per_rx(uint16_t psdu_len, const uint8_t *psdu_data, test_per_rx_report_cb_t func); |
| | | |
| | | /** |
| | | * @brief Start RX test, this API is used to receive single packet and report signal parameters like SNR, AoA etc. |
| | | * @param[in] func callback function to report RX test result. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_rx(test_rx_report_cb_t func); |
| | | |
| | | /** |
| | | * @brief Start loopback test, this API can be used as self-test to verify functional capabilities of UWBS device without any other UWBS device. |
| | | * @param[in] psdu_len test packet length. |
| | | * @param[in] psdu_data test packet data. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_loopback(uint8_t psdu_len, const uint8_t *psdu_data); |
| | | |
| | | /** |
| | | * @brief Start SS-TWR test, This API can be used to measure single SS-TWR ToF using SP3 packets. |
| | | * @param[in] func callback function to report result. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_ss_twr(test_ss_twr_report_cb_t func); |
| | | |
| | | /** |
| | | * @brief Stop the test session. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_test_stop_session(void); |
| | | |
| | | /** |
| | | * @brief Start vendor defined continuous RX test. |
| | | * @param[in] func callback function to report result. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_vendor_rx_pkt_start(vendor_rx_report_cb_t func); |
| | | |
| | | /** |
| | | * @brief Stop vendor defined continuous RX test. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_vendor_rx_pkt_stop(void); |
| | | |
| | | /** |
| | | * @brief Start ouput carrier. |
| | | * @param[in] data_len data length. |
| | | * @param[in] data payload |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_vendor_tx_carrier_only_start(uint8_t data_len, const uint8_t *data); |
| | | |
| | | /** |
| | | * @brief Stop ouput carrier. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_vendor_tx_carrier_only_stop(void); |
| | | |
| | | /** |
| | | * @brief Start to transmit UWB CW in blocking mode. |
| | | * @param[in] data_len data length. |
| | | * @param[in] data payload |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_vendor_block_tx_start(uint8_t data_len, const uint8_t *data); |
| | | |
| | | /** |
| | | * @brief Report uwb radar raw data from UWBS to host |
| | | * @param[in] data_len radar raw data length. |
| | | * @param[in] raw_data radar raw data |
| | | */ |
| | | void uwbapi_report_radar_raw_data(uint16_t data_len, const uint8_t *raw_data); |
| | | |
| | | /** |
| | | * @brief Report channel status information |
| | | * @param[in] csi channel status information |
| | | */ |
| | | void uwbapi_report_debug_csi_data(struct RANGING_CSI_T *csi); |
| | | |
| | | /** |
| | | * @brief Report ranging data from UWBS to host |
| | | * @param[in] report report data. |
| | | */ |
| | | void uwbapi_report_ranging_data(void *report); |
| | | |
| | | /** |
| | | * @brief Report periodic tx test result from UWBS to host |
| | | * @param[in] send_num_pkt packet number. |
| | | */ |
| | | void uwbapi_report_periodic_tx_data(uint32_t *send_num_pkt); |
| | | |
| | | /** |
| | | * @brief Report PER RX test result from UWBS to host |
| | | * @param[in] report report data. |
| | | */ |
| | | void uwbapi_report_per_rx_data(struct TEST_PER_RX_T *report); |
| | | |
| | | /** |
| | | * @brief Report RX test result from UWBS to host |
| | | * @param[in] report report data. |
| | | */ |
| | | void uwbapi_report_rx_test_data(struct TEST_RX_T *report); |
| | | |
| | | /** |
| | | * @brief Report vendor defined continuous RX test result from UWBS to host. |
| | | * @param[in] data_len packet length to be reported. |
| | | * @param[in] p_data packet data to be reported. |
| | | */ |
| | | void uwbapi_report_vendor_rx_pkt(const uint16_t *data_len, const uint8_t *data); |
| | | |
| | | /** |
| | | * @brief Report user defined data through UCI. |
| | | * @note The initialization of the UCI needs to be completed before calling this function. |
| | | * @note This function sends user-defined data to the host through the uci channel and you |
| | | * can call this function where you need it to transfer data to the host. |
| | | * @note The format of the data packet follows the UCI NTF data packet format GID=0xE, OID=0x5. |
| | | * | Octet0 | Octet1 | Octet2 | Octet3 | Octet4-Octet(4+L) | |
| | | * | NTF-PBF-GID | RFU-OID | RFU | rsp-length | Report-data | |
| | | * | 0x6E | 0x05 | 0x00 | xx | xx | |
| | | * @param[in] data_len packet length to be reported. |
| | | * @param[in] p_data packet data to be reported. |
| | | */ |
| | | void uwbapi_report_user_defined_data(uint8_t data_len, const uint8_t *p_data); |
| | | |
| | | /** |
| | | * @brief Registered user defined data processing function. |
| | | * @note Only after UCI is initialized, the registered function will be called in the interaction process between host and slave. |
| | | * @note The function will only be executed after the host sends a data in the following format, GID=0xE, OID=0x5. |
| | | * | Octet0 | Octet1 | Octet2 | Octet3 | Octet4-Octet(4+L) | |
| | | * | CMD-PBF-GID | RFU-OID | RFU | cmd-length | user-cmd-data | |
| | | * | 0x2E | 0x05 | 0x00 | xx | CMD DATA | |
| | | * @note The packet format of the Slave response is as follows and the value of code-err is the return |
| | | * value of this function. If the function is not registered, the value of code-err defaults to 0xFF. |
| | | * | Octet0 | Octet1 | Octet2 | Octet3 | Octet4 | Octet5 | |
| | | * | RSP-PBF-GID | RFU-OID | RFU | rsp-length | STATUS_OK | code-err | |
| | | * | 0x4E | 0x05 | 0x00 | 0x02 | 0x00 | default 0xFF | |
| | | * @note Do not perform delay operations in this function to avoid the slave response timeout. |
| | | * @param[in] func user-defined data processing function. |
| | | */ |
| | | void uwbapi_set_user_defined_data_process_handler(vendor_user_defined_data_process_cb_t func); |
| | | |
| | | /** |
| | | * @brief Set URSK for CCC work mode |
| | | * @param[in] ursk URSK data. |
| | | * @param[in] len URSK length. |
| | | * @return UWB Status code @ref UWB_STATUS_T |
| | | */ |
| | | uint8_t uwbapi_vendor_set_ccc_ursk(const uint8_t *ursk, uint16_t len); |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | // UWB Subsystem API |
| | | |
| | | /** |
| | | * @addtogroup MK8000_UWB_SUBSYSTEM |
| | | * @{ |
| | | */ |
| | | |
| | | /** |
| | | * @brief UWBS initialization. |
| | | */ |
| | | void uwbs_init(void); |
| | | |
| | | /** |
| | | * @brief Initialize UWBS process handler. |
| | | * @param[in] op processing handler list. |
| | | */ |
| | | void uwbs_handler_init(struct UWB_OP_T *op); |
| | | |
| | | /** |
| | | * @brief Configure UWB transceiver work at TX or RX mode. |
| | | * @param[in] mode work mode, PHY_TX or PHY_RX or both. |
| | | * @param[in] tx_power_level TX power level |
| | | */ |
| | | void uwbs_configure(uint8_t mode, uint8_t tx_power_level); |
| | | |
| | | /** |
| | | * @brief Get mac addr mode. |
| | | * @return Mac addr mode : short or long |
| | | */ |
| | | uint8_t uwbs_mac_addr_mode_get(void); |
| | | |
| | | /** |
| | | * @brief Set UWB mac addr mode. |
| | | * @param[in] mode mac addr mode @ref enum MAC_ADDRESS_MODE_T |
| | | * @return 0: success, -1: failed |
| | | */ |
| | | int uwbs_mac_addr_mode_set(enum MAC_ADDRESS_MODE_T mode); |
| | | |
| | | /** |
| | | * @brief Get UWBS local short address. |
| | | * @return Local short address |
| | | */ |
| | | uint16_t uwbs_local_short_addr_get(void); |
| | | |
| | | /** |
| | | * @brief Get UWBS peer short address. |
| | | * @return Peer short address |
| | | */ |
| | | uint16_t uwbs_peer_short_addr_get(void); |
| | | |
| | | /** |
| | | * @brief Set UWBS local short address. |
| | | * @param[in] short_addr Local short address to be set |
| | | */ |
| | | void uwbs_local_short_addr_set(uint16_t short_addr); |
| | | |
| | | /** |
| | | * @brief Set UWBS peer short address. |
| | | * @param[in] short_addr Peer short address to be set |
| | | */ |
| | | void uwbs_peer_short_addr_set(uint16_t short_addr); |
| | | |
| | | /** |
| | | * @brief Set UWBS local long address. |
| | | * @param[in] long_addr Local long address to be set |
| | | */ |
| | | void uwbs_local_long_addr_set(uint8_t long_addr[8]); |
| | | |
| | | /** |
| | | * @brief Set UWBS peer long address. |
| | | * @param[in] long_addr Peer long address to be set |
| | | */ |
| | | void uwbs_peer_long_addr_set(uint8_t long_addr[8]); |
| | | |
| | | /** |
| | | * @brief Get UWBS local long address. |
| | | * @return Local long address |
| | | */ |
| | | uint8_t *uwbs_local_long_addr_get(void); |
| | | |
| | | /** |
| | | * @brief Get UWBS peer long address. |
| | | * @return Peer long address |
| | | */ |
| | | uint8_t *uwbs_peer_long_addr_get(void); |
| | | |
| | | /** |
| | | * @brief Get UWBS pan ID. |
| | | * @return Pan ID |
| | | */ |
| | | uint16_t uwbs_pan_id_get(void); |
| | | |
| | | /** |
| | | * @brief Set UWBS pan ID. |
| | | * @param[in] pan_id Pan ID to be set |
| | | */ |
| | | void uwbs_pan_id_set(uint16_t pan_id); |
| | | |
| | | /** |
| | | * @brief Enable or disable UWBS security. |
| | | * @param[in] en Enable or disable |
| | | */ |
| | | void uwbs_security_enable_set(uint8_t en); |
| | | |
| | | /** |
| | | * @brief Set UWB configuration id for CCC. |
| | | * @param[in] uwb_cfg_id CCC UWB configuration id |
| | | */ |
| | | uint8_t uwbs_ccc_uwb_config_id_set(uint16_t uwb_cfg_id); |
| | | |
| | | /** |
| | | * @brief Clear RSSI statistical result in PER test procedure. |
| | | */ |
| | | void uwbs_clear_rssi(void); |
| | | |
| | | /** |
| | | * @brief update RSSI for statistic. |
| | | * @param[in] rssi new RSSI value |
| | | */ |
| | | void uwbs_update_rssi(int8_t rssi); |
| | | |
| | | /** |
| | | * @brief Get RSSI statistical result. |
| | | * @param[in] rssi_avg output RSSI average result |
| | | * @param[in] rssi_min output RSSI minimum value |
| | | * @param[in] rssi_max output RSSI maximum value |
| | | */ |
| | | void uwbs_get_rssi(int8_t *rssi_avg, int8_t *rssi_min, int8_t *rssi_max); |
| | | |
| | | /** |
| | | * @brief Check SE connection. |
| | | * @param[in] p_des_data output test data |
| | | * @param[in] p_des_len output test data length |
| | | * @return 1: Connected, 0: NC |
| | | */ |
| | | uint8_t uwbs_check_se(uint8_t *p_des_data, uint8_t *p_des_len); |
| | | |
| | | /** |
| | | * @brief Set UWB tx and rx shared buffer for test session. |
| | | * @param[in] buffer output RSSI average result |
| | | */ |
| | | void uwbs_test_pkt_buffer_set(uint8_t *buffer); |
| | | |
| | | /** |
| | | * @brief Transform angle format for FiRa UWB packet |
| | | * @param[in] angle angle in Q9.7 format |
| | | * @param[in] range 180 for azimuth, 90 for elevation |
| | | * @return formatted angle, unit is 360 * 2^-16 |
| | | */ |
| | | int16_t uwbapi_q7_to_angle_ota_format(int16_t angle, int16_t range); |
| | | |
| | | /** |
| | | * @brief Transform angle in FiRa UWB packet to Q9.7 format |
| | | * @param[in] data angle in UWB packet, unit is 360 * 2^-16 |
| | | * @param[in] range 180 for azimuth, 90 for elevation |
| | | * @return angle Q9.7 format |
| | | */ |
| | | int16_t uwbapi_angle_ota_format_to_q7(int16_t data, int16_t range); |
| | | |
| | | /** |
| | | * @brief Get ranging flow mode |
| | | * @return ranging flow mode @ref enum RANGING_FLOW_MODE_T |
| | | */ |
| | | uint8_t uwbs_ranging_flow_mode_get(void); |
| | | |
| | | /** |
| | | * @brief Get ranging stage |
| | | * @return ranging stage @ref enum RANGING_STAGE_T |
| | | */ |
| | | uint8_t uwbs_ranging_stage_get(void); |
| | | |
| | | /** |
| | | * @brief Get ranging device role |
| | | * @return ranging device role @ref enum DEV_ROLE_T |
| | | */ |
| | | uint8_t uwbs_ranging_role_get(void); |
| | | |
| | | #ifdef __cplusplus |
| | | } |
| | | #endif |
| | | |
| | | /** |
| | | * @} |
| | | */ |
| | | |
| | | #endif /* UWB_API_H_ */ |