1 | /***************************************************************** |
---|
2 | * File: sw_intr_util.h |
---|
3 | * Copyright (c) 2018 Mango Communications, all rights reseved |
---|
4 | *****************************************************************/ |
---|
5 | |
---|
6 | #ifndef SW_INTR_UTIL_H |
---|
7 | #define SW_INTR_UTIL_H |
---|
8 | |
---|
9 | /***************************** Include Files *******************************/ |
---|
10 | |
---|
11 | #include "xstatus.h" |
---|
12 | #include "xil_io.h" |
---|
13 | |
---|
14 | #define SW_INTR_UTIL_USER_SLV_SPACE_OFFSET (0x00000000) |
---|
15 | #define SW_INTR_UTIL_SLV_REG0_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000000) |
---|
16 | #define SW_INTR_UTIL_SLV_REG1_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000004) |
---|
17 | #define SW_INTR_UTIL_SLV_REG2_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000008) |
---|
18 | #define SW_INTR_UTIL_SLV_REG3_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x0000000C) |
---|
19 | #define SW_INTR_UTIL_SLV_REG4_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000010) |
---|
20 | #define SW_INTR_UTIL_SLV_REG5_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000014) |
---|
21 | #define SW_INTR_UTIL_SLV_REG6_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000018) |
---|
22 | #define SW_INTR_UTIL_SLV_REG7_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x0000001C) |
---|
23 | #define SW_INTR_UTIL_SLV_REG8_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000020) |
---|
24 | #define SW_INTR_UTIL_SLV_REG9_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000024) |
---|
25 | #define SW_INTR_UTIL_SLV_REG10_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000028) |
---|
26 | #define SW_INTR_UTIL_SLV_REG11_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x0000002C) |
---|
27 | #define SW_INTR_UTIL_SLV_REG12_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000030) |
---|
28 | #define SW_INTR_UTIL_SLV_REG13_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000034) |
---|
29 | #define SW_INTR_UTIL_SLV_REG14_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x00000038) |
---|
30 | #define SW_INTR_UTIL_SLV_REG15_OFFSET (SW_INTR_UTIL_USER_SLV_SPACE_OFFSET + 0x0000003C) |
---|
31 | |
---|
32 | /* Address map: |
---|
33 | HDL is coded [MSB:LSB] = [31:0], per Xilinx's convention for AXI peripherals |
---|
34 | regX[31] maps to 0x80000000 in C driver |
---|
35 | regX[ 0] maps to 0x00000001 in C driver |
---|
36 | |
---|
37 | 0: RO/RW: Control/status register |
---|
38 | [ 0] = Enable (active high) for intrA output |
---|
39 | [ 1] = Enable (active high) for intrB output |
---|
40 | [ 28] = (RO) current intrA_out value |
---|
41 | [ 29] = (RO) current intrB_out value |
---|
42 | |
---|
43 | 1: RW: Software state register 0 |
---|
44 | 2: RW: Software state register 1 |
---|
45 | |
---|
46 | 3: RW: Bitmask for sw state reg 0 asserting intrA |
---|
47 | 4: RW: Bitmask for sw state reg 1 asserting intrA |
---|
48 | 5: RW: Bitmask for sw state reg 0 asserting intrB |
---|
49 | 6: RW: Bitmask for sw state reg 1 asserting intrB |
---|
50 | |
---|
51 | Two interrupt outputs - intrA and intrB. These should be connected |
---|
52 | to an interrupt controller in the hardware design. |
---|
53 | |
---|
54 | Either software state register can assert either interrupt output. |
---|
55 | |
---|
56 | intrA is asserted when en_intrA & (((sw_state0 & sw_mask0_A) || (sw_state1 & sw_mask1_A)) != 0) |
---|
57 | intrB is asserted when en_intrB & (((sw_state0 & sw_mask0_B) || (sw_state1 & sw_mask1_B)) != 0) |
---|
58 | |
---|
59 | */ |
---|
60 | |
---|
61 | #define SW_INTR_CTRL_REG_EN_A 0x00000001 |
---|
62 | #define SW_INTR_CTRL_REG_EN_B 0x00000002 |
---|
63 | |
---|
64 | #define SW_INTR_CTRL_REG_INTR_A 0x10000000 |
---|
65 | #define SW_INTR_CTRL_REG_INTR_B 0x20000000 |
---|
66 | |
---|
67 | #define sw_intr_set_enA(ba, e) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG0_OFFSET, (Xil_In32((ba) + SW_INTR_UTIL_SLV_REG0_OFFSET) & ~SW_INTR_CTRL_REG_EN_A) | ((e) ? SW_INTR_CTRL_REG_EN_A : 0)) |
---|
68 | #define sw_intr_set_enB(ba, e) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG0_OFFSET, (Xil_In32((ba) + SW_INTR_UTIL_SLV_REG0_OFFSET) & ~SW_INTR_CTRL_REG_EN_B) | ((e) ? SW_INTR_CTRL_REG_EN_B : 0)) |
---|
69 | |
---|
70 | #define sw_intr_get_enA(ba) ((Xil_In32((ba) + SW_INTR_UTIL_SLV_REG0_OFFSET) & SW_INTR_CTRL_REG_EN_A) ? 1 : 0) |
---|
71 | #define sw_intr_get_enB(ba) ((Xil_In32((ba) + SW_INTR_UTIL_SLV_REG0_OFFSET) & SW_INTR_CTRL_REG_EN_B) ? 1 : 0) |
---|
72 | |
---|
73 | #define sw_intr_set_state0(ba, s) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG1_OFFSET, (s)) |
---|
74 | #define sw_intr_set_state1(ba, s) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG2_OFFSET, (s)) |
---|
75 | |
---|
76 | #define sw_intr_get_state0(ba) Xil_In32((ba) + SW_INTR_UTIL_SLV_REG1_OFFSET) |
---|
77 | #define sw_intr_get_state1(ba) Xil_In32((ba) + SW_INTR_UTIL_SLV_REG2_OFFSET) |
---|
78 | |
---|
79 | #define sw_intr_set_mask_A0(ba, m) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG3_OFFSET, (m)) |
---|
80 | #define sw_intr_set_mask_A1(ba, m) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG4_OFFSET, (m)) |
---|
81 | #define sw_intr_set_mask_B0(ba, m) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG5_OFFSET, (m)) |
---|
82 | #define sw_intr_set_mask_B1(ba, m) Xil_Out32((ba) + SW_INTR_UTIL_SLV_REG6_OFFSET, (m)) |
---|
83 | |
---|
84 | #define sw_intr_get_mask_A0(ba) Xil_In32((ba) + SW_INTR_UTIL_SLV_REG3_OFFSET) |
---|
85 | #define sw_intr_get_mask_A1(ba) Xil_In32((ba) + SW_INTR_UTIL_SLV_REG4_OFFSET) |
---|
86 | #define sw_intr_get_mask_B0(ba) Xil_In32((ba) + SW_INTR_UTIL_SLV_REG5_OFFSET) |
---|
87 | #define sw_intr_get_mask_B1(ba) Xil_In32((ba) + SW_INTR_UTIL_SLV_REG6_OFFSET) |
---|
88 | |
---|
89 | void sw_intr_init(u32 baseaddr); |
---|
90 | |
---|
91 | |
---|
92 | #endif /** SW_INTR_UTIL_H */ |
---|