Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.57 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, 0x100
  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.  
  52. @Configura o GPT
  53.  
  54. ldr r0, =GPTCR
  55. mov r1, #0x41
  56. str r1, [r0]
  57.  
  58. ldr r0, =GPTPR
  59. mov r1, #0x0
  60. str r1, [r0]
  61.  
  62. ldr r0, =GPTOCR
  63. ldr r1, =TIME_SZ
  64. str r1, [r0]
  65.  
  66. ldr r0, =GPTIR
  67. mov r1, #0x1
  68. str r1, [r0]
  69.  
  70.  
  71. @CONFIGURA O TZIC
  72.  
  73.  
  74. SET_TZIC:
  75. @ Constantes para os enderecos do TZIC
  76. .set TZIC_BASE, 0x0FFFC000
  77. .set TZIC_INTCTRL, 0x0
  78. .set TZIC_INTSEC1, 0x84
  79. .set TZIC_ENSET1, 0x104
  80. .set TZIC_PRIOMASK, 0xC
  81. .set TZIC_PRIORITY9, 0x424
  82.  
  83. @ Liga o controlador de interrupcoes
  84. @ R1 <= TZIC_BASE
  85.  
  86. ldr r1, =TZIC_BASE
  87.  
  88. @ Configura interrupcao 39 do GPT como nao segura
  89. mov r0, #(1 << 7)
  90. str r0, [r1, #TZIC_INTSEC1]
  91.  
  92. @ Habilita interrupcao 39 (GPT)
  93. @ reg1 bit 7 (gpt)
  94.  
  95. mov r0, #(1 << 7)
  96. str r0, [r1, #TZIC_ENSET1]
  97.  
  98. @ Configure interrupt39 priority as 1
  99. @ reg9, byte 3
  100.  
  101. ldr r0, [r1, #TZIC_PRIORITY9]
  102. bic r0, r0, #0xFF000000
  103. mov r2, #1
  104. orr r0, r0, r2, lsl #24
  105. str r0, [r1, #TZIC_PRIORITY9]
  106.  
  107. @ Configure PRIOMASK as 0
  108. eor r0, r0, r0
  109. str r0, [r1, #TZIC_PRIOMASK]
  110.  
  111. @ Habilita o controlador de interrupcoes
  112. mov r0, #1
  113. str r0, [r1, #TZIC_INTCTRL]
  114.  
  115.  
  116.  
  117. @Inicializa Pilha IRQ
  118.  
  119. msr CPSR_c, #0xD2
  120. ldr sp, =pilhairq
  121.  
  122.  
  123. @Inicializa Pilha do Usuário, usando o modo system para nao ficar "trancado"
  124.  
  125. msr CPSR_c, #0x1F
  126. ldr sp, =pilhauser
  127.  
  128.  
  129.  
  130. @Inicializa Pilha do Supervisor
  131.  
  132. msr CPSR_c, #0x13
  133. ldr sp, =pilhasup
  134.  
  135.  
  136. @Transfere para o modo usuario
  137.  
  138. msr CPSR_c, #0x10
  139.  
  140. @ Salta para codigo de usuario
  141.  
  142. @ldr r0, =USERCODE
  143. @mov pc, r0
  144.  
  145. mov r0, #0
  146. mov r1, #30
  147. mov r7, #18
  148. svc 0x0
  149.  
  150.  
  151.  
  152. IRQ_HANDLER:
  153.  
  154. ldr r0, =GPTSR
  155. mov r1, #1
  156. str r1, [r0]
  157. ldr r0, =CONTADOR
  158. ldr r1, [r0]
  159. add r1, r1, #1
  160. str r1, [r0]
  161. sub lr, lr, #4
  162. movs pc, lr
  163.  
  164.  
  165. SVC_HANDLER:
  166.  
  167.  
  168. push {lr}
  169.  
  170. msr CPSR_c, #0xD3 @ Desliga interrupcoes IRQ
  171.  
  172. cmp r7, #16
  173. bleq read_sonar
  174. cmp r7, #17
  175. bleq register_proximity_callbacks
  176. cmp r7, #18
  177. bleq set_motor_speed
  178. cmp r7, #19
  179. bleq set_motors_speed
  180. cmp r7, #20
  181. bleq get_time
  182. cmp r7, #21
  183. bleq set_time
  184. cmp r7, #22
  185. bleq set_alarm
  186.  
  187. pop {lr}
  188.  
  189. movs pc, lr
  190.  
  191.  
  192.  
  193. @Tratamento das chamadas de sistema
  194.  
  195.  
  196. read_sonar:
  197.  
  198. cmp r0, #15
  199. bgt invalid_sonar
  200. cmp r0, #0
  201. blt invalid_sonar
  202.  
  203. push {r2, r3, r4, r5, r6, lr}
  204.  
  205. ldr r2, =DR
  206. ldr r1, [r2] @ Salva conteúdo atual de DR em r1
  207.  
  208. @Como o Trigger está sempre em zero entre as chamadas, não é preciso o primeiro delay (pelo menos na prática não foi)
  209.  
  210.  
  211. bic r1, r1, #0b111100 @Zera os bits do MUX (2 a 5)
  212. orr r1, r1, r0, lsl #2 @ Seta os bits de identificação do sonar (2 a 5)
  213. orr r1, r1, #2 @ Seta TRIGGER (bit 2)
  214. str r1, [r2] @ Salva bits do sonar + TRIGGER setado
  215.  
  216. mov r3, #0
  217. mov r4, #2000
  218.  
  219. delay1:
  220. add r3, r3, #1
  221. cmp r3, r4
  222. blt delay1
  223.  
  224. bic r1, r1, #2 @ Zera TRIGGER
  225. str r1, [r2] @ Salva TRIGGER zerado
  226.  
  227. mov r4, #0
  228.  
  229. flag:
  230. ldr r1, [r2]
  231. and r4, r1, #1 @ Seleciona bit da flag
  232. cmp r4, #1 @Verifica se bit da flag está setado
  233. beq flag_setada
  234.  
  235. @Delay menor entre as checagens da flag
  236.  
  237. mov r5, #0
  238. mov r6, #1000
  239.  
  240. delay2:
  241. add r5, r5, #1
  242. cmp r5, r6
  243. blt delay2
  244.  
  245. b flag
  246.  
  247. flag_setada:
  248.  
  249. ldr r2, =0b111111111111000000 @ Máscara que seta os bits de Sonar_Data
  250. and r1, r1, r2
  251. mov r1, r1, lsr #6 @ Ajusta localização dos bits para retorno
  252.  
  253. mov r0, r1
  254.  
  255. pop {r2, r3, r4, r5, r6, lr}
  256.  
  257. mov pc, lr
  258.  
  259.  
  260. invalid_sonar:
  261. mov r0, #-1
  262. mov pc, lr
  263.  
  264.  
  265. register_proximity_callbacks:
  266.  
  267. cmp r0, #0
  268. blt sonar_error
  269. cmp r0, #15
  270. bgt sonar_error
  271. push {r3}
  272. cmp r1, #0
  273. blt distance_error
  274. ldr r3, =0xFFF
  275. cmp r1, r3
  276. bgt distance_error
  277.  
  278. push {r4, r5, r6}
  279.  
  280. ldr r3, =CALLBACKS
  281. ldr r4, [r3]
  282. cmp r4, #MAX_CALLBACKS
  283. bgt callback_overflow
  284.  
  285.  
  286. mov pc, lr
  287.  
  288. sonar_error:
  289. mov r0, #-2
  290. mov pc, lr
  291.  
  292. distance_error:
  293. mov r0, #-1
  294. pop {r3}
  295. mov pc, lr
  296.  
  297. callback_overflow:
  298. mov r0, #-1
  299. pop {r3, r4, r5, r6}
  300. mov pc, lr
  301.  
  302. set_motor_speed:
  303.  
  304. cmp r1, #0
  305. blt invalid_speed
  306. cmp r1, #63
  307. bgt invalid_speed
  308. cmp r0, #0
  309. blt invalid_motor
  310. cmp r0, #1
  311. bgt invalid_motor
  312.  
  313. push {r2, r3}
  314.  
  315. cmp r0, #1
  316. beq motor_1
  317. cmp r0, #0
  318. beq motor_0
  319.  
  320.  
  321. invalid_motor:
  322. mov r0, #-1
  323. mov pc, lr
  324.  
  325. invalid_speed:
  326. mov r0, #-2
  327. mov pc, lr
  328.  
  329. motor_0:
  330.  
  331. ldr r2, =DR
  332. ldr r3, [r2]
  333. bic r3, #0x1F80000 @ Máscara que zera os bits de 19 a 24
  334. orr r3, r1, lsl #19 @ Máscara que seta os bits de 19 a 24
  335. str r3,[r2]
  336. mov r0, #2
  337. pop {r2, r3}
  338. mov pc, lr
  339.  
  340. motor_1:
  341.  
  342. ldr r2, =DR
  343. ldr r3, [r2]
  344. bic r3, #0xFC000000 @ Máscara que zera os bits de 26 a 31
  345. orr r3, r1, lsl #26 @ Máscara que seta os bits de 26 a 31
  346. str r3, [r2]
  347. mov r0, #2
  348. pop {r2, r3}
  349. mov pc, lr
  350.  
  351.  
  352. set_motors_speed:
  353.  
  354. cmp r1, #0
  355. blt invalid_1
  356. cmp r1, #63
  357. bhi invalid_1
  358. cmp r0, #0
  359. blt invalid_0
  360. cmp r0, #63
  361. blt invalid_0
  362.  
  363. b motors
  364.  
  365.  
  366. invalid_1:
  367. mov r0, #-2
  368. mov pc, lr
  369.  
  370. invalid_0:
  371. mov r0, #-1
  372. mov pc, lr
  373.  
  374. motors:
  375. push {r2, r3}
  376.  
  377. ldr r2, =DR
  378. ldr r3, [r2]
  379. bic r3, #0x1F80000 @ Máscara que zera os bits de 19 a 24
  380. orr r3, r0, lsl #19 @ Máscara que seta os bits de 19 a 24
  381. str r3, [r2]
  382.  
  383. ldr r2, =DR
  384. ldr r3, [r2]
  385. bic r3, #0xFC000000 @ Máscara que zera os bits de 26 a 31
  386. orr r3, r1, lsl #26 @ Máscara que seta os bits de 26 a 31
  387. str r3, [r2]
  388.  
  389. mov r0, #0
  390. pop {r2, r3}
  391. mov pc, lr
  392.  
  393.  
  394. get_time:
  395. push {r1}
  396. ldr r1, =CONTADOR
  397. ldr r0, [r1]
  398. pop {r1}
  399. mov pc, lr
  400.  
  401.  
  402. set_time:
  403. push {r1}
  404. ldr r1, =CONTADOR
  405. str r0, [r1]
  406. pop {r1}
  407. mov pc, lr
  408.  
  409.  
  410. set_alarm:
  411.  
  412.  
  413.  
  414. .data @ Seção de Dados
  415.  
  416. CONTADOR: .word 0
  417. ALARMS: .word 0
  418. CALLBACKS: .word 0
  419.  
  420. strcallbacks:
  421. .skip 72
  422.  
  423. stralarms:
  424. .skip 72
  425.  
  426.  
  427.  
  428. .skip 500
  429. pilhasup:
  430. .skip 500
  431. pilhauser:
  432. .skip 500
  433. pilhairq:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement