This is Unofficial EPICS BASE Doxygen Site
epicsMMIODef.h
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2010 Brookhaven Science Associates, as Operator of
3 * Brookhaven National Laboratory.
4 * EPICS BASE is distributed subject to a Software License Agreement found
5 * in file LICENSE that is included with this distribution.
6 \*************************************************************************/
17 #ifndef EPICSMMIODEF_H
18 #define EPICSMMIODEF_H
19 
20 #include <epicsTypes.h>
21 #include <epicsEndian.h>
22 #include <compilerSpecific.h>
23 #include <libComAPI.h>
24 
25 #ifdef __cplusplus
26 # ifndef INLINE
27 # define INLINE inline
28 # endif
29 #endif
30 
39 ioread8(volatile void* addr)
40 {
41  return *(volatile epicsUInt8*)(addr);
42 }
43 
47 void
48 iowrite8(volatile void* addr, epicsUInt8 val)
49 {
50  *(volatile epicsUInt8*)(addr) = val;
51 }
52 
58 nat_ioread16(volatile void* addr)
59 {
60  return *(volatile epicsUInt16*)(addr);
61 }
62 
67 void
68 nat_iowrite16(volatile void* addr, epicsUInt16 val)
69 {
70  *(volatile epicsUInt16*)(addr) = val;
71 }
72 
78 nat_ioread32(volatile void* addr)
79 {
80  return *(volatile epicsUInt32*)(addr);
81 }
82 
87 void
88 nat_iowrite32(volatile void* addr, epicsUInt32 val)
89 {
90  *(volatile epicsUInt32*)(addr) = val;
91 }
92 
93 #if EPICS_BYTE_ORDER == EPICS_ENDIAN_BIG
94 
101 bswap16(epicsUInt16 value)
102 {
103  return (((epicsUInt16)(value) & 0x00ff) << 8) |
104  (((epicsUInt16)(value) & 0xff00) >> 8);
105 }
106 
107 static EPICS_ALWAYS_INLINE
109 bswap32(epicsUInt32 value)
110 {
111  return (((epicsUInt32)(value) & 0x000000ff) << 24) |
112  (((epicsUInt32)(value) & 0x0000ff00) << 8) |
113  (((epicsUInt32)(value) & 0x00ff0000) >> 8) |
114  (((epicsUInt32)(value) & 0xff000000) >> 24);
115 }
116 
117 # define be_ioread16(A) nat_ioread16(A)
118 # define be_ioread32(A) nat_ioread32(A)
119 # define be_iowrite16(A,D) nat_iowrite16(A,D)
120 # define be_iowrite32(A,D) nat_iowrite32(A,D)
121 
122 # define le_ioread16(A) bswap16(nat_ioread16(A))
123 # define le_ioread32(A) bswap32(nat_ioread32(A))
124 # define le_iowrite16(A,D) nat_iowrite16(A,bswap16(D))
125 # define le_iowrite32(A,D) nat_iowrite32(A,bswap32(D))
126 
129 #elif EPICS_BYTE_ORDER == EPICS_ENDIAN_LITTLE
130 
131 /* Get hton[sl] declarations: */
132 #include <osdSock.h>
133 
138 /* hton* is optimized or a builtin for most compilers
139  * so use it if possible
140  */
141 #define bswap16(v) htons(v)
142 #define bswap32(v) htonl(v)
143 
144 # define be_ioread16(A) bswap16(nat_ioread16(A))
145 # define be_ioread32(A) bswap32(nat_ioread32(A))
146 # define be_iowrite16(A,D) nat_iowrite16(A,bswap16(D))
147 # define be_iowrite32(A,D) nat_iowrite32(A,bswap32(D))
148 
149 # define le_ioread16(A) nat_ioread16(A)
150 # define le_ioread32(A) nat_ioread32(A)
151 # define le_iowrite16(A,D) nat_iowrite16(A,D)
152 # define le_iowrite32(A,D) nat_iowrite32(A,D)
153 
156 #else
157 # error Unable to determine native byte order
158 #endif
159 
198 #define rbarr() do{}while(0)
199 
202 #define wbarr() do{}while(0)
203 
206 #define rwbarr() do{}while(0)
207 
282 #endif /* EPICSMMIODEF_H */
Definition: link.h:174
#define nat_ioread16(address)
Definition: epicsMMIO.h:111
#define EPICS_ALWAYS_INLINE
#define ioread8(address)
Definition: epicsMMIO.h:108
unsigned short epicsUInt16
Definition: epicsTypes.h:41
unsigned char epicsUInt8
Definition: epicsTypes.h:39
unsigned int epicsUInt32
Definition: epicsTypes.h:43
#define nat_iowrite32(address, data)
Definition: epicsMMIO.h:115
#define nat_iowrite16(address, data)
Definition: epicsMMIO.h:114
#define iowrite8(address, data)
Definition: epicsMMIO.h:109
#define nat_ioread32(address)
Definition: epicsMMIO.h:112