| | |
| | | /* |
| | | * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and |
| | | * Copyright (c) 2019-2025 Beijing Hanwei Innovation Technology Ltd. Co. and |
| | | * its subsidiaries and affiliates (collectly called MKSEMI). |
| | | * |
| | | * All rights reserved. |
| | |
| | | #include "mk_uwb.h" |
| | | #include "uwb_trx.h" |
| | | #include "wsf_msg.h" |
| | | |
| | | #ifndef RANGING_EN |
| | | #define RANGING_EN (0) |
| | | #endif |
| | | #if RANGING_EN || CSI_EN |
| | | #include "lib_ranging.h" |
| | | #endif |
| | |
| | | // register process handler for MAC TX done and RX done |
| | | mac_register_process_handler(uwb_tx_process, uwb_rx_process); |
| | | |
| | | // which RX ports will be used for AoA/PDoA |
| | | phy_rx_ant_mode_set(RX_ANT_PORTS_COMBINATION); |
| | | |
| | | #if CSI_EN |
| | | ranging_aux_out_opt_set(CH_LEN_DEFAULT, 3); |
| | | #endif |
| | | return 0; |
| | | } |
| | | |
| | |
| | | ind->hdr.event = UWB_RX_DONE_MSG; |
| | | ind->phy_timer_count = rx->timestamp; |
| | | ind->status = rx->err_code; |
| | | ind->rssi = rx->rssi; |
| | | ind->snr = rx->snr; |
| | | // ind->rssi = rx->rssi; |
| | | ind->rssi = correct_rssi(rx->rssi); |
| | | ind->snr = correct_snr(rx->snr); |
| | | |
| | | if (rx->err_code == UWB_RX_OK) |
| | | { |
| | |
| | | } |
| | | ind->length = rx->pkt_len; |
| | | |
| | | #if RANGING_EN |
| | | int64_t timestamp = ranging_rx_time(rx); |
| | | ind->timestamp_frac = timestamp & 0x1ff; |
| | | ind->timestamp_int = (uint32_t)(timestamp >> 9); |
| | | |
| | | #if CSI_EN |
| | | if (ranging_debug_csi_en_get()) |
| | | { |
| | | uint8_t frame_idx = 0; |
| | | debug_csi.frame_idx = frame_idx; |
| | | debug_csi.rframe_idx = frame_idx; |
| | | debug_csi.frame_idx = frame_idx; |
| | | |
| | | uint32_t val = REG_READ(0x40003050); |
| | | debug_csi.frame[frame_idx].rf_gain = (val & 0x07); |
| | |
| | | debug_csi.frame[frame_idx].bd_cnt = phy_bd_cnt_get(); |
| | | debug_csi.frame[frame_idx].sfd_cnt = phy_sfd_cnt_get(); |
| | | debug_csi.frame[frame_idx].error_code = ind->status; |
| | | if (rx->err_code != 0x0830) |
| | | { |
| | | debug_csi.frame[frame_idx].rssi = ind->rssi; |
| | | debug_csi.frame[frame_idx].snr = ind->snr; |
| | | |
| | | dump_preamble_cir(frame_idx, 128); |
| | | dump_sts_cir(frame_idx); |
| | | } |
| | | debug_csi.frame[frame_idx].rssi = ind->rssi; |
| | | debug_csi.frame[frame_idx].snr = ind->snr; |
| | | debug_csi.frame[frame_idx].channel_power = REG_READ(0x40002064); |
| | | debug_csi.frame[frame_idx].noise_power = REG_READ(0x40002078); |
| | | } |
| | | #endif |
| | | #if RANGING_EN || CSI_EN |
| | | int64_t timestamp = ranging_rx_time(rx); |
| | | ind->timestamp_frac = timestamp & 0x1ff; |
| | | ind->timestamp_int = (uint32_t)(timestamp >> 9); |
| | | #endif |
| | | } |
| | | |
| | |
| | | |
| | | void uwb_tx_process(struct MAC_HW_REPORT_T *tx_report) |
| | | { |
| | | power_off_radio(); |
| | | uwb_tx_done_ind(tx_report); |
| | | } |
| | | |
| | | void uwb_rx_process(struct MAC_HW_REPORT_T *rx_report) |
| | | { |
| | | power_off_radio(); |
| | | uwb_rx_done_ind(rx_report); |
| | | } |