/**************************************************************************** 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 IOT_CAL_DATA_H #define IOT_CAL_DATA_H /* os shim includes */ #include "os_types.h" #include "iot_config.h" #ifdef __cplusplus extern "C" { #endif /* * cal data section is the place to store RF parameters. */ /* pack for the structures in the whole file */ #pragma pack(push) // save the pack status #pragma pack(1) // 1 byte align #define IOT_PHY_GAIN_STEP_NUM (85) #define IOT_CAL_DATA_DUMMY_LEN (10) #define IOT_OEM_PHY_MAGIC_NUM (0x5048595A) #define IOT_OEM_EM_EXT_MAGIN_NUM (0x5048AA55) #define IOT_OEM_EM_INNER_MAGIC_NUM (0x50485A5A) #define IOT_PHY_CFG_MASK_CHIPID (0) #define IOT_PHY_CFG_MASK_PPM (1) #define IOT_PHY_CFG_MASK_TX_DC (2) #define IOT_PHY_CFG_MASK_RX_DC (3) #define IOT_PHY_CFG_MASK_PT_VER (4) #define IOT_PHY_CFG_MASK_CALI_TEMP (5) #define IOT_PHY_CFG_MASK_CALI_ADC (6) #define IOT_PHY_CFG_MASK_CALI_RF_TXIQM (7) #define IOT_PHY_CFG_MASK_CALI_RF_TXF (8) #define IOT_PHY_CFG_MASK_CALI_PT_INFO (9) #define IOT_PHY_CFG_MASK_CALI_RF_RXIQM (10) /* adc module calibration data. actual_val = raw_val * k + b */ typedef struct _iot_adc_m_cal_data { float k; float b; }iot_adc_m_cal_data_t; /* rf version and phy tx calibration info */ typedef struct _iot_cal_data_rf_ver_phy_txiqm { /* tx I MAG balance calibration value, range range: 0~15 */ uint8_t tx_i_mag : 4, /* rf version, see RF_VER_XXX */ rf_ver : 4; /* tx Q MAG balance calibration value, range range: 0~15 */ uint8_t tx_q_mag; /* tx I phase calibration value, range range: 0~31 */ uint8_t tx_i_phase; /* tx Q phase calibration value, range range: 0~31 */ uint8_t tx_q_phase; /* tx I dc calibration value, range range: -127~127 */ int8_t tx_i_dc; /* tx I dc calibration value, range range: -127~127 */ int8_t tx_q_dc; } iot_cal_data_rf_ver_phy_txiqm_t; /* rf phy rx calibration info */ typedef struct _iot_cal_data_rf_phy_rxiqm { /* rx I MAG balance calibration value, range range: 0~15 */ uint8_t rx_i_mag : 4, /* rx Q MAG balance calibration value, range range: 0~15 */ rx_q_mag : 4; /* rx I phase calibration value, range range: 0~31 */ uint8_t rx_i_phase; /* rx Q phase calibration value, range range: 0~31 */ uint8_t rx_q_phase; } iot_cal_data_rf_phy_rxiqm_t; /* rf phy tx fiter calibration info */ typedef struct _iot_cal_data_rf_phy_txf { /* flag mark if the value of the corresponding option is valid */ uint8_t valid_mask; /* tx filter bw calibration value for each option */ uint16_t bw_sel_value[3]; } iot_cal_data_rf_phy_txf_t; typedef struct _iot_cal_data_pt_info { /* the golden mac which used for the pt test */ uint8_t golden_mac[6]; /* production test time in bcd format */ uint8_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t min; uint32_t golden_fw_ver; uint32_t pt_tool_ver; uint32_t pt_board_ver; } iot_cal_data_pt_info; /* halphy config setting */ typedef struct _iot_cal_data_halphy_real_cfg { /* magic num */ uint32_t magic; /* mask */ uint32_t mask; /* chip id for check valid */ uint32_t chipid_hi; uint32_t chipid_lo; /* ppm cali */ int8_t ppm; /* tx dc cali */ uint16_t tx_dc[4]; /* rx dc cali */ uint16_t rx_dc[IOT_PHY_GAIN_STEP_NUM]; /* pt fw version record */ uint32_t pt_fw_ver; /* hardware version */ uint16_t hw_ver_major; uint16_t hw_ver_minor; /* unit: degrees centigrade, actual_temp = raw_temp + cali_temp */ float cali_temp; /* adc module calibration data */ iot_adc_m_cal_data_t cali_adc_m; /* rf version and phy tx iqm calibration data */ iot_cal_data_rf_ver_phy_txiqm_t rf_txiqm; /* rf phy tx filter calibration data */ iot_cal_data_rf_phy_txf_t rf_txf; /* the production info */ iot_cal_data_pt_info pt_info; /* rf phy rx iqm calibration data */ iot_cal_data_rf_phy_rxiqm_t rf_rxiqm; uint8_t reserved[IOT_CAL_DATA_DUMMY_LEN]; } iot_halphy_real_cfg_t; /* rf golden uint calibration data size */ #define IOT_CAL_DATA_RF_GU_DATA_BYTES 200 /* rf golden uint calibration data layout */ typedef struct _iot_cal_data_rf_gu_t { /* crc16 */ uint16_t crc; /* calibration data */ uint8_t data[IOT_CAL_DATA_RF_GU_DATA_BYTES]; } iot_cal_data_rf_gu_t; #define IOT_CAL_DATA_EM_EXT_PARA_BYTES 320 //TODO: check len typedef struct _iot_cal_data_em_ext { /* crc8 */ uint8_t crc; /* energy meter extern module id */ uint8_t module_id; /* extend crc8 */ uint8_t ext_crc; /* cali data version */ uint8_t version; /* magic num */ uint32_t magic; /* calibration data */ uint8_t data[IOT_CAL_DATA_EM_EXT_PARA_BYTES]; } iot_cal_data_em_ext_t; #define IOT_CAL_DATA_EM_INNER_PARA_BYTES 1016 //TODO: check len typedef struct _iot_cal_data_em_inner_t { /* magic num */ uint32_t magic; /* energy meter inner module id */ uint32_t module_id : 8, /* reserved */ rsvd : 16, /* crc8 of the calibration data field */ crc : 8; /* calibration data */ uint8_t data[IOT_CAL_DATA_EM_INNER_PARA_BYTES]; } iot_cal_data_em_inner_t; typedef struct _iot_cal_data_cfg { uint8_t crc; iot_halphy_real_cfg_t halphy_cfg; /* energy meter extern calibration parameters */ iot_cal_data_em_ext_t em_ext_cali; #if (TARGET_VERSION == TARGET_KUNLUN2 || \ TARGET_VERSION == TARGET_KUNLUN3) /* energy meter inner calibration parameters */ iot_cal_data_em_inner_t em_inner_cali; #endif #if (IOT_CLI_IC_TOOL_EN && HPLC_RF_DEV_SUPPORT) iot_cal_data_rf_gu_t gu_cali; #endif } iot_cal_data_cfg_t; /** * @brief iot_cal_data_check_mask() - check calibration data valid. * @param calcfg: pointer to receive cal data cfg. * @param type: see IOT_PHY_CFG_MASK_XXX. * @retval 0 calibration data invalid; others calibration data valid. */ uint32_t iot_cal_data_check_mask(iot_cal_data_cfg_t *calcfg, uint8_t type); /** * @brief iot_cal_data_set_mask() - set calibration data valid flag. * @param calcfg: pointer to receive cal data cfg. * @param type: see IOT_PHY_CFG_MASK_XXX. */ void iot_cal_data_set_mask(iot_cal_data_cfg_t *calcfg, uint8_t type); /** * @brief iot_cal_data_get_cfg() - read cal data cfg from flash cal data info section. * @param cal data cfg: pointer to receive cal data cfg * @retval 0 success; others fail */ uint32_t iot_cal_data_get_cfg(iot_cal_data_cfg_t** cal_data_cfg); /** * @brief iot_cal_data_set_cfg() - write cal data cfg to flash cal data info section. * @param cal data cfg: pointer to receive cal data cfg * @retval 0 success; others fail */ uint32_t iot_cal_data_set_cfg(iot_cal_data_cfg_t* cal_data_cfg); /** * @brief iot_cal_data_get_adc_m_cali() - read adc module calibration data. * @param adc_m_cali_data: pointer to receive adc module calibration data * @retval 0 success; others fail */ uint32_t iot_cal_data_get_adc_m_cali(iot_adc_m_cal_data_t **adc_m_cali_data); /** * @brief iot_cal_data_get_rf_phy_txiqm_cali() - read rf phy tx iqm calibration * data. * @param cali: pointer to pointer of rf phy tx iqm calibration data * @retval 0 success; others fail */ uint32_t iot_cal_data_get_rf_phy_txiqm_cali( iot_cal_data_rf_ver_phy_txiqm_t **cali); /** * @brief iot_cal_data_get_rf_phy_txf_cali() - read rf phy tx filter calibration data. * @param cali: pointer to pointer of rf phy tx firter calibration data. * @retval 0 success; others fail */ uint32_t iot_cal_data_get_rf_phy_txf_cali(iot_cal_data_rf_phy_txf_t **cali); /** * @brief iot_cal_data_get_mtd_sts() - get mtd status from global cal data. * @param cal data cfg: void * @retval 0 success; others fail */ uint32_t iot_cal_data_get_mtd_sts(void); /** * @brief iot_cal_data_init() - initialize global cal data. * @param NULL * @retval NULL */ void iot_cal_data_init(); #pragma pack(pop) // restore the pack status #ifdef __cplusplus } #endif #endif