1
0

common.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * Copyright (c) 2021, Shenzhen Academy of Aerospace Technology
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-11-16 Dystopia the first version
  9. */
  10. #include "common.h"
  11. CSL_BootcfgRegs * gp_bootcfg_regs = (CSL_BootcfgRegs *)CSL_BOOT_CFG_REGS;
  12. CSL_CgemRegs * gp_cgem_regs = (CSL_CgemRegs *)CSL_CGEM0_5_REG_BASE_ADDRESS_REGS;
  13. CSL_TmrPlusRegs * gp_timer_regs[9] = {
  14. (CSL_TmrPlusRegs *)CSL_TIMER_0_REGS,
  15. (CSL_TmrPlusRegs *)CSL_TIMER_1_REGS,
  16. (CSL_TmrPlusRegs *)CSL_TIMER_2_REGS,
  17. (CSL_TmrPlusRegs *)CSL_TIMER_3_REGS,
  18. (CSL_TmrPlusRegs *)CSL_TIMER_4_REGS,
  19. (CSL_TmrPlusRegs *)CSL_TIMER_5_REGS,
  20. (CSL_TmrPlusRegs *)CSL_TIMER_6_REGS,
  21. (CSL_TmrPlusRegs *)CSL_TIMER_7_REGS,
  22. (CSL_TmrPlusRegs *)(CSL_TIMER_7_REGS+(CSL_TIMER_7_REGS-CSL_TIMER_6_REGS))
  23. };
  24. void cpu_interrupt_init(void)
  25. {
  26. //clear interrupt and excpetion events
  27. ICR = IFR;
  28. ECR = EFR;
  29. IER = 3; //disable all interrupts
  30. /* disable event combine */
  31. gp_cgem_regs->EVTMASK[0] = 0xffffffff;
  32. gp_cgem_regs->EVTMASK[1] = 0xffffffff;
  33. gp_cgem_regs->EVTMASK[2] = 0xffffffff;
  34. gp_cgem_regs->EVTMASK[3] = 0xffffffff;
  35. /*Clear all CPU events*/
  36. gp_cgem_regs->EVTCLR[0] = 0xFFFFFFFF;
  37. gp_cgem_regs->EVTCLR[1] = 0xFFFFFFFF;
  38. gp_cgem_regs->EVTCLR[2] = 0xFFFFFFFF;
  39. gp_cgem_regs->EVTCLR[3] = 0xFFFFFFFF;
  40. /*Interrupt Service Table Pointer to begining of LL2 memory*/
  41. ISTP = 0x800000;
  42. }
  43. void keystone_cpu_init(void)
  44. {
  45. /* clear all interrupt flag/status, setup ISTP to begining of LL2 */
  46. cpu_interrupt_init();
  47. }
  48. /*===============================Timer=================================*/
  49. void reset_timer(int timer_num)
  50. {
  51. if(gp_timer_regs[timer_num]->TGCR)
  52. {
  53. gp_timer_regs[timer_num]->TGCR = 0;
  54. gp_timer_regs[timer_num]->TCR= 0;
  55. }
  56. }
  57. void timer64_init(Timer64_Config * tmrCfg)
  58. {
  59. reset_timer(tmrCfg->timer_num);
  60. gp_timer_regs[tmrCfg->timer_num]->CNTLO = 0;
  61. gp_timer_regs[tmrCfg->timer_num]->CNTHI = 0;
  62. /*please note, in clock mode, two timer periods generate a clock,
  63. one timer period output high voltage level, the other timer period
  64. output low voltage level, so, the timer period should be half to the
  65. desired output clock period*/
  66. if(TIMER_PERIODIC_CLOCK == tmrCfg->timerMode)
  67. {
  68. tmrCfg->period = tmrCfg->period/2;
  69. }
  70. /*the value written into period register is the expected value minus one*/
  71. gp_timer_regs[tmrCfg->timer_num]->PRDLO = _loll(tmrCfg->period-1);
  72. gp_timer_regs[tmrCfg->timer_num]->PRDHI = _hill(tmrCfg->period-1);
  73. if(tmrCfg->reload_period>1)
  74. {
  75. gp_timer_regs[tmrCfg->timer_num]->RELLO = _loll(tmrCfg->reload_period-1);
  76. gp_timer_regs[tmrCfg->timer_num]->RELHI = _hill(tmrCfg->reload_period-1);
  77. }
  78. if(TIMER_WATCH_DOG == tmrCfg->timerMode)
  79. {
  80. gp_timer_regs[tmrCfg->timer_num]->TGCR =
  81. /*Select watch-dog mode*/
  82. (CSL_TMR_TIMMODE_WDT << CSL_TMR_TGCR_TIMMODE_SHIFT)
  83. /*Remove the timer from reset*/
  84. | (CSL_TMR_TGCR_TIMLORS_MASK)
  85. | (CSL_TMR_TGCR_TIMHIRS_MASK);
  86. }
  87. else if(TIMER_PERIODIC_WAVE == tmrCfg->timerMode)
  88. {
  89. gp_timer_regs[tmrCfg->timer_num]->TGCR = TMR_TGCR_PLUSEN_MASK
  90. /*for plus featuers, dual 32-bit unchained timer mode should be used*/
  91. | (CSL_TMR_TIMMODE_DUAL_UNCHAINED << CSL_TMR_TGCR_TIMMODE_SHIFT)
  92. /*Remove the timer from reset*/
  93. | (CSL_TMR_TGCR_TIMLORS_MASK);
  94. //in plus mode, interrupt/event must be enabled manually
  95. gp_timer_regs[tmrCfg->timer_num]->INTCTL_STAT= TMR_INTCTLSTAT_EN_ALL_CLR_ALL;
  96. }
  97. else
  98. {
  99. gp_timer_regs[tmrCfg->timer_num]->TGCR =
  100. /*Select 64-bit general timer mode*/
  101. (CSL_TMR_TIMMODE_GPT << CSL_TMR_TGCR_TIMMODE_SHIFT)
  102. /*Remove the timer from reset*/
  103. | (CSL_TMR_TGCR_TIMLORS_MASK)
  104. | (CSL_TMR_TGCR_TIMHIRS_MASK);
  105. }
  106. /*make timer stop with emulation*/
  107. gp_timer_regs[tmrCfg->timer_num]->EMUMGT_CLKSPD = (gp_timer_regs[tmrCfg->timer_num]->EMUMGT_CLKSPD&
  108. ~(CSL_TMR_EMUMGT_CLKSPD_FREE_MASK|CSL_TMR_EMUMGT_CLKSPD_SOFT_MASK));
  109. if(TIMER_WATCH_DOG == tmrCfg->timerMode)
  110. {
  111. /*enable watchdog timer*/
  112. gp_timer_regs[tmrCfg->timer_num]->WDTCR = CSL_TMR_WDTCR_WDEN_MASK
  113. | (CSL_TMR_WDTCR_WDKEY_CMD1 << CSL_TMR_WDTCR_WDKEY_SHIFT);
  114. gp_timer_regs[tmrCfg->timer_num]->TCR =
  115. (CSL_TMR_CLOCK_INP_NOGATE << CSL_TMR_TCR_TIEN_LO_SHIFT)
  116. | (CSL_TMR_CLKSRC_INTERNAL << CSL_TMR_TCR_CLKSRC_LO_SHIFT)
  117. /*The timer is enabled continuously*/
  118. | (CSL_TMR_ENAMODE_CONT << CSL_TMR_TCR_ENAMODE_LO_SHIFT)
  119. | ((tmrCfg->pulseWidth << CSL_TMR_TCR_PWID_LO_SHIFT)&CSL_TMR_TCR_PWID_LO_MASK)
  120. /*select pulse mode*/
  121. | (CSL_TMR_CP_PULSE << CSL_TMR_TCR_CP_LO_SHIFT)
  122. | (CSL_TMR_INVINP_UNINVERTED << CSL_TMR_TCR_INVINP_LO_SHIFT)
  123. | (CSL_TMR_INVOUTP_UNINVERTED << CSL_TMR_TCR_INVOUTP_LO_SHIFT)
  124. | (0 << CSL_TMR_TCR_TSTAT_LO_SHIFT);
  125. /*active watchdog timer*/
  126. gp_timer_regs[tmrCfg->timer_num]->WDTCR = CSL_TMR_WDTCR_WDEN_MASK
  127. | (CSL_TMR_WDTCR_WDKEY_CMD2 << CSL_TMR_WDTCR_WDKEY_SHIFT);
  128. }
  129. else if(TIMER_ONE_SHOT_PULSE == tmrCfg->timerMode)
  130. {
  131. gp_timer_regs[tmrCfg->timer_num]->TCR =
  132. (CSL_TMR_CLOCK_INP_NOGATE << CSL_TMR_TCR_TIEN_LO_SHIFT)
  133. | (CSL_TMR_CLKSRC_INTERNAL << CSL_TMR_TCR_CLKSRC_LO_SHIFT)
  134. /*The timer is enabled one-shot*/
  135. | (CSL_TMR_ENAMODE_ENABLE << CSL_TMR_TCR_ENAMODE_LO_SHIFT)
  136. | ((tmrCfg->pulseWidth << CSL_TMR_TCR_PWID_LO_SHIFT)&CSL_TMR_TCR_PWID_LO_MASK)
  137. /*select pulse mode*/
  138. | (CSL_TMR_CP_PULSE << CSL_TMR_TCR_CP_LO_SHIFT)
  139. | (CSL_TMR_INVINP_UNINVERTED << CSL_TMR_TCR_INVINP_LO_SHIFT)
  140. | (CSL_TMR_INVOUTP_UNINVERTED << CSL_TMR_TCR_INVOUTP_LO_SHIFT)
  141. | (0 << CSL_TMR_TCR_TSTAT_LO_SHIFT);
  142. }
  143. else if(TIMER_PERIODIC_CLOCK == tmrCfg->timerMode)
  144. {
  145. gp_timer_regs[tmrCfg->timer_num]->TCR =
  146. (CSL_TMR_CLOCK_INP_NOGATE << CSL_TMR_TCR_TIEN_LO_SHIFT)
  147. | (CSL_TMR_CLKSRC_INTERNAL << CSL_TMR_TCR_CLKSRC_LO_SHIFT)
  148. /*The timer is enabled continuously*/
  149. | (CSL_TMR_ENAMODE_CONT << CSL_TMR_TCR_ENAMODE_LO_SHIFT)
  150. | ((tmrCfg->pulseWidth << CSL_TMR_TCR_PWID_LO_SHIFT)&CSL_TMR_TCR_PWID_LO_MASK)
  151. /*select clock mode*/
  152. | (CSL_TMR_CP_CLOCK << CSL_TMR_TCR_CP_LO_SHIFT)
  153. | (CSL_TMR_INVINP_UNINVERTED << CSL_TMR_TCR_INVINP_LO_SHIFT)
  154. | (CSL_TMR_INVOUTP_UNINVERTED << CSL_TMR_TCR_INVOUTP_LO_SHIFT)
  155. | (0 << CSL_TMR_TCR_TSTAT_LO_SHIFT);
  156. }
  157. else if(TIMER_PERIODIC_WAVE == tmrCfg->timerMode)
  158. {
  159. gp_timer_regs[tmrCfg->timer_num]->TCR =
  160. (CSL_TMR_CLOCK_INP_NOGATE << CSL_TMR_TCR_TIEN_LO_SHIFT)
  161. | (CSL_TMR_CLKSRC_INTERNAL << CSL_TMR_TCR_CLKSRC_LO_SHIFT)
  162. /*The timer is enabled continuously with period reload*/
  163. | (CSL_TMR_ENAMODE_CONT_RELOAD << CSL_TMR_TCR_ENAMODE_LO_SHIFT)
  164. | ((tmrCfg->pulseWidth << CSL_TMR_TCR_PWID_LO_SHIFT)&CSL_TMR_TCR_PWID_LO_MASK)
  165. /*select clock mode*/
  166. | (CSL_TMR_CP_CLOCK << CSL_TMR_TCR_CP_LO_SHIFT)
  167. | (CSL_TMR_INVINP_UNINVERTED << CSL_TMR_TCR_INVINP_LO_SHIFT)
  168. | (CSL_TMR_INVOUTP_UNINVERTED << CSL_TMR_TCR_INVOUTP_LO_SHIFT)
  169. | (0 << CSL_TMR_TCR_TSTAT_LO_SHIFT);
  170. }
  171. else /*TIMER_PERIODIC_PULSE*/
  172. {
  173. gp_timer_regs[tmrCfg->timer_num]->TCR =
  174. (CSL_TMR_CLOCK_INP_NOGATE << CSL_TMR_TCR_TIEN_LO_SHIFT)
  175. | (CSL_TMR_CLKSRC_INTERNAL << CSL_TMR_TCR_CLKSRC_LO_SHIFT)
  176. /*The timer is enabled continuously*/
  177. | (CSL_TMR_ENAMODE_CONT << CSL_TMR_TCR_ENAMODE_LO_SHIFT)
  178. | ((tmrCfg->pulseWidth << CSL_TMR_TCR_PWID_LO_SHIFT)&CSL_TMR_TCR_PWID_LO_MASK)
  179. /*select clock mode*/
  180. | (CSL_TMR_CP_PULSE << CSL_TMR_TCR_CP_LO_SHIFT)
  181. | (CSL_TMR_INVINP_UNINVERTED << CSL_TMR_TCR_INVINP_LO_SHIFT)
  182. | (CSL_TMR_INVOUTP_UNINVERTED << CSL_TMR_TCR_INVOUTP_LO_SHIFT)
  183. | (0 << CSL_TMR_TCR_TSTAT_LO_SHIFT);
  184. }
  185. }