1 /*
2  * Copyright (c) 2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "hpm_vsc_drv.h"
9 
vsc_get_default_config(VSC_Type * vsc,vsc_config_t * config)10 void vsc_get_default_config(VSC_Type *vsc, vsc_config_t *config)
11 {
12     (void)vsc;
13 
14     config->phase_mode = vsc_abc_phase;
15     config->a_adc_config.adc_sel = vsc_sel_adc0;
16     config->b_adc_config.adc_sel = vsc_sel_adc1;
17     config->c_adc_config.adc_sel = vsc_sel_adc2;
18     config->a_adc_config.adc_chn = 0;
19     config->b_adc_config.adc_chn = 0;
20     config->c_adc_config.adc_chn = 0;
21     config->a_adc_config.adc_offset = 0x80000000;
22     config->b_adc_config.adc_offset = 0x80000000;
23     config->c_adc_config.adc_offset = 0x80000000;
24 
25     config->a_data_cnt = 1;
26     config->a_data_opr_config.opr_0 = vsc_data_opr_plus_mul_1;
27     config->a_data_opr_config.opr_1 = vsc_data_opr_plus_mul_1;
28     config->a_data_opr_config.opr_2 = vsc_data_opr_plus_mul_1;
29     config->a_data_opr_config.opr_3 = vsc_data_opr_plus_mul_1;
30     config->b_data_cnt = 1;
31     config->b_data_opr_config.opr_0 = vsc_data_opr_plus_mul_1;
32     config->b_data_opr_config.opr_1 = vsc_data_opr_plus_mul_1;
33     config->b_data_opr_config.opr_2 = vsc_data_opr_plus_mul_1;
34     config->b_data_opr_config.opr_3 = vsc_data_opr_plus_mul_1;
35     config->c_data_cnt = 1;
36     config->c_data_opr_config.opr_0 = vsc_data_opr_plus_mul_1;
37     config->c_data_opr_config.opr_1 = vsc_data_opr_plus_mul_1;
38     config->c_data_opr_config.opr_2 = vsc_data_opr_plus_mul_1;
39     config->c_data_opr_config.opr_3 = vsc_data_opr_plus_mul_1;
40 
41     config->pos_cap_mode = vsc_pos_use_last_data_when_adc_sample_finish;
42     config->pole_pairs = 1;
43 }
44 
vsc_config_init(VSC_Type * vsc,vsc_config_t * config)45 void vsc_config_init(VSC_Type *vsc, vsc_config_t *config)
46 {
47     vsc->ABC_MODE = VSC_ABC_MODE_PHASE_ABSENT_MODE_SET(config->phase_mode)
48                   | VSC_ABC_MODE_VALUE_C_WIDTH_SET(config->c_data_cnt)
49                   | VSC_ABC_MODE_VALUE_B_WIDTH_SET(config->b_data_cnt)
50                   | VSC_ABC_MODE_VALUE_A_WIDTH_SET(config->a_data_cnt)
51                   | VSC_ABC_MODE_VALUE_C_LOC_SET(config->c_adc_config.adc_sel)
52                   | VSC_ABC_MODE_VALUE_B_LOC_SET(config->b_adc_config.adc_sel)
53                   | VSC_ABC_MODE_VALUE_A_LOC_SET(config->a_adc_config.adc_sel);
54 
55     vsc->ADC_CHAN_ASSIGN = VSC_ADC_CHAN_ASSIGN_VALUE_C_CHAN_SET(config->c_adc_config.adc_chn)
56                          | VSC_ADC_CHAN_ASSIGN_VALUE_B_CHAN_SET(config->b_adc_config.adc_chn)
57                          | VSC_ADC_CHAN_ASSIGN_VALUE_A_CHAN_SET(config->a_adc_config.adc_chn);
58 
59     vsc->VALUE_A_DATA_OPT = VSC_VALUE_A_DATA_OPT_OPT_3_SET(config->a_data_opr_config.opr_3)
60                           | VSC_VALUE_A_DATA_OPT_OPT_2_SET(config->a_data_opr_config.opr_2)
61                           | VSC_VALUE_A_DATA_OPT_OPT_1_SET(config->a_data_opr_config.opr_1)
62                           | VSC_VALUE_A_DATA_OPT_OPT_0_SET(config->a_data_opr_config.opr_0);
63 
64     vsc->VALUE_B_DATA_OPT = VSC_VALUE_B_DATA_OPT_OPT_3_SET(config->b_data_opr_config.opr_3)
65                           | VSC_VALUE_B_DATA_OPT_OPT_2_SET(config->b_data_opr_config.opr_2)
66                           | VSC_VALUE_B_DATA_OPT_OPT_1_SET(config->b_data_opr_config.opr_1)
67                           | VSC_VALUE_B_DATA_OPT_OPT_0_SET(config->b_data_opr_config.opr_0);
68 
69     vsc->VALUE_C_DATA_OPT = VSC_VALUE_C_DATA_OPT_OPT_3_SET(config->c_data_opr_config.opr_3)
70                           | VSC_VALUE_C_DATA_OPT_OPT_2_SET(config->c_data_opr_config.opr_2)
71                           | VSC_VALUE_C_DATA_OPT_OPT_1_SET(config->c_data_opr_config.opr_1)
72                           | VSC_VALUE_C_DATA_OPT_OPT_0_SET(config->c_data_opr_config.opr_0);
73 
74     vsc->VALUE_A_OFFSET = VSC_VALUE_A_OFFSET_VALUE_A_OFFSET_SET(config->a_adc_config.adc_offset);
75     vsc->VALUE_B_OFFSET = VSC_VALUE_B_OFFSET_VALUE_B_OFFSET_SET(config->b_adc_config.adc_offset);
76     vsc->VALUE_C_OFFSET = VSC_VALUE_C_OFFSET_VALUE_C_OFFSET_SET(config->c_adc_config.adc_offset);
77 
78     vsc_config_pos_capture_mode(vsc, config->pos_cap_mode);
79     vsc_set_pos_pole_pairs(vsc, config->pole_pairs);
80 }
81 
vsc_sw_inject_abc_value(VSC_Type * vsc,int32_t value_a,int32_t value_b,int32_t value_c)82 void vsc_sw_inject_abc_value(VSC_Type *vsc, int32_t value_a, int32_t value_b, int32_t value_c)
83 {
84     vsc->TRIGGER_SW = VSC_TRIGGER_SW_TRIGGER_SW_MASK;
85     vsc->VALUE_A_SW = VSC_VALUE_A_SW_VALUE_A_SW_SET((uint32_t)value_a);
86     vsc->VALUE_B_SW = VSC_VALUE_B_SW_VALUE_B_SW_SET((uint32_t)value_b);
87     vsc->VALUE_C_SW = VSC_VALUE_C_SW_VALUE_C_SW_SET((uint32_t)value_c);
88     vsc->VALUE_SW_READY = VSC_VALUE_SW_READY_VALUE_SW_READY_MASK;
89 }
90 
vsc_sw_inject_pos_value(VSC_Type * vsc,uint32_t pos)91 void vsc_sw_inject_pos_value(VSC_Type *vsc, uint32_t pos)
92 {
93     vsc->POSITION_SW = VSC_POSITION_SW_POSITION_SW_SET(pos);
94 }
95