sys_mpu.asm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. ;-------------------------------------------------------------------------------
  2. ; sys_mpu.asm
  3. ;
  4. ; (c) Texas Instruments 2009-2013, All rights reserved.
  5. ;
  6. .text
  7. .arm
  8. ;-------------------------------------------------------------------------------
  9. ; Initalize Mpu
  10. .def _mpuInit_
  11. .asmfunc
  12. _mpuInit_
  13. stmfd sp!, {r0}
  14. ; Disable mpu
  15. mrc p15, #0, r0, c1, c0, #0
  16. bic r0, r0, #1
  17. dsb
  18. mcr p15, #0, r0, c1, c0, #0
  19. isb
  20. ; Disable background region
  21. mrc p15, #0, r0, c1, c0, #0
  22. bic r0, r0, #0x20000
  23. mcr p15, #0, r0, c1, c0, #0
  24. ; Setup region 1
  25. mov r0, #0
  26. mcr p15, #0, r0, c6, c2, #0
  27. ldr r0, r1Base
  28. mcr p15, #0, r0, c6, c1, #0
  29. mov r0, #0x0008
  30. orr r0, r0, #0x1000
  31. mcr p15, #0, r0, c6, c1, #4
  32. movw r0, #((1 << 15) + (1 << 14) + (1 << 13) + (1 << 12) + (1 << 11) + (1 << 10) + (1 << 9) + (1 << 8) + (0x1F << 1) + (1))
  33. mcr p15, #0, r0, c6, c1, #2
  34. ; Setup region 2
  35. mov r0, #1
  36. mcr p15, #0, r0, c6, c2, #0
  37. ldr r0, r2Base
  38. mcr p15, #0, r0, c6, c1, #0
  39. mov r0, #0x0008
  40. orr r0, r0, #0x0600
  41. mcr p15, #0, r0, c6, c1, #4
  42. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x15 << 1) + (1))
  43. mcr p15, #0, r0, c6, c1, #2
  44. ; Setup region
  45. mov r0, #2
  46. mcr p15, #0, r0, c6, c2, #0
  47. ldr r0, r3Base
  48. mcr p15, #0, r0, c6, c1, #0
  49. mov r0, #0x0008
  50. orr r0, r0, #0x0300
  51. mcr p15, #0, r0, c6, c1, #4
  52. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x11 << 1) + (1))
  53. mcr p15, #0, r0, c6, c1, #2
  54. ; Setup region 4
  55. mov r0, #3
  56. mcr p15, #0, r0, c6, c2, #0
  57. ldr r0, r4Base
  58. mcr p15, #0, r0, c6, c1, #0
  59. mov r0, #0x0008
  60. orr r0, r0, #0x0300
  61. mcr p15, #0, r0, c6, c1, #4
  62. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x11 << 1) + (1))
  63. mcr p15, #0, r0, c6, c1, #2
  64. ; Setup region 5
  65. mov r0, #4
  66. mcr p15, #0, r0, c6, c2, #0
  67. ldr r0, r5Base
  68. mcr p15, #0, r0, c6, c1, #0
  69. mov r0, #0x0000
  70. orr r0, r0, #0x0300
  71. mcr p15, #0, r0, c6, c1, #4
  72. movw r0, #((1 << 15) + (1 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x19 << 1) + (1))
  73. mcr p15, #0, r0, c6, c1, #2
  74. ; Setup region 6
  75. mov r0, #5
  76. mcr p15, #0, r0, c6, c2, #0
  77. ldr r0, r6Base
  78. mcr p15, #0, r0, c6, c1, #0
  79. mov r0, #0x0000
  80. orr r0, r0, #0x0300
  81. mcr p15, #0, r0, c6, c1, #4
  82. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x1A << 1) + (1))
  83. mcr p15, #0, r0, c6, c1, #2
  84. ; Setup region 7
  85. mov r0, #6
  86. mcr p15, #0, r0, c6, c2, #0
  87. ldr r0, r7Base
  88. mcr p15, #0, r0, c6, c1, #0
  89. mov r0, #0x0008
  90. orr r0, r0, #0x1200
  91. mcr p15, #0, r0, c6, c1, #4
  92. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x16 << 1) + (1))
  93. mcr p15, #0, r0, c6, c1, #2
  94. ; Setup region 8
  95. mov r0, #7
  96. mcr p15, #0, r0, c6, c2, #0
  97. ldr r0, r8Base
  98. mcr p15, #0, r0, c6, c1, #0
  99. mov r0, #0x0010
  100. orr r0, r0, #0x1300
  101. mcr p15, #0, r0, c6, c1, #4
  102. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x17 << 1) + (1))
  103. mcr p15, #0, r0, c6, c1, #2
  104. ; Setup region 9
  105. mov r0, #8
  106. mcr p15, #0, r0, c6, c2, #0
  107. ldr r0, r9Base
  108. mcr p15, #0, r0, c6, c1, #0
  109. mov r0, #0x0010
  110. orr r0, r0, #0x1300
  111. mcr p15, #0, r0, c6, c1, #4
  112. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x08 << 1) + (1))
  113. mcr p15, #0, r0, c6, c1, #2
  114. ; Setup region 10
  115. mov r0, #9
  116. mcr p15, #0, r0, c6, c2, #0
  117. ldr r0, r10Base
  118. mcr p15, #0, r0, c6, c1, #0
  119. mov r0, #0x0010
  120. orr r0, r0, #0x1300
  121. mcr p15, #0, r0, c6, c1, #4
  122. movw r0, #((0 << 15) + (0 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x17 << 1) + (1))
  123. mcr p15, #0, r0, c6, c1, #2
  124. ; Setup region 11
  125. mov r0, #10
  126. mcr p15, #0, r0, c6, c2, #0
  127. ldr r0, r11Base
  128. mcr p15, #0, r0, c6, c1, #0
  129. mov r0, #0x0008
  130. orr r0, r0, #0x1100
  131. mcr p15, #0, r0, c6, c1, #4
  132. movw r0, #((1 << 15) + (1 << 14) + (1 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x0A << 1) + (0))
  133. mcr p15, #0, r0, c6, c1, #2
  134. ; Setup region 12
  135. mov r0, #11
  136. mcr p15, #0, r0, c6, c2, #0
  137. ldr r0, r12Base
  138. mcr p15, #0, r0, c6, c1, #0
  139. mov r0, #0x0008
  140. orr r0, r0, #0x1300
  141. mcr p15, #0, r0, c6, c1, #4
  142. movw r0, #((1 << 15) + (1 << 14) + (0 << 13) + (0 << 12) + (0 << 11) + (0 << 10) + (0 << 9) + (0 << 8) + (0x15 << 1) + (0))
  143. mcr p15, #0, r0, c6, c1, #2
  144. ; Enable mpu background region
  145. mrc p15, #0, r0, c1, c0, #0
  146. orr r0, r0, #0x20000
  147. mcr p15, #0, r0, c1, c0, #0
  148. ; Enable mpu
  149. mrc p15, #0, r0, c1, c0, #0
  150. orr r0, r0, #1
  151. dsb
  152. mcr p15, #0, r0, c1, c0, #0
  153. isb
  154. ldmfd sp!, {r0}
  155. bx lr
  156. r1Base .word 0x00000000
  157. r2Base .word 0x00000000
  158. r3Base .word 0x08000000
  159. r4Base .word 0x08400000
  160. r5Base .word 0x60000000
  161. r6Base .word 0x80000000
  162. r7Base .word 0xF0000000
  163. r8Base .word 0xFC000000
  164. r9Base .word 0xFE000000
  165. r10Base .word 0xFF000000
  166. r11Base .word 0x08001000
  167. r12Base .word 0x20000000
  168. .endasmfunc
  169. ;-------------------------------------------------------------------------------
  170. ; Enable Mpu
  171. .def _mpuEnable_
  172. .asmfunc
  173. _mpuEnable_
  174. stmfd sp!, {r0}
  175. mrc p15, #0, r0, c1, c0, #0
  176. orr r0, r0, #1
  177. dsb
  178. mcr p15, #0, r0, c1, c0, #0
  179. isb
  180. ldmfd sp!, {r0}
  181. bx lr
  182. .endasmfunc
  183. ;-------------------------------------------------------------------------------
  184. ; Disable Mpu
  185. .def _mpuDisable_
  186. .asmfunc
  187. _mpuDisable_
  188. stmfd sp!, {r0}
  189. mrc p15, #0, r0, c1, c0, #0
  190. bic r0, r0, #1
  191. dsb
  192. mcr p15, #0, r0, c1, c0, #0
  193. isb
  194. ldmfd sp!, {r0}
  195. bx lr
  196. .endasmfunc
  197. ;-------------------------------------------------------------------------------
  198. ; Enable Mpu background region
  199. .def _mpuEnableBackgroundRegion_
  200. .asmfunc
  201. _mpuEnableBackgroundRegion_
  202. stmfd sp!, {r0}
  203. mrc p15, #0, r0, c1, c0, #0
  204. orr r0, r0, #0x20000
  205. mcr p15, #0, r0, c1, c0, #0
  206. ldmfd sp!, {r0}
  207. bx lr
  208. .endasmfunc
  209. ;-------------------------------------------------------------------------------
  210. ; Disable Mpu background region
  211. .def _mpuDisableBackgroundRegion_
  212. .asmfunc
  213. _mpuDisableBackgroundRegion_
  214. stmfd sp!, {r0}
  215. mrc p15, #0, r0, c1, c0, #0
  216. bic r0, r0, #0x20000
  217. mcr p15, #0, r0, c1, c0, #0
  218. ldmfd sp!, {r0}
  219. bx lr
  220. .endasmfunc
  221. ;-------------------------------------------------------------------------------
  222. ; Returns number of implemented Mpu regions
  223. .def _mpuGetNumberOfRegions_
  224. .asmfunc
  225. _mpuGetNumberOfRegions_
  226. mrc p15, #0, r0, c0, c0, #4
  227. uxtb r0, r0, ROR #8
  228. bx lr
  229. .endasmfunc
  230. ;-------------------------------------------------------------------------------
  231. ; Returns the type of the implemented mpu regions
  232. .def _mpuAreRegionsSeparate_
  233. .asmfunc
  234. _mpuAreRegionsSeparate_
  235. mrc p15, #0, r0, c0, c0, #4
  236. uxtb r0, r0
  237. bx lr
  238. .endasmfunc
  239. ;-------------------------------------------------------------------------------
  240. ; Set mpu region number
  241. .def _mpuSetRegion_
  242. .asmfunc
  243. _mpuSetRegion_
  244. mcr p15, #0, r0, c6, c2, #0
  245. bx lr
  246. .endasmfunc
  247. ;-------------------------------------------------------------------------------
  248. ; Get mpu region number
  249. .def _mpuGetRegion_
  250. .asmfunc
  251. _mpuGetRegion_
  252. mrc p15, #0, r0, c6, c2, #0
  253. bx lr
  254. .endasmfunc
  255. ;-------------------------------------------------------------------------------
  256. ; Set base address
  257. .def _mpuSetRegionBaseAddress_
  258. .asmfunc
  259. _mpuSetRegionBaseAddress_
  260. mcr p15, #0, r0, c6, c1, #0
  261. bx lr
  262. .endasmfunc
  263. ;-------------------------------------------------------------------------------
  264. ; Get base address
  265. .def _mpuGetRegionBaseAddress_
  266. .asmfunc
  267. _mpuGetRegionBaseAddress_
  268. mrc p15, #0, r0, c6, c1, #0
  269. bx lr
  270. .endasmfunc
  271. ;-------------------------------------------------------------------------------
  272. ; Set type and permission
  273. .def _mpuSetRegionTypeAndPermission_
  274. .asmfunc
  275. _mpuSetRegionTypeAndPermission_
  276. orr r0, r0, r1
  277. mcr p15, #0, r0, c6, c1, #4
  278. bx lr
  279. .endasmfunc
  280. ;-------------------------------------------------------------------------------
  281. ; Get type
  282. .def _mpuGetRegionType_
  283. .asmfunc
  284. _mpuGetRegionType_
  285. mrc p15, #0, r0, c6, c1, #4
  286. bic r0, r0, #0xFF00
  287. bx lr
  288. .endasmfunc
  289. ;-------------------------------------------------------------------------------
  290. ; Get permission
  291. .def _mpuGetRegionPermission_
  292. .asmfunc
  293. _mpuGetRegionPermission_
  294. mrc p15, #0, r0, c6, c1, #4
  295. bic r0, r0, #0xFF
  296. bx lr
  297. .endasmfunc
  298. ;-------------------------------------------------------------------------------
  299. ; Set region size register value
  300. .def _mpuSetRegionSizeRegister_
  301. .asmfunc
  302. _mpuSetRegionSizeRegister_
  303. mcr p15, #0, r0, c6, c1, #2
  304. bx lr
  305. .endasmfunc
  306. ;-------------------------------------------------------------------------------