GeMRTOS
grtos_regs.h
Go to the documentation of this file.
1 
21 /******************************************************************************
22 * *
23 * License Agreement *
24 * Copyright (c) Ricardo L. Cayssials *
25 * All rights reserved. *
26 * *
27 ******************************************************************************/
28 
29 
30 #ifndef __GRTOS_REGS_H__
31 #define __GRTOS_REGS_H__
32 
33 #include <io.h>
34 // extern void *GRTOS_DRIVER_GRTOS_BASE;
35 
36 #define ADDR_SMP 0
37 #define ADDR_TM_CNT_HGH 1
38 
39 #define ADDR_NXT_OCC_TM_HGH 3
40 #define ADDR_SYS_MUTEX_TIME_HGH 4
41 #define ADDR_SYS_TM 5
42 #define ADDR_MTX_GRN 6
43 #define ADDR_MTX_RLS 7
44 
45 #define ADDR_MTX_RSV_SET 9
46 #define ADDR_MTX_RSV_CLR 10
47 #define ADDR_INT_PRC_PND_CLR 11
48 #define ADDR_ELP_TM_CNT 12
49 #define ADDR_MTX_SET_TM 13
50 #define ADDR_FRZ_TM_HGH 14
51 #define ADDR_TM_PSC 15
52 #define ADDR_FRZ_THR_HGH 16
53 #define ADDR_CTRL 17
54 #define ADDR_EVN_OCC 19
55 #define ADDR_MUTEXBLOCKED32 20
56 #define ADDR_INT_ENB_SET 21
57 #define ADD_INT_ENB_CLR 22
58 #define ADDR_LOW_PRC_SET 23
59 #define ADDR_NXT_TM_PRC_SET 24
60 
61 #define ADDR_HLT_IDL_PRC_ENB 25
62 #define ADDR_HLT_IDL_PRC_DSB 26
63 
64 #define ADDR_IRQ_ENB_SET 27
65 #define ADDR_IRQ_ENB_CLR 28
66 #define ADDR_IRQ_RQS 29
67 #define ADDR_RST_CLR 30
68 #define ADDR_TRG_INT_PRC 31
69 
70 #define ADDR_HLT_ACT_CNT_SMP 34
71 
72 // Macros defined and implemented in hardware, but not used
73 #define IORD_GRTOS_HLT_ACT_CNT_SMP IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_HLT_ACT_CNT_SMP)
74 #define IORD_GRTOS_TRG_INT_PRC IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_TRG_INT_PRC)
75 #define IORD_GRTOS_HLT_IDL_PRC_ENB IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_HLT_IDL_PRC_ENB)
76 #define IORD_GRTOS_RST_CLR IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_RST_CLR)
77 #define IORD_GRTOS_FRZ_TM_HGH IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_FRZ_TM_HGH)
78 
79 #define IOWR_GRTOS_HLT_IDL_PRC_CLR(data) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_HLT_IDL_PRC_DSB, data)
80 #define IOWR_GRTOS_FRZ_TM_HGH(data) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_FRZ_TM_HGH,data)
81 #define IOWR_GRTOS_MTX_RSV_CLR(data) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_MTX_RSV_CLR, data)
82 #define IOWR_GRTOS_MTX_RQS(data) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_MTX_GRN, data)
83 
84 
85 // Read grtos registers
86 // #define IORD_GRTOS_SMP IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP)
87 // #define IORD_GRTOS_TM_CNT_HGH IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_TM_CNT_HGH)
88 // #define IORD_GRTOS_SYS_MUTEX_TIME_HGH IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SYS_MUTEX_TIME_HGH)
89 // #define IORD_GRTOS_SYS_TM_HGH IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SYS_TM)
90 
91 
92 
97 #define GRTOS_now ({ \
98 TIMEPRIORITY value64; \
99 do { \
100  value64.i32[1] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_TM_CNT_HGH); \
101  value64.i32[0] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP); \
102 } while(0); \
103  value64.i64; \
104 })
105 
106 
110 #define GRTOS_CMD_MTX_TM_GET ({ \
111 TIMEPRIORITY value64; \
112 do { \
113  value64.i32[1] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SYS_MUTEX_TIME_HGH); \
114  value64.i32[0] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP); \
115 } while(0); \
116  value64.i64; \
117 })
118 
123 #define GRTOS_CMD_SYS_TM_GET ({ \
124 TIMEPRIORITY value64; \
125 do { \
126  value64.i32[1] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SYS_TM); \
127  value64.i32[0] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP); \
128 } while(0); \
129  value64.i64; \
130 })
131 
132 
135 #define GRTOS_MTX_PRC_GRANTED IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_MTX_GRN)
136 
141 #define GRTOS_GET_INTERVAL IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_ELP_TM_CNT)
142 
145 #define GRTOS_CMD_GET_TIME_PRESCALE IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_TM_PSC)
146 
152 #define GRTOS_CMD_FRZ_TM_THR_GET ({ \
153  TIMEPRIORITY value64; \
154  value64.i32[1] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_FRZ_THR_HGH); \
155  value64.i32[0] = (unsigned) IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP); \
156  value64.i64; \
157 })
158 
161 #define GRTOS_CMD_GET_STATUS_DEBUG_HOLD (((IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL) >> 2) & 1) ? G_TRUE : G_FALSE)
162 
165 #define GRTOS_CMD_GET_FRZ_ENB (((IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL) >> 1) & 1) ? G_TRUE : G_FALSE)
166 
169 #define GRTOS_CMD_GET_FRZ_ACT ((IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL) & 1) ? G_TRUE : G_FALSE)
170 
173 #define GRTOS_CMD_EVN_OCC IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_EVN_OCC)
174 
176 #define GRTOS_MUTEX_BLOCKED_GET IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_MUTEXBLOCKED32)
177 
181 #define GRTOS_CMD_IRQ_RQS IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_IRQ_RQS)
182 
185 #define GRTOS_CMD_IRQ_ENB_GET(irq) ((IORD(GRTOS_DRIVER_GRTOS_BASE, ADDR_INT_ENB_SET) >> (irq-1)) & 1)
186 
187 
188 // Write grtos registers
189 
192 #define GRTOS_CMD_FRZ_TM_THR_SET(timeset) \
193  do { \
194  TIMEPRIORITY temp_aux; \
195  temp_aux.i64 = (INT64) timeset; \
196  IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP, (unsigned long)temp_aux.i32[0]); \
197  IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_FRZ_THR_HGH, (unsigned long)temp_aux.i32[1]); \
198  }while(0)
199 
203 #define GRTOS_CMD_NXT_OCC_TM_EVN_SET(timeset) \
204  do { \
205  TIMEPRIORITY temp_aux; \
206  temp_aux.i64 = (INT64) timeset; \
207  IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_SMP, (unsigned long)temp_aux.i32[0]); \
208  IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_NXT_OCC_TM_HGH, (unsigned long)temp_aux.i32[1]); \
209  }while(0)
210 
212 #define GRTOS_MTX_RLS IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_MTX_RLS, GRTOS_CMD_PRC_ID)
213 
215 #define GRTOS_MTX_RSV_SET IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_MTX_RSV_SET, GRTOS_CMD_PRC_ID)
216 
220 #define GRTOS_CMD_INT_PRC_PND_CLR IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_INT_PRC_PND_CLR, GRTOS_CMD_PRC_ID);
221 
224 #define GRTOS_CMD_SET_TIME_PRESCALE(scale) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_TM_PSC, scale);
225 
228 #define GRTOS_CMD_FRZ_ENB_SET IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL, 1)
229 
232 #define GRTOS_CMD_FRZ_DSB_SET IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL, 2)
233 
237 #define GRTOS_CMD_FRZ_EVN_CLR IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL, 3)
238 
242 #define GRTOS_CMD_TM_CNT_CLR IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL, 4);
243 
246 #define GRTOS_CMD_DEBUG_HOLD_ENB IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL, 6)
247 
250 #define GRTOS_CMD_DEBUG_HOLD_DIS IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_CTRL, 7)
251 
254 #define GRTOS_CMD_PRC_INT_ENB IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_INT_ENB_SET, GRTOS_CMD_PRC_ID);
255 
258 #define GRTOS_CMD_PRC_INT_DSB IOWR(GRTOS_DRIVER_GRTOS_BASE, ADD_INT_ENB_CLR, GRTOS_CMD_PRC_ID);
259 
263 #define GRTOS_CMD_LOW_PRC_SET(processor) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_LOW_PRC_SET, processor);
264 
267 #define GRTOS_CMD_NXT_TM_PRC_SET(processor) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_NXT_TM_PRC_SET, processor);
268 
270 #define GRTOS_MUTEX_BLOCKED(data) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_MUTEXBLOCKED32, data)
271 
274 #define GRTOS_CMD_HLT_IDL_PRC IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_HLT_IDL_PRC_ENB, GRTOS_CMD_PRC_ID)
275 
278 #define GRTOS_CMD_IRQ_ENB_SET(irq) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_IRQ_ENB_SET, irq)
279 
282 #define GRTOS_CMD_IRQ_ENB_CLR(irq) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_IRQ_ENB_CLR, irq)
283 
287 #define GRTOS_CMD_TRG_PRC_INT_SET(proc) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_TRG_INT_PRC, proc);
288 
292 #define GRTOS_CMD_RST_GRTOS IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_RST_CLR, 0)
293 
295 #define GRTOS_CMD_RLS_NXT_PRC IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_RST_CLR, GRTOS_CMD_PRC_ID)
296 
301 #define GRTOS_USER_CRITICAL_SECTION_SET_RELEASE_TIME(time) IOWR(GRTOS_DRIVER_GRTOS_BASE, ADDR_MTX_SET_TM, time);
302 
303 
304 /************************************************************************************
305  * GRTOS COMMANDS
306  ************************************************************************************/
307 
309 #define GRTOS_CMD_PRC_ID __builtin_rdctl(5)
310 
311 
315 #define GRTOS_CMD_PRC_INT(proc) \
316  GRTOS_CMD_TRG_PRC_INT_SET(proc); \
317  while (GRTOS_CMD_IRQ_ENB_GET(proc)){ \
318  while(0); \
319  }
320 
321 
326 #define GRTOS_CMD_HALT_PROCESSOR \
327  GRTOS_CMD_HLT_IDL_PRC; \
328  g_kcb.G_PCBTbl[GRTOS_CMD_PRC_ID -1].GRTOS_PROCESSOR_BASE[0] = (int) 0;
329 
330 /************************************************************************************
331  * GRTOS CRITICAL SECTION COMMANDS
332  ************************************************************************************/
333 
340 #define GRTOS_CMD_CRITICAL_SECTION_GET \
341  do{ \
342  do { \
343  GRTOS_MTX_RSV_SET; \
344  GRTOS_CMD_HALT_PROCESSOR \
345  } while (GRTOS_CMD_PRC_ID != GRTOS_MTX_PRC_GRANTED); \
346  }while(0)
347 
348 
356 #define GRTOS_CMD_CRITICAL_SECTION_RELEASE \
357  do{ GRTOS_CMD_PRC_INT_ENB; \
358  alt_dcache_flush_all(); \
359  GRTOS_MTX_RLS; \
360  }while(0)
361 
366 #define GRTOS_CMD_MTX_RQS_GET GRTOS_MTX_PRC_GRANTED;
367 
373 #define GRTOS_USER_CRITICAL_SECTION_GET GRTOS_CMD_CRITICAL_SECTION_GET
374 
375 
381 #define GRTOS_USER_CRITICAL_SECTION_RELEASE GRTOS_CMD_CRITICAL_SECTION_RELEASE
382 
383 
384 
385 
386 
387 
388 
389 
390 #endif /* __GRTOS_REGS_H__ */