1 /*
2 * Copyright (c) 2024 HPMicro
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8 #ifndef HPM_LOBS_DRV_H
9 #define HPM_LOBS_DRV_H
10
11 #include "hpm_common.h"
12 #include "hpm_soc_ip_feature.h"
13 #include "hpm_lobs_regs.h"
14
15 /**
16 * @brief LOBS driver APIs
17 * @defgroup lobs_interface LOBS driver APIs
18 * @ingroup lobs_interfaces
19 * @{
20 */
21
22 #define LOBS_UNLOCK_KEY 0xc5acce55u
23
24 #define LOBS_PIN_DO(x) (x * 3)
25 #define LOBS_PIN_OE(x) (x * 3 + 1)
26 #define LOBS_PIN_DI(x) (x * 3 + 2)
27
28 /**
29 * @brief group mode selection
30 *
31 */
32 typedef enum {
33 lobs_one_group_128_bits = 0,
34 lobs_two_group_8_bits
35 } lobs_group_mode_t; /**< lobs_group_mode_t */
36
37 /**
38 * @brief sample rate selection
39 *
40 */
41 typedef enum {
42 lobs_sample_1_per_5 = 4,
43 lobs_sample_1_per_6 = 5,
44 lobs_sample_1_per_7 = 6,
45 } lobs_sample_rate_t; /**< lobs_sample_rate_t */
46
47 /**
48 * @brief burst selection
49 *
50 */
51 typedef enum {
52 lobs_burst_4 = 3,
53 lobs_burst_8 = 5,
54 lobs_burst_16 = 7,
55 } lobs_burst_t; /**< lobs_burst_t */
56
57 /**
58 * @brief two group selection
59 *
60 */
61 typedef enum {
62 lobs_two_group_1 = 0,
63 lobs_two_group_2,
64 } lobs_two_group_sel_t; /**< lobs_two_group_sel_t */
65
66 /**
67 * @brief state selection
68 *
69 */
70 typedef enum {
71 lobs_state_0 = 0,
72 lobs_state_1,
73 lobs_state_2,
74 lobs_state_3,
75 lobs_state_4,
76 } lobs_state_sel_t; /**< lobs_state_sel_t */
77
78 /**
79 * @brief compare mode
80 *
81 */
82 typedef enum {
83 lobs_sig_cmp_mode = 0,
84 lobs_cnt_cmp_mode,
85 } lobs_cmp_mode_t; /**< lobs_cmp_mode_t */
86
87 /**
88 * @brief compare condition
89 *
90 */
91 typedef enum {
92 lobs_cnt_matched = 0,
93 lobs_sig_equal_golden,
94 lobs_sig_greater_golden,
95 lobs_sig_greater_equal_golden,
96 lobs_sig_not_equal_golden,
97 lobs_sig_less_golden,
98 lobs_sig_less_equal_golden,
99 } lobs_state_chg_condition_t; /**< lobs_state_chg_condition_t */
100
101 /**
102 * @brief next state
103 *
104 */
105 typedef enum {
106 lobs_next_state_finish = 0x00,
107 lobs_next_state_0 = 0x01,
108 lobs_next_state_1 = 0x02,
109 lobs_next_state_2 = 0x04,
110 lobs_next_state_3 = 0x08,
111 lobs_next_state_4 = 0x10,
112 } lobs_next_state_t; /**< lobs_next_state_t */
113
114 /**
115 * @brief ctrl config structure
116 *
117 */
118 typedef struct {
119 lobs_group_mode_t group_mode;
120 lobs_sample_rate_t sample_rate;
121 uint32_t start_addr;
122 uint32_t end_addr;
123 } lobs_ctrl_config_t; /**< lobs_ctrl_config_t */
124
125 /**
126 * @brief two group mode config structure
127 *
128 */
129 typedef struct {
130 bool group_enable;
131 uint8_t sig_group_num;
132 uint8_t sample_sig_bit[4];
133 bool sample_sig_en[4];
134 } lobs_two_group_mode_config_t; /**< lobs_two_group_mode_config_t */
135
136 /**
137 * @brief two group mode config structure
138 *
139 */
140 typedef struct {
141 uint8_t sig_group_num;
142 lobs_cmp_mode_t cmp_mode;
143 lobs_state_chg_condition_t state_chg_condition;
144 lobs_next_state_t next_state;
145 uint32_t cmp_counter;
146 uint8_t cmp_sig_bit[4];
147 bool cmp_sig_en[4];
148 bool cmp_golden_value[4];
149 } lobs_state_config_t; /**< lobs_state_config_t */
150
151 #ifdef __cplusplus
152 extern "C" {
153 #endif
154
155 /**
156 * @brief set lobs unlock
157 *
158 * @param[in] lobs LOBS base address
159 */
lobs_unlock(LOBS_Type * lobs)160 static inline void lobs_unlock(LOBS_Type *lobs)
161 {
162 lobs->LAR = LOBS_UNLOCK_KEY;
163 }
164
165 /**
166 * @brief set lobs lock
167 *
168 * @param[in] lobs LOBS base address
169 */
lobs_lock(LOBS_Type * lobs)170 static inline void lobs_lock(LOBS_Type *lobs)
171 {
172 lobs->LAR = 0;
173 }
174
175 /**
176 * @brief set lobs enable or disable
177 *
178 * @param[in] lobs LOBS base address
179 * @param[in] enable true - enable; false - disable.
180 */
lobs_set_enable(LOBS_Type * lobs,bool enable)181 static inline void lobs_set_enable(LOBS_Type *lobs, bool enable)
182 {
183 lobs->CTRL = (lobs->CTRL & ~LOBS_CTRL_RUN_MASK) | LOBS_CTRL_RUN_SET(enable);
184 }
185
186 /**
187 * @brief set lobs pre-trig enable or disable
188 *
189 * @param[in] lobs LOBS base address
190 * @param[in] enable true - enable; false - disable.
191 */
lobs_set_pre_trig_enable(LOBS_Type * lobs,bool enable)192 static inline void lobs_set_pre_trig_enable(LOBS_Type *lobs, bool enable)
193 {
194 lobs->PTACTION = (lobs->PTACTION & ~LOBS_PTACTION_TRACE_MASK) | LOBS_PTACTION_TRACE_SET(enable);
195 }
196
197 /**
198 * @brief set lobs state enable or disable
199 *
200 * @param[in] lobs LOBS base address
201 * @param[in] state one of state, @ref lobs_state_sel_t
202 * @param[in] enable true - enable; false - disable.
203 */
lobs_set_state_enable(LOBS_Type * lobs,lobs_state_sel_t state,bool enable)204 static inline void lobs_set_state_enable(LOBS_Type *lobs, lobs_state_sel_t state, bool enable)
205 {
206 lobs->STATE[state].ACTION = (lobs->STATE[state].ACTION & ~LOBS_STATE_ACTION_TRACE_MASK) | LOBS_STATE_ACTION_TRACE_SET(enable);
207 }
208
209 /**
210 * @brief get lobs final address
211 *
212 * @param[in] lobs LOBS base address
213 *
214 * @return uint32_t trace final address
215 */
lobs_get_final_address(LOBS_Type * lobs)216 static inline uint32_t lobs_get_final_address(LOBS_Type *lobs)
217 {
218 return lobs->FINALADDR;
219 }
220
221 /**
222 * @brief check lobs trace finish
223 *
224 * @param[in] lobs LOBS base address
225 *
226 * @return bool true - trace finish; false - trace not finish
227 */
lobs_is_trace_finish(LOBS_Type * lobs)228 static inline bool lobs_is_trace_finish(LOBS_Type *lobs)
229 {
230 return (LOBS_CTSR_FINALSTATE_GET(lobs->CTSR) != 0) ? true : false;
231 }
232
233 /**
234 * @brief clear lobs fifo overflow flag
235 *
236 * @param[in] lobs LOBS base address
237 *
238 */
lobs_clear_fifo_overflow_flag(LOBS_Type * lobs)239 static inline void lobs_clear_fifo_overflow_flag(LOBS_Type *lobs)
240 {
241 lobs->STREAMCTRL |= LOBS_STREAMCTRL_FULL_CLEAR_MASK;
242 }
243
244 /**
245 * @brief lobs deinit
246 *
247 * @param[in] lobs LOBS base address
248 */
249 void lobs_deinit(LOBS_Type *lobs);
250
251 /**
252 * @brief lobs control config
253 *
254 * @param[in] lobs LOBS base address
255 * @param[in] config control config structure pointer
256 */
257 void lobs_ctrl_config(LOBS_Type *lobs, lobs_ctrl_config_t *config);
258
259 /**
260 * @brief lobs two group mode config
261 *
262 * @param[in] lobs LOBS base address
263 * @param[in] group one of the two group, @ref lobs_two_group_sel_t
264 * @param[in] config two group mode config structure pointer
265 */
266 void lobs_two_group_mode_config(LOBS_Type *lobs, lobs_two_group_sel_t group, lobs_two_group_mode_config_t *config);
267
268 /**
269 * @brief lobs state config
270 *
271 * @param[in] lobs LOBS base address
272 * @param[in] state one of state, @ref lobs_state_sel_t
273 * @param[in] config state config structure pointer
274 */
275 void lobs_state_config(LOBS_Type *lobs, lobs_state_sel_t state, lobs_state_config_t *config);
276
277 #ifdef __cplusplus
278 }
279 #endif
280 /**
281 * @}
282 */
283 #endif /* HPM_LOBS_DRV_H */
284