143 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			143 lines
		
	
	
		
			4.2 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 "hw_reg_api.h"
 | ||
|  | #include "phy_reg.h"
 | ||
|  | #include "phy_dfe_reg.h"
 | ||
|  | #include "plc_const.h"
 | ||
|  | #include "phy_ppm.h"
 | ||
|  | 
 | ||
|  | void phy_set_sw_nn_tx_ppm_en(uint8_t enable) | ||
|  | { | ||
|  |     (void)enable; | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_sw_nn_tx_ppm_en(void) | ||
|  | { | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_set_sw_nn_rx_ppm_en(uint8_t enable) | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     uint32_t tmp; | ||
|  |     tmp = PHY_DFE_READ_REG(CFG_BB_PPM_CFG2_ADDR); | ||
|  |     REG_FIELD_SET(SW_NN_PPM_EN, tmp, !!enable); | ||
|  |     PHY_DFE_WRITE_REG(CFG_BB_PPM_CFG2_ADDR, tmp); | ||
|  | #else
 | ||
|  |     (void)enable; | ||
|  | #endif
 | ||
|  |     return; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_sw_nn_rx_ppm_en(void) | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     return (uint32_t)REG_FIELD_GET(SW_NN_PPM_EN, \ | ||
|  |         PHY_DFE_READ_REG(CFG_BB_PPM_CFG2_ADDR)); | ||
|  | #else
 | ||
|  |     return 0; | ||
|  | #endif
 | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_set_sw_nn_ppm_para(uint32_t para_id, uint32_t nn_nid, | ||
|  |     int16_t nn_ppm) | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     uint32_t tmp, reg_addr; | ||
|  |     int16_t self_ppm, rx_nn_phase_adj; | ||
|  | 
 | ||
|  |     if (para_id > PHY_SW_NN_PPM_PARA_MAX | ||
|  |         || nn_ppm == PLC_MAX_PPM_SUPPORT) { | ||
|  |         return ERR_INVAL; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* set nn nid */ | ||
|  |     reg_addr = CFG_BB_PHY_NN_NID0_ADDR + \ | ||
|  |         ((CFG_BB_PHY_NN_NID1_ADDR - CFG_BB_PHY_NN_NID0_ADDR) * para_id); | ||
|  |     tmp = PHY_READ_REG(reg_addr); | ||
|  |     /* attention to the define of SW_PHY_NN_NID0~7 in the register header file
 | ||
|  |      * must be consistent. | ||
|  |      */ | ||
|  |     REG_FIELD_SET(SW_PHY_NN_NID0, tmp, nn_nid); | ||
|  |     PHY_WRITE_REG(reg_addr, tmp); | ||
|  | 
 | ||
|  |     /* st nn ppm and phase ppm adj*/ | ||
|  |     self_ppm = REG_FIELD_GET(SW_RX_PPM, \ | ||
|  |         PHY_DFE_READ_REG(CFG_BB_PPM_SETTING_ADDR)); | ||
|  |     rx_nn_phase_adj = (int16_t)PHY_PPM_TO_NN_PHASE_ADJ(nn_ppm, (self_ppm >> 4)); | ||
|  |     reg_addr = CFG_BB_NN_PPM_CFG0_ADDR + \ | ||
|  |         ((CFG_BB_NN_PPM_CFG1_ADDR - CFG_BB_NN_PPM_CFG0_ADDR) * para_id); | ||
|  |     tmp = PHY_DFE_READ_REG(reg_addr); | ||
|  |     /* attention to the define of SW_RX_NN_PPM0~7 & SW_RX_NN_PHASE_ADJ_VAL0~7
 | ||
|  |      * in the register header file must be consistent. | ||
|  |      */ | ||
|  |     REG_FIELD_SET(SW_RX_NN_PPM0, tmp, nn_ppm << 4); | ||
|  |     REG_FIELD_SET(SW_RX_NN_PHASE_ADJ_VAL0, tmp, rx_nn_phase_adj); | ||
|  |     PHY_DFE_WRITE_REG(reg_addr, tmp); | ||
|  | #endif
 | ||
|  |     (void)para_id; | ||
|  |     (void)nn_nid; | ||
|  |     (void)nn_ppm; | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_sw_nn_rx_ppm_para(uint32_t para_id, uint32_t *nn_nid, | ||
|  |     int16_t *nn_ppm, int16_t *rx_nn_phase_adj) | ||
|  | { | ||
|  | #if HW_PLATFORM >= HW_PLATFORM_FPGA
 | ||
|  |     uint32_t tmp, reg_addr; | ||
|  |     if ((para_id > PHY_SW_NN_PPM_PARA_MAX) || | ||
|  |         !(nn_nid && nn_ppm && rx_nn_phase_adj)) { | ||
|  |         return ERR_INVAL; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (nn_nid) { | ||
|  |         reg_addr = CFG_BB_PHY_NN_NID0_ADDR + \ | ||
|  |             ((CFG_BB_PHY_NN_NID1_ADDR - CFG_BB_PHY_NN_NID0_ADDR) * para_id); | ||
|  |         *nn_nid = (uint32_t)(REG_FIELD_GET(SW_PHY_NN_NID0, \ | ||
|  |             PHY_READ_REG(reg_addr))); | ||
|  |     } | ||
|  |     if (nn_ppm || rx_nn_phase_adj) { | ||
|  |         reg_addr = CFG_BB_NN_PPM_CFG0_ADDR + \ | ||
|  |             ((CFG_BB_NN_PPM_CFG1_ADDR - CFG_BB_NN_PPM_CFG0_ADDR) * para_id); | ||
|  |         tmp = PHY_DFE_READ_REG(reg_addr); | ||
|  |         if (nn_ppm) { | ||
|  |             *nn_ppm = (int16_t)(REG_FIELD_GET(SW_RX_NN_PPM0, tmp) >> 4); | ||
|  |         } | ||
|  |         if (rx_nn_phase_adj) { | ||
|  |             *rx_nn_phase_adj = (int16_t)(REG_FIELD_GET(\ | ||
|  |                 SW_RX_NN_PHASE_ADJ_VAL0, tmp)); | ||
|  |         } | ||
|  |     } | ||
|  | #endif
 | ||
|  |     (void)para_id; | ||
|  |     (void)nn_nid; | ||
|  |     (void)nn_ppm; | ||
|  |     (void)rx_nn_phase_adj; | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_get_sw_nn_tx_ppm_para(uint32_t para_id, uint32_t *nn_nid, | ||
|  |     int16_t *nn_ppm) | ||
|  | { | ||
|  |     (void)para_id; | ||
|  |     (void)nn_nid; | ||
|  |     (void)nn_ppm; | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 |