| | |
| | | #include "PanSeries.h" |
| | | #include "pan_lp.h" |
| | | #include "pan_clk.h" |
| | | #include "comm_prf.h" |
| | | |
| | | extern const uint32_t PanFlashLineMode; |
| | | extern const bool PanFlashEnhanceEnable; |
| | | |
| | | /** |
| | | * @brief This function enable gpio p56 wake up |
| | | * @brief This function enable gpio p56 wake up |
| | | * @param[in] ana: where ana is analog module |
| | | * @param[in] WkEdge: wake up edge select,0-->low,1-->high |
| | | * @param[in] WkEdge: wake up edge select,0-->low,1-->high |
| | | * @return none |
| | | */ |
| | | void LP_SetExternalWake(ANA_T *ana,uint8_t WkEdge) |
| | |
| | | * |
| | | * @return none |
| | | */ |
| | | |
| | | void LP_SetSleepMode(ANA_T *ana,uint8_t mode) |
| | | { |
| | | uint32_t tmp_reg; |
| | |
| | | tmp_reg &= ~(ANAC_FL_SLEEP_MODE_SEL_Msk); |
| | | tmp_reg |= (mode << ANAC_FL_SLEEP_MODE_SEL_Pos); |
| | | ana->LP_FL_CTRL_3V = tmp_reg; |
| | | } |
| | | |
| | | __STATIC_FORCEINLINE void PHY_FifoFlush(void) |
| | | { |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY1, PHY_DRV_CFG_BUF_FLUSH, 0x1); |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY1, PHY_DRV_CFG_BUF_FLUSH, 0x0); |
| | | |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY1, PHY_DRV_RSP_BUF_FLUSH, 0x1); |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY1, PHY_DRV_RSP_BUF_FLUSH, 0x0); |
| | | } |
| | | |
| | | uint32_t PHY_WriteCfgFifoBatchCopy(const uint32_t *command, const uint32_t cmd_len, uint32_t *ptr_rsp_value) |
| | | { |
| | | volatile uint32_t reg = 0; |
| | | uint32_t time_out = 0, cmd_idx = 0; |
| | | uint32_t rsp_len = 0; |
| | | |
| | | if (0 == cmd_len) |
| | | { |
| | | goto fun_ext; |
| | | } |
| | | |
| | | /* Flush the PHY Driver FIFO */ |
| | | PHY_FifoFlush(); |
| | | |
| | | /* Trigger the FIFO */ |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY1, PHY_DRV_CFG_TRG, 0x1); |
| | | |
| | | do |
| | | { |
| | | do |
| | | { |
| | | /* check that the FIFO is empty */ |
| | | reg = PRI_RF_READ_REG_VALUE(PRI_RF, PHY1, PHY_DRV_CFG_BUF_FULL); |
| | | } while (reg == 1); |
| | | |
| | | /* Write the commands to FIFO */ |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY3, PHY_DRV_CFG_BUF_DIN, command[cmd_idx++]); |
| | | |
| | | /* check that the Response buff is full */ |
| | | reg = PRI_RF_READ_REG_VALUE(PRI_RF, PHY1, PHY_DRV_RSP_BUF_EMPTY); |
| | | if ((ptr_rsp_value != NULL) && (reg == 0)) |
| | | { |
| | | /* read the response from FIFO */ |
| | | ptr_rsp_value[rsp_len++] = PRI_RF_READ_REG_VALUE(PRI_RF, PHY4, PHY_DRV_RSP_BUF_DOUT); |
| | | } |
| | | } while (cmd_idx < cmd_len); |
| | | |
| | | do |
| | | { |
| | | time_out++; |
| | | reg = PRI_RF_READ_REG_VALUE(PRI_RF, INTR1, IC_PHY_DRV_CFG_DONE); |
| | | } while (reg == 0); |
| | | |
| | | /* check that the Response buff is full */ |
| | | reg = PRI_RF_READ_REG_VALUE(PRI_RF, PHY1, PHY_DRV_RSP_BUF_EMPTY); |
| | | |
| | | while ((ptr_rsp_value != NULL) && (reg == 0)) |
| | | { |
| | | /* read the response from FIFO */ |
| | | ptr_rsp_value[rsp_len++] = PRI_RF_READ_REG_VALUE(PRI_RF, PHY4, PHY_DRV_RSP_BUF_DOUT); |
| | | /* check that the Response buff is full */ |
| | | reg = PRI_RF_READ_REG_VALUE(PRI_RF, PHY1, PHY_DRV_RSP_BUF_EMPTY); |
| | | } |
| | | |
| | | /* Clear the interrupt */ |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, INTCLR, IC_PHY_DRV_CFG_DONE_CLR, 1); |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, INTCLR, IC_PHY_DRV_CFG_DONE_CLR, 0); |
| | | PRI_RF_WRITE_REG_VALUE(PRI_RF, PHY1, PHY_DRV_CFG_TRG, 0x0); |
| | | |
| | | fun_ext: |
| | | |
| | | return rsp_len; |
| | | } |
| | | |
| | | uint32_t PHY_SingleRegRead(uint32_t reg_addr) |
| | | { |
| | | uint32_t reg; |
| | | uint32_t val; |
| | | uint32_t cmd[] = { |
| | | 0x00000013 | (reg_addr << 8), |
| | | }; |
| | | |
| | | // Backup AHB Clock Register and enable LL Clock |
| | | reg = CLK->AHB_CLK_CTRL; |
| | | CLK->AHB_CLK_CTRL |= CLK_AHBCLK_BLE32M_EN_Msk | CLK_AHBCLK_BLE32K_EN_Msk; |
| | | |
| | | // Enable LL module for later phy operation |
| | | LLHWC_WRITE_MASK32_REG(REG_FILE_OFST, CTRL_MEM_SOFT_RST_N, CTRL_MEM_SOFT_RST_N_MSK, CTRL_MEM_SOFT_RST_N_SHFT, 0); |
| | | LLHWC_WRITE_MASK32_REG(REG_FILE_OFST, CTRL_MEM_SOFT_RST_N, CTRL_MEM_SOFT_RST_N_MSK, CTRL_MEM_SOFT_RST_N_SHFT, 1); |
| | | LLHWC_WRITE_MASK32_REG(REG_FILE_OFST, CTRL_PWR_MOD, CTRL_PWR_MOD_MSK, CTRL_PWR_MOD_SHFT, 1); |
| | | |
| | | // Start to read phy register |
| | | PHY_WriteCfgFifoBatchCopy(cmd, sizeof(cmd) >> 2, &val); |
| | | |
| | | // Restore AHB Clock Register |
| | | CLK->AHB_CLK_CTRL = reg; |
| | | |
| | | return val; |
| | | } |
| | | |
| | | void PHY_SingleRegWrite(uint32_t reg_addr, uint32_t reg_val) |
| | | { |
| | | uint32_t reg; |
| | | uint32_t cmd[] = { |
| | | 0x00000012 | (reg_addr << 8) | (reg_val << 16), |
| | | }; |
| | | |
| | | // Backup AHB Clock Register and enable LL Clock |
| | | reg = CLK->AHB_CLK_CTRL; |
| | | CLK->AHB_CLK_CTRL |= CLK_AHBCLK_BLE32M_EN_Msk | CLK_AHBCLK_BLE32K_EN_Msk; |
| | | |
| | | // Enable LL module for later phy operation |
| | | LLHWC_WRITE_MASK32_REG(REG_FILE_OFST, CTRL_MEM_SOFT_RST_N, CTRL_MEM_SOFT_RST_N_MSK, CTRL_MEM_SOFT_RST_N_SHFT, 0); |
| | | LLHWC_WRITE_MASK32_REG(REG_FILE_OFST, CTRL_MEM_SOFT_RST_N, CTRL_MEM_SOFT_RST_N_MSK, CTRL_MEM_SOFT_RST_N_SHFT, 1); |
| | | LLHWC_WRITE_MASK32_REG(REG_FILE_OFST, CTRL_PWR_MOD, CTRL_PWR_MOD_MSK, CTRL_PWR_MOD_SHFT, 1); |
| | | |
| | | // Start to write phy register |
| | | PHY_WriteCfgFifoBatchCopy(cmd, sizeof(cmd) >> 2, NULL); |
| | | |
| | | // Restore AHB Clock Register |
| | | CLK->AHB_CLK_CTRL = reg; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | // Configure LP delay |
| | | ana->LP_DLY_CTRL_3V &= ~0x3ff; |
| | | ana->LP_DLY_CTRL_3V |= 0x5; |
| | | ana->LP_DLY_CTRL_3V |= 0x7; |
| | | |
| | | // Mask all interrupts |
| | | __disable_irq(); |
| | |
| | | |
| | | /* Set digital delay with 32k tick unit */ |
| | | ana->LP_DLY_CTRL_3V &= ~0x3ff; |
| | | ana->LP_DLY_CTRL_3V |= 5; |
| | | ana->LP_DLY_CTRL_3V |= 7; |
| | | |
| | | /* Insure we are going to enter hw standby mode 1 */ |
| | | LP_SetSleepMode(ana, LP_MODE_SEL_STANDBY_M1_MODE); |
| | |
| | | |
| | | /* Set digital delay with 32k tick unit */ |
| | | ANA->LP_DLY_CTRL_3V &= ~0x3ff; |
| | | ANA->LP_DLY_CTRL_3V |= 5; |
| | | ANA->LP_DLY_CTRL_3V |= 7; |
| | | |
| | | /* Insure we are going to enter hw standby mode 1 */ |
| | | LP_SetSleepMode(ANA, LP_MODE_SEL_STANDBY_M0_MODE); |