From cc432b761c884a0bd8e9d83db0a4e26109fc08b1 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期五, 08 十一月 2024 15:35:38 +0800 Subject: [PATCH] 安邦手环GPS删除部分无用数据和修改4G波特率9600出厂测试固件 --- keil/include/components/app/src/ul_tdoa.c | 402 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 402 insertions(+), 0 deletions(-) diff --git a/keil/include/components/app/src/ul_tdoa.c b/keil/include/components/app/src/ul_tdoa.c new file mode 100644 index 0000000..43f7d63 --- /dev/null +++ b/keil/include/components/app/src/ul_tdoa.c @@ -0,0 +1,402 @@ +/* + * 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. + */ + +#include "mk_trace.h" +#include "mk_power.h" +#include "mk_uwb.h" +#include "mk_clock.h" +#include "uwb_api.h" +#include "ul_tdoa.h" +#include "lib_ranging.h" +#include "lib_aoa.h" +#include "mk_trng.h" +#include <stdlib.h> + +struct UL_TDOA_ENV_T ul_tdoa_env; + +static struct UL_TDOA_CB_T ul_tdoa_cb; + +static struct UWB_OP_T op = { + .session_configure = ul_tdoa_configure, + .session_start = ul_tdoa_start, + .session_stop = ul_tdoa_stop, + .session_local_addr_set = uwbs_local_short_addr_set, + .session_peer_addr_set = NULL, + .session_responder_addr_add = NULL, + .session_responder_list_clr = NULL, + .session_dynamic_update_responder_list = NULL, + .session_set_ccc_ursk = NULL, +}; + +static void ul_tdoa_timer_callback(void *dev, uint32_t time); + +static uint8_t tx_msg[127] = {0}; +static uint16_t tx_msg_len = 0; + +static void ul_tdoa_tx_process(struct MAC_HW_REPORT_T *tx_report); +static void ul_tdoa_rx_process(struct MAC_HW_REPORT_T *rx_report); +void app_session_init(void); + +int ul_tdoa_init(uint8_t handle_id) +{ + /* store handler ID */ + ul_tdoa_cb.handle_id = handle_id; + + /* init rx queue */ + WSF_QUEUE_INIT(&ul_tdoa_cb.msg_queue); + + LOG_INFO(TRACE_MODULE_APP, "Ranging lib version: %s\r\n", MK8000_get_rangelib_version()); + LOG_INFO(TRACE_MODULE_APP, "AoA lib version: %s\r\n", MK8000_get_aoalib_version()); + return 0; +} + +int ul_tdoa_deinit(void) +{ + return 0; +} + +// This function will be called by uwbapi_session_init() +void app_session_init(void) +{ + // register process handler for MAC TX done and RX done + mac_register_process_handler(ul_tdoa_tx_process, ul_tdoa_rx_process); + + uwbs_handler_init(&op); +} + +void ul_tdoa_configure(void) +{ + ul_tdoa_env.stage = UL_TDOA_IDLE; + ul_tdoa_env.ranging_period = MS_TO_PHY_TIMER_COUNT(uwb_app_config.session_param.ranging_interval); + ul_tdoa_env.random_window = MS_TO_PHY_TIMER_COUNT(uwb_app_config.session_param.ul_tdoa_random_window); + ul_tdoa_env.sequence_num = 0; + ul_tdoa_env.lost_cnt = 0; + + uint32_t seed = 0; + + trng_open(); + trng_get(&seed, 1, NULL); + trng_close(); + + srand(seed); + LOG_INFO(TRACE_MODULE_APP, "Random seed %u\r\n", seed); + + phy_rx_sts_switch_mode_set(uwb_app_config.ppdu_params.sts_pkt_cfg, STS_NEVER_SWITCH, 0, 0); + uwbs_configure(PHY_TX | PHY_RX, uwb_app_config.session_param.tx_power_level); + + aoa_param_config(); +} + +static uint32_t ul_tdoa_tx_offset_get(void) +{ + uint32_t tx_offset_ms = (uint32_t)rand() % uwb_app_config.session_param.ul_tdoa_random_window; + if (tx_offset_ms < 1) + { + tx_offset_ms = 1; + } + return MS_TO_PHY_TIMER_COUNT(tx_offset_ms); +} + +static void ul_tdoa_pkt_construct(enum OWR_MESSAGE_TYPE_T type, int64_t tx_time) +{ + uint8_t input[160]; + uint8_t input_len = 0; + + /* + Bits: + 0-2 Frame Type + 3 Long Frame Control + 4-5 Destination Addressing mode + 6-7 Source Addressing mode + 8 PAN ID Present + 9 Security Enabled + 10 Sequence Number Suppression + 11 Frame Pending + 12-13 Frame Version + 14 Ack Request + 15 IE Present + */ + uint16_t frame_control = (1 << 15) | (1 << 10) | (1 << 9) | (2 << 6) | (1 << 3) | (5 << 0); + + input[input_len++] = frame_control & 0xff; + input[input_len++] = (frame_control >> 8) & 0xff; + + uint16_t mac_addr = uwbs_local_short_addr_get(); + input[input_len++] = mac_addr & 0xff; + input[input_len++] = (mac_addr >> 8) & 0xff; + + // Auxiliary Security Header + uint8_t sec_lvl = 6; + uint8_t sec_control = (1 << 5) | (uint8_t)(sec_lvl << 0); + + input[input_len++] = sec_control; + + uint32_t phy_sts_index = ul_tdoa_env.sequence_num; + uint32_t session_id = uwb_app_config.session_id; + + // Header IE - Measurement Report Message Type 1 + uint16_t header_ie = (0x0 << 15) | (0x0 << 7) | (19 << 0); + uint32_t vendor_oui = 0x5a18ff; + input[input_len++] = header_ie & 0xff; + input[input_len++] = (header_ie >> 8) & 0xff; + input[input_len++] = vendor_oui & 0xff; + input[input_len++] = (vendor_oui >> 8) & 0xff; + input[input_len++] = (vendor_oui >> 16) & 0xff; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = 0x08; + input[input_len++] = session_id & 0xff; + input[input_len++] = (session_id >> 8) & 0xff; + input[input_len++] = (session_id >> 16) & 0xff; + input[input_len++] = (session_id >> 24) & 0xff; + input[input_len++] = phy_sts_index & 0xff; + input[input_len++] = (phy_sts_index >> 8) & 0xff; + input[input_len++] = (phy_sts_index >> 16) & 0xff; + input[input_len++] = (phy_sts_index >> 24) & 0xff; + + header_ie = (0x7e << 7) | (0 << 0); // HT1 IE + input[input_len++] = header_ie & 0xff; + input[input_len++] = (header_ie >> 8) & 0xff; + + // Payload IE + uint8_t payload_content_len = 16; + uint16_t payload_ie = (1 << 15) | (0x2 << 11) | (payload_content_len); + + input[input_len++] = payload_ie & 0xff; + input[input_len++] = (payload_ie >> 8) & 0xff; + + input[input_len++] = vendor_oui & 0xff; + input[input_len++] = (vendor_oui >> 8) & 0xff; + input[input_len++] = (vendor_oui >> 16) & 0xff; + + // OWR message type || UWB message ID + uint8_t uwb_message_id = (uint8_t)(type << 4) | 0x7; + input[input_len++] = uwb_message_id; + + // Reserved (4) || TX timestamp present (2) || Device ID Present (2) + uint8_t message_control = (uint8_t)(2 << 2) | 1; + input[input_len++] = message_control; + + uint32_t frame_number = ul_tdoa_env.sequence_num; + input[input_len++] = frame_number & 0xff; + input[input_len++] = (frame_number >> 8) & 0xff; + input[input_len++] = (frame_number >> 16) & 0xff; + input[input_len++] = (frame_number >> 24) & 0xff; + + uint8_t *device_id = &uwb_app_config.session_param.ul_tdoa_device_id[1]; + input[input_len++] = device_id[0]; + input[input_len++] = device_id[1]; + + input[input_len++] = tx_time & 0xff; + input[input_len++] = (tx_time >> 8) & 0xff; + input[input_len++] = (tx_time >> 16) & 0xff; + input[input_len++] = (tx_time >> 24) & 0xff; + input[input_len++] = (tx_time >> 32) & 0xff; + input[input_len++] = (tx_time >> 40) & 0xff; + input[input_len++] = (tx_time >> 48) & 0xff; + input[input_len++] = (tx_time >> 56) & 0xff; + + memcpy(&tx_msg[0], &input[0], input_len); + tx_msg_len = input_len; +} + +void ul_tdoa_start(void) +{ + ul_tdoa_env.anchor_point = phy_timer_count_get(); + ul_tdoa_env.tx_offset = ul_tdoa_tx_offset_get(); + + enum DEV_ROLE_T role = uwb_app_config.session_param.device_role; + if (role == DEV_ROLE_UT_SYNC_ANCHOR) + { + uint32_t curr_count = phy_timer_count_get(); + uint32_t count = (uint32_t)(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset - curr_count); + if (count > ul_tdoa_env.random_window) + { + count = ul_tdoa_env.random_window; + } + if (count > MS_TO_PHY_TIMER_COUNT(2)) + { + power_on_radio(0, 1); + ul_tdoa_env.stage = UL_TDOA_LISTEN; + mac_rx(EVT_MODE_MAC_PHY_ASAP, 0, count - MS_TO_PHY_TIMER_COUNT(2)); + mac_start(); + } + else + { + ul_tdoa_env.stage = UL_TDOA_TX_SYNC; + phy_timer_target_set(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset - UWB_PERIOD_PREFETCH_TIME, ul_tdoa_timer_callback); + } + } + else if (role == DEV_ROLE_UT_TAG) + { + ul_tdoa_env.stage = UL_TDOA_TX_BLINK; + phy_timer_target_set(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset - UWB_PERIOD_PREFETCH_TIME, ul_tdoa_timer_callback); + } + else + { + power_on_radio(0, 1); + ul_tdoa_env.stage = UL_TDOA_LISTEN; + mac_rx(EVT_MODE_MAC_PHY_ASAP, 0, ul_tdoa_env.random_window); + mac_start(); + } + + ul_tdoa_env.enable = 1; + LOG_INFO(TRACE_MODULE_APP, "UL-TDoA start, role %d\r\n", role); +} + +void ul_tdoa_stop(void) +{ + ul_tdoa_env.enable = 0; + LOG_INFO(TRACE_MODULE_APP, "UL-TDoA stop\r\n"); +} + +static void ul_tdoa_timer_callback(void *dev, uint32_t time) +{ + ul_tdoa_env.sequence_num++; + + // Calculate tx timestamp + int64_t tx_time = ranging_tx_time(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset + phy_shr_duration()); + enum OWR_MESSAGE_TYPE_T type = (uwb_app_config.session_param.device_role == DEV_ROLE_UT_SYNC_ANCHOR ? OWR_SYNV_UTM : OWR_BLINK_UTM); + + ul_tdoa_pkt_construct(type, tx_time); + power_on_radio(1, 0); + mac_tx(EVT_MODE_MAC_ASAP_PHY_FIX, ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset, 0, tx_msg, tx_msg_len); + mac_start(); +} + +void ul_tdoa_process(const struct MAC_HW_REPORT_T *ind) +{ + enum DEV_ROLE_T role = uwb_app_config.session_param.device_role; + if (role == DEV_ROLE_UT_SYNC_ANCHOR) + { + if (ul_tdoa_env.stage == UL_TDOA_LISTEN) + { + if (ind->err_code == UWB_RX_OK) + { + int64_t timestamp = ranging_rx_time(ind); + ul_tdoa_rx_ind(ind->err_code, ind->pkt_data, ind->pkt_len, timestamp); + } + } + else + { + // TX sync done - update next tx offset + ul_tdoa_env.tx_offset = ul_tdoa_tx_offset_get(); + ul_tdoa_env.anchor_point += ul_tdoa_env.ranging_period; + LOG_INFO(TRACE_MODULE_APP, "UL-TDoA TX Sync %u\r\n", ul_tdoa_env.sequence_num); + } + + uint32_t curr_count = phy_timer_count_get(); + uint32_t count = (uint32_t)(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset - curr_count); + if (count > ul_tdoa_env.random_window) + { + count = ul_tdoa_env.random_window; + } + + if (count > MS_TO_PHY_TIMER_COUNT(2)) + { + ul_tdoa_env.stage = UL_TDOA_LISTEN; + mac_rx(EVT_MODE_MAC_PHY_ASAP, 0, count - MS_TO_PHY_TIMER_COUNT(2)); + mac_start(); + } + else + { + ul_tdoa_env.stage = UL_TDOA_TX_SYNC; + phy_timer_target_set(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset - UWB_PERIOD_PREFETCH_TIME, ul_tdoa_timer_callback); + power_off_radio(); + } + } + else if (role == DEV_ROLE_UT_TAG) + { + // TX blink done - update next tx offset + ul_tdoa_env.tx_offset = ul_tdoa_tx_offset_get(); + ul_tdoa_env.anchor_point += ul_tdoa_env.ranging_period; + + phy_timer_target_set(ul_tdoa_env.anchor_point + ul_tdoa_env.tx_offset - UWB_PERIOD_PREFETCH_TIME, ul_tdoa_timer_callback); + power_off_radio(); + + LOG_INFO(TRACE_MODULE_APP, "UL-TDoA TX Blink %u\r\n", ul_tdoa_env.sequence_num); + } + else + { + if (ind->err_code == UWB_RX_OK) + { + int64_t timestamp = ranging_rx_time(ind); + ul_tdoa_rx_ind(ind->err_code, ind->pkt_data, ind->pkt_len, timestamp); + } + + mac_rx(EVT_MODE_MAC_PHY_ASAP, 0, ul_tdoa_env.random_window); + mac_start(); + } +} + +void ul_tdoa_rx_ind(uint16_t status, const uint8_t *data, uint16_t len, int64_t timestamp) +{ + struct UL_TDOA_RX_IND_T *ind; + + if ((ind = WsfMsgAlloc(sizeof(struct UL_TDOA_RX_IND_T) + len)) != NULL) + { + ind->hdr.event = UL_TDOA_RX_IND_MSG; + ind->status = status; + ind->rx_len = len; + ind->rx_timestamp = timestamp; + if (data != NULL) + { + memcpy(ind->rx_data, data, len); + } + + // Send the message + WsfMsgSend(ul_tdoa_cb.handle_id, ind); + } +} + +static void ul_tdoa_tx_process(struct MAC_HW_REPORT_T *tx_report) +{ + ul_tdoa_process(tx_report); +} + +static void ul_tdoa_rx_process(struct MAC_HW_REPORT_T *rx_report) +{ + ul_tdoa_process(rx_report); +} -- Gitblit v1.9.3