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