1:
10:
11:
15:
16:
17:
#include "AG903_common.h"
18:
19:
#include "register/AG903_ospreg.h"
20:
#include "osp/ospprm.h"
21:
#include "osp/ospmgr.h"
22:
#include "osp.h"
23:
24:
25:
#define EVENT(R) (
AG903_OSP->R)
26:
27:
#define EVENTn(N) *((uint32_t *)
AG903_OSP + N)
28:
29:
#define EVTn(EVT) ((
OSPEvt_Type *)(
AG903_OSP_BASE + (EVT / 4) * 0x04UL))
30:
31:
32:
typedef struct _OSPEvt_Type {
33:
34:
union {
35: uint32_t
EVENT;
36:
37:
struct {
38: uint32_t VAL0:4;
39: uint32_t OVF0:1;
40: uint32_t EN0 :1;
41: uint32_t :2;
42:
43: uint32_t VAL1:4;
44: uint32_t OVF1:1;
45: uint32_t EN1 :1;
46: uint32_t :2;
47: uint32_t VAL2:4;
48: uint32_t OVF2:1;
49: uint32_t EN2 :1;
50: uint32_t :2;
51:
52: uint32_t VAL3:4;
53: uint32_t OVF3:1;
54: uint32_t EN3 :1;
55: uint32_t :2;
56: };
57: };
58: }
OSPEvt_Type;
59:
60:
68:
void AG903_OSPPrmCTRL(
const uint8_t ch,
const uint8_t en)
69: {
70:
ASSERT(ch <
AG903_OSP_CH_NUM);
71:
72:
AG903_OSPn(ch)->CTRL = (en <<
AG903_OSPn_CTRL_EN_POS) &
AG903_OSPn_CTRL_EN_MSK;
73: }
74:
75:
83:
void AG903_OSPPrmPRIOR(
const uint8_t ch,
const uint8_t pri)
84: {
85:
ASSERT(ch <
AG903_OSP_CH_NUM);
86:
ASSERT(pri < AG903_OSP_PRI_NUM);
87:
88:
AG903_OSPn(ch)->PRIOR = (pri <<
AG903_OSPn_PRIOR_PRIOR_POS) &
AG903_OSPn_PRIOR_PRIOR_MSK;
89: }
90:
91:
100:
void AG903_OSPPrmFIFOSTAT(
const uint8_t ch, uint8_t *ovf, uint8_t *siz)
101: {
102: uint32_t val;
103:
104:
ASSERT(ch <
AG903_OSP_CH_NUM);
105:
ASSERT(ovf != NULL);
106:
ASSERT(siz != NULL);
107:
108: val =
AG903_OSPn(ch)->FIFOSTAT;
109: *ovf = (val &
AG903_OSPn_FIFOSTAT_OVF_MSK) >>
AG903_OSPn_FIFOSTAT_OVF_POS;
110: *siz = (val &
AG903_OSPn_FIFOSTAT_SIZE_MSK ) >>
AG903_OSPn_FIFOSTAT_SIZE_POS;
111: }
112:
113:
121:
void AG903_OSPPrmFIFOCTRL(
const uint8_t ch)
122: {
123:
ASSERT(ch <
AG903_OSP_CH_NUM);
124:
125:
AG903_OSPn(ch)->FIFOCTRL =
AG903_OSPn_FIFOCTRL_CLR_MSK;
126: }
127:
128:
137:
void AG903_OSPPrmFIFODT(
const uint8_t ch,
const uint32_t *dats,
const uint32_t len)
138: {
139: uint32_t ii;
140:
141:
ASSERT(ch <
AG903_OSP_CH_NUM);
142:
ASSERT(dats != NULL);
143:
144:
for (ii = 0;ii < len;ii++) {
145:
AG903_OSPn(ch)->FIFODT = *dats++;
146: }
147: }
148:
149:
158:
void AG903_OSPPrmSTAT(
const uint8_t ch, uint8_t *stat, uint8_t *cnt)
159: {
160: uint32_t val;
161:
162:
ASSERT(ch <
AG903_OSP_CH_NUM);
163:
ASSERT(stat != NULL);
164:
ASSERT(cnt != NULL);
165:
166: val =
AG903_OSPn(ch)->STAT;
167: *cnt = (val &
AG903_OSPn_STAT_COUNT_MSK) >>
AG903_OSPn_STAT_COUNT_POS;
168: *stat = (val &
AG903_OSPn_STAT_STAT_MSK) >>
AG903_OSPn_STAT_STAT_POS;
169: }
170:
171:
181:
void AG903_OSPPrmEnableEvent(
const uint8_t evt,
const uint8_t en,
const uint8_t cnt)
182: {
183: uint8_t evtno, regno, ecnt, ovf;
184:
185:
ASSERT(evt <
AG903_OSP_EVENT_NUM);
186:
187: regno = evt / 4;
188: evtno = evt % 4;
189:
190: uint8_t *reg = (uint8_t *)&
EVENTn(regno) + evtno;
191:
if (en == 0) {
192: ecnt = (*reg &
AG903_OSP_EVENT0_VAL0_MSK) >>
AG903_OSP_EVENT0_VAL0_POS;
193: ovf = (*reg &
AG903_OSP_EVENT0_OVF0_MSK) >>
AG903_OSP_EVENT0_OVF0_POS;
194: }
else {
195: ecnt = cnt;
196: ovf = 0;
197: }
198: *reg = ((en <<
AG903_OSP_EVENT0_EN0_POS) &
AG903_OSP_EVENT0_EN0_MSK )|
199: ((ovf <<
AG903_OSP_EVENT0_OVF0_POS) &
AG903_OSP_EVENT0_OVF0_MSK )|
200: ((ecnt <<
AG903_OSP_EVENT0_VAL0_POS) &
AG903_OSP_EVENT0_VAL0_MSK );
201: }
202:
203:
211:
void AG903_OSPPrmGetEventStat(
const uint8_t evt, uint8_t *ovf, uint8_t *cnt)
212: {
213: uint8_t evtno;
214:
215:
ASSERT(evt <
AG903_OSP_EVENT_NUM);
216:
ASSERT(ovf != NULL);
217:
ASSERT(cnt != NULL);
218:
219: evtno = evt % 4;
220:
221:
switch (evtno) {
222:
case 0:
223: *ovf =
EVTn(evt)->OVF0;
224: *cnt =
EVTn(evt)->VAL0;
225:
break;
226:
227:
case 1:
228: *ovf =
EVTn(evt)->OVF1;
229: *cnt =
EVTn(evt)->VAL1;
230:
break;
231:
232:
case 2:
233: *ovf =
EVTn(evt)->OVF2;
234: *cnt =
EVTn(evt)->VAL2;
235:
break;
236:
237:
case 3:
238: *ovf =
EVTn(evt)->OVF3;
239: *cnt =
EVTn(evt)->VAL3;
240:
break;
241: }
242: }
243:
244:
250:
void AG903_OSPPrmFLAGSET(
const uint32_t flag)
251: {
252:
EVENT(FLAGSET) = (flag <<
AG903_OSP_FLAGSET_F_POS) &
AG903_OSP_FLAGSET_F_MSK;
253: }
254:
255:
261:
void AG903_OSPPrmFLAGCLR(
const uint32_t flag)
262: {
263:
EVENT(FLAGCLR) = (flag <<
AG903_OSP_FLAGCLR_F_POS) &
AG903_OSP_FLAGCLR_F_MSK;
264: }
265:
266:
272:
void AG903_OSPPrmFLAGSTAT(uint32_t *val)
273: {
274:
ASSERT(val != NULL);
275:
276: *val = (
EVENT(FLAGSTAT) &
AG903_OSP_FLAGSTAT_F_MSK) >>
AG903_OSP_FLAGSTAT_F_POS;
277: }