libpynq  (release 5EID0-2023 version 0.3.0 of 2024-04-25 09:42 )
xil_io.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Copyright (c) 2014 - 2021 Xilinx, Inc. All rights reserved.
3  * SPDX-License-Identifier: MIT
4  ******************************************************************************/
5 
6 /*****************************************************************************/
35 #ifndef XIL_IO_H /* prevent circular inclusions */
36 #define XIL_IO_H /* by using protection macros */
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 /***************************** Include Files *********************************/
43 
44 #include "xil_types.h"
45 
46 /************************** Function Prototypes ******************************/
47 #ifdef ENABLE_SAFETY
48 extern u32 XStl_RegUpdate(u32 RegAddr, u32 RegVal);
49 #endif
50 
51 /***************** Macros (Inline Functions) Definitions *********************/
52 #if defined __GNUC__
53 #if defined(__MICROBLAZE__)
54 #define INST_SYNC mbar(0)
55 #define DATA_SYNC mbar(1)
56 #else
57 #define SYNCHRONIZE_IO dmb()
58 #define INST_SYNC isb()
59 #define DATA_SYNC dsb()
60 #endif
61 #else
62 #define SYNCHRONIZE_IO
63 #define INST_SYNC
64 #define DATA_SYNC
65 #define INST_SYNC
66 #define DATA_SYNC
67 #endif
68 
69 #if defined(__GNUC__) || defined(__ICCARM__) || defined(__MICROBLAZE__)
70 #define INLINE inline
71 #else
72 #define INLINE __inline
73 #endif
74 
75 /*****************************************************************************/
88 static INLINE u8 Xil_In8(UINTPTR Addr) { return *(volatile u8 *)Addr; }
89 
90 /*****************************************************************************/
102 static INLINE u16 Xil_In16(UINTPTR Addr) { return *(volatile u16 *)Addr; }
103 
104 /*****************************************************************************/
116 static INLINE u32 Xil_In32(UINTPTR Addr) { return *(volatile u32 *)Addr; }
117 
118 /*****************************************************************************/
130 static INLINE u64 Xil_In64(UINTPTR Addr) { return *(volatile u64 *)Addr; }
131 
132 /*****************************************************************************/
145 static INLINE void Xil_Out8(UINTPTR Addr, u8 Value) {
146  /* write 8 bit value to specified address */
147  volatile u8 *LocalAddr = (volatile u8 *)Addr;
148  *LocalAddr = Value;
149 }
150 
151 /*****************************************************************************/
163 static INLINE void Xil_Out16(UINTPTR Addr, u16 Value) {
164  /* write 16 bit value to specified address */
165  volatile u16 *LocalAddr = (volatile u16 *)Addr;
166  *LocalAddr = Value;
167 }
168 
169 /*****************************************************************************/
182 static INLINE void Xil_Out32(UINTPTR Addr, u32 Value) {
183  /* write 32 bit value to specified address */
184 #ifndef ENABLE_SAFETY
185  volatile u32 *LocalAddr = (volatile u32 *)Addr;
186  *LocalAddr = Value;
187 #else
188  XStl_RegUpdate(Addr, Value);
189 #endif
190 }
191 
192 /*****************************************************************************/
205 static INLINE void Xil_Out64(UINTPTR Addr, u64 Value) {
206  /* write 64 bit value to specified address */
207  volatile u64 *LocalAddr = (volatile u64 *)Addr;
208  *LocalAddr = Value;
209 }
210 
211 /*****************************************************************************/
227 static INLINE int Xil_SecureOut32(UINTPTR Addr, u32 Value) {
228  int Status = XST_FAILURE;
229  u32 ReadReg;
230  u32 ReadRegTemp;
231 
232  /* writing 32 bit value to specified address */
233  Xil_Out32(Addr, Value);
234 
235  /* verify value written to specified address with multiple reads */
236  ReadReg = Xil_In32(Addr);
237  ReadRegTemp = Xil_In32(Addr);
238 
239  if ((ReadReg == Value) && (ReadRegTemp == Value)) {
240  Status = XST_SUCCESS;
241  }
242 
243  return Status;
244 }
245 
246 /*****************************************************************************/
256 static INLINE __attribute__((always_inline)) u16 Xil_EndianSwap16(u16 Data) {
257  return (u16)(((Data & 0xFF00U) >> 8U) | ((Data & 0x00FFU) << 8U));
258 }
259 
260 /*****************************************************************************/
270 static INLINE __attribute__((always_inline)) u32 Xil_EndianSwap32(u32 Data) {
271  u16 LoWord;
272  u16 HiWord;
273 
274  /* get each of the half words from the 32 bit word */
275 
276  LoWord = (u16)(Data & 0x0000FFFFU);
277  HiWord = (u16)((Data & 0xFFFF0000U) >> 16U);
278 
279  /* byte swap each of the 16 bit half words */
280 
281  LoWord = (u16)(((LoWord & 0xFF00U) >> 8U) | ((LoWord & 0x00FFU) << 8U));
282  HiWord = (u16)(((HiWord & 0xFF00U) >> 8U) | ((HiWord & 0x00FFU) << 8U));
283 
284  /* swap the half words before returning the value */
285 
286  return ((((u32)LoWord) << (u32)16U) | (u32)HiWord);
287 }
288 
289 #if defined(__MICROBLAZE__)
290 #ifdef __LITTLE_ENDIAN__
291 #define Xil_In16LE Xil_In16
292 #define Xil_In32LE Xil_In32
293 #define Xil_Out16LE Xil_Out16
294 #define Xil_Out32LE Xil_Out32
295 #define Xil_Htons Xil_EndianSwap16
296 #define Xil_Htonl Xil_EndianSwap32
297 #define Xil_Ntohs Xil_EndianSwap16
298 #define Xil_Ntohl Xil_EndianSwap32
299 #else
300 #define Xil_In16BE Xil_In16
301 #define Xil_In32BE Xil_In32
302 #define Xil_Out16BE Xil_Out16
303 #define Xil_Out32BE Xil_Out32
304 #define Xil_Htons(Data) (Data)
305 #define Xil_Htonl(Data) (Data)
306 #define Xil_Ntohs(Data) (Data)
307 #define Xil_Ntohl(Data) (Data)
308 #endif
309 #else
310 #define Xil_In16LE Xil_In16
311 #define Xil_In32LE Xil_In32
312 #define Xil_Out16LE Xil_Out16
313 #define Xil_Out32LE Xil_Out32
314 #define Xil_Htons Xil_EndianSwap16
315 #define Xil_Htonl Xil_EndianSwap32
316 #define Xil_Ntohs Xil_EndianSwap16
317 #define Xil_Ntohl Xil_EndianSwap32
318 #endif
319 
320 #if defined(__MICROBLAZE__)
321 #ifdef __LITTLE_ENDIAN__
322 static INLINE u16 Xil_In16BE(UINTPTR Addr)
323 #else
324 static INLINE u16 Xil_In16LE(UINTPTR Addr)
325 #endif
326 #else
327 static INLINE u16 Xil_In16BE(UINTPTR Addr)
328 #endif
329 {
330  u16 value = Xil_In16(Addr);
331  return Xil_EndianSwap16(value);
332 }
333 
334 #if defined(__MICROBLAZE__)
335 #ifdef __LITTLE_ENDIAN__
336 static INLINE u32 Xil_In32BE(UINTPTR Addr)
337 #else
338 static INLINE u32 Xil_In32LE(UINTPTR Addr)
339 #endif
340 #else
341 static INLINE u32 Xil_In32BE(UINTPTR Addr)
342 #endif
343 {
344  u32 value = Xil_In32(Addr);
345  return Xil_EndianSwap32(value);
346 }
347 
348 #if defined(__MICROBLAZE__)
349 #ifdef __LITTLE_ENDIAN__
350 static INLINE void Xil_Out16BE(UINTPTR Addr, u16 Value)
351 #else
352 static INLINE void Xil_Out16LE(UINTPTR Addr, u16 Value)
353 #endif
354 #else
355 static INLINE void Xil_Out16BE(UINTPTR Addr, u16 Value)
356 #endif
357 {
358  Value = Xil_EndianSwap16(Value);
359  Xil_Out16(Addr, Value);
360 }
361 
362 #if defined(__MICROBLAZE__)
363 #ifdef __LITTLE_ENDIAN__
364 static INLINE void Xil_Out32BE(UINTPTR Addr, u32 Value)
365 #else
366 static INLINE void Xil_Out32LE(UINTPTR Addr, u32 Value)
367 #endif
368 #else
369 static INLINE void Xil_Out32BE(UINTPTR Addr, u32 Value)
370 #endif
371 {
372  Value = Xil_EndianSwap32(Value);
373  Xil_Out32(Addr, Value);
374 }
375 
376 #ifdef __cplusplus
377 }
378 #endif
379 
380 #endif /* end of protection macro */
xil_types.h
INLINE
#define INLINE
Definition: xil_io.h:72
Xil_In32LE
#define Xil_In32LE
Definition: xil_io.h:311
__attribute__
union __attribute__((packed))
Definition: stepper.c:51
Xil_Out16LE
#define Xil_Out16LE
Definition: xil_io.h:312
Xil_In16LE
#define Xil_In16LE
Definition: xil_io.h:310
Xil_Out32LE
#define Xil_Out32LE
Definition: xil_io.h:313