1 /*
2  * Copyright (c) 2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include <assert.h>
9 #include "hpm_lobs_drv.h"
10 
lobs_deinit(LOBS_Type * lobs)11 void lobs_deinit(LOBS_Type *lobs)
12 {
13     lobs_set_state_enable(lobs, lobs_state_0, false);
14     lobs_set_state_enable(lobs, lobs_state_1, false);
15     lobs_set_state_enable(lobs, lobs_state_2, false);
16     lobs_set_state_enable(lobs, lobs_state_3, false);
17     lobs_set_state_enable(lobs, lobs_state_4, false);
18     lobs_set_pre_trig_enable(lobs, false);
19     lobs_set_enable(lobs, false);
20 }
21 
lobs_ctrl_config(LOBS_Type * lobs,lobs_ctrl_config_t * config)22 void lobs_ctrl_config(LOBS_Type *lobs, lobs_ctrl_config_t *config)
23 {
24     uint8_t burst_len;
25 
26     assert((config->start_addr & 0x03) == 0);
27     assert((config->end_addr & 0x03) == 0);
28 
29     if (config->sample_rate == lobs_sample_1_per_5) {
30         burst_len = lobs_burst_16;
31     } else if (config->sample_rate == lobs_sample_1_per_6) {
32         burst_len = lobs_burst_8;
33     } else {
34         burst_len = lobs_burst_4;
35     }
36     lobs->STREAMCTRL = LOBS_STREAMCTRL_SEL_SET(config->group_mode)
37                      | LOBS_STREAMCTRL_SAMPLE_SET(config->sample_rate)
38                      | LOBS_STREAMCTRL_BURST_SET(burst_len);
39     lobs->STARTADDR = config->start_addr;
40     lobs->ENDADDR = config->end_addr - 4u;
41 }
42 
lobs_two_group_mode_config(LOBS_Type * lobs,lobs_two_group_sel_t group,lobs_two_group_mode_config_t * config)43 void lobs_two_group_mode_config(LOBS_Type *lobs, lobs_two_group_sel_t group, lobs_two_group_mode_config_t *config)
44 {
45     assert(config->sig_group_num < 12);
46 
47     if (group == lobs_two_group_1) {
48         lobs->GRPSELA = (lobs->GRPSELA & ~LOBS_GRPSELA_NUM1_MASK) | LOBS_GRPSELA_NUM1_SET(config->sig_group_num);
49         lobs->SIGSELA1 = LOBS_SIGSELA1_NUM1_SET(config->sample_sig_bit[0]) | LOBS_SIGSELA1_NUM2_SET(config->sample_sig_bit[1])
50                        | LOBS_SIGSELA1_NUM3_SET(config->sample_sig_bit[2]) | LOBS_SIGSELA1_NUM4_SET(config->sample_sig_bit[3]);
51         lobs->SIGENA = (lobs->SIGENA & ~LOBS_SIGENA_EN1_MASK)
52                       | LOBS_SIGENA_EN1_SET((config->sample_sig_en[0]) | (config->sample_sig_en[1] << 1)
53                                           | (config->sample_sig_en[2] << 2) | (config->sample_sig_en[3] << 3));
54         lobs->GRPENA = (lobs->GRPENA & ~LOBS_GRPENA_EN1_MASK) | LOBS_GRPENA_EN1_SET(config->group_enable);
55     } else if (group == lobs_two_group_2) {
56         lobs->GRPSELA = (lobs->GRPSELA & ~LOBS_GRPSELA_NUM2_MASK) | LOBS_GRPSELA_NUM2_SET(config->sig_group_num);
57         lobs->SIGSELA2 = LOBS_SIGSELA2_NUM1_SET(config->sample_sig_bit[0]) | LOBS_SIGSELA2_NUM2_SET(config->sample_sig_bit[1])
58                        | LOBS_SIGSELA2_NUM3_SET(config->sample_sig_bit[2]) | LOBS_SIGSELA2_NUM4_SET(config->sample_sig_bit[3]);
59         lobs->SIGENA = (lobs->SIGENA & ~LOBS_SIGENA_EN2_MASK)
60                       | LOBS_SIGENA_EN2_SET((config->sample_sig_en[0]) | (config->sample_sig_en[1] << 1)
61                                           | (config->sample_sig_en[2] << 2) | (config->sample_sig_en[3] << 3));
62         lobs->GRPENA = (lobs->GRPENA & ~LOBS_GRPENA_EN2_MASK) | LOBS_GRPENA_EN2_SET(config->group_enable);
63     } else {
64         ;
65     }
66 }
67 
lobs_state_config(LOBS_Type * lobs,lobs_state_sel_t state,lobs_state_config_t * config)68 void lobs_state_config(LOBS_Type *lobs, lobs_state_sel_t state, lobs_state_config_t *config)
69 {
70     uint8_t cmp_reg_index;
71     uint8_t cmp_bit_index;
72     uint8_t sample_rate;
73 
74     assert(config->sig_group_num < 12);
75     assert((config->cmp_sig_en[0] && (config->cmp_sig_bit[0] < 128)) || (!config->cmp_sig_en[0]));
76     assert((config->cmp_sig_en[1] && (config->cmp_sig_bit[1] < 128)) || (!config->cmp_sig_en[1]));
77     assert((config->cmp_sig_en[2] && (config->cmp_sig_bit[2] < 128)) || (!config->cmp_sig_en[2]));
78     assert((config->cmp_sig_en[3] && (config->cmp_sig_bit[3] < 128)) || (!config->cmp_sig_en[3]));
79     assert(((config->cmp_mode == lobs_cnt_cmp_mode) && (config->state_chg_condition == lobs_cnt_matched)) || (config->cmp_mode != lobs_cnt_cmp_mode));
80 
81     lobs->STATE[state].SIGSEL = LOBS_STATE_SIGSEL_EN_SET(1u << (config->sig_group_num));
82     lobs->STATE[state].TRIGCTRL = LOBS_STATE_TRIGCTRL_TRACE_SET(2)
83                                 | LOBS_STATE_TRIGCTRL_COMPSEL_SET(config->cmp_mode)
84                                 | LOBS_STATE_TRIGCTRL_COMP_SET(config->state_chg_condition);
85     lobs->STATE[state].NEXTSTATE = LOBS_STATE_NEXTSTATE_NEXTSTATE_SET(config->next_state);
86 
87     sample_rate = LOBS_STREAMCTRL_SAMPLE_GET(lobs->STREAMCTRL);
88     if (sample_rate == lobs_sample_1_per_7) {
89         lobs->STATE[state].COUNTCOMP = LOBS_STATE_COUNTCOMP_VALUE_SET(config->cmp_counter * 7u);
90     } else if (sample_rate == lobs_sample_1_per_6) {
91         lobs->STATE[state].COUNTCOMP = LOBS_STATE_COUNTCOMP_VALUE_SET(config->cmp_counter * 6u);
92     } else if (sample_rate == lobs_sample_1_per_5) {
93         lobs->STATE[state].COUNTCOMP = LOBS_STATE_COUNTCOMP_VALUE_SET(config->cmp_counter * 5u);
94     } else {
95         assert(0);
96     }
97 
98     lobs->STATE[state].SIGMASK = LOBS_STATE_SIGMASK_NUM0_SET(config->cmp_sig_bit[0]) | LOBS_STATE_SIGMASK_NUM1_SET(config->cmp_sig_bit[1])
99                                | LOBS_STATE_SIGMASK_NUM2_SET(config->cmp_sig_bit[2]) | LOBS_STATE_SIGMASK_NUM3_SET(config->cmp_sig_bit[3]);
100     lobs->STATE[state].COMPEN = LOBS_STATE_COMPEN_EN_SET((config->cmp_sig_en[0]) | (config->cmp_sig_en[1] << 1)
101                                                        | (config->cmp_sig_en[2] << 2) | (config->cmp_sig_en[3] << 3));
102     lobs->STATE[state].EXTMASK = 0;
103     lobs->STATE[state].EXTCOMP = 0;
104 
105     for (uint8_t i = 0; i < 4; i++) {
106         if (config->cmp_sig_en[i]) {
107             cmp_reg_index = config->cmp_sig_bit[i] / 32;
108             cmp_bit_index = config->cmp_sig_bit[i] % 32;
109             if (cmp_reg_index == 0) {
110                 lobs->STATE[state].SIGCOMP0 = (lobs->STATE[state].SIGCOMP0 & ~(1u << cmp_bit_index)) | (config->cmp_golden_value[i] << cmp_bit_index);
111             } else if (cmp_reg_index == 1) {
112                 lobs->STATE[state].SIGCOMP1 = (lobs->STATE[state].SIGCOMP1 & ~(1u << cmp_bit_index)) | (config->cmp_golden_value[i] << cmp_bit_index);
113             } else if (cmp_reg_index == 2) {
114                 lobs->STATE[state].SIGCOMP2 = (lobs->STATE[state].SIGCOMP2 & ~(1u << cmp_bit_index)) | (config->cmp_golden_value[i] << cmp_bit_index);
115             } else if (cmp_reg_index == 3) {
116                 lobs->STATE[state].SIGCOMP3 = (lobs->STATE[state].SIGCOMP3 & ~(1u << cmp_bit_index)) | (config->cmp_golden_value[i] << cmp_bit_index);
117             } else {
118                 ;
119             }
120         }
121     }
122 }
123