interrupts, timers, under construction
[rpikern] / src / rpi_ioreg.h
diff --git a/src/rpi_ioreg.h b/src/rpi_ioreg.h
new file mode 100644 (file)
index 0000000..aca3a9f
--- /dev/null
@@ -0,0 +1,133 @@
+#ifndef RPI_IOREG_H_
+#define RPI_IOREG_H_
+
+#include "rpi.h"
+
+#define IOREG(offs)            (*(volatile uint32_t*)(rpi_iobase | offs))
+
+/* System timer */
+#define STM_CTL_REG            IOREG(0x3000)
+#define STM_STAT_REG   STM_CTL_REG
+#define STM_LCNT_REG   IOREG(0x3004)
+#define STM_HCNT_REG   IOREG(0x3008)
+#define STM_CMP0_REG   IOREG(0x300c)
+#define STM_CMP1_REG   IOREG(0x3010)
+#define STM_CMP2_REG   IOREG(0x3014)
+#define STM_CMP3_REG   IOREG(0x3018)
+
+#define STMCTL_M0              1
+#define STMCTL_M1              2
+#define STMCTL_M2              4
+#define STMCTL_M3              8
+
+/* TIMER */
+#define TM_LOAD_REG            IOREG(0xb400)
+#define TM_VALUE_REG   IOREG(0xb404)
+#define TM_CTL_REG             IOREG(0xb408)
+#define TM_ICLR_REG            IOREG(0xb40c)
+#define TM_IRAW_REG            IOREG(0xb410)
+#define TM_IMSK_REG            IOREG(0xb414)
+#define TM_RELOAD_REG  IOREG(0xb418)
+#define TM_PREDIV_REG  IOREG(0xb41c)
+#define TM_COUNT_REG   IOREG(0xb420)
+
+#define TMCTL_23BIT            0x000002
+#define TMCTL_DIV16            0x000004
+#define TMCTL_DIV256   0x000008
+#define TMCTL_DIV1             0x00000c
+#define TMCTL_IEN              0x000020
+#define TMCTL_EN               0x000080
+#define TMCTL_DBGHALT  0x000100
+#define TMCTL_CNTEN            0x000200
+
+#define TMCTL_PRESCALER(x)     (((uint32_t)(x) & 0xff) << 16)
+
+/* watchdog */
+#define PM_RSTC_REG            IOREG(0x10001c)
+#define PM_WDOG_REG            IOREG(0x100024)
+
+#define PM_PASSWD                      0x5a000000
+#define PMRSTC_WRCFG_FULL_RESET        0x00000020
+#define PMRSTC_WRCFG_CLEAR             0xffffffcf
+
+/* MAILBOX */
+#define MBOX_READ_REG  IOREG(0xb880)
+#define MBOX_POLL_REG  IOREG(0xb890)
+#define MBOX_SENDER_REG        IOREG(0xb894)
+#define MBOX_STATUS_REG        IOREG(0xb898)
+#define MBOX_CFG_REG   IOREG(0xb89c)
+#define MBOX_WRITE_REG IOREG(0xb8a0)
+
+/* the full bit is set when there's no space to append messages */
+#define MBOX_STAT_FULL 0x80000000
+/* the empty bit is set when there are no pending messages to be read */
+#define MBOX_STAT_EMPTY        0x40000000
+
+/* IRQ */
+#define IRQ_PENDING0_REG       IOREG(0xb200)
+#define IRQ_PENDING1_REG       IOREG(0xb204)
+#define IRQ_PENDING2_REG       IOREG(0xb208)
+#define IRQ_FIQCTL_REG         IOREG(0xb20c)
+#define IRQ_ENABLE1_REG                IOREG(0xb210)
+#define IRQ_ENABLE2_REG                IOREG(0xb214)
+#define IRQ_ENABLE0_REG                IOREG(0xb218)
+#define IRQ_DISABLE1_REG       IOREG(0xb21c)
+#define IRQ_DISABLE2_REG       IOREG(0xb220)
+#define IRQ_DISABLE0_REG       IOREG(0xb224)
+
+#define IRQ_TIMER      0
+#define IRQ_MBOX       1
+#define IRQ_DOORB0     2
+#define IRQ_DOORB1     3
+#define IRQ_GPU0HLT    4
+#define IRQ_GPU1HLT    5
+#define IRQ_ILL1       6
+#define IRQ_ILL0       7
+
+#define IRQ_GPU_TIMER0         0
+#define IRQ_GPU_TIMER1         1
+#define IRQ_GPU_TIMER2         2
+#define IRQ_GPU_TIMER3         3
+#define IRQ_GPU_AUX                    29
+#define IRQ_GPU_I2C_SPI_SLV    43
+#define IRQ_GPU_PWA0           45
+#define IRQ_GPU_PWA1           46
+#define IRQ_GPU_SMI                    48
+#define IRQ_GPU_GPIO0          49
+#define IRQ_GPU_GPIO1          50
+#define IRQ_GPU_GPIO2          51
+#define IRQ_GPU_GPIO3          52
+#define IRQ_GPU_I2C                    53
+#define IRQ_GPU_SPI                    54
+#define IRQ_GPU_PCM                    55
+#define IRQ_GPU_UART           57
+
+/* IRQ_PENDING0_REG flags (pending basic interrupts) */
+#define IRQ_PEND0_TIMER                0x0000001
+#define IRQ_PEND0_MBOX         0x0000002
+#define IRQ_PEND0_DOORB0       0x0000004
+#define IRQ_PEND0_DOORB1       0x0000008
+#define IRQ_PEND0_GPU0HLT      0x0000010
+#define IRQ_PEND0_GPU1HLT      0x0000020
+#define IRQ_PEND0_ILL1         0x0000040
+#define IRQ_PEND0_ILL0         0x0000080
+#define IRQ_PEND0_PEND2                0x0000100
+#define IRQ_PEND0_PEND1                0x0000200
+#define IRQ_PEND0_GPU_IRQ7     0x0000400
+#define IRQ_PEND0_GPU_IRQ9     0x0000800
+#define IRQ_PEND0_GPU_IRQ10    0x0001000
+#define IRQ_PEND0_GPU_IRQ18    0x0002000
+#define IRQ_PEND0_GPU_IRQ19    0x0004000
+#define IRQ_PEND0_GPU_I2C      0x0008000
+#define IRQ_PEND0_GPU_SPI      0x0010000
+#define IRQ_PEND0_GPU_PCM      0x0020000
+#define IRQ_PEND0_GPU_IRQ56    0x0040000
+#define IRQ_PEND0_GPU_UART     0x0080000
+#define IRQ_PEND0_GPU_IRQ62    0x0100000
+
+/* IRQ_FIQCTL_REG */
+#define IRQ_FIQCTL_SELGPU(x)   (x)
+#define IRQ_FIQCTL_SELARM(x)   ((x) + 64)
+#define IRQ_FIQCTL_ENABLE              0x80
+
+#endif /* RPI_IOREG_H_ */