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
|
#ifndef __CVI_PWM_H__
#define __CVI_PWM_H__
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
#define __IM volatile const /*! Defines 'read only' structure member permissions */
#define __OM volatile /*! Defines 'write only' structure member permissions */
#define __IOM volatile /*! Defines 'read / write' structure member permissions */
#define CVI_PWM0_BASE 0x03060000
#define CVI_PWM1_BASE 0x03061000
#define CVI_PWM2_BASE 0x03062000
#define CVI_PWM3_BASE 0x03063000
typedef enum {
PWM_CHANNEL_0 = 0U,
PWM_CHANNEL_1,
PWM_CHANNEL_2,
PWM_CHANNEL_3,
PWM_CHANNEL_4,
PWM_CHANNEL_5,
PWM_CHANNEL_6,
PWM_CHANNEL_7,
PWM_CHANNEL_8,
PWM_CHANNEL_9,
PWM_CHANNEL_10,
PWM_CHANNEL_11,
PWM_CHANNEL_12,
PWM_CHANNEL_13,
PWM_CHANNEL_14,
PWM_CHANNEL_15,
PWM_CHANNEL_NUM
} cvi_pwm_channel_t;
struct cvi_pwm_regs_t {
uint32_t HLPERIOD0;
uint32_t PERIOD0;
uint32_t HLPERIOD1;
uint32_t PERIOD1;
uint32_t HLPERIOD2;
uint32_t PERIOD2;
uint32_t HLPERIOD3;
uint32_t PERIOD3;
uint32_t CAP_FREQNUM;
uint32_t CAP_FREQDATA;
uint32_t POLARITY;
uint32_t PWMSTART;
uint32_t PWMDONE;
uint32_t PWMUPDATE;
uint32_t PCOUNT0;
uint32_t PCOUNT1;
uint32_t PCOUNT2;
uint32_t PCOUNT3;
uint32_t PULSECOUNT0;
uint32_t PULSECOUNT1;
uint32_t PULSECOUNT2;
uint32_t PULSECOUNT3;
uint32_t SHIFTCOUNT0;
uint32_t SHIFTCOUNT1;
uint32_t SHIFTCOUNT2;
uint32_t SHIFTCOUNT3;
uint32_t SHIFTSTART;
uint32_t CAP_FREQEN;
uint32_t CAP_FREQDONE_NUM;
uint32_t PWM_OE;
};
static struct cvi_pwm_regs_t cv182x_pwm_reg = {
.HLPERIOD0 = 0x0,
.PERIOD0 = 0x4,
.HLPERIOD1 = 0x8,
.PERIOD1 = 0xc,
.HLPERIOD2 = 0x10,
.PERIOD2 = 0x14,
.HLPERIOD3 = 0x18,
.PERIOD3 = 0x1c,
.CAP_FREQNUM = 0x20,
.CAP_FREQDATA = 0x24,
.POLARITY = 0x40,
.PWMSTART = 0x44,
.PWMDONE = 0x48,
.PWMUPDATE = 0x4c,
.PCOUNT0 = 0x50,
.PCOUNT1 = 0x54,
.PCOUNT2 = 0x58,
.PCOUNT3 = 0x5c,
.PULSECOUNT0 = 0x60,
.PULSECOUNT1 = 0x64,
.PULSECOUNT2 = 0x68,
.PULSECOUNT3 = 0x6c,
.SHIFTCOUNT0 = 0x80,
.SHIFTCOUNT1 = 0x84,
.SHIFTCOUNT2 = 0x88,
.SHIFTCOUNT3 = 0x8c,
.SHIFTSTART = 0x90,
.CAP_FREQEN = 0x9c,
.CAP_FREQDONE_NUM = 0xC0,
.PWM_OE = 0xd0,
};
static struct cvi_pwm_regs_t *cvi_pwm_reg = &cv182x_pwm_reg;
#define PWM_HLPERIOD0(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->HLPERIOD0))
#define PWM_PERIOD0(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PERIOD0))
#define PWM_HLPERIOD1(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->HLPERIOD1))
#define PWM_PERIOD1(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PERIOD1))
#define PWM_HLPERIOD2(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->HLPERIOD2))
#define PWM_PERIOD2(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PERIOD2))
#define PWM_HLPERIOD3(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->HLPERIOD3))
#define PWM_PERIOD3(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PERIOD3))
#define PWM_HLPERIODX(reg_base, _ch_) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->HLPERIOD0 + (_ch_ << 3)))
#define PWM_PERIODX(reg_base, _ch_) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PERIOD0 * (1 + (_ch_ << 1))))
#define CAP_FREQNUM(reg_base, _ch_) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->CAP_FREQNUM + _ch_ * 8))
#define CAP_FREQDATA(reg_base, _ch_) *((__IM uint32_t *)(reg_base + cvi_pwm_reg->CAP_FREQDATA + _ch_ * 8))
#define PWM_POLARITY(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->POLARITY))
#define PWM_PWMSTART(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PWMSTART))
#define PWM_PWMDONE(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PWMDONE))
#define PWM_PWMUPDATE(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PWMUPDATE))
#define PWM_PCOUNT0(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PCOUNT0))
#define PWM_PCOUNT1(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PCOUNT1))
#define PWM_PCOUNT2(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PCOUNT2))
#define PWM_PCOUNT3(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PCOUNT3))
#define PWM_PULSECOUNT0(reg_base) *((__IM uint32_t *)(reg_base + cvi_pwm_reg->PULSECOUNT0))
#define PWM_PULSECOUNT1(reg_base) *((__IM uint32_t *)(reg_base + cvi_pwm_reg->PULSECOUNT1))
#define PWM_PULSECOUNT2(reg_base) *((__IM uint32_t *)(reg_base + cvi_pwm_reg->PULSECOUNT2))
#define PWM_PULSECOUNT3(reg_base) *((__IM uint32_t *)(reg_base + cvi_pwm_reg->PULSECOUNT3))
#define PWM_SHIFTCOUNT0(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->SHIFTCOUNT0))
#define PWM_SHIFTCOUNT1(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->SHIFTCOUNT1))
#define PWM_SHIFTCOUNT2(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->SHIFTCOUNT2))
#define PWM_SHIFTCOUNT3(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->SHIFTCOUNT3))
#define PWM_SHIFTSTART(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->SHIFTSTART))
#define CAP_FREQEN(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->CAP_FREQEN))
#define CAP_FREQDONE_NUM(reg_base, _ch_) *((__IM uint32_t *)(reg_base + cvi_pwm_reg->CAP_FREQDONE_NUM + _ch_ * 4))
#define PWM_PWM_OE(reg_base) *((__IOM uint32_t *)(reg_base + cvi_pwm_reg->PWM_OE))
/*! PWM Configure Register, offset: 0x00 */
#define CVI_PWM_HIGH_PERIOD_Pos (0U)
#define CVI_PWM_HIGH_PERIOD_Msk (0xffffffff)
#define CVI_PWM_PERIOD_Pos (0U)
#define CVI_PWM_PERIOD_Msk (0xffffffff)
#define CVI_PWM_POLARITY_CH_Pos(_ch_) (_ch_)
#define CVI_PWM_POLARITY_CH_Msk(_ch_) (1U << CVI_PWM_POLARITY_CH_Pos(_ch_))
#define CVI_PWM_POLARITY_CH_HIGH(_ch_) CVI_PWM_POLARITY_CH_Msk(_ch_)
#define CVI_PWM_START_CH_Pos(_ch_) (_ch_)
#define CVI_PWM_START_CH_Msk(_ch_) (1U << CVI_PWM_START_CH_Pos(_ch_))
#define CVI_PWM_START_CH_EN(_ch_) CVI_PWM_START_CH_Msk(_ch_)
#define CVI_PWM_OUTPUT_CH_Pos(_ch_) (_ch_)
#define CVI_PWM_OUTPUT_CH_Msk(_ch_) (1U << CVI_PWM_OUTPUT_CH_Pos(_ch_))
#define CVI_PWM_OUTPUT_CH_EN(_ch_) CVI_PWM_OUTPUT_CH_Msk(_ch_)
#define CVI_CAP_FREQNUM_CH_Pos (0U)
#define CVI_CAP_FREQNUM_CH_Msk (0xffffffff)
#define CVI_CAP_FREQEN_Pos(_ch_) (_ch_)
#define CVI_CAP_FREQEN_Msk(_ch_) (1U << CVI_CAP_FREQEN_Pos(_ch_))
#define CVI_CAP_FREQEN(_ch_) CVI_CAP_FREQEN_Msk(_ch_)
#define CVI_CAP_FREQDONE_NUM_Poa (0U)
#define CVI_CAP_FREQDONE_NUM_Msk (0xffffffff)
#define CVI_CAP_FREQDATA_pos (0U)
#define CVI_CAP_FREQDATA_msk (0xffffffff)
static inline void cvi_pwm_set_high_period_ch(unsigned long reg_base, uint32_t ch, unsigned long long value)
{
PWM_HLPERIODX(reg_base, ch) = value;
}
static inline unsigned long long cvi_pwm_get_high_period_ch(unsigned long reg_base, uint32_t ch)
{
return PWM_HLPERIODX(reg_base, ch);
}
static inline void cvi_pwm_set_period_ch(unsigned long reg_base, uint32_t ch, unsigned long long value)
{
PWM_PERIODX(reg_base, ch) = value;
}
static inline unsigned long long cvi_pwm_get_period_ch(unsigned long reg_base, uint32_t ch)
{
return PWM_PERIODX(reg_base, ch);
}
static inline void cvi_pwm_set_polarity_high_ch(unsigned long reg_base, uint32_t ch)
{
PWM_POLARITY(reg_base) |= CVI_PWM_POLARITY_CH_HIGH(ch);
}
static inline void cvi_pwm_set_polarity_low_ch(unsigned long reg_base, uint32_t ch)
{
PWM_POLARITY(reg_base) &= ~CVI_PWM_POLARITY_CH_HIGH(ch);
}
static inline uint32_t cvi_pwm_get_polarity(unsigned long reg_base, uint32_t ch)
{
return (PWM_POLARITY(reg_base) & CVI_PWM_POLARITY_CH_Msk(ch));
}
static inline void cvi_pwm_start_en_ch(unsigned long reg_base, uint32_t ch)
{
PWM_PWMSTART(reg_base) |= CVI_PWM_START_CH_EN(ch);
}
static inline void cvi_pwm_start_dis_ch(unsigned long reg_base, uint32_t ch)
{
PWM_PWMSTART(reg_base) &= ~CVI_PWM_START_CH_EN(ch);
}
static inline void cvi_pwm_output_en_ch(unsigned long reg_base, uint32_t ch)
{
PWM_PWM_OE(reg_base) |= CVI_PWM_OUTPUT_CH_EN(ch);
}
static inline void cvi_pwm_input_en_ch(unsigned long reg_base, uint32_t ch)
{
PWM_PWM_OE(reg_base) &= ~CVI_PWM_OUTPUT_CH_EN(ch);
}
static inline void cvi_cap_set_freqnum_ch(unsigned long reg_base, uint32_t ch, uint32_t value)
{
CAP_FREQNUM(reg_base, ch) = value;
}
static inline void cvi_cap_freq_en_ch(unsigned long reg_base, uint32_t ch)
{
CAP_FREQEN(reg_base) |= CVI_CAP_FREQEN(ch);
}
static inline void cvi_cap_freq_dis_ch(unsigned long reg_base, uint32_t ch)
{
CAP_FREQEN(reg_base) &= ~CVI_CAP_FREQEN(ch);
}
static inline uint32_t cvi_cap_get_freq_done_num_ch(unsigned long reg_base, uint32_t ch)
{
return CAP_FREQDONE_NUM(reg_base, ch);
}
static inline uint32_t cvi_cap_get_freq_data_ch(unsigned long reg_base, uint32_t ch)
{
return CAP_FREQDATA(reg_base, ch);
}
#ifdef __cplusplus
}
#endif
#endif
|