Advertisement
trafka

SW2

Oct 22nd, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.09 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <io.h>
  3. #include <system.h>
  4. #include "alt_types.h"
  5. #include "altera_avalon_pio_regs.h"
  6. #include "sys/alt_irq.h"
  7. #include "sys/alt_timestamp.h"
  8. #include <unistd.h>
  9. #include "definition.h"
  10.  
  11. #define  SW0 0x00000001
  12. #define  SW1 0x00000002
  13. #define  SW2 0x00000004
  14. #define  SW3 0x00000008
  15. #define  SW4 0x00000010
  16. #define  SW5 0x00000020
  17.  
  18. #define  LEDG0 0x00000001
  19. #define  LEDG1 0x00000002
  20. #define  LEDG2 0x00000004
  21. #define  LEDG3 0x00000008
  22. #define  LEDG4 0x00000010
  23. #define  LEDG5 0x00000020
  24.  
  25. #define  LEDR17 0x00020000
  26.  
  27. #define  SEGA 0b0000001
  28. #define  SEGB 0b0000010
  29. #define  SEGC 0b0000100
  30. #define  SEGD 0b0001000
  31. #define  SEGE 0b0010000
  32. #define  SEGF 0b0100000
  33. #define  SEGG 0b1000000
  34.  
  35. int HEX0 = SEGA|SEGB|SEGC|SEGD|SEGE|SEGF;
  36. int HEX3 = SEGA|SEGB|SEGC|SEGD|SEGG;
  37. int HEX4 = SEGF|SEGG|SEGB|SEGC;
  38. int HEX5 = SEGA|SEGF|SEGG|SEGC|SEGD;
  39. int HEX6 = SEGA|SEGF|SEGG|SEGC|SEGD|SEGE;
  40. int HEX8 = SEGA|SEGB|SEGC|SEGD|SEGE|SEGF|SEGG;
  41. int HEX9 = SEGA|SEGB|SEGC|SEGD|SEGF|SEGG;
  42. int HEXE = SEGA|SEGF|SEGG|SEGE|SEGD;
  43. int HEXr = SEGE|SEGG;
  44.  
  45. struct interrupt_data
  46. {
  47.     int * ledsr_addr;
  48.     int * ledsg_addr;
  49.     int * sliders_addr;
  50.     int * hex3_addr;
  51. };
  52.  
  53. static void handle_sliders_interrupt(struct interrupt_data * data)
  54. {
  55.     int switches = IORD(*data->sliders_addr,0);
  56.     int state = switches & (SW0|SW1|SW2|SW3|SW4|SW5);
  57.     IOWR(*data->ledsg_addr,0,0);
  58.     IOWR(*data->ledsr_addr,0,0);
  59.     IOWR(*data->hex3_addr,0,0);
  60.     switch(state)
  61.     {
  62.     case 0:
  63.         break;
  64.     case 1:
  65.         IOWR(*data->hex3_addr,0,((HEX3<<8)| HEX0));
  66.         IOWR(*data->ledsg_addr,0,LEDG0);
  67.         break;
  68.     case 2:
  69.         IOWR(*data->hex3_addr,0,((HEX3<<8)| HEX5));
  70.         IOWR(*data->ledsg_addr,0,LEDG1);
  71.         break;
  72.     case 4:
  73.         IOWR(*data->hex3_addr,0,((HEX4<<8)| HEX0));
  74.         IOWR(*data->ledsg_addr,0,LEDG2);
  75.         break;
  76.     case 8:
  77.         IOWR(*data->hex3_addr,0,((HEX6<<8)| HEX0));
  78.         IOWR(*data->ledsg_addr,0,LEDG3);
  79.         break;
  80.     case 16:
  81.         IOWR(*data->hex3_addr,0,((HEX8<<8)| HEX0));
  82.         IOWR(*data->ledsg_addr,0,LEDG4);
  83.         break;
  84.     case 32:
  85.         IOWR(*data->hex3_addr,0,((HEX9<<8)| HEX0));
  86.         IOWR(*data->ledsg_addr,0,LEDG5);
  87.         break;
  88.  
  89.     default:
  90.         IOWR(*data->hex3_addr,0,((HEXE<<16) | (HEXr<<8) | HEXr));
  91.         IOWR(*data->ledsg_addr,0,0);
  92.         IOWR(*data->ledsr_addr,0,LEDR17);
  93.         break;
  94.  
  95.     }
  96. }
  97. int main()
  98. {
  99.  
  100.     int *ledsr = (int*) & LEDS_RED_BASE;
  101.     int *ledsg = (int*) & LEDS_GREEN_BASE;
  102.     int *sliders = (int*) & SW_SLIDERS_BASE;
  103.     int *hex3 = (int*) & HEX_3_BASE;
  104.     struct interrupt_data data;
  105.  
  106.     data.ledsr_addr = ledsr;
  107.     data.ledsg_addr = ledsg;
  108.     data.sliders_addr = sliders;
  109.     data.hex3_addr = hex3;
  110.  
  111.     IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_SLIDERS_BASE,0xF);
  112.  
  113.     alt_ic_isr_register(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID, SW_SLIDERS_IRQ, handle_sliders_interrupt, &data, 0x0);
  114.  
  115.     alt_ic_irq_enable(SW_SLIDERS_IRQ_INTERRUPT_CONTROLLER_ID, SW_SLIDERS_IRQ);
  116.  
  117.     printf("Hello from Nios II!\n");
  118.  
  119.     while(1);
  120.  
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement