Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.49 KB | None | 0 0
  1. .set GPTCR, 0x53FA0000
  2. .set GPTPR, 0x53FA0004
  3. .set GPTOCR, 0x53FA0010
  4. .set GPTIR, 0x53FA000C
  5. .set GPTSR, 0x53FA0008
  6. .set GDIR, 0x53F84004
  7. .set DR, 0x53F84000
  8. .set PSR, 0x53F84008
  9. .set USERCODE, 0x77812000
  10. .set MAX_ALARMS, 8
  11. .set MAX_CALLBACKS, 8
  12.  
  13. .set TIME_SZ, 0x60
  14.  
  15.  
  16. .org 0x0
  17. .section .iv,"a"
  18.  
  19. _start:
  20.  
  21. interrupt_vector:
  22.  
  23. b RESET_HANDLER
  24. .org 0x08
  25. b SVC_HANDLER
  26. .org 0x18
  27. b IRQ_HANDLER
  28.  
  29.  
  30. .org 0x100
  31. .text
  32.  
  33. RESET_HANDLER:
  34.  
  35. @ Zera o contador
  36. ldr r2, =CONTADOR
  37. mov r0, #0
  38. str r0, [r2]
  39.  
  40. @Faz o registrador que aponta para a tabela de interrupções apontar para a tabela interrupt_vector
  41. ldr r0, =interrupt_vector
  42. mcr p15, 0, r0, c12, c0, 0
  43.  
  44. @Inicializa vetor GDIR conforme tabela entrada/saída
  45.  
  46. ldr r1, =GDIR
  47. ldr r0, =0xFFFC003E @ Máscara de entrada/saída
  48. str r0, [r1]
  49.  
  50.  
  51. @Inicializa Pilha IRQ
  52.  
  53. msr CPSR_c, #0x12
  54. ldr r0, =pilhairq
  55. mov r13, r0
  56.  
  57. @Inicializa Pilha do Usuário, usando o modo system para nao ficar "trancado"
  58.  
  59. msr CPSR_c, #0x1F
  60. ldr r0, =pilhauser
  61. mov r13, r0
  62.  
  63.  
  64. @Configura o GPT
  65.  
  66. ldr r0, =GPTCR
  67. mov r1, #0x41
  68. str r1, [r0]
  69.  
  70. ldr r0, =GPTPR
  71. mov r1, #0x0
  72. str r1, [r0]
  73.  
  74. ldr r0, =GPTOCR
  75. ldr r1, =TIME_SZ
  76. str r1, [r0]
  77.  
  78. ldr r0, =GPTIR
  79. mov r1, #0x1
  80. str r1, [r0]
  81.  
  82.  
  83. @CONFIGURA O TZIC
  84.  
  85.  
  86. SET_TZIC:
  87. @ Constantes para os enderecos do TZIC
  88. .set TZIC_BASE, 0x0FFFC000
  89. .set TZIC_INTCTRL, 0x0
  90. .set TZIC_INTSEC1, 0x84
  91. .set TZIC_ENSET1, 0x104
  92. .set TZIC_PRIOMASK, 0xC
  93. .set TZIC_PRIORITY9, 0x424
  94.  
  95. @ Liga o controlador de interrupcoes
  96. @ R1 <= TZIC_BASE
  97.  
  98. ldr r1, =TZIC_BASE
  99.  
  100. @ Configura interrupcao 39 do GPT como nao segura
  101. mov r0, #(1 << 7)
  102. str r0, [r1, #TZIC_INTSEC1]
  103.  
  104. @ Habilita interrupcao 39 (GPT)
  105. @ reg1 bit 7 (gpt)
  106.  
  107. mov r0, #(1 << 7)
  108. str r0, [r1, #TZIC_ENSET1]
  109.  
  110. @ Configure interrupt39 priority as 1
  111. @ reg9, byte 3
  112.  
  113. ldr r0, [r1, #TZIC_PRIORITY9]
  114. bic r0, r0, #0xFF000000
  115. mov r2, #1
  116. orr r0, r0, r2, lsl #24
  117. str r0, [r1, #TZIC_PRIORITY9]
  118.  
  119. @ Configure PRIOMASK as 0
  120. eor r0, r0, r0
  121. str r0, [r1, #TZIC_PRIOMASK]
  122.  
  123. @ Habilita o controlador de interrupcoes
  124. mov r0, #1
  125. str r0, [r1, #TZIC_INTCTRL]
  126.  
  127.  
  128. @Inicializa Pilha do Supervisor
  129.  
  130. msr CPSR_c, #0x13
  131. ldr r0, =pilhasup
  132. mov r13, r0
  133.  
  134.  
  135. @Transfere para o modo usuario, interrupcoes IRQ ativadas
  136.  
  137. msr CPSR_c, #0x10
  138.  
  139. @ Salta para codigo de usuario
  140.  
  141. ldr r0, =USERCODE
  142. mov pc, r0
  143.  
  144. .align 4
  145.  
  146. IRQ_HANDLER:
  147.  
  148. ldr r0, =GPTSR
  149. mov r1, #1
  150. str r1, [r0]
  151. ldr r0, =CONTADOR
  152. ldr r1, [r0]
  153. add r1, r1, #1
  154. str r1, [r0]
  155. sub lr, lr, #4
  156. movs pc, lr
  157.  
  158. .align 4
  159.  
  160. SVC_HANDLER:
  161.  
  162.  
  163. cmp r7, #16
  164. beq read_sonar
  165. cmp r7, #17
  166. beq register_proximity_callbacks
  167. cmp r7, #18
  168. beq set_motor_speed
  169. cmp r7, #19
  170. beq set_motors_speed
  171. cmp r7, #20
  172. beq get_time
  173. cmp r7, #21
  174. beq set_time
  175. cmp r7, #22
  176. beq set_alarm
  177.  
  178.  
  179.  
  180.  
  181. @Tratamento das chamadas de sistema
  182.  
  183. .align 4
  184.  
  185. read_sonar:
  186.  
  187.  
  188.  
  189. .align 4
  190.  
  191. register_proximity_callbacks:
  192.  
  193.  
  194. .align 4
  195.  
  196. set_motor_speed:
  197.  
  198. cmp r1, #0
  199. blt invalid_speed
  200. cmp r1, #63
  201. bhi invalid_speed
  202. cmp r0, #0
  203. blt invalid_motor
  204. cmp r0, #1
  205. bhi invalid_motor
  206.  
  207.  
  208. push {r2, r3}
  209. cmp r0, #1
  210. beq motor_1
  211. cmp r0, #0
  212. beq motor_0
  213. mov r0, #-1
  214.  
  215. movs pc, lr
  216.  
  217. invalid_motor:
  218. mov r0, #-1
  219. movs pc, lr
  220.  
  221. invalid_speed:
  222. mov r0, #-2
  223. movs pc, lr
  224.  
  225. motor_0:
  226.  
  227. ldr r2, =DR
  228. ldr r3, [r2]
  229. bic r3, #0x1F80000 @ Máscara que zera os bits de 19 a 24
  230. orr r3, r1, lsl #19 @ Máscara que seta os bits de 19 a 24
  231. str r3,[r2]
  232. mov r0, #0
  233. pop {r2, r3}
  234. movs pc, lr
  235.  
  236. motor_1:
  237. ldr r2, =DR
  238. ldr r3, [r2]
  239. bic r3, #0xFC000000 @ Máscara que zera os bits de 26 a 31
  240. orr r3, r1, lsl #26 @ Máscara que seta os bits de 26 a 31
  241. str r3, [r2]
  242. mov r0, #0
  243. pop {r2, r3}
  244. movs pc, lr
  245.  
  246. .align 4
  247.  
  248. set_motors_speed:
  249.  
  250. cmp r1, #0
  251. blt invalid_1
  252. cmp r1, #63
  253. bhi invalid_1
  254. cmp r0, #0
  255. blt invalid_0
  256. cmp r0, #63
  257. blt invalid_0
  258.  
  259. b motors
  260.  
  261.  
  262. invalid_1:
  263. mov r0, #-2
  264. movs pc, lr
  265.  
  266. invalid_0:
  267. mov r0, #-1
  268. movs pc, lr
  269.  
  270. motors:
  271. push {r2, r3}
  272.  
  273. ldr r2, =DR
  274. ldr r3, [r2]
  275. bic r3, #0x1F80000 @ Máscara que zera os bits de 19 a 24
  276. orr r3, r1, lsl #19 @ Máscara que seta os bits de 19 a 24
  277. str r3, [r2]
  278.  
  279. ldr r2, =DR
  280. ldr r3, [r2]
  281. bic r3, #0xFC000000 @ Máscara que zera os bits de 26 a 31
  282. orr r3, r1, lsl #26 @ Máscara que seta os bits de 26 a 31
  283. str r3, [r2]
  284.  
  285. mov r0, #0
  286. pop {r2, r3}
  287. movs pc, lr
  288.  
  289. .align 4
  290.  
  291. get_time:
  292. push {r1}
  293. ldr r1, =CONTADOR
  294. ldr r0, [r1]
  295. pop {r1}
  296. movs pc, lr
  297.  
  298. .align 4
  299.  
  300. set_time:
  301. push {r1}
  302. ldr r1, =CONTADOR
  303. str r0, [r1]
  304. pop {r1}
  305. movs pc, lr
  306.  
  307. .align 4
  308.  
  309. set_alarm:
  310.  
  311.  
  312.  
  313. .data @ Seção de Dados
  314.  
  315. CONTADOR: .word 0
  316. ALARMS: .word 0
  317. CALLBACKS: .word 0
  318.  
  319.  
  320. .skip 500
  321. pilhasup:
  322. .skip 500
  323. pilhauser:
  324. .skip 500
  325. pilhairq:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement