clock.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /**
  2. * @file clock.c
  3. * @author chipsea
  4. * @brief
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. #include "sdk_config.h"
  11. #include "clock.h"
  12. #include "gpio.h"
  13. #include "global_config.h"
  14. #include "error.h"
  15. #include "rf_phy_driver.h"
  16. #include "jump_function.h"
  17. #include "flash.h"
  18. extern uint32_t hclk,pclk;
  19. extern uint32_t osal_sys_tick;
  20. extern void wakeupProcess_rcoscmode(void);
  21. void hal_clk_gate_enable(MODULE_e module)
  22. {
  23. if(module < MOD_CP_CPU)
  24. {
  25. AP_PCR->SW_CLK |= BIT(module);
  26. }
  27. else if(module < MOD_PCLK_CACHE)
  28. {
  29. AP_PCR->SW_CLK1 |= BIT(module-MOD_CP_CPU);
  30. }
  31. else if(module < MOD_USR0)
  32. {
  33. AP_PCR->CACHE_CLOCK_GATE |= BIT(module-MOD_PCLK_CACHE);
  34. }
  35. }
  36. void hal_clk_gate_disable(MODULE_e module)
  37. {
  38. if(module < MOD_CP_CPU)
  39. {
  40. AP_PCR->SW_CLK &= ~(BIT(module));
  41. }
  42. else if(module < MOD_PCLK_CACHE)
  43. {
  44. AP_PCR->SW_CLK1 &= ~(BIT(module-MOD_CP_CPU));
  45. }
  46. else if(module < MOD_USR0)
  47. {
  48. AP_PCR->CACHE_CLOCK_GATE &= ~(BIT(module-MOD_PCLK_CACHE));
  49. }
  50. }
  51. int hal_clk_gate_get(MODULE_e module)
  52. {
  53. if(module < MOD_CP_CPU)
  54. {
  55. return (AP_PCR->SW_CLK & BIT(module));
  56. }
  57. else if(module < MOD_PCLK_CACHE)
  58. {
  59. return (AP_PCR->SW_CLK1 & BIT(module-MOD_CP_CPU));
  60. }
  61. //else if(module < MOD_USR0)
  62. else
  63. {
  64. return (AP_PCR->CACHE_CLOCK_GATE & BIT(module-MOD_PCLK_CACHE));
  65. }
  66. }
  67. void hal_clk_get_modules_state(uint32_t* buff)
  68. {
  69. *buff = AP_PCR->SW_CLK;
  70. *(buff+1) = AP_PCR->SW_CLK1;
  71. *(buff+2) = AP_PCR->CACHE_CLOCK_GATE;
  72. }
  73. void hal_clk_reset(MODULE_e module)
  74. {
  75. if(module < MOD_CP_CPU)
  76. {
  77. if((module >= MOD_TIMER5) &&(module <= MOD_TIMER6))
  78. {
  79. AP_PCR->SW_RESET0 &= ~BIT(5);
  80. AP_PCR->SW_RESET0 |= BIT(5);
  81. }
  82. else
  83. {
  84. AP_PCR->SW_RESET0 &= ~BIT(module);
  85. AP_PCR->SW_RESET0 |= BIT(module);
  86. }
  87. }
  88. else if(module < MOD_PCLK_CACHE)
  89. {
  90. if((module >= MOD_TIMER1) &&(module <= MOD_TIMER4))
  91. {
  92. AP_PCR->SW_RESET2 &= ~BIT(4);
  93. AP_PCR->SW_RESET2 |= BIT(4);
  94. }
  95. else
  96. {
  97. AP_PCR->SW_RESET2 &= ~BIT(module-MOD_CP_CPU);
  98. AP_PCR->SW_RESET2 |= BIT(module-MOD_CP_CPU);
  99. }
  100. }
  101. else if(module < MOD_USR0)
  102. {
  103. AP_PCR->CACHE_RST &= ~BIT(1-(module-MOD_HCLK_CACHE));
  104. AP_PCR->CACHE_RST |= BIT(1-(module-MOD_HCLK_CACHE));
  105. }
  106. }
  107. void hal_rtc_clock_config(CLK32K_e clk32Mode)
  108. {
  109. uint8_t ic_ver = get_ic_version();
  110. if(clk32Mode == CLK_32K_RCOSC)
  111. {
  112. subWriteReg(&(AP_AON->PMCTL0),31,27,0x05);
  113. subWriteReg(&(AP_AON->PMCTL2_0),16,7,0x3fb);
  114. subWriteReg(&(AP_AON->PMCTL2_0),6,6 ,0x01);
  115. //pGlobal_config[LL_SWITCH]|=RC32_TRACKINK_ALLOW|LL_RC32K_SEL;
  116. if(ic_ver != VERSION_0100)
  117. {
  118. JUMP_FUNCTION(WAKEUP_PROCESS)=(uint32_t)&wakeupProcess_rcoscmode;
  119. }
  120. }
  121. else if(clk32Mode == CLK_32K_XTAL)
  122. {
  123. // P16 P17 for 32K XTAL input
  124. HalGpioPupdConfig(P16,FLOATING);
  125. HalGpioPupdConfig(P17,FLOATING);
  126. subWriteReg(&(AP_AON->PMCTL2_0),9,8,0x03); //software control 32k_clk
  127. subWriteReg(&(AP_AON->PMCTL2_0),6,6,0x00); //disable software control
  128. subWriteReg(&(AP_AON->PMCTL0),31,27,0x16);
  129. subWriteReg(&(AP_AON->PMCTL0),28,28,0x1);// turn on 32kxtal
  130. subWriteReg(&(AP_AON->PMCTL1),18,17,0x3);// reduce 32kxtl bias current
  131. subWriteReg(&(AP_AON->PMCTL1),24,24,0x1);// enable 32k xtal offset cap base value
  132. //pGlobal_config[LL_SWITCH]&=0xffffffee;
  133. }
  134. }
  135. uint32_t hal_systick(void)
  136. {
  137. return osal_sys_tick;
  138. }
  139. uint32_t hal_ms_intv(uint32_t tick)
  140. {
  141. uint32_t diff = 0;
  142. if(osal_sys_tick < tick){
  143. diff = 0xffffffff- tick;
  144. diff = osal_sys_tick + diff;
  145. }
  146. else
  147. {
  148. diff = osal_sys_tick - tick;
  149. }
  150. return diff*625/1000;
  151. }
  152. /**************************************************************************************
  153. * @fn WaitMs
  154. *
  155. * @brief This function process for wait program msecond,use RTC
  156. *
  157. * input parameters
  158. *
  159. * @param uint32_t msecond: the msecond value
  160. *
  161. * output parameters
  162. *
  163. * @param None.
  164. *
  165. * @return None.
  166. **************************************************************************************/
  167. void WaitMs(uint32_t msecond)
  168. {
  169. uint32_t now_clock_tick = 0;
  170. AP_AON->RTCCTL |= BIT(0);//RUN_RTC;
  171. now_clock_tick = rtc_get_counter();
  172. while((rtc_get_counter()-now_clock_tick) < (32 * msecond))
  173. {
  174. ;
  175. }
  176. }
  177. void WaitUs(uint32_t wtTime)
  178. {
  179. uint32_t T0,currTick,deltTick;
  180. //T0 = read_current_time();
  181. T0 =(TIME_BASE - ((AP_TIM3->CurrentCount) >> 2));
  182. while(1)
  183. {
  184. currTick = (TIME_BASE - ((AP_TIM3->CurrentCount) >> 2));
  185. deltTick = TIME_DELTA(currTick,T0);
  186. if(deltTick>wtTime)
  187. break;
  188. }
  189. }
  190. extern int m_in_critical_region ;
  191. void hal_system_soft_reset(void)
  192. {
  193. //HAL_ENTER_CRITICAL_SECTION();
  194. __disable_irq();
  195. m_in_critical_region++;
  196. /**
  197. config reset casue as RSTC_WARM_NDWC
  198. reset path walkaround dwc
  199. */
  200. AP_AON->SLEEP_R[0]=4;
  201. AON_CLEAR_XTAL_TRACKING_AND_CALIB;
  202. AP_PCR->SW_RESET1 = 0;
  203. while(1);
  204. }
  205. __ATTR_SECTION_XIP__ void hal_rfPhyFreqOff_Set(void)
  206. {
  207. int32_t freqPpm=0;
  208. freqPpm= *(volatile int32_t*) 0x11004008;
  209. if((freqPpm!=0xffffffff) && (freqPpm>=-50) && (freqPpm<=50))
  210. {
  211. g_rfPhyFreqOffSet=(int8_t)freqPpm;
  212. }
  213. else
  214. {
  215. g_rfPhyFreqOffSet =RF_PHY_FREQ_FOFF_00KHZ;
  216. }
  217. }
  218. __ATTR_SECTION_XIP__ void hal_xtal16m_cap_Set(void)
  219. {
  220. uint32_t cap=0;
  221. cap= *(volatile int32_t*) 0x1100400c;
  222. if((cap!=0xffffffff) && (cap <= 0x1f))
  223. {
  224. XTAL16M_CAP_SETTING(cap);
  225. }
  226. else
  227. {
  228. XTAL16M_CAP_SETTING(0x09);
  229. }
  230. }
  231. void hal_rc32k_clk_tracking_init(void)
  232. {
  233. extern uint32 counter_tracking;
  234. extern uint32_t g_counter_traking_avg ;
  235. counter_tracking = g_counter_traking_avg = STD_RC32_16_CYCLE_16MHZ_CYCLE;
  236. AON_CLEAR_XTAL_TRACKING_AND_CALIB;
  237. }