1 /*******************************************************************************
2  * (c) Copyright 2011-2013 Microsemi SoC Products Group. All rights reserved.
3  *
4  *  SmartFusion2 Cortex Microcontroller Software Interface - Peripheral
5  *  Access Layer.
6  *
7  *  This file provides interfaces to perform register and register bit level
8  *  read / write operations. These interfaces support bit-banding in case of
9  *  Cortex-M3 CPU.
10  *
11  * SVN $Revision: 5263 $
12  * SVN $Date: 2013-03-21 14:44:58 +0000 (Thu, 21 Mar 2013) $
13  */
14 
15 #ifndef HW_REG_IO_H_
16 #define HW_REG_IO_H_
17 
18 #include <stdint.h>                       /* Include standard types */
19 
20 #if defined ( __CC_ARM   )
21   #define __INLINE         __inline       /*!< inline keyword for ARM Compiler       */
22 
23 #elif defined ( __ICCARM__ )
24   #define __INLINE        inline          /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */
25 
26 #elif defined   (  __GNUC__  )
27   #define __INLINE        inline          /*!< inline keyword for GNU Compiler       */
28 #endif
29 
30 /*****************************************************************************************
31  * Definitions for register access
32  */
33 
34 #define HW_REG(addr)            (*((volatile uint32_t *) (addr)))
35 
write_reg32(volatile uint32_t * reg,uint32_t val)36 static __INLINE void write_reg32(volatile uint32_t * reg, uint32_t val)
37 {
38     HW_REG(reg) = val;
39 }
write_reg16(volatile uint16_t * reg,uint16_t val)40 static __INLINE void write_reg16(volatile uint16_t * reg, uint16_t val)
41 {
42     HW_REG(reg) = val;
43 }
write_reg8(volatile uint8_t * reg,uint8_t val)44 static __INLINE void write_reg8(volatile uint8_t * reg, uint8_t val)
45 {
46     HW_REG(reg) = val;
47 }
48 
read_reg32(volatile uint32_t * reg)49 static __INLINE uint32_t read_reg32(volatile uint32_t * reg)
50 {
51     return ( HW_REG(reg) );
52 }
read_reg16(volatile uint16_t * reg)53 static __INLINE uint16_t read_reg16(volatile uint16_t * reg)
54 {
55     return ( HW_REG(reg) );
56 }
read_reg8(volatile uint8_t * reg)57 static __INLINE uint8_t read_reg8(volatile uint8_t * reg)
58 {
59     return ( HW_REG(reg) );
60 }
61 /*****************************************************************************************
62  * Definitions for register bits access using bit-band aliases for Cortex-M3
63  */
64 #define BITBAND(addr,bitnum)    (((uint32_t)addr & 0xF0000000)+0x02000000+(((uint32_t)addr & 0xFFFFF)<<5)+(bitnum<<2))
65 #define HW_REG_BIT(reg,bitnum)  (*(volatile unsigned int *)((BITBAND(reg,bitnum))))
66 
67 /*****************************************************************************************
68  * Functions to set a bit field in Cortex-M3
69  */
set_bit_reg32(volatile uint32_t * reg,uint8_t bit)70 static __INLINE void set_bit_reg32(volatile uint32_t * reg, uint8_t bit)
71 {
72     HW_REG_BIT(reg,bit) = 0x1;
73 }
set_bit_reg16(volatile uint16_t * reg,uint8_t bit)74 static __INLINE void set_bit_reg16(volatile uint16_t * reg, uint8_t bit)
75 {
76     HW_REG_BIT(reg,bit) = 0x1;
77 }
set_bit_reg8(volatile uint8_t * reg,uint8_t bit)78 static __INLINE void set_bit_reg8(volatile uint8_t * reg, uint8_t bit)
79 {
80     HW_REG_BIT(reg,bit) = 0x1;
81 }
82 /*****************************************************************************************
83  * Functions to clear a bit field in Cortex-M3
84  */
clear_bit_reg32(volatile uint32_t * reg,uint8_t bit)85 static __INLINE void clear_bit_reg32(volatile uint32_t * reg, uint8_t bit)
86 {
87     HW_REG_BIT(reg,bit) = 0x0;
88 }
clear_bit_reg16(volatile uint16_t * reg,uint8_t bit)89 static __INLINE void clear_bit_reg16(volatile uint16_t * reg, uint8_t bit)
90 {
91     HW_REG_BIT(reg,bit) = 0x0;
92 }
clear_bit_reg8(volatile uint8_t * reg,uint8_t bit)93 static __INLINE void clear_bit_reg8(volatile uint8_t * reg, uint8_t bit)
94 {
95     HW_REG_BIT(reg,bit) = 0x0;
96 }
97 /*****************************************************************************************
98  * Functions to read a bit field in Cortex-M3
99  */
read_bit_reg32(volatile uint32_t * reg,uint8_t bit)100 static __INLINE uint8_t read_bit_reg32(volatile uint32_t * reg, uint8_t bit)
101 {
102     return (HW_REG_BIT(reg,bit));
103 }
read_bit_reg16(volatile uint16_t * reg,uint8_t bit)104 static __INLINE uint8_t read_bit_reg16(volatile uint16_t * reg, uint8_t bit)
105 {
106     return (HW_REG_BIT(reg,bit));
107 }
read_bit_reg8(volatile uint8_t * reg,uint8_t bit)108 static __INLINE uint8_t read_bit_reg8(volatile uint8_t * reg, uint8_t bit)
109 {
110     return (HW_REG_BIT(reg,bit));
111 }
112 
113 #endif /* HW_REG_IO_H_ */
114