Advertisement
Guest User

Untitled

a guest
Nov 19th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 6.61 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, 0x4E20
  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.  
  45.     @Inicializa Pilha IRQ, interrupcoes desativadas
  46.  
  47.     msr CPSR_C, #0x92
  48.     ldr r13, =pilhairq
  49.  
  50.     @Inicializa Pilha do Usuário, interrupções desativadas
  51.  
  52.     msr CPSR_C, #0x9F
  53.     ldr r13, =pilhauser
  54.  
  55.  
  56.     @Configura o GPT
  57.  
  58.     ldr r0, =GPTCR
  59.     mov r1, #0x41
  60.     str r1, [r0]
  61.  
  62.     ldr r0, =GPTPR
  63.     mov r1, #0x0
  64.     str r1, [r0]
  65.  
  66.     ldr r0, =GPTOCR
  67.     ldr r1, =TIME_SZ
  68.     str r1, [r0]
  69.  
  70.     ldr r0, =GPTIR
  71.     mov r1, #0x10x77812000
  72.     str r1, [r0]
  73.  
  74.  
  75.     @CONFIGURA O TZIC
  76.  
  77.  
  78.     SET_TZIC:
  79.     @ Constantes para os enderecos do TZIC
  80.     .set TZIC_BASE,             0x0FFFC000
  81.     .set TZIC_INTCTRL,          0x0
  82.     .set TZIC_INTSEC1,          0x84
  83.     .set TZIC_ENSET1,           0x104
  84.     .set TZIC_PRIOMASK,         0xC
  85.     .set TZIC_PRIORITY9,        0x424
  86.  
  87.     @ Liga o controlador de interrupcoes
  88.     @ R1 <= TZIC_BASE
  89.  
  90.     ldr r1, =TZIC_BASE
  91.  
  92.     @ Configura interrupcao 39 do GPT como nao segura
  93.     mov r0, #(1 << 7)
  94.     str r0, [r1, #TZIC_INTSEC1]
  95.  
  96.     @ Habilita interrupcao 39 (GPT)
  97.     @ reg1 bit 7 (gpt)
  98.  
  99.     mov r0, #(1 << 7)
  100.     str r0, [r1, #TZIC_ENSET1]
  101.  
  102.     @ Configure interrupt39 priority as 1
  103.     @ reg9, byte 3
  104.  
  105.     ldr r0, [r1, #TZIC_PRIORITY9]
  106.     bic r0, r0, #0xFF000000
  107.     mov r2, #1
  108.     orr r0, r0, r2, lsl #24
  109.     str r0, [r1, #TZIC_PRIORITY9]
  110.  
  111.     @ Configure PRIOMASK as 0
  112.     eor r0, r0, r0
  113.     str r0, [r1, #TZIC_PRIOMASK]
  114.  
  115.     @ Habilita o controlador de interrupcoes
  116.     mov r0, #1
  117.     str r0, [r1, #TZIC_INTCTRL]
  118.  
  119.  
  120.     @Inicializa Pilha do Supervisor
  121.  
  122.     msr  CPSR_c, #0x93       @ SUPERVISOR mode, IRQ/FIQ disabled
  123.     ldr r13, =pilhasup
  124.  
  125.  
  126.     @Transfere para o modo usuario, interrupcoes IRQ ativadas
  127.  
  128.     msr CPSR_C, #0x10
  129.  
  130.     @Salta para codigo de usuario
  131.  
  132.     ldr pc, =USERCODE
  133.  
  134. .align 4
  135.  
  136. IRQ_HANDLER:
  137.  
  138.    ldr r0, =GPTSR
  139.    mov r1, #1
  140.    str r1, [r0]
  141.    ldr r0, =CONTADOR
  142.    add r0, r0, #1
  143.    str r0, =CONTADOR
  144.    sub lr, lr, #4
  145.    movs pc, lr
  146.  
  147. .align 4
  148.  
  149. SVC_HANDLER:
  150.  
  151.    msr  CPSR_c, #0x93    @Modo Supervisor, interrupções FIQ desativadas
  152.    sub lr, lr, #4
  153.    cmp r7, #16
  154.    beq read_sonar
  155.    cmp r7, #17
  156.    beq register_proximity_callbacks
  157.    cmp r7, #18
  158.    beq set_motor_speed
  159.    cmp r7, #19
  160.    beq set_motors_speed
  161.    cmp r7, #20
  162.    beq get_time
  163.    cmp r7, #21
  164.    beq set_time
  165.    cmp r7, #22
  166.    beq set_alarm
  167.  
  168.  
  169. @Tratamento das chamadas de sistema
  170.  
  171. .align 4
  172.  
  173. read_sonar:
  174.  
  175.  
  176.  
  177. .align 4
  178.  
  179. register_proximity_callbacks:
  180.  
  181.  
  182. .align 4
  183.  
  184. set_motor_speed:
  185.  
  186.     cmp r1, #0
  187.     blt invalid_speed
  188.     cmp r1, #63
  189.     bhi invalid_speed
  190.  
  191.     push {r2, r3}
  192.     cmp r0, #1
  193.     beq motor_1
  194.     cmp r0, #0
  195.     beq motor_0
  196.     mov r0, #-1
  197.  
  198.     movs pc, lr
  199.  
  200.     invalid_speed:
  201.         mov r0, #-2
  202.         movs pc, lr
  203.  
  204.     motor_0:
  205.         ldr r2, =GDIR
  206.         and r2, r2, #0xFE03FFFF @ Máscara que zera os bits de 18 a 24
  207.         add r2, r2, #0x1FC0000 @ Máscara que seta os bits de 18 a 24 como saída
  208.         str r2, =GDIR
  209.         ldr r2, =DR
  210.         and r2, r2, #0xFE03FFFF @ Máscara que zera os bits de 18 a 24
  211.         mov r3, #0
  212.         add r3, r1, lsl #19 @ Máscara que coloca os bits de entrada na posição correta
  213.         add r3, r3, #0x40000 @ Seta o bit de write
  214.         orr r2, r2, r3
  215.         str r2, =DR
  216.         pop {r2, r3}
  217.         movs pc, lr
  218.  
  219.     motor_1:
  220.         ldr r2, =GDIR
  221.         and r2, r2, #0x01FFFFFF @ Máscara que zera os bits de 25 a 31
  222.         add r2, r2, #0xFE000000 @ Máscara que seta os bits de 25 a 31 como saída
  223.         str r2, =GDIR
  224.         ldr r2, =DR
  225.         and r2, r2, #0x01FFFFFF @ Máscara que zera os bits de 25 a 31
  226.         mov r3, #0
  227.         add r3, r1, lsl #26 @ Máscara que coloca os bits de entrada na posição correta
  228.         add r3, r3, #0x2000000 @ Seta o bit de write
  229.         orr r2, r2, r3
  230.         str r2, =DR
  231.         pop {r2, r3}
  232.         movs pc, lr
  233.  
  234. .align 4
  235.  
  236. set_motors_speed:
  237.  
  238.     cmp r1, #0
  239.     blt invalid_1
  240.     cmp r1, #63
  241.     bhi invalid_1
  242.     cmp r0, #0
  243.     blt invalid_0
  244.     cmp r0, #63
  245.     blt invalid_0
  246.  
  247.     b motors
  248.  
  249.  
  250.     invalid_1:
  251.         mov r0, #-2
  252.         movs pc, lr
  253.  
  254.     invalid_0:
  255.         mov r0, #-1
  256.         movs pc, lr
  257.  
  258.     motors:
  259.  
  260.         push {r2, r3}
  261.         ldr r2, =GDIR
  262.         and r2, r2, #0xFE03FFFF @ Máscara que zera os bits de 18 a 24
  263.         add r2, r2, #0x1FC0000 @ Máscara que seta os bits de 18 a 24 como saída
  264.         str r2, =GDIR
  265.         ldr r2, =DR
  266.         and r2, r2, #0xFE03FFFF @ Máscara que zera os bits de 18 a 24
  267.         mov r3, #0
  268.         add r3, r0, lsl #19 @ Máscara que coloca os bits de entrada na posição correta
  269.         add r3, r3, #0x40000 @ Seta o bit de write
  270.         orr r2, r2, r3
  271.         str r2, =DR
  272.  
  273.         ldr r2, =GDIR
  274.         and r2, r2, #0x01FFFFFF @ Máscara que zera os bits de 25 a 31
  275.         add r2, r2, #0xFE000000 @ Máscara que seta os bits de 25 a 31 como saída
  276.         str r2, =GDIR
  277.         ldr r2, =DR
  278.         and r2, r2, #0x01FFFFFF @ Máscara que zera os bits de 25 a 31
  279.         mov r3, #0
  280.         add r3, r1, lsl #26 @ Máscara que coloca os bits de entrada na posição correta
  281.         add r3, r3, #0x2000000 @ Seta o bit de write
  282.         orr r2, r2, r3
  283.         str r2, =DR
  284.         pop {r2, r3}
  285.         movs pc, lr
  286.  
  287. .align 4
  288.  
  289. get_time:
  290.     ldr r0, =CONTADOR
  291.     movs pc, lr
  292.  
  293. .align 4
  294.  
  295. set_time:
  296.     str r0, =CONTADOR
  297.     movs pc, lr
  298.  
  299. .align 4
  300.  
  301. set_alarm:
  302.     push {r2}
  303.     ldr r2, =ALARMS
  304.     cmp r1, CONTADOR
  305.     blt lower_timer
  306.     cmp r2, MAX_ALARMS
  307.     bhi alarm_overflow
  308.     add r2, r2, #1
  309.     str r2, =ALARMS
  310.     pop {r2}
  311.     mov pc, r0
  312.     movs pc, lr
  313.  
  314.     alarm_overflow:
  315.         mov r0, #-1
  316.         pop {r2}
  317.         movs pc, lr
  318.  
  319.     lower_timer:
  320.         mov r0, #-2
  321.         pop {r2}
  322.         movs pc,lr
  323.  
  324.  
  325.  
  326. .data @ Seção de Dados
  327.  
  328. CONTADOR: .word 0
  329. ALARMS: .word 0
  330. CALLBACKS: .word 0
  331.  
  332.  
  333. .skip 500
  334. pilhasup:
  335. .skip 500
  336. pilhauser:
  337. skip 500
  338. pilhairq:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement