|
@@ -0,0 +1,69 @@
|
|
|
+#ifndef IODEVA_H
|
|
|
+#define IODEVA_H
|
|
|
+
|
|
|
+#define _NEGBASE(b) ((0xffffffff << (b)) & 0xffffffff)
|
|
|
+#define XDEV_ADDR_BASE _NEGBASE(XDEV_ADDR_SHIFT+XDEV_ADDR_BITS)
|
|
|
+#define IODEV_ADDR_BASE _NEGBASE(IODEV_ADDR_SHIFT+IODEV_ADDR_BITS)
|
|
|
+
|
|
|
+/* Address for I/O device d, subregister r, offset o */
|
|
|
+#define IODEVA(b,r,o) ((b ## _BASE)+((r) << 2)+(o))
|
|
|
+
|
|
|
+#ifdef __ASSEMBLY__
|
|
|
+
|
|
|
+/*
|
|
|
+ * The I/O device range is designed so that it can be addressed via
|
|
|
+ * negative offsets from the zero register. Use (zero) after the
|
|
|
+ * macro in a load or store instruction.
|
|
|
+ */
|
|
|
+#define IODEVV(d,r) IODEVA(d,r,0)
|
|
|
+#define IODEVB0(d,r) IODEVA(d,r,0)
|
|
|
+#define IODEVB1(d,r) IODEVA(d,r,1)
|
|
|
+#define IODEVB2(d,r) IODEVA(d,r,2)
|
|
|
+#define IODEVB3(d,r) IODEVA(d,r,3)
|
|
|
+#define IODEVH0(d,r) IODEVA(d,r,0)
|
|
|
+#define IODEVH1(d,r) IODEVA(d,r,1)
|
|
|
+#define IODEVL(d,r) IODEVA(d,r,0)
|
|
|
+
|
|
|
+#define IODEVRV(d,r) IODEVA(d,r,0)
|
|
|
+#define IODEVRB0(d,r) IODEVA(d,r,0)
|
|
|
+#define IODEVRB1(d,r) IODEVA(d,r,1)
|
|
|
+#define IODEVRB2(d,r) IODEVA(d,r,2)
|
|
|
+#define IODEVRB3(d,r) IODEVA(d,r,3)
|
|
|
+#define IODEVRH0(d,r) IODEVA(d,r,0)
|
|
|
+#define IODEVRH1(d,r) IODEVA(d,r,1)
|
|
|
+#define IODEVRL(d,r) IODEVA(d,r,0)
|
|
|
+
|
|
|
+#define PTR(x) x
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+/* Writable registers */
|
|
|
+#define IODEVV(d,r) (*(volatile void *)IODEVA(d,r,0))
|
|
|
+#define IODEVB0(d,r) (*(volatile uint8_t *)IODEVA(d,r,0))
|
|
|
+#define IODEVB1(d,r) (*(volatile uint8_t *)IODEVA(d,r,1))
|
|
|
+#define IODEVB2(d,r) (*(volatile uint8_t *)IODEVA(d,r,2))
|
|
|
+#define IODEVB3(d,r) (*(volatile uint8_t *)IODEVA(d,r,3))
|
|
|
+#define IODEVH0(d,r) (*(volatile uint16_t *)IODEVA(d,r,0))
|
|
|
+#define IODEVH1(d,r) (*(volatile uint16_t *)IODEVA(d,r,2))
|
|
|
+#define IODEVL(d,r) (*(volatile uint32_t *)IODEVA(d,r,0))
|
|
|
+
|
|
|
+/* Readonly registers */
|
|
|
+#define IODEVRV(d,r) (*(const volatile void *)IODEVA(d,r,0))
|
|
|
+#define IODEVRB0(d,r) (*(const volatile uint8_t *)IODEVA(d,r,0))
|
|
|
+#define IODEVRB1(d,r) (*(const volatile uint8_t *)IODEVA(d,r,1))
|
|
|
+#define IODEVRB2(d,r) (*(const volatile uint8_t *)IODEVA(d,r,2))
|
|
|
+#define IODEVRB3(d,r) (*(const volatile uint8_t *)IODEVA(d,r,3))
|
|
|
+#define IODEVRH0(d,r) (*(const volatile uint16_t *)IODEVA(d,r,0))
|
|
|
+#define IODEVRH1(d,r) (*(const volatile uint16_t *)IODEVA(d,r,2))
|
|
|
+#define IODEVRL(d,r) (*(const volatile uint32_t *)IODEVA(d,r,0))
|
|
|
+
|
|
|
+#define PTR(x) (&(x))
|
|
|
+
|
|
|
+#endif /* __ASSEMBLY__ */
|
|
|
+
|
|
|
+#define IODEVB(d,r) IODEVB0(d,r)
|
|
|
+#define IODEVH(d,r) IODEVH0(d,r)
|
|
|
+#define IODEVRB(d,r) IODEVRB0(d,r)
|
|
|
+#define IODEVRH(d,r) IODEVRH0(d,r)
|
|
|
+
|
|
|
+#endif /* IODEVA_H */
|