]> rtime.felk.cvut.cz Git - arc.git/blob - arch/arm/arm_cr4/kernel/core_cr4.h
Cortex-R4 port now passes OSEK tests.
[arc.git] / arch / arm / arm_cr4 / kernel / core_cr4.h
1 /*\r
2  * core_cr4.h\r
3  *\r
4  *  Created on: 12 okt 2010\r
5  *      Author: maek\r
6  */\r
7 \r
8 #ifndef CORE_CR4_H_\r
9 #define CORE_CR4_H_\r
10 \r
11 #include "Std_Types.h"\r
12 \r
13 #define     __I     volatile const            /*!< defines 'read only' permissions      */\r
14 #define     __O     volatile                  /*!< defines 'write only' permissions     */\r
15 #define     __IO    volatile                  /*!< defines 'read / write' permissions   */\r
16 \r
17 \r
18 typedef volatile struct vimBase\r
19 {\r
20     unsigned              : 24U;    /* 0x0000        */\r
21     unsigned      IRQIVEC :  8U;    /* 0x0000        */\r
22     unsigned              : 24U;    /* 0x0004        */\r
23     unsigned      FIQIVEC :  8U;    /* 0x0004        */\r
24     unsigned      : 32U;            /* 0x0008        */\r
25     unsigned      : 32U;            /* 0x000C        */\r
26     unsigned      FIRQPR0;          /* 0x0010        */\r
27     unsigned      FIRQPR1;          /* 0x0014        */\r
28     unsigned      FIRQPR2;          /* 0x0018        */\r
29     unsigned      FIRQPR3;          /* 0x001C        */\r
30     unsigned      INTREQ0;          /* 0x0020        */\r
31     unsigned      INTREQ1;          /* 0x0024        */\r
32     unsigned      INTREQ2;          /* 0x0028        */\r
33     unsigned      INTREQ3;          /* 0x002C        */\r
34     unsigned      REQMASKSET0;      /* 0x0030        */\r
35     unsigned      REQMASKSET1;      /* 0x0034        */\r
36     unsigned      REQMASKSET2;      /* 0x0038        */\r
37     unsigned      REQMASKSET3;      /* 0x003C        */\r
38     unsigned      REQMASKCLR0;      /* 0x0040        */\r
39     unsigned      REQMASKCLR1;      /* 0x0044        */\r
40     unsigned      REQMASKCLR2;      /* 0x0048        */\r
41     unsigned      REQMASKCLR3;      /* 0x004C        */\r
42     unsigned      WAKEMASKSET0;     /* 0x0050        */\r
43     unsigned      WAKEMASKSET1;     /* 0x0054        */\r
44     unsigned      WAKEMASKSET2;     /* 0x0058        */\r
45     unsigned      WAKEMASKSET3;     /* 0x005C        */\r
46     unsigned      WAKEMASKCLR0;     /* 0x0060        */\r
47     unsigned      WAKEMASKCLR1;     /* 0x0064        */\r
48     unsigned      WAKEMASKCLR2;     /* 0x0068        */\r
49     unsigned      WAKEMASKCLR3;     /* 0x006C        */\r
50     unsigned      IRQVECREG;        /* 0x0070        */\r
51     unsigned      FIQVECREQ;        /* 0x0074        */\r
52     unsigned                 :  9U; /* 0x0078        */\r
53     unsigned      CAPEVTSRC1 :  7U; /* 0x0078        */\r
54     unsigned                 :  9U; /* 0x0078        */\r
55     unsigned      CAPEVTSRC0 :  7U; /* 0x0078        */\r
56     unsigned      : 32U;            /* 0x007C        */\r
57     unsigned char CHANMAP[64U];     /* 0x0080-0x017C */\r
58 } vimBASE_t;\r
59 \r
60 #define vimREG ((vimBASE_t *)0xFFFFFE00U)\r
61 \r
62 \r
63 \r
64 typedef volatile struct rtiBase\r
65 {\r
66     unsigned GCTRL;          /**< 0x0000: Global Control Register   */\r
67     unsigned TBCTRL;         /**< 0x0004: Timebase Control Register */\r
68     unsigned CAPCTRL;        /**< 0x0008: Capture Control Register  */\r
69     unsigned COMPCTRL;       /**< 0x000C: Compare Control Register  */\r
70     struct\r
71     {\r
72         unsigned FRCx;       /**< 0x0010,0x0030: Free Running Counter x Register         */\r
73         unsigned UCx;        /**< 0x0014,0x0034: Up Counter x Register                   */\r
74         unsigned CPUCx;      /**< 0x0018,0x0038: Compare Up Counter x Register           */\r
75         unsigned : 32;       /**< 0x001C,0x003C: Reserved                                */\r
76         unsigned CAFRCx;     /**< 0x0020,0x0040: Capture Free Running Counter x Register */\r
77         unsigned CAUCx;      /**< 0x0024,0x0044: Capture Up Counter x Register           */\r
78         unsigned : 32;       /**< 0x0028,0x0048: Reserved                                */\r
79         unsigned : 32;       /**< 0x002C,0x004C: Reserved                                */\r
80     } CNT[2U];               /**< Counter x selection:\r
81                                     - 0: Counter 0\r
82                                     - 1: Counter 1                                       */\r
83     struct\r
84     {\r
85         unsigned COMPx;      /**< 0x0050,0x0058,0x0060,0x0068: Compare x Register        */\r
86         unsigned UDCPx;      /**< 0x0054,0x005C,0x0064,0x006C: Update Compare x Register */\r
87     } CMP[4U];               /**< Compare x selection:\r
88                                     - 0: Compare 0\r
89                                     - 1: Compare 1\r
90                                     - 2: Compare 2\r
91                                     - 3: Compare 3                                       */\r
92     unsigned TBLCOMP;        /**< 0x0070: External Clock Timebase Low Compare Register   */\r
93     unsigned TBHCOMP;        /**< 0x0074: External Clock Timebase High Compare Register  */\r
94     unsigned : 32;           /**< 0x0078: Reserved                                       */\r
95     unsigned : 32;           /**< 0x007C: Reserved                                       */\r
96     unsigned SETINT;         /**< 0x0080: Set/Status Interrupt Register                  */\r
97     unsigned CLEARINT;       /**< 0x0084: Clear/Status Interrupt Register                */\r
98     unsigned INTFLAG;        /**< 0x008C: Interrupt Flag Register                        */\r
99 } rtiBASE_t;\r
100 \r
101 /** @def rtiREG1\r
102 *   @brief RTI1 Register Frame Pointer\r
103 *\r
104 *   This pointer is used by the RTI driver to access the RTI1 registers.\r
105 */\r
106 #define rtiREG1 ((rtiBASE_t *)0xFFFFFC00)\r
107 \r
108 \r
109 enum systemClockSource\r
110 {\r
111     SYS_OSC      = 0, /**< Alias for oscillator clock Source                */\r
112     SYS_PLL      = 1, /**< Alias for Pll clock Source                       */\r
113     SYS_O32      = 2, /**< Alias for 32 kHz oscillator clock Source         */\r
114     SYS_EXTERNAL = 3, /**< Alias for external clock Source                  */\r
115     SYS_LPO_LOW  = 4, /**< Alias for low power oscillator low clock Source  */\r
116     SYS_LPO_HIGH = 5, /**< Alias for low power oscillator high clock Source */\r
117     SYS_FR_PLL   = 6, /**< Alias for flexray pll clock Source               */\r
118     SYS_VCLK     = 9  /**< Alias for synchronous VCLK1 clock Source         */\r
119 };\r
120 \r
121 typedef volatile struct systemBase1\r
122 {\r
123     unsigned SYSPC1;                 /* 0x0000 */\r
124     unsigned SYSPC2;                 /* 0x0004 */\r
125     unsigned SYSPC3;                 /* 0x0008 */\r
126     unsigned SYSPC4;                 /* 0x000C */\r
127     unsigned SYSPC5;                 /* 0x0010 */\r
128     unsigned SYSPC6;                 /* 0x0014 */\r
129     unsigned SYSPC7;                 /* 0x0018 */\r
130     unsigned SYSPC8;                 /* 0x001C */\r
131     unsigned SYSPC9;                 /* 0x0020 */\r
132     unsigned SSWPLL1;                /* 0x0024 */\r
133     unsigned SSWPLL2;                /* 0x0028 */\r
134     unsigned SSWPLL3;                /* 0x002C */\r
135     unsigned CSDIS;                  /* 0x0030 */\r
136     unsigned CSDISSET;               /* 0x0034 */\r
137     unsigned CSDISCLR;               /* 0x0038 */\r
138     unsigned CSDDIS;                 /* 0x003C */\r
139     unsigned CSDDISSET;              /* 0x0040 */\r
140     unsigned CSDDISCLR;              /* 0x0044 */\r
141     unsigned GHVSRC;                 /* 0x0048 */\r
142     unsigned VCLKASRC;               /* 0x004C */\r
143     unsigned RCLKSRC;                /* 0x0050 */\r
144     unsigned CSVSTAT;                /* 0x0054 */\r
145     unsigned MSTGCR;                 /* 0x0058 */\r
146     unsigned MINITGCR;               /* 0x005C */\r
147     unsigned MSINENA;                /* 0x0060 */\r
148     unsigned MSTFAIL;                /* 0x0064 */\r
149     unsigned MSTCGSTAT;              /* 0x0068 */\r
150     unsigned MINISTAT;               /* 0x006C */\r
151     unsigned PLLCTL1;                /* 0x0070 */\r
152     unsigned PLLCTL2;                /* 0x0074 */\r
153     unsigned UERFLAG;                /* 0x0078 */\r
154     unsigned DIEIDL;                 /* 0x007C */\r
155     unsigned DIEIDH;                 /* 0x0080 */\r
156     unsigned VRCTL;                  /* 0x0084 */\r
157     unsigned LPOMONCTL;              /* 0x0088 */\r
158     unsigned CLKTEST;                /* 0x008C */\r
159     unsigned DFTCTRLREG1;            /* 0x0090 */\r
160     unsigned DFTCTRLREG2;            /* 0x0094 */\r
161     unsigned : 32U;                  /* 0x0098 */\r
162     unsigned : 32U;                  /* 0x009C */\r
163     unsigned GPREG1;                 /* 0x00A0 */\r
164     unsigned BTRMSEL;                /* 0x00A4 */\r
165     unsigned IMPFASTS;               /* 0x00A8 */\r
166     unsigned IMPFTADD;               /* 0x00AC */\r
167     unsigned SSISR1;                 /* 0x00B0 */\r
168     unsigned SSISR2;                 /* 0x00B4 */\r
169     unsigned SSISR3;                 /* 0x00B8 */\r
170     unsigned SSISR4;                 /* 0x00BC */\r
171     unsigned RAMGCR;                 /* 0x00C0 */\r
172     unsigned BMMCR1;                 /* 0x00C4 */\r
173     unsigned BMMCR2;                 /* 0x00C8 */\r
174     unsigned MMUGCR;                 /* 0x00CC */\r
175 #ifdef _little_endian__\r
176     unsigned        : 8U;            /* 0x00D0 */\r
177     unsigned PENA   : 1U;            /* 0x00D0 */\r
178     unsigned        : 7U;            /* 0x00D0 */\r
179     unsigned VCLKR  : 4U;            /* 0x00D0 */\r
180     unsigned        : 4U;            /* 0x00D0 */\r
181     unsigned VCLK2R : 4U;            /* 0x00D0 */\r
182     unsigned        : 4U;            /* 0x00D0 */\r
183 #else\r
184     unsigned        : 4U;            /* 0x00D0 */\r
185     unsigned VCLK2R : 4U;            /* 0x00D0 */\r
186     unsigned        : 4U;            /* 0x00D0 */\r
187     unsigned VCLKR  : 4U;            /* 0x00D0 */\r
188     unsigned        : 7U;            /* 0x00D0 */\r
189     unsigned PENA   : 1U;            /* 0x00D0 */\r
190     unsigned        : 8U;            /* 0x00D0 */\r
191 #endif\r
192     unsigned : 32U;                  /* 0x00D4 */\r
193     unsigned DSPGCR;                 /* 0x00D8 */\r
194     unsigned DEVCR1;                 /* 0x00DC */\r
195     unsigned SYSECR;                 /* 0x00E0 */\r
196     unsigned SYSESR;                 /* 0x00E4 */\r
197     unsigned ITIFLAG;                /* 0x00E8 */\r
198     unsigned GBLSTAT;                /* 0x00EC */\r
199     unsigned DEV;                    /* 0x00F0 */\r
200     unsigned SSIVEC;                 /* 0x00F4 */\r
201     unsigned SSIF;                   /* 0x00F8 */\r
202 } systemBASE1_t;\r
203 \r
204 \r
205 /** @def systemREG1\r
206 *   @brief System Register Frame 1 Pointer\r
207 *\r
208 *   This pointer is used by the system driver to access the system frame 1 registers.\r
209 */\r
210 #define systemREG1 ((systemBASE1_t *)0xFFFFFF00U)\r
211 \r
212 \r
213 /** @def PRE1\r
214 *   @brief Alias name for RTI1CLK PRE clock source\r
215 *\r
216 *   This is an alias name for the RTI1CLK pre clock source.\r
217 *   This can be either:\r
218 *     - Oscillator\r
219 *     - Pll\r
220 *     - 32 kHz Oscillator\r
221 *     - External\r
222 *     - Low Power Oscillator Low\r
223 *     - Low Power Oscillator High\r
224 *     - Flexray Pll\r
225 */\r
226 #define PRE1 SYS_PLL\r
227 \r
228 /** @def PRE2\r
229 *   @brief Alias name for RTI2CLK pre clock source\r
230 *\r
231 *   This is an alias name for the RTI2CLK pre clock source.\r
232 *   This can be either:\r
233 *     - Oscillator\r
234 *     - Pll\r
235 *     - 32 kHz Oscillator\r
236 *     - External\r
237 *     - Low Power Oscillator Low\r
238 *     - Low Power Oscillator High\r
239 *     - Flexray Pll\r
240 */\r
241 #define PRE2 SYS_PLL\r
242 \r
243 typedef volatile struct systemBase2\r
244 {\r
245     unsigned PLLCTL3;        /* 0x0000 */\r
246     unsigned : 32U;          /* 0x0004 */\r
247     unsigned STCCLKDIV;      /* 0x0008 */\r
248     unsigned CLKHB_GLBREG;   /* 0x000C */\r
249     unsigned CLKHB_RTIDREG;  /* 0x0010 */\r
250     unsigned HBCD_STAT;      /* 0x0014 */\r
251     unsigned : 32U;          /* 0x0018 */\r
252     unsigned : 32U;          /* 0x001C */\r
253     unsigned CLKTRMI1;       /* 0x0020 */\r
254     unsigned ECPCNTRL0;      /* 0x0024 */\r
255     unsigned ECPCNTRL1;      /* 0x0028 */\r
256     unsigned ECPCNTRL2;      /* 0x002C */\r
257     unsigned ECPCNTRL3;      /* 0x0030 */\r
258 } systemBASE2_t;\r
259 \r
260 \r
261 /** @def systemREG2\r
262 *   @brief System Register Frame 2 Pointer\r
263 *\r
264 *   This pointer is used by the system driver to access the system frame 2 registers.\r
265 */\r
266 #define systemREG2 ((systemBASE2_t *)0xFFFFE100U)\r
267 \r
268 typedef volatile struct pcrBase\r
269 {\r
270     unsigned PMPROTSET0;    /* 0x0000 */\r
271     unsigned PMPROTSET1;    /* 0x0004 */\r
272     unsigned : 32U;         /* 0x0008 */\r
273     unsigned : 32U;         /* 0x000C */\r
274     unsigned PMPROTCLR0;    /* 0x0010 */\r
275     unsigned PMPROTCLR1;    /* 0x0014 */\r
276     unsigned : 32U;         /* 0x0018 */\r
277     unsigned : 32U;         /* 0x001C */\r
278     unsigned PPROTSET0;     /* 0x0020 */\r
279     unsigned PPROTSET1;     /* 0x0024 */\r
280     unsigned PPROTSET2;     /* 0x0028 */\r
281     unsigned PPROTSET3;     /* 0x002C */\r
282     unsigned : 32U;         /* 0x0030 */\r
283     unsigned : 32U;         /* 0x0034 */\r
284     unsigned : 32U;         /* 0x0038 */\r
285     unsigned : 32U;         /* 0x003C */\r
286     unsigned PPROTCLR0;     /* 0x0040 */\r
287     unsigned PPROTCLR1;     /* 0x0044 */\r
288     unsigned PPROTCLR2;     /* 0x0048 */\r
289     unsigned PPROTCLR3;     /* 0x004C */\r
290     unsigned : 32U;         /* 0x0050 */\r
291     unsigned : 32U;         /* 0x0054 */\r
292     unsigned : 32U;         /* 0x0058 */\r
293     unsigned : 32U;         /* 0x005C */\r
294     unsigned PCSPWRDWNSET0; /* 0x0060 */\r
295     unsigned PCSPWRDWNSET1; /* 0x0064 */\r
296     unsigned : 32U;         /* 0x0068 */\r
297     unsigned : 32U;         /* 0x006C */\r
298     unsigned PCSPWRDWNCLR0; /* 0x0070 */\r
299     unsigned PCSPWRDWNCLR1; /* 0x0074 */\r
300     unsigned : 32U;         /* 0x0078 */\r
301     unsigned : 32U;         /* 0x007C */\r
302     unsigned PSPWRDWNSET0;  /* 0x0080 */\r
303     unsigned PSPWRDWNSET1;  /* 0x0084 */\r
304     unsigned PSPWRDWNSET2;  /* 0x0088 */\r
305     unsigned PSPWRDWNSET3;  /* 0x008C */\r
306     unsigned : 32U;         /* 0x0090 */\r
307     unsigned : 32U;         /* 0x0094 */\r
308     unsigned : 32U;         /* 0x0098 */\r
309     unsigned : 32U;         /* 0x009C */\r
310     unsigned PSPWRDWNCLR0;  /* 0x00A0 */\r
311     unsigned PSPWRDWNCLR1;  /* 0x00A4 */\r
312     unsigned PSPWRDWNCLR2;  /* 0x00A8 */\r
313     unsigned PSPWRDWNCLR3;  /* 0x00AC */\r
314 } pcrBASE_t;\r
315 \r
316 /** @def pcrREG\r
317 *   @brief Pcr Register Frame Pointer\r
318 *\r
319 *   This pointer is used by the system driver to access the Pcr registers.\r
320 */\r
321 #define pcrREG ((pcrBASE_t *)0xFFFFE000U)\r
322 \r
323 \r
324 /*----------------------------------------------------------------------------*/\r
325 /* CAN register definition                                                    */\r
326 \r
327 typedef volatile struct\r
328 {\r
329     uint32   CTL;\r
330     uint32   SR;\r
331     unsigned     : 16;\r
332     unsigned REC :  8;\r
333     unsigned TEC :  8;\r
334     uint32   BTR;\r
335     uint32   IR;\r
336     uint32   TR;\r
337     unsigned : 32;\r
338     uint32   PEC;\r
339     unsigned : 32;\r
340     unsigned : 32;\r
341     unsigned : 32;\r
342     unsigned : 32;\r
343     unsigned : 32;\r
344     unsigned : 32;\r
345     unsigned : 32;\r
346     unsigned : 32;\r
347     unsigned : 32;\r
348     unsigned : 32;\r
349     unsigned : 32;\r
350     unsigned : 32;\r
351     unsigned : 32;\r
352     unsigned : 32;\r
353     unsigned : 32;\r
354     unsigned : 32;\r
355     unsigned : 32;\r
356     unsigned : 32;\r
357     unsigned : 32;\r
358     unsigned : 32;\r
359     unsigned : 32;\r
360     unsigned : 32;\r
361         unsigned : 32;\r
362         unsigned : 32;\r
363     uint32   ABOT;\r
364     uint32   TRX;\r
365     uint32   TRx[4];\r
366     uint32   NDX;\r
367     uint32   NDx[4];\r
368     uint32   IPX;\r
369     uint32   IPx[4];\r
370     uint32   MVX;\r
371     uint32   MVx[4];\r
372     unsigned : 32;\r
373     uint32   IPMx[4];\r
374     unsigned : 32;\r
375     unsigned : 32;\r
376     unsigned : 32;\r
377     unsigned : 32;\r
378     unsigned : 32;\r
379         unsigned : 32;\r
380     struct\r
381     {\r
382         uint32   COM;\r
383         uint32   MASK;\r
384         uint32   ARB;\r
385         uint32   MC;\r
386         uint8    DATx[8];\r
387         unsigned : 32;\r
388         unsigned : 32;\r
389     } IFx[3];\r
390     uint32   IF3UEy[4];\r
391     unsigned : 32;\r
392     unsigned : 32;\r
393     unsigned : 32;\r
394     unsigned : 32;\r
395     unsigned : 32;\r
396     unsigned : 32;\r
397     unsigned : 32;\r
398     unsigned : 32;\r
399     unsigned : 32;\r
400     unsigned : 32;\r
401     unsigned : 32;\r
402     unsigned : 32;\r
403     unsigned : 32;\r
404     unsigned : 32;\r
405     unsigned : 32;\r
406     unsigned : 32;\r
407     unsigned : 32;\r
408     unsigned : 32;\r
409     unsigned : 32;\r
410     unsigned : 32;\r
411     unsigned : 32;\r
412     unsigned : 32;\r
413     unsigned : 32;\r
414     unsigned : 32;\r
415     unsigned : 32;\r
416         unsigned : 32;\r
417         unsigned : 32;\r
418         unsigned : 32;\r
419     uint32   IOTX;\r
420     uint32   IORX;\r
421 } Can_RegisterType;\r
422 \r
423 \r
424 #define Can0_Base ((Can_RegisterType *)0xFFF7DC00)\r
425 #define Can1_Base ((Can_RegisterType *)0xFFF7DE00)\r
426 \r
427 \r
428 \r
429 typedef volatile struct gioBase\r
430 {\r
431     unsigned GCR0;      /**< 0x0000: Global Control Register */\r
432     unsigned PWDN;      /**< 0x0004: Power Down Register */\r
433     unsigned INTDET;    /**< 0x0008: Interrupt Detect Regsiter*/\r
434     unsigned POL;       /**< 0x000C: Interrupt Polarity Register */\r
435     unsigned INTENASET; /**< 0x0010: Interrupt Enable Set Register */\r
436     unsigned INTENACLR; /**< 0x0014: Interrupt Enable Clear Register */\r
437     unsigned LVLSET;    /**< 0x0018: Interrupt Priority Set Register */\r
438     unsigned LVLCLR;    /**< 0x001C: Interrupt Priority Clear Register */\r
439     unsigned FLG;       /**< 0x0020: Interrupt Flag Register */\r
440     unsigned OFFSET0;   /**< 0x0024: Interrupt Offset A Register */\r
441     unsigned OFFSET1;   /**< 0x0028: Interrupt Offset B Register */\r
442 } gioBASE_t;\r
443 \r
444 \r
445 /** @struct gioPort\r
446 *   @brief GIO Port Register Definition\r
447 */\r
448 /** @typedef gioPORT_t\r
449 *   @brief GIO Port Register Type Definition\r
450 *\r
451 *   This type is used to access the GIO Port Registers.\r
452 */\r
453 typedef volatile struct gioPort\r
454 {\r
455     unsigned DIR;    /**< 0x0000: Data Direction Register */\r
456     unsigned DIN;    /**< 0x0004: Data Input Register */\r
457     unsigned DOUT;   /**< 0x0008: Data Output Register */\r
458     unsigned DSET;   /**< 0x000C: Data Output Set Register */\r
459     unsigned DCLR;   /**< 0x0010: Data Output Clear Register */\r
460     unsigned PDR;    /**< 0x0014: Open Drain Regsiter */\r
461     unsigned PULDIS; /**< 0x0018: Pullup Disable Register */\r
462     unsigned PSL;    /**< 0x001C: Pull Up/Down Selection Register */\r
463 } gioPORT_t;\r
464 \r
465 \r
466 /** @def gioREG\r
467 *   @brief GIO Register Frame Pointer\r
468 *\r
469 *   This pointer is used by the GIO driver to access the gio module registers.\r
470 */\r
471 #define gioREG   ((gioBASE_t *)0xFFF7BC00U)\r
472 \r
473 /** @def gioPORTA\r
474 *   @brief GIO Port (A) Register Pointer\r
475 *\r
476 *   Pointer used by the GIO driver to access PORTA\r
477 */\r
478 #define gioPORTA ((gioPORT_t *)0xFFF7BC34U)\r
479 \r
480 /** @def gioPORTB\r
481 *   @brief GIO Port (B) Register Pointer\r
482 *\r
483 *   Pointer used by the GIO driver to access PORTB\r
484 */\r
485 #define gioPORTB ((gioPORT_t *)0xFFF7BC54U)\r
486 \r
487 \r
488 typedef struct\r
489 {\r
490   __IO uint32_t CTRL;                         /*!< SysTick Control and Status Register */\r
491   __IO uint32_t LOAD;                         /*!< SysTick Reload Value Register       */\r
492   __IO uint32_t VAL;                          /*!< SysTick Current Value Register      */\r
493   __I  uint32_t CALIB;                        /*!< SysTick Calibration Register        */\r
494 } SysTick_Type;\r
495 \r
496 \r
497 static inline void __disable_irq() {\r
498   __asm volatile("CPSID if");\r
499 }\r
500 static inline void __enable_irq() {\r
501         __asm volatile("CPSIE if");\r
502 }\r
503 \r
504 static inline unsigned long _Irq_Save(void)\r
505 {\r
506    register unsigned long val asm("r0");\r
507    asm("mrs r0, cpsr");\r
508    asm("and r0, r0, #0xC0"); // Mask the I and F bit of CPSR\r
509    __disable_irq();\r
510    return val;\r
511 }\r
512 \r
513 static inline void _Irq_Restore(unsigned mask) {\r
514         if (mask & 0x80) {\r
515                 __asm volatile("CPSID i");\r
516         } else {\r
517                 __asm volatile("CPSIE i");\r
518         }\r
519         if (mask & 0x40) {\r
520                 __asm volatile("CPSID f");\r
521         } else {\r
522                 __asm volatile("CPSIE f");\r
523         }\r
524 }\r
525 \r
526 #endif /* CORE_CR4_H_ */\r