Advertisement
Guest User

ass

a guest
Jun 7th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ===========================  INTERRUPT ID-evi ===========================
  2.  
  3. #define TIMERPS_INT_ID          #29 /* Private timer interrupt ID */
  4. #define XGPIOPS_INT_ID          #52 /* GPIO interrupt ID */
  5. #define XIICPS_INT_ID           #57 /* I2C interrupt ID */
  6. #define XSPIPS_INT_ID           #58 /* SPI interrupt ID */
  7. #define XUARTPS_INT_ID          #59 /* UART interrupt ID */
  8.  
  9. // ===================== BAZNE ADRESE I OFFSETI SKLOPOVA =====================
  10.  
  11. // CPU interface control (za prekide):
  12. #define ICC_ICR_BASEADDR        #0xF8F00100 /* CPU interface control base address */
  13. #define ICC_IAR_OFFSET          #0xC /* Interrupt acknowledge register */
  14. #define ICC_EOIR_OFFSET         #0x10 /* End of interrupt register */
  15.  
  16. // UART:
  17. #define XUARTPS_BASEADDR        #0xE0000000
  18. //#define XUARTPS_CR_OFFSET     #0x0 /* UART Control Register */
  19. #define XUARTPS_MR_OFFSET       #0x4 /* UART Mode Register */
  20. #define XUARTPS_IER_OFFSET      #0x8 /* Interrupt Enable Register */
  21. #define XUARTPS_IDR_OFFSET      #0xC /* Interrupt Disable Register */
  22. #define XUARTPS_IMR_OFFSET      #0x10 /* Interrupt Mask Register */
  23. #define XUARTPS_ISR_OFFSET      #0x14 /* Channel Interrupt Status Register */
  24. #define XUARTPS_BAUDGEN_OFFSET  #0x18 /* Baud Rate Generator Register */
  25. #define XUARTPS_RXTOUT_OFFSET   #0x1C /* Receiver Timeout Register */
  26. #define XUARTPS_RXWM_OFFSET     #0x20 /* Receiver FIFO Trigger Level Register*/
  27. #define XUARTPS_MODEMCR_OFFSET  #0x24 /* Modem Control Register */
  28. #define XUARTPS_MODEMSR_OFFSET  #0x28 /* Modem Status Register */
  29. #define XUARTPS_SR_OFFSET       #0x2C /* Channel Status Register */
  30. #define XUARTPS_FIFO_OFFSET     #0x30 /* Transmit and Receive FIFO*/
  31. #define Baud_rate_divider_reg0  #0x34 /* Baud Rate Divider Register */
  32. #define Flow_delay_reg0         #0x38 /* Flow Control Delay Register */
  33. #define TX_FIFO_trigger_level0  #0x44 /* Transmitter FIFO Trigger Level Register */
  34.  
  35. // GPIO:
  36. #define XGPIOPS_BASEADDR        #0xE000A000 /* GPIO base address */
  37. #define XGPIOPS_INT_TYPE_OFFSET #0x29C /* GPIO interrupt type register offset for bank 2 */
  38. #define XGPIOPS_INT_POL_OFFSET  #0x2A0 /* GPIO interrupt polarity register offset for bank 2 */
  39. #define XGPIOPS_INT_EN_OFFSET   #0x290 /* GPIO interrupt enable register offset for bank 2 */
  40. #define XGPIOPS_INT_EDGE_ANY    #0x2A4 /* GPIO any interrupt edge register offset for bank 2 */
  41. #define XGPIOPS_DIRM_OFFSET     #0x284 /* GPIO direction mode register offset for bank 2 */
  42. #define XGPIOPS_OUTEN_OFFSET    #0x288 /* GPIO direction mode register offset for bank 2 */
  43. #define XGPIOPS_DATA2_OFFSET    #0x48  /* GPIO data 2 (bank 2) register offset */
  44. #define XGPIOPS_ISR2_OFFSET     #0x298  /* GPIO interrupt status register 2 (for bank 2) offset */
  45.  
  46. // CPU0 private timer:
  47. #define TIMERPS_BASEADDR        #0xF8F00600 /* CPU private timer base address */
  48. //#define TIMERPS_LR_OFFSET     #0x0 /* CPU private timer load register offset */
  49. #define TIMERPS_CR_OFFSET       #0x4 /* CPU private timer counter register offset */
  50. #define TIMERPS_CNTRL_OFFSET    #0x8 /* CPU private timer control register offset */
  51. #define TIMERPS_ISR_OFFSET      #0xC /* CPU private timer interrupt status register offset*/
  52.  
  53.  
  54. // ====================== MY_CONSTANTS ======================
  55.  
  56. #define PRIM_ADR                #0x7FFFFFC /* Array of prime numbers up to sqrt(2^31) with first cell being it's size*/
  57. #define LIM                     #46340
  58.  
  59. // ====================== TABLICA PREKIDNIH VEKTORA ======================
  60.  
  61. .section .vectors, "ax"
  62.     B _start            // Reset vector
  63.     B SERVICE_UND       // Undefined instruction vector
  64.     B SERVICE_SVC       // Software interrrupt vector
  65.     B SERVICE_ABT_INST  // Aborted prefetch vector
  66.     B SERVICE_ABT_DATA  // Aborted data vector
  67.     .word 0             // Unused vector
  68.     B SERVICE_IRQ       // IRQ interrupt vector
  69.     B SERVICE_FIQ       // FIQ interrupt vector
  70.  
  71. // ============================ POCETAK RESET VEKTORA ============================
  72.  
  73. .text
  74. .global _start
  75.  
  76. _start:
  77.     // Postavljanje pokazivaca stoga za IRQ i SVC nacin rada
  78.     MOV R1, #0b11010010     // MODE = IRQ
  79.     MSR CPSR_c, R1          // Spremi u CPSR_c
  80.     LDR SP, =0xFFFFFFF - 3  // Postavi IRQ stog
  81.  
  82.     // Postavi u SVC nacin rada
  83.     MOV R1, #0b11010011     // MODE = SVC
  84.     MSR CPSR, R1            // Spremi u CPSR
  85.     LDR SP, =0x3FFFFFF - 3  // Postavi SVC stog
  86.  
  87.     BL CONFIG_GIC           // Konfiguriraj ARM GIC
  88.  
  89.     // Omoguci prekide na GPIO sklopu za tipku 0
  90.     LDR R0, =XGPIOPS_BASEADDR   // GPIO adresa
  91.     MOV R1, #0b11110000     // Kontrolna rijec
  92.     STR R1, [R0, XGPIOPS_INT_TYPE_OFFSET]   // Type
  93.     STR R1, [R0, XGPIOPS_INT_POL_OFFSET]    // Polarity
  94.     STR R1, [R0, XGPIOPS_INT_EN_OFFSET]     // Enable
  95.  
  96.     MOV R1, #0
  97.     STR R1, [R0, XGPIOPS_INT_EDGE_ANY]  // Any
  98.  
  99.     // Postavi GPIO izlaze
  100.     MOV R1, #0b111111           // Kontrolna rijec
  101.     MOV R1, R1, LSL #11
  102.     STR R1, [R0, XGPIOPS_DIRM_OFFSET]   // DIRM - postavi smjer
  103.     STR R1, [R0, XGPIOPS_OUTEN_OFFSET]  // OUTEN - omogu�i izlaze
  104.  
  105.     // Omoguci IRQ prekide na procesoru
  106.     MOV R0, #0b01010011     // MODE = SVC
  107.     MSR CPSR_c, R0
  108.  
  109.     MOV R0, #0
  110.     LDR R1, =PRIM_ADR
  111.     STR R0, [R1]
  112.  
  113.     // ========================= PROSTOR ZA PISANJE KODA =========================
  114.  
  115. MAIN:
  116.  
  117.     /* Initialize dynamica array of prim numbers */
  118.     MOV R0, #0
  119.     LDR R1, =PRIM_ADR
  120.     STR R0, [R1]
  121.  
  122.     MOV R2, #2
  123.     PUSH {R2}
  124.     BL APPEND_PRIM
  125.     ADD SP, SP, #4
  126.  
  127.     /* Set counter (R1)*/
  128.     MOV R1, #3
  129.  
  130. IDLE:
  131.  
  132.     BL IS_RUNNING
  133.  
  134.     PUSH {R1}
  135.     BL IS_PRIM
  136.     ADD SP, SP, #4
  137.  
  138.     ADD R1, R1, #1
  139.     CMP R1, #500
  140.     BNE IDLE // "koristan posao"
  141.  
  142.     // ===================== KRAJ PROSTORA ZA PISANJE KODA =======================
  143.  
  144.  
  145. /* potporgrami */
  146.  
  147. IS_PRIM:
  148.     PUSH {R1 - R4, LR}
  149.  
  150.     LDR R4, [SP, #0x14]
  151.     LDR R1, =PRIM_ADR
  152.     LDR R2, [R1], #4
  153.     ADD R1, R1, R2
  154.  
  155. TEST_LOOP:
  156.     LDR R3, [R1, -R2]
  157.     SUB R2, R2, #4
  158.  
  159.     PUSH {R3}
  160.     PUSH {R4}
  161.  
  162.     BL MOD
  163.     ADD SP, SP, #8
  164.  
  165.     CMP R0, #0
  166.     BEQ OUT_PRIM
  167.     CMP R2, #0
  168.     BGT TEST_LOOP
  169.  
  170.     PUSH {R4}
  171.     BL APPEND_PRIM
  172.     ADD SP, SP, #4
  173.  
  174. OUT_PRIM:
  175.     POP {R1 - R4, PC}
  176.  
  177. // potprogram za dodavanje elementa na dinamicki array prostih brojeva, parametar prima preko stoga
  178. APPEND_PRIM:
  179.     PUSH {R0 - R2, LR}
  180.  
  181.     LDR R0, [SP, #0x10]
  182.     LDR R1, =LIM
  183.     CMP R0, R1
  184.  
  185.     BLGE APPEND_PRIM_OUT
  186.  
  187.     LDR R1, =PRIM_ADR
  188.     LDR R2, [R1], #4
  189.  
  190.     STR R0, [R1, R2]
  191.     ADD R2, R2, #4
  192.     STR R2, [R1, #-4]
  193.  
  194. APPEND_PRIM_OUT:
  195.     POP {R0 - R2, PC}
  196.  
  197. // potprogram za racunanje modula, parametre prima preko stoga, a rezultat vraca preko r0
  198. // ako su parametri koje dohvaca sa stoga A i B, onda vraca A % B
  199. MOD:
  200.     PUSH {R1 - R3, LR}
  201.  
  202.     LDR R0, [SP, #0x10]
  203.     LDR R1, [SP, #0x14]
  204.  
  205.     MOV R2, #15
  206. POW_LOOP:
  207.     MOV R3, R1, LSL R2
  208.     SUB R2, R2, #1
  209.     CMP R0, R3
  210.  
  211.     BLT POW_LOOP
  212.  
  213. SUB_LOOP:
  214.  
  215.     SUB R0, R0, R3
  216.  
  217.     CMP R0, #0
  218.     BEQ MOD_OUT
  219.  
  220.     CMP R3, #0
  221.     BEQ MOD_OUT
  222.  
  223.     CMP R0, R3
  224.     BGE SUB_LOOP
  225.  
  226.     CMP R2, #0
  227.     BLGE POW_LOOP
  228.  
  229. MOD_OUT:
  230.     POP {R1 - R3, PC}
  231.  
  232.  
  233. IS_RUNNING:
  234.     PUSH {R0 - R1, LR}
  235.  
  236.     MOV R1, #0b010010
  237.     MOV R1, R1, LSL #10
  238.     LDR R0, =XGPIOPS_BASEADDR
  239.     STR R1, [R0, XGPIOPS_DATA2_OFFSET]
  240.  
  241.     POP {R0 - R1, PC}
  242.  
  243. PAUSE_PROMPT:
  244.     PUSH {R0 - R4, LR}
  245.  
  246.     MOV R1, #0b001001
  247.     MOV R1, R1, LSL #10
  248.     LDR R0, =XGPIOPS_BASEADDR
  249.     STR R1, [R0, XGPIOPS_DATA2_OFFSET]
  250.  
  251. PAUSED:
  252.     B PAUSED
  253.     // poraditi na ovome
  254.     POP {R0 - R4, PC}
  255.  
  256. /* Potprogrami za obradu prekida */
  257. /*--- Undefined instructions --------------------------------------------------*/
  258. SERVICE_UND:
  259.     B SERVICE_UND
  260.  
  261. /*--- Software interrupts -----------------------------------------------------*/
  262.  
  263. SERVICE_SVC:
  264.     B SERVICE_SVC
  265.  
  266. /*--- Aborted data reads ------------------------------------------------------*/
  267. SERVICE_ABT_DATA:
  268.     B SERVICE_ABT_DATA
  269.  
  270. /*--- Aborted instruction fetch -----------------------------------------------*/
  271. SERVICE_ABT_INST:
  272.     B SERVICE_ABT_INST
  273.  
  274. /*--- IRQ ---------------------------------------------------------------------*/
  275. SERVICE_IRQ:
  276.     PUSH {R0-R7, LR}
  277.  
  278.     LDR R4, =ICC_ICR_BASEADDR
  279.     LDR R5, [R4, ICC_IAR_OFFSET]    // Dohvacanje ID-a prekida
  280.  
  281. FPGA_IRQ1_HANDLER:
  282. // ===================== PREKIDNA RUTINA - DOZNATI TKO JE GENERIRAO PREKID ==================
  283.     CMP R5, XGPIOPS_INT_ID                  // 52 - ID za GPIO
  284.     BEQ GPIO_INT
  285.  
  286. UNEXPECTED:
  287.     BNE UNEXPECTED                          // Nepoznati prekid - vrti se zauvijek
  288.  
  289. GPIO_INT:
  290.     LDR R0, =XGPIOPS_BASEADDR               // GPIO adresa
  291.     LDR R1, [R0, XGPIOPS_DATA2_OFFSET]      // Ucitaj stanje na GPIO
  292.     MOV R1, R1, LSR #4                      // Dohvati bitove gumba
  293.  
  294.     // pauza
  295.     MOV R2, #0
  296.     ANDS R2, R1, #0b0001
  297.     //BLPL PAUSE_PROMPT
  298.  
  299.     LDR R1, [R0, XGPIOPS_ISR2_OFFSET]   // Dojavi kraj prekida na GPIO
  300.     STR R1, [R0, XGPIOPS_ISR2_OFFSET]
  301.  
  302. EXIT_IRQ:
  303.     STR R5, [R4, ICC_EOIR_OFFSET]   // ICCEOIR - End of interrupt register
  304.     POP {R0-R7, LR}
  305.     SUBS PC, LR, #4 // povratak iz prekida
  306.  
  307.     /*--- FIQ ---------------------------------------------------------------------*/
  308. SERVICE_FIQ:
  309.     B SERVICE_FIQ
  310.  
  311.  
  312.  
  313. // Konfiguracija Generic Interrupt Controller (GIC)
  314. CONFIG_GIC:
  315.     PUSH {LR}
  316.     /* Postavljanje prekida za GPIO tipke (ID 52):
  317.     * 1. Postavi ciljani procesor na cpu0 u ICDIPTRn registru
  318.     * 2. Omogu�i prekide u ICDISERn registru */
  319.     /* CONFIG_INTERRUPT (int_ID (R0), CPU_target (R1)); */
  320.     MOV R0, #52             // Interrupt ID = 52
  321.     MOV R1, #1              // bit-mask; bit 0 ozna�ava cpu0
  322.     BL CONFIG_INTERRUPT
  323.  
  324.     /* Postavi GIC CPU su�elje */
  325.     LDR R0, =0xF8F00100     // Osnovna adresa CPU su�elja (ICC)
  326.     /* Omogu�avanje prekida svih proriteta */
  327.     LDR R1, =0xFFFF         // ICCPMR - Interrupt Priority Mask Register
  328.     STR R1, [R0, #0x04]
  329.  
  330.     // Prenesi prekide na procesor
  331.     MOV R1, #1
  332.     STR R1, [R0]            // ICCICR - CPU Interface Control Register
  333.  
  334.     LDR R0, =0xF8F01000     // ICDDCR - Distributor Control Register
  335.     STR R1, [R0]            // Omogu�avanje distributora
  336.     POP {PC}
  337.  
  338.  
  339. /*
  340. * Postavljaju se Interrupt Set Enable Registers (ICDISERn) i
  341. * Interrupt Processor Target Registers (ICDIPTRn).
  342. *
  343. * Argumenti:
  344. * R0 = Interrupt ID, N
  345. * R1 = CPU target
  346. */
  347. CONFIG_INTERRUPT:
  348.     PUSH {R4-R5, LR}
  349.     /* Postavi Interrupt Set-Enable Registers (ICDISERn).
  350.     * reg_offset = (integer_div(N / 32) * 4
  351.     * value = 1 << (N mod 32) */
  352.     LSR R4, R0, #3          // Izra�unaj reg_offset
  353.     BIC R4, R4, #3          // R4 = reg_offset
  354.  
  355.     LDR R2, =0xF8F01100
  356.     ADD R4, R2, R4          // R4 = ICDISER
  357.     AND R2, R0, #0x1F       // N mod 32
  358.     MOV R5, #1              // Omogu�i
  359.     LSL R2, R5, R2          // R2 = maska
  360.  
  361.     // Koristi se adresa u R4 i maska u R2 da se postavi to�an bit u GIC registru
  362.     LDR R3, [R4]
  363.     ORR R3, R3, R2
  364.     STR R3, [R4]
  365.  
  366.     /* Postavi Interrupt Processor Targets Register (ICDIPTRn)
  367.     * reg_offset = integer_div(N / 4) * 4
  368.     * index = N mod 4 */
  369.     BIC R4, R0, #3          // R4 = reg_offset
  370.     LDR R2, =0xF8F01800
  371.     ADD R4, R2, R4          // R4 = adresa rije�i ICDIPTR
  372.     AND R2, R0, #0x3        // N mod 4
  373.     ADD R4, R2, R4          // R4 = adresa bajta ICDIPTR
  374.  
  375.     /* Koristi se adresa u R4 i vrijednost u R2 da se postavi odgovaraju�i bajt */
  376.     STRB R1, [R4]
  377.     POP {R4-R5, PC}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement