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