ae210p.c 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. #include <nds32_intrinsic.h>
  2. #include "debug.h"
  3. #include "nds32.h"
  4. #include "cache.h"
  5. #define CACHE_NONE 0
  6. #define CACHE_WRITEBACK 2
  7. #define CACHE_WRITETHROUGH 3
  8. #if (defined(CONFIG_CPU_ICACHE_ENABLE) || defined(CONFIG_CPU_DCACHE_ENABLE))
  9. /* Cacheable */
  10. #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
  11. #define CACHE_MODE CACHE_WRITETHROUGH
  12. #else
  13. #define CACHE_MODE CACHE_WRITEBACK
  14. #endif
  15. #else
  16. /* Uncacheable */
  17. #define CACHE_MODE CACHE_NONE
  18. #endif
  19. #define MMU_CTL_MSK \
  20. (MMU_CTL_mskD \
  21. | MMU_CTL_mskNTC0 \
  22. | MMU_CTL_mskNTC1 \
  23. | MMU_CTL_mskNTC2 \
  24. | MMU_CTL_mskNTC3 \
  25. | MMU_CTL_mskTBALCK \
  26. | MMU_CTL_mskMPZIU \
  27. | MMU_CTL_mskNTM0 \
  28. | MMU_CTL_mskNTM1 \
  29. | MMU_CTL_mskNTM2 \
  30. | MMU_CTL_mskNTM3)
  31. /*
  32. * NTC0: CACHE_MODE, NTC1~NTC3: Non-cacheable
  33. * MSC_CFG.ADR24 = 0 : NTM0~NTM3 are mapped to partition 0/0/0/0
  34. * MSC_CFG.ADR24 = 1 : NTM0~NTM3 are mapped to partition 0/1/2/3
  35. */
  36. #define MMU_CTL_INIT \
  37. (0x0UL << MMU_CTL_offD \
  38. | (CACHE_MODE) << MMU_CTL_offNTC0 \
  39. | 0x0UL << MMU_CTL_offNTC1 \
  40. | 0x0UL << MMU_CTL_offNTC2 \
  41. | 0x0UL << MMU_CTL_offNTC3 \
  42. | 0x0UL << MMU_CTL_offTBALCK \
  43. | 0x0UL << MMU_CTL_offMPZIU \
  44. | 0x0UL << MMU_CTL_offNTM0 \
  45. | 0x0UL << MMU_CTL_offNTM1 \
  46. | 0x0UL << MMU_CTL_offNTM2 \
  47. | 0x0UL << MMU_CTL_offNTM3)
  48. #define MMU_CTL_INIT_ADR24 \
  49. (MMU_CTL_INIT \
  50. | 0x0UL << MMU_CTL_offNTM0 \
  51. | 0x1UL << MMU_CTL_offNTM1 \
  52. | 0x2UL << MMU_CTL_offNTM2 \
  53. | 0x3UL << MMU_CTL_offNTM3)
  54. #define CACHE_CTL_MSK \
  55. (CACHE_CTL_mskIC_EN \
  56. | CACHE_CTL_mskDC_EN \
  57. | CACHE_CTL_mskICALCK \
  58. | CACHE_CTL_mskDCALCK \
  59. | CACHE_CTL_mskDCCWF \
  60. | CACHE_CTL_mskDCPMW)
  61. /* ICache/DCache enable */
  62. #define CACHE_CTL_CACHE_ON \
  63. (0x1UL << CACHE_CTL_offIC_EN \
  64. | 0x1UL << CACHE_CTL_offDC_EN \
  65. | 0x0UL << CACHE_CTL_offICALCK \
  66. | 0x0UL << CACHE_CTL_offDCALCK \
  67. | 0x1UL << CACHE_CTL_offDCCWF \
  68. | 0x1UL << CACHE_CTL_offDCPMW)
  69. /*
  70. * Interrupt priority :
  71. * PIT(IRQ #2): highest priority
  72. * Others: lowest priority
  73. */
  74. #define PRI1_DEFAULT 0xFFFFFFFF
  75. #define PRI2_DEFAULT 0xFFFFFFFF
  76. /* This must be a leaf function, no child function */
  77. void _nds32_init_mem(void) __attribute__((naked, optimize("Os")));
  78. void _nds32_init_mem(void)
  79. {
  80. /* Enable DLM */
  81. __nds32__mtsr(EDLM_BASE | 0x1, NDS32_SR_DLMB);
  82. __nds32__dsb();
  83. }
  84. /*
  85. * Initialize MMU configure and cache ability.
  86. */
  87. static void mmu_init(void)
  88. {
  89. //#ifndef __NDS32_ISA_V3M__
  90. // unsigned int reg;
  91. //
  92. // /* MMU initialization: NTC0~NTC3, NTM0~NTM3 */
  93. // reg = (__nds32__mfsr(NDS32_SR_MMU_CTL) & ~MMU_CTL_MSK) | MMU_CTL_INIT;
  94. //
  95. // if (__nds32__mfsr(NDS32_SR_MSC_CFG) & MSC_CFG_mskADR24)
  96. // reg = (__nds32__mfsr(NDS32_SR_MMU_CTL) & ~MMU_CTL_MSK) | MMU_CTL_INIT_ADR24;
  97. // else
  98. // reg = (__nds32__mfsr(NDS32_SR_MMU_CTL) & ~MMU_CTL_MSK) | MMU_CTL_INIT;
  99. //
  100. // __nds32__mtsr(reg, NDS32_SR_MMU_CTL);
  101. // __nds32__dsb();
  102. //#endif
  103. }
  104. /*
  105. * Platform specific initialization
  106. */
  107. static void plf_init(void)
  108. {
  109. /* Set default Hardware interrupts priority */
  110. __nds32__mtsr(PRI1_DEFAULT, NDS32_SR_INT_PRI);
  111. __nds32__mtsr(PRI2_DEFAULT, NDS32_SR_INT_PRI2);
  112. /* Mask all HW interrupts except SWI */
  113. __nds32__mtsr((1 << IRQ_SYS_TICK_VECTOR) | (1 << IRQ_SWI_VECTOR), NDS32_SR_INT_MASK2);
  114. /* Reset the PIT (timers) */
  115. REG32(PIT_INT_EN) = 0; /* disable all timer interrupt */
  116. REG32(PIT_CH_EN) = 0; /* disable all timer */
  117. REG32(PIT_INT_ST) = -1; /* clear pending events */
  118. REG32(PIT_CHNx_LOAD(0)) = 0; /* clean channel 0 reload */
  119. REG32(PIT_CHNx_LOAD(1)) = 0; /* clean channel 1 reload */
  120. REG32(PIT_CHNx_LOAD(2)) = 0; /* clean channel 2 reload */
  121. REG32(PIT_CHNx_LOAD(3)) = 0; /* clean channel 3 reload */
  122. }
  123. /*
  124. * All AE210P hardware initialization
  125. */
  126. void hardware_init(void)
  127. {
  128. mmu_init(); /* mmu/cache */
  129. plf_init(); /* Perform any platform specific initializations */
  130. #if (defined(CONFIG_CPU_ICACHE_ENABLE) || defined(CONFIG_CPU_DCACHE_ENABLE))
  131. unsigned int reg;
  132. /* Invalid ICache */
  133. nds32_icache_flush();
  134. /* Invalid DCache */
  135. nds32_dcache_invalidate();
  136. /* Enable I/Dcache */
  137. reg = (__nds32__mfsr(NDS32_SR_CACHE_CTL) & ~CACHE_CTL_MSK) | CACHE_CTL_CACHE_ON;
  138. __nds32__mtsr(reg, NDS32_SR_CACHE_CTL);
  139. #endif
  140. }
  141. /********************************
  142. * HAL Level : Interrupt
  143. ********************************/
  144. /* 32IVIC without SOC INTC */
  145. /*
  146. * mask/unmask priority >= _irqs_ interrupts
  147. * used in ISR & gie diable
  148. */
  149. uint32_t hal_intc_irq_mask(int _irqs_)
  150. {
  151. uint32_t prv_msk = __nds32__mfsr(NDS32_SR_INT_MASK2);
  152. if (_irqs_ == -1 )
  153. {
  154. __nds32__mtsr(0, NDS32_SR_INT_MASK2);
  155. }
  156. else if (_irqs_ < 32 )
  157. {
  158. SR_CLRB32(NDS32_SR_INT_MASK2,_irqs_);
  159. }
  160. else
  161. {
  162. DEBUG(1,1,"_irqs_:%d, is invalid!\r\n",_irqs_);
  163. return -1;
  164. }
  165. return prv_msk;
  166. }
  167. void hal_intc_irq_unmask(uint32_t _msk_)
  168. {
  169. __nds32__mtsr( _msk_ , NDS32_SR_INT_MASK2);
  170. }
  171. void hal_intc_irq_clean(int _irqs_)
  172. {
  173. if ( _irqs_ == IRQ_SWI_VECTOR )
  174. {
  175. SR_CLRB32(NDS32_SR_INT_PEND, INT_PEND_offSWI);
  176. }
  177. else
  178. {
  179. /* PEND2 is W1C */
  180. SR_SETB32(NDS32_SR_INT_PEND2,_irqs_);
  181. }
  182. }
  183. void hal_intc_irq_clean_all()
  184. {
  185. __nds32__mtsr(-1,NDS32_SR_INT_PEND2);
  186. }
  187. void hal_intc_irq_disable(int _irqs_)
  188. {
  189. SR_CLRB32(NDS32_SR_INT_MASK2,_irqs_);
  190. }
  191. void hal_intc_irq_disable_all()
  192. {
  193. __nds32__mtsr(0x0,NDS32_SR_INT_MASK2);
  194. }
  195. void hal_intc_irq_enable(int _irqs_)
  196. {
  197. SR_SETB32(NDS32_SR_INT_MASK2,_irqs_);
  198. }
  199. void hal_intc_irq_set_priority( uint32_t _prio1_, uint32_t _prio2_ )
  200. {
  201. __nds32__mtsr(_prio1_, NDS32_SR_INT_PRI);
  202. __nds32__mtsr(_prio2_, NDS32_SR_INT_PRI2);
  203. }
  204. void hal_intc_irq_config(uint8_t _irq_, uint8_t _edge_, uint8_t _falling_){}
  205. void hal_intc_swi_enable()
  206. {
  207. //SR_SETB32(NDS32_SR_INT_MASK,16);
  208. SR_SETB32(NDS32_SR_INT_MASK2,IRQ_SWI_VECTOR);
  209. }
  210. void hal_intc_swi_disable()
  211. {
  212. SR_CLRB32(NDS32_SR_INT_MASK2,IRQ_SWI_VECTOR);
  213. }
  214. void hal_intc_swi_clean()
  215. {
  216. SR_CLRB32(NDS32_SR_INT_PEND, INT_PEND_offSWI);
  217. }
  218. void hal_intc_swi_trigger()
  219. {
  220. SR_SETB32(NDS32_SR_INT_PEND,INT_PEND_offSWI);
  221. }
  222. uint32_t hal_intc_get_all_pend()
  223. {
  224. return __nds32__mfsr(NDS32_SR_INT_PEND2);
  225. }
  226. /********************************
  227. * TIMER HAL Function
  228. ********************************/
  229. static const uint8_t timer_irq[4] = {IRQ_PIT_VECTOR, IRQ_PIT_VECTOR, IRQ_PIT_VECTOR, IRQ_PIT_VECTOR};
  230. uint32_t hal_timer_irq_mask(uint32_t _tmr_ )
  231. {
  232. return hal_intc_irq_mask(timer_irq[_tmr_-1]);
  233. }
  234. void hal_timer_irq_unmask(uint32_t _msk_ )
  235. {
  236. hal_intc_irq_unmask(_msk_);
  237. }
  238. void hal_timer_irq_clear(uint32_t _tmr_ )
  239. {
  240. /* Clean IP pending, W1C */
  241. #ifndef CONFIG_TX_DEMO
  242. REG32(PIT_INT_ST) = (0x1 << (5*(_tmr_-1)));
  243. #endif
  244. hal_intc_irq_clean(timer_irq[_tmr_-1]);
  245. }
  246. void hal_timer_set_period(uint32_t _tmr_, uint32_t _period_ )
  247. {
  248. REG32(PIT_CHNx_LOAD(_tmr_-1)) = _period_;
  249. //REG32(PIT_CHNx_COUNT(_tmr_-1))= _period_;
  250. }
  251. void hal_timer_irq_control(uint32_t _tmr_, uint32_t enable )
  252. {
  253. if (enable)
  254. REG32(PIT_INT_EN) = REG32(PIT_INT_EN) | (0x1 << (5*(_tmr_-1)));
  255. else
  256. REG32(PIT_INT_EN) = REG32(PIT_INT_EN) & ~(0x1 << (5*(_tmr_-1)));
  257. }
  258. void hal_timer_set_upward(uint32_t _tmr_ ,uint32_t up)
  259. {
  260. if ( up )
  261. DEBUG(1,1,"PIT Timer only support downward!\r\n");
  262. }
  263. void hal_timer_start(uint32_t _tmr_)
  264. {
  265. /* config channel mode */
  266. /* 32 bits timer, APB clock */
  267. REG32(PIT_CHNx_CTL(_tmr_-1)) = ( PIT_CH_CTL_APBCLK | PIT_CH_CTL_TMR32 );
  268. /* enable channel */
  269. REG32(PIT_CH_EN) = REG32(PIT_CH_EN) | (0x1 << (5*(_tmr_-1)));
  270. }
  271. void hal_timer_stop(uint32_t _tmr_ )
  272. {
  273. REG32(PIT_CH_EN) = REG32(PIT_CH_EN) & ~(0x1 << (5*(_tmr_-1)));
  274. }
  275. uint32_t hal_timer_read(uint32_t _tmr_ )
  276. {
  277. /* By default, timer would decrease from load value to 0 */
  278. return REG32( PIT_CHNx_LOAD(_tmr_-1) ) - REG32( PIT_CHNx_COUNT(_tmr_-1) );
  279. }
  280. uint32_t hal_timer_count_read(uint32_t _tmr_ )
  281. {
  282. return REG32( PIT_CHNx_COUNT(_tmr_-1) );
  283. }
  284. uint32_t hal_timer_irq_status(uint32_t _tmr_)
  285. {
  286. /* return PIT int status */
  287. /* PIT need #channel & #timer */
  288. /* just return all int status */
  289. return REG32(PIT_INT_ST);
  290. }