1 /*
2  * Copyright (c) 2021-2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 
9 #ifndef HPM_PLB_H
10 #define HPM_PLB_H
11 
12 typedef struct {
13     struct {
14         __RW uint32_t LOOKUP_TABLE[4];         /* 0x0 - 0xC: TYPE A CHN lookup_table 0 */
15         __RW uint32_t SW_INJECT;               /* 0x10: TYPE A CHN software inject */
16         __R  uint8_t  RESERVED0[12];           /* 0x14 - 0x1F: Reserved */
17     } TYPE_A[8];
18     __R  uint8_t  RESERVED0[768];              /* 0x100 - 0x3FF: Reserved */
19     struct {
20         __RW uint32_t LUT[2];                  /* 0x400 - 0x404: TYPE B CHN lookup table 0 */
21         __RW uint32_t CMP[4];                  /* 0x408 - 0x414: TYPE B CHN data unit cmp0 */
22         __RW uint32_t MODE;                    /* 0x418: TYPE B CHN mode ctrl */
23         __RW uint32_t SW_INJECT;               /* 0x41C: TYPE B CHN software inject */
24     } TYPE_B[8];
25 } PLB_Type;
26 
27 
28 /* Bitfield definition for register of struct array TYPE_A: 0 */
29 /*
30  * LOOKUP_TABLE (RW)
31  *
32  * using 4 bit trig_in as lookup index. software can program this register as trig_in's true table.
33  */
34 #define PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_MASK (0xFFFFU)
35 #define PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_SHIFT (0U)
36 #define PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_SET(x) (((uint32_t)(x) << PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_SHIFT) & PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_MASK)
37 #define PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_GET(x) (((uint32_t)(x) & PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_MASK) >> PLB_TYPE_A_LOOKUP_TABLE_LOOKUP_TABLE_SHIFT)
38 
39 /* Bitfield definition for register of struct array TYPE_A: SW_INJECT */
40 /*
41  * SW_INJECT (RW)
42  *
43  * software can inject value to TYPEA's output
44  */
45 #define PLB_TYPE_A_SW_INJECT_SW_INJECT_MASK (0xFU)
46 #define PLB_TYPE_A_SW_INJECT_SW_INJECT_SHIFT (0U)
47 #define PLB_TYPE_A_SW_INJECT_SW_INJECT_SET(x) (((uint32_t)(x) << PLB_TYPE_A_SW_INJECT_SW_INJECT_SHIFT) & PLB_TYPE_A_SW_INJECT_SW_INJECT_MASK)
48 #define PLB_TYPE_A_SW_INJECT_SW_INJECT_GET(x) (((uint32_t)(x) & PLB_TYPE_A_SW_INJECT_SW_INJECT_MASK) >> PLB_TYPE_A_SW_INJECT_SW_INJECT_SHIFT)
49 
50 /* Bitfield definition for register of struct array TYPE_B: 0 */
51 /*
52  * LOOKUP_TABLE (RW)
53  *
54  * lut0 and lut1 union as 64bit, consider each 4bit as one slice. then, total 16 slice. slice0 as bit3:0, slice1 as bit7:4...etc. using 4bit trig in as index of slice. the operate sel in data unit of type B channle is decided by which slice value choosed by trig_in
55  */
56 #define PLB_TYPE_B_LUT_LOOKUP_TABLE_MASK (0xFFFFFFFFUL)
57 #define PLB_TYPE_B_LUT_LOOKUP_TABLE_SHIFT (0U)
58 #define PLB_TYPE_B_LUT_LOOKUP_TABLE_SET(x) (((uint32_t)(x) << PLB_TYPE_B_LUT_LOOKUP_TABLE_SHIFT) & PLB_TYPE_B_LUT_LOOKUP_TABLE_MASK)
59 #define PLB_TYPE_B_LUT_LOOKUP_TABLE_GET(x) (((uint32_t)(x) & PLB_TYPE_B_LUT_LOOKUP_TABLE_MASK) >> PLB_TYPE_B_LUT_LOOKUP_TABLE_SHIFT)
60 
61 /* Bitfield definition for register of struct array TYPE_B: 0 */
62 /*
63  * CMP_VALUE (RW)
64  *
65  * cmp value, using as data unit operation
66  */
67 #define PLB_TYPE_B_CMP_CMP_VALUE_MASK (0xFFFFFFFFUL)
68 #define PLB_TYPE_B_CMP_CMP_VALUE_SHIFT (0U)
69 #define PLB_TYPE_B_CMP_CMP_VALUE_SET(x) (((uint32_t)(x) << PLB_TYPE_B_CMP_CMP_VALUE_SHIFT) & PLB_TYPE_B_CMP_CMP_VALUE_MASK)
70 #define PLB_TYPE_B_CMP_CMP_VALUE_GET(x) (((uint32_t)(x) & PLB_TYPE_B_CMP_CMP_VALUE_MASK) >> PLB_TYPE_B_CMP_CMP_VALUE_SHIFT)
71 
72 /* Bitfield definition for register of struct array TYPE_B: MODE */
73 /*
74  * OPT_SEL (RW)
75  *
76  * operation selection in data unit.
77  */
78 #define PLB_TYPE_B_MODE_OPT_SEL_MASK (0x10000UL)
79 #define PLB_TYPE_B_MODE_OPT_SEL_SHIFT (16U)
80 #define PLB_TYPE_B_MODE_OPT_SEL_SET(x) (((uint32_t)(x) << PLB_TYPE_B_MODE_OPT_SEL_SHIFT) & PLB_TYPE_B_MODE_OPT_SEL_MASK)
81 #define PLB_TYPE_B_MODE_OPT_SEL_GET(x) (((uint32_t)(x) & PLB_TYPE_B_MODE_OPT_SEL_MASK) >> PLB_TYPE_B_MODE_OPT_SEL_SHIFT)
82 
83 /*
84  * OUT3_SEL (RW)
85  *
86  * trig out 3 output type in current channel
87  */
88 #define PLB_TYPE_B_MODE_OUT3_SEL_MASK (0xF000U)
89 #define PLB_TYPE_B_MODE_OUT3_SEL_SHIFT (12U)
90 #define PLB_TYPE_B_MODE_OUT3_SEL_SET(x) (((uint32_t)(x) << PLB_TYPE_B_MODE_OUT3_SEL_SHIFT) & PLB_TYPE_B_MODE_OUT3_SEL_MASK)
91 #define PLB_TYPE_B_MODE_OUT3_SEL_GET(x) (((uint32_t)(x) & PLB_TYPE_B_MODE_OUT3_SEL_MASK) >> PLB_TYPE_B_MODE_OUT3_SEL_SHIFT)
92 
93 /*
94  * OUT2_SEL (RW)
95  *
96  * trig out 2 output type in current channel
97  */
98 #define PLB_TYPE_B_MODE_OUT2_SEL_MASK (0xF00U)
99 #define PLB_TYPE_B_MODE_OUT2_SEL_SHIFT (8U)
100 #define PLB_TYPE_B_MODE_OUT2_SEL_SET(x) (((uint32_t)(x) << PLB_TYPE_B_MODE_OUT2_SEL_SHIFT) & PLB_TYPE_B_MODE_OUT2_SEL_MASK)
101 #define PLB_TYPE_B_MODE_OUT2_SEL_GET(x) (((uint32_t)(x) & PLB_TYPE_B_MODE_OUT2_SEL_MASK) >> PLB_TYPE_B_MODE_OUT2_SEL_SHIFT)
102 
103 /*
104  * OUT1_SEL (RW)
105  *
106  * trig out 1 output type in current channel
107  */
108 #define PLB_TYPE_B_MODE_OUT1_SEL_MASK (0xF0U)
109 #define PLB_TYPE_B_MODE_OUT1_SEL_SHIFT (4U)
110 #define PLB_TYPE_B_MODE_OUT1_SEL_SET(x) (((uint32_t)(x) << PLB_TYPE_B_MODE_OUT1_SEL_SHIFT) & PLB_TYPE_B_MODE_OUT1_SEL_MASK)
111 #define PLB_TYPE_B_MODE_OUT1_SEL_GET(x) (((uint32_t)(x) & PLB_TYPE_B_MODE_OUT1_SEL_MASK) >> PLB_TYPE_B_MODE_OUT1_SEL_SHIFT)
112 
113 /*
114  * OUT0_SEL (RW)
115  *
116  * trig out 0 output type in current channel
117  */
118 #define PLB_TYPE_B_MODE_OUT0_SEL_MASK (0xFU)
119 #define PLB_TYPE_B_MODE_OUT0_SEL_SHIFT (0U)
120 #define PLB_TYPE_B_MODE_OUT0_SEL_SET(x) (((uint32_t)(x) << PLB_TYPE_B_MODE_OUT0_SEL_SHIFT) & PLB_TYPE_B_MODE_OUT0_SEL_MASK)
121 #define PLB_TYPE_B_MODE_OUT0_SEL_GET(x) (((uint32_t)(x) & PLB_TYPE_B_MODE_OUT0_SEL_MASK) >> PLB_TYPE_B_MODE_OUT0_SEL_SHIFT)
122 
123 /* Bitfield definition for register of struct array TYPE_B: SW_INJECT */
124 /*
125  * SOFTWARE_INJECT (RW)
126  *
127  * data unit value can be changed if program this register
128  */
129 #define PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_MASK (0xFFFFFFFFUL)
130 #define PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_SHIFT (0U)
131 #define PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_SET(x) (((uint32_t)(x) << PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_SHIFT) & PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_MASK)
132 #define PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_GET(x) (((uint32_t)(x) & PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_MASK) >> PLB_TYPE_B_SW_INJECT_SOFTWARE_INJECT_SHIFT)
133 
134 
135 
136 /* LOOKUP_TABLE register group index macro definition */
137 #define PLB_TYPE_A_LOOKUP_TABLE_0 (0UL)
138 #define PLB_TYPE_A_LOOKUP_TABLE_1 (1UL)
139 #define PLB_TYPE_A_LOOKUP_TABLE_2 (2UL)
140 #define PLB_TYPE_A_LOOKUP_TABLE_3 (3UL)
141 
142 /* TYPE_A register group index macro definition */
143 #define PLB_TYPE_A_0 (0UL)
144 #define PLB_TYPE_A_1 (1UL)
145 #define PLB_TYPE_A_2 (2UL)
146 #define PLB_TYPE_A_3 (3UL)
147 #define PLB_TYPE_A_4 (4UL)
148 #define PLB_TYPE_A_5 (5UL)
149 #define PLB_TYPE_A_6 (6UL)
150 #define PLB_TYPE_A_7 (7UL)
151 
152 /* LUT register group index macro definition */
153 #define PLB_TYPE_B_LUT_0 (0UL)
154 #define PLB_TYPE_B_LUT_1 (1UL)
155 
156 /* CMP register group index macro definition */
157 #define PLB_TYPE_B_CMP_0 (0UL)
158 #define PLB_TYPE_B_CMP_1 (1UL)
159 #define PLB_TYPE_B_CMP_2 (2UL)
160 #define PLB_TYPE_B_CMP_3 (3UL)
161 
162 /* TYPE_B register group index macro definition */
163 #define PLB_TYPE_B_0 (0UL)
164 #define PLB_TYPE_B_1 (1UL)
165 #define PLB_TYPE_B_2 (2UL)
166 #define PLB_TYPE_B_3 (3UL)
167 #define PLB_TYPE_B_4 (4UL)
168 #define PLB_TYPE_B_5 (5UL)
169 #define PLB_TYPE_B_6 (6UL)
170 #define PLB_TYPE_B_7 (7UL)
171 
172 
173 #endif /* HPM_PLB_H */
174