Files
kunlun/plc/inc/hw_phy_api.h

699 lines
17 KiB
C
Raw Normal View History

2024-09-28 14:24:04 +08:00
/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#ifndef HW_PHY_API_H
#define HW_PHY_API_H
#include "os_types.h"
#include "iot_errno_api.h"
#include "iot_queue_api.h"
#include "iot_config_api.h"
#include "phy_bb.h"
#include "phy_chn.h"
#include "os_timer.h"
#include "plc_chn_est.h"
#include "iot_pkt_api.h"
#include "phy_data.h"
#include "phy_overstress.h"
#ifdef __cplusplus
extern "C" {
#endif
#define IOT_PHY_FFT_BUF_LEN (512)
#define PHY_CHN_EST_PRE_DET_CNT (5)
/* calibrate linear snr within -/+ 2.5dB*/
#define PHY_SNR_LINEAR_CAL(SNR_RAW) \
(((SNR_RAW) * 11453 - 13019) / 10000)
#define PHY_SNR_CAL_TH (10)
//kl3 SPUR:increase tgt pwr get bigger gain
#define PHY_AGC_RCV_TGT_PWR_SG_SPUR (109)
/* 200k spike rx target power uint:dbuv */
#define PHY_AGC_RCV_TGT_PWR_200K_SPIKE (118)
#define PHY_AGC_RCV_TGT_PWR_SG (103)
#define PHY_AGC_RCV_TGT_PWR_GP (105)
#define PHY_AGC_JUDGE_END_TONE (120)
#define PHY_AGC_ACC_STEP_192P (0)
#define PHY_AGC_ACC_STEP_384P (1)
#define PHY_AGC_ACC_STEP_768P (2)
#define PHY_AGC_ACC_STEP_1536P (3)
#define PHY_AGC_ACC_STEP_3072P (4)
#define PHY_AGC_ACC_STEP_6144P (5)
#define L0 (0)
#define L1 (1)
#define L2 (2)
#define L3 (3)
#define PEAK (4)
#define R0 (5)
#define R1 (6)
#define R2 (7)
#define R3 (8)
/* delay for chip hang, unit ms */
#define CHIP_HANG_DELAY 15
#define PHY_GET_NF() (g_phy_ctxt.dep.nf)
#define phy_busy_wait(cycle) \
do { \
uint32_t cnt = 0; \
while (cnt < cycle) {cnt++;} \
} while(0)
/* todo: replace refs to rx_mpdu_start.h ? */
typedef struct _iot_phy_info{
/* phy info start */
uint8_t adc_power;
uint8_t agc_tbl_entry;
uint8_t est_dc;
int8_t est_ppm; /* int8_t type */
int8_t avg_snr;
uint8_t pream_sym_detect;
uint8_t remain_phase_frac;
uint8_t max_spur_id;
/* phy info end */
} iot_phy_info_t;
typedef enum {
PHY_MODE_NORMAL = 0,
PHY_MODE_TEST = 1,
PHY_MODE_END = 2,
} phy_work_mode_id;
typedef struct _phy_tx_pwr_cfg_tbl{
uint8_t dig_tx_factor :5,
ana_tx_gain :3;
} phy_tx_pwr_cfg_tbl_t;
typedef uint32_t (*iot_phy_chn_tx_cb)(void);
typedef struct _phy_chn_est{
uint8_t spur_8m_done_flag : 1,
spur_3m_done_flag : 1,
spur_2m_done_flag : 1,
pulse_done_flag : 1,
bcn_check_cnt : 4;
} phy_chn_est_t;
typedef struct _iot_phy_tone_param_ctxt_t {
/* tone start flag */
uint32_t tone_start : 1,
/* retry counter */
rty_cnt : 31;
/* tone timer id */
timer_id_t tone_timer;
timer_id_t auto_tone_timer;
timer_id_t rest_tone_timer;
/* start tone */
uint16_t start_tone;
/* end tone */
uint16_t end_tone;
/* current tone */
uint16_t curent_tone;
/* tone tx interval time value, unit ms */
uint16_t tx_intval_time_ms;
} iot_phy_tone_param_ctxt_t;
/* global ctxt */
typedef struct _iot_phy_plat_indep_ctxt {
/* band info 44 bytes */
iot_phy_chn_ctxt_t chn;
/* tx tone param 24bytes */
iot_phy_tone_param_ctxt_t tx_tone;
/* phy overstress context 12 bytes */
phy_overstress_ctxt_t ovs_ctxt;
iot_phy_chn_tx_cb phy_chn_tx_cb;
/* tx pwr reduce dB */
uint32_t tx_pwr_reduce_db : 8,
/* target power */
tgt_pwr : 8,
/* tx psd fix */
tx_pwr_psd_fix_db : 6,
/* work mode */
work_mode : 1,
/* notch filter enable */
notch_filter_en : 1,
/* spike find */
spike_shift_en : 1,
/* det tone extend */
det_tone_extend_en : 1,
/* current pm status */
pm_sts : 2,
sw_agc_force_off : 1,
tx_pga : 2,
cert_force_spike : 1;
/* channel estimate 1 byte */
phy_chn_est_t chn_est;
/* record nncco fc */
uint32_t nn_cco_fc[4];
} iot_phy_plat_indep_ctxt_t;
/* phy total ctxt entry */
typedef struct _phy_ctxt {
iot_phy_plat_dep_ctxt_t dep;
iot_phy_plat_indep_ctxt_t indep;
} phy_ctxt_t;
extern phy_ctxt_t g_phy_ctxt;
/* phy busy id */
typedef enum {
PHY_BUSY_TX,
PHY_BUSY_RX,
PHY_BUSY_DUMP,
PHY_BUSY_MAX
} PHY_BUSY_ID;
/**
*@brief phy_info_check_entry.
*
* Phy API called by MAC task to check channel state.
*
*@param phy_info [mpdu start ptr]
*@param fc [fc ptr]
*@param role [CCO or STA or IIC.]
*@exception [none.]
*@return [ERR_OK or ERR_FAIL.]
*/
uint32_t phy_info_check_entry(void *mpdu_st,
void *fc, uint32_t role, uint8_t mt_mode_sel);
/**
*@brief phy_check_spur_cert_handle.
*
* some special handle to cert chck spur.
*
*@param notch_alpha [notch alpha]
*@exception [none.]
*@return [void]
*/
void phy_check_spur_cert_handle(uint16_t notch_alpha);
/**
*@brief phy_work_mode_set.
*
* Phy API called by MAC task to set current test mode.
*
*@param mode [normal or test mode.]
*@exception [none.]
*@return [ERR_OK or ERR_FAIL.]
*/
uint32_t phy_work_mode_set(phy_work_mode_id mode);
/**
*@brief iot_phy_chn_dump_start.
*
* start ada dump with upper parameters and callback data output API.
*
*@param dump_cfg [dump parameters.]
*@exception [none.]
*@return [0 sucess and other fail.]
*/
uint32_t iot_phy_chn_dump_start(iot_phy_chn_dump_rt_cfg_t *dump_cfg);
/**
*@brief phy_chn_est_ai_by_time.
*
* This api can be used for phy channel estimate when phy init or reinit.
* Also, the upper layer can redo it if channel changed dynmaically. Pls
* check the return cnt to fit your expectation and avoid block. The input
* parameter is period with ms unit.
*
*@param time_ms [expected time with the unit of ms.]
*@exception [none.]
*@return [successful counter.]
*/
uint32_t phy_chn_est_ai_by_time(uint32_t time_ms);
/**
*@brief phy_chn_est_pre_detect.
*
* do channel estimate after phy init.
* there'll be very usrful to receive beacon with big attenuation.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_chn_est_pre_detect(void);
/**
*@brief phy_rx_scan_fft_dump.
*
*for collecting fft dump data by sending multiple packets,
*each data packet has a unique packet number, sending completes
*until up to total packet number.
*
*@param buf_ptr [csi data from csi buf.]
*@param rx_gain [get uint8_t rx_gain parameter for fft dump.]
*@param cur_pnum [current packet number, sent partially.]
*@param total_pnum [total packets number to transmit.]
*@exception [none.]
*@return [uint32_t err_ok.]
*/
uint32_t phy_rx_scan_fft_dump(uint32_t *buf_ptr, int8_t rx_gain,\
uint16_t cur_pnum, uint16_t total_pnum);
/**
*@brief phy_rx_snr_cal.
*
* This API will get the max value between time domain snr and frequency
* domain snr. The frequency snr must be calibrated firstly.
*
*@param phy_info [phy info pointer.]
*@exception [none.]
*@return [snr.]
*/
int8_t phy_rx_snr_cal(void *phy_info, uint8_t rx_phase);
/**
*@brief phy_rx_snr_cal.
*
* snr will mapping to -10 ~ 90 dB. clip to 90 if snr > 90 dB and clip to
* -10 dB if snr < -10 dB.
*
*@param raw_snr [snr raw data.]
*@exception [none.]
*@return [mapping snr.]
*/
int8_t phy_snr_mapping_minus10_90(int8_t raw_snr);
/**
*@brief phy_fd_short_band_rms_get
* get current fd short band rms value.
*@param valid_tone_num [valid tone number.]
*@param para_int [rms integer.]
*@param para_frac [rms frac.]
*@exception [none.]
*@return [none.]
*/
void phy_fd_short_band_rms_get(uint32_t valid_tone_num, uint8_t *para_int, uint8_t *para_frac);
/**
*@brief phy_dbg_sts_print.
*
* print rx cnt, tx cnt and status registers.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_dbg_sts_print();
/**
*@brief phy_chn_nf_get.
*
* get current noise floor from phy global value.
*
*@param [none.]
*@exception [none.]
*@return [noise floor.]
*/
uint8_t phy_chn_nf_get(void);
/**
*@brief phy_chn_tx_power_get.
*
* get current hplc tx power from phy global value.
*
*@param [none.]
*@exception [none.]
*@return [noise floor.]
*/
uint8_t phy_chn_tx_power_get(void);
/**
*@brief phy_idle_set.
*
* turn off phy clk.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_idle_set();
/**
*@brief phy_idle_clr.
*
* turn on phy clk.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_idle_clr();
/**
*@brief phy_pkt_found_flag_get.
*
* check if packet received .
*
*@param [none.]
*@exception [none.]
*@return [true or others false.]
*/
bool_t phy_pkt_found_flag_get(void);
/**
*@brief phy_pkt_found_flag_clr.
*
* clear the global packet received flag.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_pkt_found_flag_clr(void);
/**
*@brief phy_cfg_band_filter_gpio.
*
*
*@param protocol_band_id [plc band id.]
*@exception [none.]
*@return [none.]
*/
void phy_cfg_band_filter_gpio(uint8_t protocol_band_id);
/**
*@brief phy_init_band_filter_gpio.
*
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_init_band_filter_gpio();
/**
*@brief phy_rx_tgt_pwr_set.
*
* set rx target power of global phy ctxt.
*
*@param pwr [rx target power.]
*@exception [none.]
*@return [none.]
*/
void phy_rx_tgt_pwr_set(uint8_t pwr);
/**
*@brief phy_rx_tgt_pwr_get.
*
* get rx target power of global phy ctxt.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
uint8_t phy_rx_tgt_pwr_get();
/**
*@brief phy_spike_shift_en_set.
*
* set spike shift en flag of global phy ctxt.
*
*@param en [enable.]
*@exception [none.]
*@return [none.]
*/
void phy_spike_shift_en_set(bool_t en);
/**
*@brief phy_spike_shift_en_get.
*
* get spike shift en flag of global phy ctxt.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
bool_t phy_spike_shift_en_get();
/**
*@brief phy_det_tone_ext_en_set.
*
* set detect tone ext en flag of global phy ctxt.
*
*@param en [enable.]
*@exception [none.]
*@return [none.]
*/
void phy_det_tone_ext_en_set(bool_t en);
/**
*@brief phy_det_tone_ext_en_get.
*
* get detect tone ext en flag of global phy ctxt.
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
bool_t phy_det_tone_ext_en_get();
/**
*@brief phy_rise_pwr_flag_set.
*
* set rise power flag of global phy ctxt.
*
*@param en [enable.]
*@exception [none.]
*@return [none.]
*/
void phy_rise_pwr_flag_set(bool_t en);
/**
*@brief phy_get_mp_mode.
*
* get mp mode
*
*@param [none.]
*@exception [none.]
*@return [true or flase.]
*/
uint32_t phy_get_fw_mode(void);
/**
*@brief phy_swagc_set.
*
* disable or enable sw-agc.
*
*@param en [true for enable and false for disable.]
*@exception [none.]
*@return [0 sucess and other fail.]
*/
uint32_t phy_swagc_set(bool_t en);
/**
*@brief phy_busy_get.
*
* get dump busy flag from global phy ctxt.
*
*@param id [busy status id.]
*@param phy_ctxt [ctxt pointer.]
*@exception [none.]
*@return [true for busy and false for idle.]
*/
bool_t phy_busy_get(void *phy_ctxt, PHY_BUSY_ID id);
/**
*@brief phy_ctxt_get.
*
* get phy global ctxt pointer.
*
*@param [none.]
*@exception [none.]
*@return [true for busy and false for idle.]
*/
phy_ctxt_t *phy_ctxt_get();
/**
*@brief phy_ctxt_get.
*
* detect big spur or pulse in current rx patch.
*
*@param [none.]
*@exception [none.]
*@return [true or false.]
*/
bool_t phy_high_noise_sts_get();
/**
*@brief phy_csma_ignore_cca.
*
* force csma tx enable all the time without regard for cca detect.
*
*@param [en]
*@exception [none.]
*@return [true for enable and false for disable.]
*/
void phy_csma_ignore_cca(bool_t en);
/**
*@brief phy_force_ana_td_power. force fd/ana power from reg
*
*@param [value.]
*@exception [none.]
*@return [0]
*/
uint32_t phy_force_ana_td_power(uint32_t value);
/**
*@brief phy_set_tx_pwr_td. set td power
*
*@param [value: td power]
*@exception [none.]
*@return [0]
*/
uint32_t phy_set_tx_pwr_td(uint32_t value);
/**
*@brief phy_get_tx_pwr_td. get td power
*
*@param [none.]
*@exception [none.]
*@return uint8_t [td pwr]
*/
uint8_t phy_get_tx_pwr_td(void);
/**
*@brief phy_set_tx_pwr_ana. set ana power
*
*@param [value: ana power]
*@exception [none.]
*@return [0]
*/
uint32_t phy_set_tx_pwr_ana(uint32_t value);
/**
*@brief phy_set_tx_pwr_fd_frac. set fd frac power
*
*@param [value: fd frac power]
*@exception [none.]
*@return [0]
*/
uint32_t phy_set_tx_pwr_fd_frac(uint32_t value);
/**
*@brief phy_set_tx_pwr_fd_int. set fd int power
*
*@param [value: fd int power]
*@exception [none.]
*@return [0]
*/
uint32_t phy_set_tx_pwr_fd_int(uint32_t value);
/**
*@brief phy_cert_is_hw_agc.
*
* check if hw agc should be applied for PHY transparent transfer test mode
*
*@param [none.]
*@exception [none.]
*@return [1 for enable and 0 for disable.]
*/
uint8_t phy_cert_is_hw_agc();
/**
*@brief register_phy_call_mac_bbai_cb.
*
* Register callback function for phy call mac api.
*
*@param cb [callback function from mac]
*@exception [time_ms.]
*@return [ret.]
*/
typedef uint32_t (*phy_call_mac_func_cb_t)(uint32_t time_ms);
void register_phy_call_mac_bbai_cb(phy_call_mac_func_cb_t cb);
/**
*@brief register_phy_get_cert_mode_cb.
*
* Register callback function for phy get cert mode.
*
*@param cb [callback function from mac]
*@exception [none.]
*@return [cert mode.]
*/
typedef uint8_t (*phy_get_cert_mode_cb_t)();
void register_phy_get_cert_mode_cb(phy_get_cert_mode_cb_t cb);
/**
*@brief phy_updata_nf_of_bbai() updata nf of bbai
*
*@param [none.]
*@exception [none.]
*@return [none.]
*/
void phy_updata_nf_of_bbai();
/**
*@brief phy_get_nf_of_bbai() get nf of bbai
*
*@param [none.]
*@exception [none.]
*@return [bbai nf]
*/
uint32_t phy_get_nf_of_bbai();
/**
*@brief phy_channel_est_request() phy channel est request
*
*@param [none.]
*@exception [none.]
*@return [void]
*/
void phy_channel_est_request(void);
/**
*@brief phy_cert_check_spike() phy cert mode check spike
*
*@param [none.]
*@exception [none.]
*@return [void]
*/
void phy_cert_check_spike();
/**
*@brief phy_is_sta_role() judge whether the device is STA.
*
*@param [none.]
*@exception [none.]
*@return [0: not sta, 1: is sta]
*/
uint32_t phy_is_sta_role();
#ifdef __cplusplus
}
#endif
#endif