1 /******************************************************************************
2 ** File Name: chip_phy_v3.c *
3 ** Author: Richard Yang *
5 ** Copyright: 2002 Spreatrum, Incoporated. All Rights Reserved. *
6 ** Description: This file defines the basic information on chip. *
7 ******************************************************************************
9 ******************************************************************************
11 ** ------------------------------------------------------------------------- *
12 ** DATE NAME DESCRIPTION *
13 ** 08/14/2002 Richard.Yang Create. *
14 ** 09/16/2003 Xueliang.Wang Modify CR4013 *
15 ** 08/23/2004 JImmy.Jia Modify for SC6600D *
16 ******************************************************************************/
18 /**---------------------------------------------------------------------------*
20 **---------------------------------------------------------------------------*/
22 #include "asm/arch/sc_reg.h"
23 #include "asm/arch/adi_hal_internal.h"
24 #include "asm/arch/wdg_drvapi.h"
25 #include "asm/arch/sprd_reg.h"
26 #include "asm/arch/boot_drvapi.h"
27 /**---------------------------------------------------------------------------*
29 **---------------------------------------------------------------------------*/
35 /**---------------------------------------------------------------------------*
37 **---------------------------------------------------------------------------*/
40 /**---------------------------------------------------------------------------*
42 **---------------------------------------------------------------------------*/
44 /**---------------------------------------------------------------------------*
46 **---------------------------------------------------------------------------*/
48 /**---------------------------------------------------------------------------*
49 ** Function Definitions *
50 **---------------------------------------------------------------------------*/
51 /*****************************************************************************/
52 // Description : This function is used to reset MCU.
53 // Global resource dependence :
54 // Author : Xueliang.Wang
56 /*****************************************************************************/
57 void CHIP_ResetMCU (void) //reset interrupt disable??
59 // This loop is very important to let the reset process work well on V3 board
71 volatile uint32 tick1 = SCI_GetTickCount();
72 volatile uint32 tick2 = SCI_GetTickCount();
74 while ( (tick2 - tick1) < 500)
76 tick2 = SCI_GetTickCount();
81 /*****************************************************************************/
82 // Description: Returns the HW_RST register address.
84 // Note : Because there is no register which can restore information
85 // when watchdog resets the system, so we choose IRAM.
86 /*****************************************************************************/
87 LOCAL uint32 CHIP_PHY_GetHwRstAddr (void)
89 // Returns a DWORD of IRAM shared with DCAM
90 return ANA_REG_GLB_WDG_RST_MONITOR;
93 /*****************************************************************************/
94 // Description: Returns the reset mode register address.
97 /*****************************************************************************/
98 LOCAL uint32 CHIP_PHY_GetRstModeAddr (void)
100 return ANA_REG_GLB_POR_RST_MONITOR;
103 /*****************************************************************************/
104 // Description: Gets the register in analog die to judge the reset mode.
106 // Note: !It is called before __main now, so it can not call the adi
107 // interface because it contains SCI_DisableIRQ inside, below
108 // writes the adi read interface individually. Because the la-
109 // ckless of SCI_DisableIRQ, so this function must be called
110 // before system interrupt is turnned on!
111 /*****************************************************************************/
112 LOCAL uint32 CHIP_PHY_GetANAReg (void)
114 return ANA_REG_GET(ANA_REG_GLB_POR_RST_MONITOR);
117 /*****************************************************************************/
118 // Description: This fuction returns the HW_RST value written before reset.
121 /*****************************************************************************/
122 LOCAL uint32 CHIP_PHY_GetHWFlag (void)
124 // Switch IRAM from DCAM to ARM
125 return ANA_REG_GET (CHIP_PHY_GetHwRstAddr ());
128 /*****************************************************************************/
129 // Description: PHY layer realization of BOOT_SetRstMode.
131 // Note: The valid bit filed is from bit15 to bit0
132 /*****************************************************************************/
133 PUBLIC void CHIP_PHY_SetRstMode (uint32 val)
135 ANA_REG_AND (CHIP_PHY_GetRstModeAddr (), ~0xFFFF);
136 ANA_REG_OR (CHIP_PHY_GetRstModeAddr (), (val&0xFFFF));
139 /*****************************************************************************/
140 // Description: This fuction returns the reset mode value.
143 /*****************************************************************************/
144 PUBLIC uint32 CHIP_PHY_GetRstMode (void)
146 return (ANA_REG_GET (CHIP_PHY_GetRstModeAddr ()) & 0xFFFF);
149 /*****************************************************************************/
150 // Description: PHY layer realization of BOOT_ResetHWFlag. It resets the HW
151 // reset register after system initialization.
153 // Note: The valid bit filed of analog register is from bit11 to bit0.
154 // | 11 10 9 8 | 7 6 5 4 | 3 2 1 0 |
155 // |ALL_HRST_MONITOR | POR_HRST_MONITOR| WDG_HRST_MONITOR |
157 // The valid bit filed of HW_RST is from bit11 to bit0.
158 /*****************************************************************************/
159 PUBLIC void CHIP_PHY_ResetHWFlag (uint32 val)
161 // Reset the analog die register
162 ANA_REG_AND(ANA_REG_GLB_POR_RST_MONITOR, ~0xFFF);
163 ANA_REG_OR (ANA_REG_GLB_POR_RST_MONITOR, (val&0xFFF));
166 ANA_REG_AND(CHIP_PHY_GetHwRstAddr (), ~0xFFFF);
167 ANA_REG_OR (CHIP_PHY_GetHwRstAddr (), (val&0xFFFF));
170 /*****************************************************************************/
171 // Description: PHY layer realization of BOOT_SetWDGHWFlag. It Writes flag
172 // to the register which would not be reset by watchdog reset.
174 // Note: The valid bit filed is from bit15 to bit0
175 /*****************************************************************************/
176 PUBLIC void CHIP_PHY_SetWDGHWFlag (WDG_HW_FLAG_T type, uint32 val)
178 if(TYPE_RESET == type)
180 ANA_REG_AND(CHIP_PHY_GetHwRstAddr (), ~0xFFFF);
181 ANA_REG_OR (CHIP_PHY_GetHwRstAddr (), (val&0xFFFF));
190 /*****************************************************************************/
191 // Description: PHY layer realization of __BOOT_IRAM_EN.
193 // Note: Do nothing. There are 32KB internal ram dedicated for ARM.
194 /*****************************************************************************/
195 PUBLIC void CHIP_PHY_BootIramEn ()
199 /*****************************************************************************/
200 // Description : This function returns whether the watchdog reset is caused
201 // by software reset or system halted.
203 // Note : The valid bit filed is from bit15 to bit0
204 /*****************************************************************************/
205 PUBLIC BOOLEAN CHIP_PHY_IsWDGRstByMCU (uint32 flag)
207 // Copy the value of HW_RST register to the register specific to reset mode
208 ANA_REG_SET (CHIP_PHY_GetRstModeAddr (),
209 (CHIP_PHY_GetHWFlag () & 0xFFFF));
211 if ((CHIP_PHY_GetHWFlag () & 0xFFFF) == (flag & 0xFFFF))
221 /*****************************************************************************/
222 // Description : This function returns whether the reset is caused by power
225 // Note : | 11 10 9 8 | 7 6 5 4 | 3 2 1 0 |
226 // |ALL_HRST_MONITOR | POR_HRST_MONITOR| WDG_HRST_MONITOR |
227 /*****************************************************************************/
228 PUBLIC BOOLEAN CHIP_PHY_IsResetByPowerUp()
230 if ((CHIP_PHY_GetANAReg () & 0xF0) == 0x0)
240 /*****************************************************************************/
241 // Description : This function returns whether the reset is caused by watch-
244 // Note : | 11 10 9 8 | 7 6 5 4 | 3 2 1 0 |
245 // |ALL_HRST_MONITOR | POR_HRST_MONITOR| WDG_HRST_MONITOR |
246 /*****************************************************************************/
247 PUBLIC BOOLEAN CHIP_PHY_IsResetByWatchDog()
249 if ((CHIP_PHY_GetANAReg () & 0xF) == 0x0)
259 /************************************************************
260 *select TDPLL's reference crystal,
261 *(1)--RF0---------xtlbuf0-----------
262 * -?-tdpll_ref_sel-----TDPLL
263 *(2)--RF1---------xtlbuf1-----------
264 1)rf_id = 0,TDPLL will select (1), or select (2)
265 ************************************************************/
266 PUBLIC uint32 TDPllRefConfig(TDPLL_REF_T rf_id)
269 /* before switch reference crystal, it must be sure that no module is using TDPLL */
270 pll_reg = readl(REG_AP_CLK_AP_AHB_CFG);
271 pll_reg &= ~AP_AHB_CLK_SEL_MASK;
272 writel(pll_reg, REG_AP_CLK_AP_AHB_CFG);
274 pll_reg = readl(REG_AON_CLK_PUB_AHB_CFG);
275 pll_reg &= ~PUB_AHB_CLK_SEL_MASK;
276 writel(pll_reg, REG_AON_CLK_PUB_AHB_CFG);
278 pll_reg = readl(REG_AP_CLK_AP_APB_CFG);
279 pll_reg &= ~AP_APB_CLK_SEL_MASK;
280 writel(pll_reg, REG_AP_CLK_AP_APB_CFG);
282 pll_reg = readl(REG_AON_CLK_AON_APB_CFG);
283 pll_reg &= ~PUB_APB_CLK_SEL_MASK;
284 writel(pll_reg, REG_AON_CLK_AON_APB_CFG);
286 pll_reg = readl(REG_AON_APB_PLL_SOFT_CNT_DONE);
287 pll_reg &= ~(BIT_TDPLL_SOFT_CNT_DONE);
288 writel(pll_reg, REG_AON_APB_PLL_SOFT_CNT_DONE);
291 /* switch TDPLL reference crystal */
292 if (rf_id == TDPLL_REF0)
294 pll_reg = readl(REG_PMU_APB_TDPLL_REL_CFG);
295 pll_reg &= ~(0x1 << 4);
296 writel(pll_reg, REG_PMU_APB_TDPLL_REL_CFG);
298 pll_reg = readl(REG_PMU_APB_XTL0_REL_CFG);
299 pll_reg |= BIT_XTL1_AP_SEL;
300 writel(pll_reg, REG_PMU_APB_XTL0_REL_CFG);
302 pll_reg = readl(REG_PMU_APB_XTLBUF0_REL_CFG);
303 pll_reg |= BIT_XTLBUF1_AP_SEL;
304 writel(pll_reg, REG_PMU_APB_XTLBUF0_REL_CFG);
306 else if(rf_id == TDPLL_REF1)
308 pll_reg = readl(REG_PMU_APB_TDPLL_REL_CFG);
309 pll_reg |= (0x1 << 4);
310 writel(pll_reg, REG_PMU_APB_TDPLL_REL_CFG);
312 pll_reg = readl(REG_PMU_APB_XTL1_REL_CFG);
313 pll_reg |= BIT_XTL1_AP_SEL;
314 writel(pll_reg, REG_PMU_APB_XTL1_REL_CFG);
316 pll_reg = readl(REG_PMU_APB_XTLBUF1_REL_CFG);
317 pll_reg |= BIT_XTLBUF1_AP_SEL;
318 writel(pll_reg, REG_PMU_APB_XTLBUF1_REL_CFG);
323 pll_reg = readl(REG_AON_APB_PLL_SOFT_CNT_DONE);
324 pll_reg |= (BIT_TDPLL_SOFT_CNT_DONE);
325 writel(pll_reg, REG_AON_APB_PLL_SOFT_CNT_DONE);
329 /* after switch, up ahb clock to 128M, APB to 64M */
330 pll_reg = readl(REG_AP_CLK_AP_AHB_CFG);
332 writel(pll_reg, REG_AP_CLK_AP_AHB_CFG);
334 pll_reg = readl(REG_AON_CLK_PUB_AHB_CFG);
336 writel(pll_reg, REG_AON_CLK_PUB_AHB_CFG);
338 pll_reg = readl(REG_AP_CLK_AP_APB_CFG);
340 writel(pll_reg, REG_AP_CLK_AP_APB_CFG);
342 pll_reg = readl(REG_AON_CLK_AON_APB_CFG);
344 writel(pll_reg, REG_AON_CLK_AON_APB_CFG);
347 /**---------------------------------------------------------------------------*
349 **---------------------------------------------------------------------------*/