summaryrefslogtreecommitdiff
path: root/bsp/xuantie/libraries/xuantie_libraries/chip_riscv_dummy/src/drivers/pwm.c
blob: 9f073473c79b291068b0ce2cda99fbdab90ddafa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
/*
 *  Copyright (C) 2017-2024 Alibaba Group Holding Limited
 */

/*******************************************************
 * @file       pwm.c
 * @brief      source file for pwm csi driver
 * @version    V2.0
 * @date       23. Sep 2020
 * ******************************************************/

#include <drv/pwm.h>
#include <drv/irq.h>

/**
  \brief       PWM interrupt handling function
  \param[in]   arg    Callback function member variables
  \return      None
*/
void wj_pwm_irq_handler(void *arg)
{

    ///< TODO:判断中断是否发生
    ///< TODO:如果发生了则清除中断
    ///< TODO:如果发生处理中断

}

/**
  \brief       Initialize PWM Interface. 1. Initializes the resources needed for the PWM interface
  \param[in]   pwm    pwm handle to operate
  \param[in]   idx    pwm idx
  \return      error code
*/
csi_error_t csi_pwm_init(csi_pwm_t *pwm, uint32_t idx)
{
    CSI_PARAM_CHK(pwm, CSI_ERROR);
    csi_error_t ret = CSI_OK;

    ///< 初始化PWM控制器

    ///< 获取中断号、基地址等相关信息
    if (0 == target_get(DEV_WJ_PWM_TAG, idx, &pwm->dev)) {

        ///< TODO:把PWM相关寄存器复位清零

    } else {
        ret = CSI_ERROR;
    }

    return ret;
}

/**
  \brief       De-initialize PWM Interface. stops operation and releases the software resources used by the interface
  \param[in]   pwm    pwm handle to operate
  \return      None
*/
void csi_pwm_uninit(csi_pwm_t *pwm)
{
    CSI_PARAM_CHK_NORETVAL(pwm);

    ///< TODO:把PWM相关寄存器复位清零

}

/**
  \brief       Config pwm out mode
  \param[in]   pwm               pwm handle to operate
  \param[in]   channel           channel num
  \param[in]   period_us         the PWM period in us
  \param[in]   pulse_width_us    the PMW pulse width in us
  \param[in]   polarity          the PWM polarity \ref csi_pwm_polarity_t
  \return      error code
*/
csi_error_t csi_pwm_out_config(csi_pwm_t *pwm,
                               uint32_t  channel,
                               uint32_t period_us,
                               uint32_t pulse_width_us,
                               csi_pwm_polarity_t polarity)
{
    CSI_PARAM_CHK(pwm, CSI_ERROR);
    csi_error_t ret = CSI_OK;

    ///< TODO:检查参数channel的正确性

    ///< TODO:设置PWM通道的模式
    ///< TODO:根据period_us、pulse_width_us设置PWM的占空比

    return ret;
}

/**
  \brief       Start generate pwm signal
  \param[in]   pwm        pwm handle to operate
  \param[in]   channel    channel num
  \return      error code
*/
csi_error_t csi_pwm_out_start(csi_pwm_t *pwm, uint32_t channel)
{
    CSI_PARAM_CHK(pwm, CSI_ERROR);

    ///< TODO:打开输出使能

    return CSI_OK;
}

/**
  \brief       Stop generate pwm signal
  \param[in]   pwm        pwm handle to operate
  \param[in]   channel    channel num
  \return      None
*/
void csi_pwm_out_stop(csi_pwm_t *pwm, uint32_t channel)
{
    CSI_PARAM_CHK_NORETVAL(pwm);

    ///< TODO:关闭输出
}

/**
  \brief       Config pwm capture mode
  \param[in]   pwm         pwm handle to operate
  \param[in]   channel     channel num
  \param[in]   polarity    pwm capture polarity \ref csi_pwm_capture_polarity_t
  \param[in]   count       pwm capture polarity count
  \return      error code \ref csi_error_t
*/
csi_error_t csi_pwm_capture_config(csi_pwm_t *pwm,
                                   uint32_t channel,
                                   csi_pwm_capture_polarity_t polarity,
                                   uint32_t count)
{
    CSI_PARAM_CHK(pwm, CSI_ERROR);
    csi_error_t ret = CSI_OK;

    ///< TODO:检查参数channel的正确性

    if (CSI_OK == ret) {
        switch (polarity) {
            case PWM_CAPTURE_POLARITY_POSEDGE:
                ///< TODO:设置PWM捕获的极性为posedge edge
                break;

            case PWM_CAPTURE_POLARITY_NEGEDGE:
                ///< TODO:设置PWM捕获的极性为negedge edge
                break;

            case PWM_CAPTURE_POLARITY_BOTHEDGE:
                ///< TODO:设置PWM捕获的极性为both edge
                break;

            default:
                ret = CSI_ERROR;
                break;
        }

        ///< TODO:配置捕获次数

        ///< TODO:配置捕获模式

        ///< TODO:启用捕获中断
    }

    return ret;
}

/**
  \brief       Start pwm capture
  \param[in]   pwm        pwm handle to operate
  \param[in]   channel    channel num
  \return      error code \ref csi_error_t
*/
csi_error_t csi_pwm_capture_start(csi_pwm_t *pwm, uint32_t channel)
{
    CSI_PARAM_CHK(pwm, CSI_ERROR);

    ///< TODO:关闭输出使能

    ///< TODO:打开输入捕获使能

    ///< TODO:获取捕获次数

    return CSI_OK;
}

/**
  \brief       Stop pwm capture
  \param[in]   pwm        pwm handle to operate
  \param[in]   channel    channel num
  \return      None
*/
void csi_pwm_capture_stop(csi_pwm_t *pwm, uint32_t channel)
{
    CSI_PARAM_CHK_NORETVAL(pwm);

    ///< TODO:关闭PWM输入捕获
    ///< TODO:关闭PWM捕获中断
}
/**
  \brief       Attach pwm callback
  \param[in]   pwm         pwm handle to operate
  \param[in]   callback    callback func
  \param[in]   arg         user param passed to callback
  \return      error code \ref csi_error_t
*/
csi_error_t csi_pwm_attach_callback(csi_pwm_t *pwm, void *callback, void *arg)
{
    CSI_PARAM_CHK(pwm, CSI_ERROR);

    pwm->callback = callback;
    pwm->arg = arg;

    ///< 注册PWM的中断服务函数和使能中断控制器对应的中断
    csi_irq_attach((uint32_t)pwm->dev.irq_num, &wj_pwm_irq_handler, &pwm->dev);
    csi_irq_enable((uint32_t)pwm->dev.irq_num);

    return CSI_OK;
}

/**
  \brief       Detach pwm callback
  \param[in]   pwm    pwm handle to operate
  \return      None
*/
void csi_pwm_detach_callback(csi_pwm_t *pwm)
{
    CSI_PARAM_CHK_NORETVAL(pwm);

    pwm->callback = NULL;
    pwm->arg = NULL;

    ///< 禁止中断控制器对应的中断,注销PWM的中断服务函数
    csi_irq_disable((uint32_t)pwm->dev.irq_num);
    csi_irq_detach((uint32_t)pwm->dev.irq_num);
}

#ifdef CONFIG_PM
csi_error_t wj_pwm_pm_action(csi_dev_t *dev, csi_pm_dev_action_t action)
{
    CSI_PARAM_CHK(dev, CSI_ERROR);

    csi_error_t ret = CSI_OK;
    csi_pm_dev_t *pm_dev = &dev->pm_dev;

    switch (action) {
        case PM_DEV_SUSPEND:
            ///< TODO:恢复PWM寄存器
            break;

        case PM_DEV_RESUME:
            ///< TODO:保存PWM寄存器
            break;

        default:
            ret = CSI_ERROR;
            break;
    }

    return ret;
}

csi_error_t csi_pwm_enable_pm(csi_pwm_t *pwm)
{
    ///< TODO:注册PWM低功耗处理函数wj_pwm_pm_action
}

void csi_pwm_disable_pm(csi_pwm_t *pwm)
{
    csi_pm_dev_unregister(&pwm->dev);
}
#endif