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