173 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			173 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/****************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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
							 |