start_ccs.asm 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. ;-------------------------------------------------------------------------------
  2. ; sys_core.asm
  3. ;
  4. ; (c) Texas Instruments 2009-2013, All rights reserved.
  5. ;
  6. .text
  7. .arm
  8. .ref _c_int00
  9. .def _reset
  10. .asmfunc
  11. _reset
  12. ;-------------------------------------------------------------------------------
  13. ; Initialize CPU Registers
  14. ; After reset, the CPU is in the Supervisor mode (M = 10011)
  15. mov r0, lr
  16. mov r1, #0x0000
  17. mov r2, #0x0000
  18. mov r3, #0x0000
  19. mov r4, #0x0000
  20. mov r5, #0x0000
  21. mov r6, #0x0000
  22. mov r7, #0x0000
  23. mov r8, #0x0000
  24. mov r9, #0x0000
  25. mov r10, #0x0000
  26. mov r11, #0x0000
  27. mov r12, #0x0000
  28. mov r13, #0x0000
  29. mrs r1, cpsr
  30. msr spsr_cxsf, r1
  31. ; Switch to FIQ mode (M = 10001)
  32. cps #17
  33. mov lr, r0
  34. mov r8, #0x0000
  35. mov r9, #0x0000
  36. mov r10, #0x0000
  37. mov r11, #0x0000
  38. mov r12, #0x0000
  39. mrs r1, cpsr
  40. msr spsr_cxsf, r1
  41. ; Switch to IRQ mode (M = 10010)
  42. cps #18
  43. mov lr, r0
  44. mrs r1,cpsr
  45. msr spsr_cxsf, r1
  46. ; Switch to Abort mode (M = 10111)
  47. cps #23
  48. mov lr, r0
  49. mrs r1,cpsr
  50. msr spsr_cxsf, r1
  51. ; Switch to Undefined Instruction Mode (M = 11011)
  52. cps #27
  53. mov lr, r0
  54. mrs r1,cpsr
  55. msr spsr_cxsf, r1
  56. ; Switch to System Mode ( Shares User Mode registers ) (M = 11111)
  57. cps #31
  58. mov lr, r0
  59. mrs r1,cpsr
  60. msr spsr_cxsf, r1
  61. ; Switch back to Supervisor Mode (M = 10011)
  62. cps #19
  63. ; Turn on FPV coprocessor
  64. mrc p15, #0x00, r2, c1, c0, #0x02
  65. orr r2, r2, #0xF00000
  66. mcr p15, #0x00, r2, c1, c0, #0x02
  67. .if (RT_VFP_LAZY_STACKING) = 0
  68. fmrx r2, fpexc
  69. orr r2, r2, #0x40000000
  70. fmxr fpexc, r2
  71. fmdrr d0, r1, r1
  72. fmdrr d1, r1, r1
  73. fmdrr d2, r1, r1
  74. fmdrr d3, r1, r1
  75. fmdrr d4, r1, r1
  76. fmdrr d5, r1, r1
  77. fmdrr d6, r1, r1
  78. fmdrr d7, r1, r1
  79. fmdrr d8, r1, r1
  80. fmdrr d9, r1, r1
  81. fmdrr d10, r1, r1
  82. fmdrr d11, r1, r1
  83. fmdrr d12, r1, r1
  84. fmdrr d13, r1, r1
  85. fmdrr d14, r1, r1
  86. fmdrr d15, r1, r1
  87. .endif
  88. ;-------------------------------------------------------------------------------
  89. ; Initialize Stack Pointers
  90. cps #17
  91. ldr sp, fiqSp
  92. cps #18
  93. ldr sp, irqSp
  94. cps #23
  95. ldr sp, abortSp
  96. cps #27
  97. ldr sp, undefSp
  98. cps #31
  99. ldr sp, userSp
  100. cps #19
  101. ldr sp, svcSp
  102. bl next1
  103. next1
  104. bl next2
  105. next2
  106. bl next3
  107. next3
  108. bl next4
  109. next4
  110. ldr lr, int00ad
  111. bx lr
  112. int00ad .word _c_int00
  113. userSp .word 0x08000000+0x00001000
  114. svcSp .word 0x08000000+0x00001000+0x00000100
  115. fiqSp .word 0x08000000+0x00001000+0x00000100+0x00000100
  116. irqSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100
  117. abortSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100
  118. undefSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100+0x00000100
  119. .endasmfunc
  120. ;-------------------------------------------------------------------------------
  121. ; Enable RAM ECC Support
  122. .def _coreEnableRamEcc_
  123. .asmfunc
  124. _coreEnableRamEcc_
  125. stmfd sp!, {r0}
  126. mrc p15, #0x00, r0, c1, c0, #0x01
  127. orr r0, r0, #0x0C000000
  128. mcr p15, #0x00, r0, c1, c0, #0x01
  129. ldmfd sp!, {r0}
  130. bx lr
  131. .endasmfunc
  132. ;-------------------------------------------------------------------------------
  133. ; Disable RAM ECC Support
  134. .def _coreDisableRamEcc_
  135. .asmfunc
  136. _coreDisableRamEcc_
  137. stmfd sp!, {r0}
  138. mrc p15, #0x00, r0, c1, c0, #0x01
  139. bic r0, r0, #0x0C000000
  140. mcr p15, #0x00, r0, c1, c0, #0x01
  141. ldmfd sp!, {r0}
  142. bx lr
  143. .endasmfunc
  144. ;-------------------------------------------------------------------------------
  145. ; Enable Flash ECC Support
  146. .def _coreEnableFlashEcc_
  147. .asmfunc
  148. _coreEnableFlashEcc_
  149. stmfd sp!, {r0}
  150. mrc p15, #0x00, r0, c1, c0, #0x01
  151. orr r0, r0, #0x02000000
  152. dmb
  153. mcr p15, #0x00, r0, c1, c0, #0x01
  154. ldmfd sp!, {r0}
  155. bx lr
  156. .endasmfunc
  157. ;-------------------------------------------------------------------------------
  158. ; Disable Flash ECC Support
  159. .def _coreDisableFlashEcc_
  160. .asmfunc
  161. _coreDisableFlashEcc_
  162. stmfd sp!, {r0}
  163. mrc p15, #0x00, r0, c1, c0, #0x01
  164. bic r0, r0, #0x02000000
  165. mcr p15, #0x00, r0, c1, c0, #0x01
  166. ldmfd sp!, {r0}
  167. bx lr
  168. .endasmfunc
  169. ;-------------------------------------------------------------------------------
  170. ; Get data fault status register
  171. .def _coreGetDataFault_
  172. .asmfunc
  173. _coreGetDataFault_
  174. mrc p15, #0, r0, c5, c0, #0
  175. bx lr
  176. .endasmfunc
  177. ;-------------------------------------------------------------------------------
  178. ; Clear data fault status register
  179. .def _coreClearDataFault_
  180. .asmfunc
  181. _coreClearDataFault_
  182. stmfd sp!, {r0}
  183. mov r0, #0
  184. mcr p15, #0, r0, c5, c0, #0
  185. ldmfd sp!, {r0}
  186. bx lr
  187. .endasmfunc
  188. ;-------------------------------------------------------------------------------
  189. ; Get instruction fault status register
  190. .def _coreGetInstructionFault_
  191. .asmfunc
  192. _coreGetInstructionFault_
  193. mrc p15, #0, r0, c5, c0, #1
  194. bx lr
  195. .endasmfunc
  196. ;-------------------------------------------------------------------------------
  197. ; Clear instruction fault status register
  198. .def _coreClearInstructionFault_
  199. .asmfunc
  200. _coreClearInstructionFault_
  201. stmfd sp!, {r0}
  202. mov r0, #0
  203. mcr p15, #0, r0, c5, c0, #1
  204. ldmfd sp!, {r0}
  205. bx lr
  206. .endasmfunc
  207. ;-------------------------------------------------------------------------------
  208. ; Get data fault address register
  209. .def _coreGetDataFaultAddress_
  210. .asmfunc
  211. _coreGetDataFaultAddress_
  212. mrc p15, #0, r0, c6, c0, #0
  213. bx lr
  214. .endasmfunc
  215. ;-------------------------------------------------------------------------------
  216. ; Clear data fault address register
  217. .def _coreClearDataFaultAddress_
  218. .asmfunc
  219. _coreClearDataFaultAddress_
  220. stmfd sp!, {r0}
  221. mov r0, #0
  222. mcr p15, #0, r0, c6, c0, #0
  223. ldmfd sp!, {r0}
  224. bx lr
  225. .endasmfunc
  226. ;-------------------------------------------------------------------------------
  227. ; Get instruction fault address register
  228. .def _coreGetInstructionFaultAddress_
  229. .asmfunc
  230. _coreGetInstructionFaultAddress_
  231. mrc p15, #0, r0, c6, c0, #2
  232. bx lr
  233. .endasmfunc
  234. ;-------------------------------------------------------------------------------
  235. ; Clear instruction fault address register
  236. .def _coreClearInstructionFaultAddress_
  237. .asmfunc
  238. _coreClearInstructionFaultAddress_
  239. stmfd sp!, {r0}
  240. mov r0, #0
  241. mcr p15, #0, r0, c6, c0, #2
  242. ldmfd sp!, {r0}
  243. bx lr
  244. .endasmfunc
  245. ;-------------------------------------------------------------------------------
  246. ; Get auxiliary data fault status register
  247. .def _coreGetAuxiliaryDataFault_
  248. .asmfunc
  249. _coreGetAuxiliaryDataFault_
  250. mrc p15, #0, r0, c5, c1, #0
  251. bx lr
  252. .endasmfunc
  253. ;-------------------------------------------------------------------------------
  254. ; Clear auxiliary data fault status register
  255. .def _coreClearAuxiliaryDataFault_
  256. .asmfunc
  257. _coreClearAuxiliaryDataFault_
  258. stmfd sp!, {r0}
  259. mov r0, #0
  260. mcr p15, #0, r0, c5, c1, #0
  261. ldmfd sp!, {r0}
  262. bx lr
  263. .endasmfunc
  264. ;-------------------------------------------------------------------------------
  265. ; Get auxiliary instruction fault status register
  266. .def _coreGetAuxiliaryInstructionFault_
  267. .asmfunc
  268. _coreGetAuxiliaryInstructionFault_
  269. mrc p15, #0, r0, c5, c1, #1
  270. bx lr
  271. .endasmfunc
  272. ;-------------------------------------------------------------------------------
  273. ; Clear auxiliary instruction fault status register
  274. .def _coreClearAuxiliaryInstructionFault_
  275. .asmfunc
  276. _coreClearAuxiliaryInstructionFault_
  277. stmfd sp!, {r0}
  278. mov r0, #0
  279. mrc p15, #0, r0, c5, c1, #1
  280. ldmfd sp!, {r0}
  281. bx lr
  282. .endasmfunc
  283. ;-------------------------------------------------------------------------------
  284. ; Clear ESM CCM errorss
  285. .def _esmCcmErrorsClear_
  286. .asmfunc
  287. _esmCcmErrorsClear_
  288. stmfd sp!, {r0-r2}
  289. ldr r0, ESMSR1_REG ; load the ESMSR1 status register address
  290. ldr r2, ESMSR1_ERR_CLR
  291. str r2, [r0] ; clear the ESMSR1 register
  292. ldr r0, ESMSR2_REG ; load the ESMSR2 status register address
  293. ldr r2, ESMSR2_ERR_CLR
  294. str r2, [r0] ; clear the ESMSR2 register
  295. ldr r0, ESMSSR2_REG ; load the ESMSSR2 status register address
  296. ldr r2, ESMSSR2_ERR_CLR
  297. str r2, [r0] ; clear the ESMSSR2 register
  298. ldr r0, ESMKEY_REG ; load the ESMKEY register address
  299. mov r2, #0x5 ; load R2 with 0x5
  300. str r2, [r0] ; clear the ESMKEY register
  301. ldr r0, VIM_INTREQ ; load the INTREQ register address
  302. ldr r2, VIM_INT_CLR
  303. str r2, [r0] ; clear the INTREQ register
  304. ldr r0, CCMR4_STAT_REG ; load the CCMR4 status register address
  305. ldr r2, CCMR4_ERR_CLR
  306. str r2, [r0] ; clear the CCMR4 status register
  307. ldmfd sp!, {r0-r2}
  308. bx lr
  309. ESMSR1_REG .word 0xFFFFF518
  310. ESMSR2_REG .word 0xFFFFF51C
  311. ESMSR3_REG .word 0xFFFFF520
  312. ESMKEY_REG .word 0xFFFFF538
  313. ESMSSR2_REG .word 0xFFFFF53C
  314. CCMR4_STAT_REG .word 0xFFFFF600
  315. ERR_CLR_WRD .word 0xFFFFFFFF
  316. CCMR4_ERR_CLR .word 0x00010000
  317. ESMSR1_ERR_CLR .word 0x80000000
  318. ESMSR2_ERR_CLR .word 0x00000004
  319. ESMSSR2_ERR_CLR .word 0x00000004
  320. VIM_INT_CLR .word 0x00000001
  321. VIM_INTREQ .word 0xFFFFFE20
  322. .endasmfunc
  323. ;-------------------------------------------------------------------------------
  324. ; Work Around for Errata CORTEX-R4#57:
  325. ;
  326. ; Errata Description:
  327. ; Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags
  328. ; Workaround:
  329. ; Disable out-of-order single-precision floating point
  330. ; multiply-accumulate instruction completion
  331. .def _errata_CORTEXR4_57_
  332. .asmfunc
  333. _errata_CORTEXR4_57_
  334. push {r0}
  335. mrc p15, #0, r0, c15, c0, #0 ; Read Secondary Auxiliary Control Register
  336. orr r0, r0, #0x10000 ; Set BIT 16 (Set DOOFMACS)
  337. mcr p15, #0, r0, c15, c0, #0 ; Write Secondary Auxiliary Control Register
  338. pop {r0}
  339. bx lr
  340. .endasmfunc
  341. ;-------------------------------------------------------------------------------
  342. ; Work Around for Errata CORTEX-R4#66:
  343. ;
  344. ; Errata Description:
  345. ; Register Corruption During A Load-Multiple Instruction At
  346. ; an Exception Vector
  347. ; Workaround:
  348. ; Disable out-of-order completion for divide instructions in
  349. ; Auxiliary Control register
  350. .def _errata_CORTEXR4_66_
  351. .asmfunc
  352. _errata_CORTEXR4_66_
  353. push {r0}
  354. mrc p15, #0, r0, c1, c0, #1 ; Read Auxiliary Control register
  355. orr r0, r0, #0x80 ; Set BIT 7 (Disable out-of-order completion
  356. ; for divide instructions.)
  357. mcr p15, #0, r0, c1, c0, #1 ; Write Auxiliary Control register
  358. pop {r0}
  359. bx lr
  360. .endasmfunc
  361. .def turnon_VFP
  362. .asmfunc
  363. turnon_VFP
  364. ; Enable FPV
  365. STMDB sp!, {r0}
  366. fmrx r0, fpexc
  367. orr r0, r0, #0x40000000
  368. fmxr fpexc, r0
  369. LDMIA sp!, {r0}
  370. subs pc, lr, #4
  371. .endasmfunc
  372. _push_svc_reg .macro
  373. sub sp, sp, #17 * 4 ;/* Sizeof(struct rt_hw_exp_stack) */
  374. stmia sp, {r0 - r12} ;/* Calling r0-r12 */
  375. mov r0, sp
  376. mrs r6, spsr ;/* Save CPSR */
  377. str lr, [r0, #15*4] ;/* Push PC */
  378. str r6, [r0, #16*4] ;/* Push CPSR */
  379. cps #0x13
  380. str sp, [r0, #13*4] ;/* Save calling SP */
  381. str lr, [r0, #14*4] ;/* Save calling PC */
  382. .endm
  383. .ref rt_hw_trap_svc
  384. .def vector_svc
  385. .asmfunc
  386. vector_svc:
  387. _push_svc_reg
  388. bl rt_hw_trap_svc
  389. sub pc, pc, #-4
  390. .endasmfunc
  391. .ref rt_hw_trap_pabt
  392. .def vector_pabort
  393. .asmfunc
  394. vector_pabort:
  395. _push_svc_reg
  396. bl rt_hw_trap_pabt
  397. sub pc, pc, #-4
  398. .endasmfunc
  399. .ref rt_hw_trap_dabt
  400. .def vector_dabort
  401. .asmfunc
  402. vector_dabort:
  403. _push_svc_reg
  404. bl rt_hw_trap_dabt
  405. sub pc, pc, #-4
  406. .endasmfunc
  407. .ref rt_hw_trap_resv
  408. .def vector_resv
  409. .asmfunc
  410. vector_resv:
  411. _push_svc_reg
  412. bl rt_hw_trap_resv
  413. sub pc, pc, #-4
  414. .endasmfunc
  415. ;-------------------------------------------------------------------------------
  416. ; C++ construct table pointers
  417. .def __TI_PINIT_Base, __TI_PINIT_Limit
  418. .weak SHT$$INIT_ARRAY$$Base, SHT$$INIT_ARRAY$$Limit
  419. __TI_PINIT_Base .long SHT$$INIT_ARRAY$$Base
  420. __TI_PINIT_Limit .long SHT$$INIT_ARRAY$$Limit
  421. ;-------------------------------------------------------------------------------