173 lines
4.6 KiB
C
Executable File
173 lines
4.6 KiB
C
Executable File
/****************************************************************************
|
|
|
|
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.
|
|
|
|
****************************************************************************/
|
|
#include "os_types.h"
|
|
#include "hw_war.h"
|
|
#include "phy_bb.h"
|
|
#include "phy_multi_ppm.h"
|
|
#include "hw_phy_api.h"
|
|
|
|
#if ENA_SYNC_DIFF_CCO_PPM
|
|
|
|
void phy_multi_sync_ppm_rst(phy_ppm_status_ctxt_t *ctxt)
|
|
{
|
|
IOT_ASSERT(ctxt != NULL);
|
|
for (uint8_t idx = 0; idx < MAX_SYNC_CCO_CNT; idx++) {
|
|
ctxt->ppm_status[idx].rsv = 0;
|
|
ctxt->ppm_status[idx].valid = 0;
|
|
ctxt->ppm_status[idx].nid = 0;
|
|
ctxt->ppm_status[idx].ppm_err = 0;
|
|
}
|
|
}
|
|
|
|
void* phy_multi_sync_get_ppm_status()
|
|
{
|
|
return &g_phy_cpu_share_ctxt.ppm_status;
|
|
}
|
|
|
|
uint32_t phy_multi_sync_get_record_nid(phy_ppm_status_ctxt_t *ctxt,
|
|
uint8_t idx)
|
|
{
|
|
if (idx >= MAX_SYNC_CCO_CNT || ctxt == NULL) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
|
|
return ctxt->ppm_status[idx].nid;
|
|
}
|
|
|
|
void phy_multi_sync_set_record_nid(phy_ppm_status_ctxt_t *ctxt,
|
|
uint8_t idx, uint32_t nid)
|
|
{
|
|
if (idx >= MAX_SYNC_CCO_CNT || ctxt == NULL) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
|
|
ctxt->ppm_status[idx].nid = nid;
|
|
return;
|
|
}
|
|
|
|
uint32_t phy_multi_sync_get_valid_flag(phy_ppm_status_ctxt_t *ctxt,
|
|
uint8_t idx)
|
|
{
|
|
if (idx >= MAX_SYNC_CCO_CNT || ctxt == NULL) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
|
|
return ctxt->ppm_status[idx].valid;
|
|
}
|
|
|
|
void phy_multi_sync_set_valid_flag(phy_ppm_status_ctxt_t *ctxt,
|
|
uint8_t idx, uint8_t valid)
|
|
{
|
|
/* mac and phy share this flag */
|
|
if (idx >= MAX_SYNC_CCO_CNT || ctxt == NULL) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
|
|
ctxt->ppm_status[idx].valid = valid;
|
|
return;
|
|
}
|
|
|
|
int16_t phy_multi_sync_get_record_ppm(phy_ppm_status_ctxt_t *ctxt,
|
|
uint8_t idx)
|
|
{
|
|
if (idx >= MAX_SYNC_CCO_CNT || ctxt == NULL) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
if (phy_multi_sync_get_valid_flag(ctxt, idx) == RECORD_PPM_VALID) {
|
|
return ctxt->ppm_status[idx].ppm_err;
|
|
} else {
|
|
return PLC_MAX_MAC_NTB_PPM;
|
|
}
|
|
|
|
}
|
|
|
|
void phy_multi_sync_set_record_ppm(phy_ppm_status_ctxt_t *ctxt,
|
|
uint8_t idx, int16_t ppm)
|
|
{
|
|
if (idx >= MAX_SYNC_CCO_CNT || ctxt == NULL) {
|
|
IOT_ASSERT(0);
|
|
}
|
|
|
|
ctxt->ppm_status[idx].ppm_err = ppm;
|
|
return;
|
|
}
|
|
|
|
uint8_t phy_multi_sync_get_record_idx(phy_ppm_status_ctxt_t *ctxt,
|
|
uint32_t cur_nid)
|
|
{
|
|
uint8_t idx = MAX_SYNC_CCO_CNT;
|
|
for (idx = 0; idx < MAX_SYNC_CCO_CNT; idx++) {
|
|
if (phy_multi_sync_get_valid_flag(ctxt, idx) != RECORD_PPM_INVALID_NID
|
|
&& phy_multi_sync_get_record_nid(ctxt, idx) == cur_nid) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return idx;
|
|
}
|
|
|
|
void phy_multi_sync_set_enable(phy_ppm_status_ctxt_t *ctxt, uint8_t enable)
|
|
{
|
|
ctxt->enable = !!enable;
|
|
}
|
|
|
|
void phy_multi_sync_apply_bb_ppm(phy_ppm_status_ctxt_t *ctxt,
|
|
uint32_t cur_nid, uint8_t update_flag)
|
|
{
|
|
uint8_t idx;
|
|
int16_t ppm_err;
|
|
if (ctxt->enable == 0) {
|
|
return;
|
|
}
|
|
|
|
idx = phy_multi_sync_get_record_idx(ctxt, cur_nid);
|
|
if (idx < MAX_SYNC_CCO_CNT) {
|
|
ppm_err = phy_multi_sync_get_record_ppm(ctxt, idx)
|
|
>> PLC_NTB_PPM_SHIFT;
|
|
if (ppm_err != PLC_MAX_PPM_SUPPORT) {
|
|
ppm_err = phy_ppm_cal_hw_val(PHY_CAL_UNIT_1_1, -ppm_err, 0);
|
|
} else {
|
|
ppm_err = g_phy_cpu_share_ctxt.phy_ppm_init;
|
|
}
|
|
} else {
|
|
/* Note: rx fc nid is PLC_DBG_PKT_MODE_NID/PLC_NID_INVALID/unknow nid,
|
|
* then set ppm is phy default.
|
|
*/
|
|
ppm_err = g_phy_cpu_share_ctxt.phy_ppm_init;
|
|
}
|
|
|
|
phy_ppm_set(ppm_err, update_flag);
|
|
}
|
|
|
|
uint32_t phy_multi_sync_set_ppm(phy_ppm_status_ctxt_t *status_ctxt, uint32_t nid)
|
|
{
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
uint32_t ret = ERR_INVAL;
|
|
/* kl2 use hw multippm */
|
|
uint8_t idx = phy_multi_sync_get_record_idx(status_ctxt, nid);
|
|
if (idx < MAX_SYNC_CCO_CNT) {
|
|
ret = phy_set_sw_nn_ppm_para((uint32_t)idx, nid,
|
|
phy_multi_sync_get_record_ppm(status_ctxt, idx)
|
|
>> PLC_NTB_PPM_SHIFT);
|
|
}
|
|
return ret;
|
|
#endif
|
|
(void)status_ctxt;
|
|
(void)nid;
|
|
return 0;
|
|
}
|
|
|
|
#endif
|