1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#ifndef SYMBOLS_H
#define SYMBOLS_H
enum
{
// The offset for the MMIO area
#ifdef BSP23
MMIO_BASE = 0x3F000000, // For Raspberry Pi 2 and 3
#else
MMIO_BASE = 0xFE000000,
#endif
// The offsets for reach register.
GPIO_BASE = (MMIO_BASE + 0x200000),
UART_FIFO_18 = 0,
UART_FIFO_14 = 1,
UART_FIFO_12 = 2,
UART_FIFO_34 = 3,
UART_FIFO_78 = 4,
//// The base address for UART.
UART0_BASE = (GPIO_BASE + 0x1000), // for raspi4 0xFE201000, raspi2 & 3 0x3F201000, and 0x20201000 for raspi1
// The offsets for reach register for the UART.
UART0_DR = (UART0_BASE + 0x00),
UART0_RSRECR = (UART0_BASE + 0x04),
UART0_FR = (UART0_BASE + 0x18),
UART0_ILPR = (UART0_BASE + 0x20),
UART0_IBRD = (UART0_BASE + 0x24),
UART0_FBRD = (UART0_BASE + 0x28),
UART0_LCRH = (UART0_BASE + 0x2C),
UART0_CR = (UART0_BASE + 0x30),
UART0_IFLS = (UART0_BASE + 0x34),
UART0_IMSC = (UART0_BASE + 0x38),
UART0_RIS = (UART0_BASE + 0x3C),
UART0_MIS = (UART0_BASE + 0x40),
UART0_ICR = (UART0_BASE + 0x44),
UART0_DMACR = (UART0_BASE + 0x48),
UART0_ITCR = (UART0_BASE + 0x80),
UART0_ITIP = (UART0_BASE + 0x84),
UART0_ITOP = (UART0_BASE + 0x88),
UART0_TDR = (UART0_BASE + 0x8C),
// IRQ REGISTERS
IRQ_BASE = (MMIO_BASE + 0xB000),
IRQ_BASIC_PENDING = (IRQ_BASE + 0x200),
IRQ_PENDING1 = (IRQ_BASE + 0x204),
IRQ_PENDING2 = (IRQ_BASE + 0x208),
FIQ_CONTROL = (IRQ_BASE + 0x20C),
IRQ_ENABLE1 = (IRQ_BASE + 0x210),
IRQ_ENABLE2 = (IRQ_BASE + 0x214),
IRQ_BASIC_ENABLE = (IRQ_BASE + 0x218),
IRQ_DISABLE1 = (IRQ_BASE + 0x21C),
IRQ_DISABLE2 = (IRQ_BASE + 0x220),
IRQ_BASIC_DISABLE = (IRQ_BASE + 0x224),
// Peripherals Interrupts
UART_0_IRQ = 57,
GPIO_IRQ_0 = 49,
GPIO_IRQ_1 = 50,
GPIO_IRQ_2 = 51,
GPIO_IRQ_3 = 52,
FIQ_ENABLE_FLAG = 1<<7,
// ARM Peripheral Interrupts
TIMER_ARM_IRQ = 0,
MAILBOX_ARM_IRQ = 1,
DOORBELL0_ARM_IRQ = 2,
DOORBELL1_ARM_IRQ = 3,
GPU0HALT_ARM_IRQ = 4,
GPU1HALT_ARM_IRQ = 5,
// The offsets for Mailbox registers
MBOX_BASE = 0xB880,
MBOX_READ = (MBOX_BASE + 0x00),
MBOX_STATUS = (MBOX_BASE + 0x18),
MBOX_WRITE = (MBOX_BASE + 0x20),
GPU_INTERRUPTS_ROUTING = 0x4000000C,
CORE0_TIMER_IRQCNTL = 0x40000040,
CORE1_TIMER_IRQCNTL = 0x40000044,
CORE2_TIMER_IRQCNTL = 0x40000048,
CORE3_TIMER_IRQCNTL = 0x4000004c,
CORE0_MBOX_IRQCNTL = 0x40000050,
CORE1_MBOX_IRQCNTL = 0x40000054,
CORE2_MBOX_IRQCNTL = 0x40000058,
CORE3_MBOX_IRQCNTL = 0x4000005c,
CORE0_IRQ_SOURCE = 0x40000060,
CORE1_IRQ_SOURCE = 0x40000064,
CORE2_IRQ_SOURCE = 0x40000068,
CORE3_IRQ_SOURCE = 0x4000006c,
CORE0_FIQ_SOURCE = 0x40000070,
CORE1_FIQ_SOURCE = 0x40000074,
CORE2_FIQ_SOURCE = 0x40000078,
CORE3_FIQ_SOURCE = 0x4000007c,
SYS_TIMER_CS = (MMIO_BASE + 0x3000),
SYS_TIMER_CHI = (MMIO_BASE + 0x3004),
SYS_TIMER_CLO = (MMIO_BASE + 0x3008),
SYS_TIMER_C0 = (MMIO_BASE + 0x300c),
SYS_TIMER_C1 = (MMIO_BASE + 0x3010),
SYS_TIMER_C2 = (MMIO_BASE + 0x3014),
SYS_TIMER_C3 = (MMIO_BASE + 0x3018),
SYS_TIMER_SC_M0 = (1 << 0),
SYS_TIMER_SC_M1 = (1 << 1),
SYS_TIMER_SC_M2 = (1 << 2),
SYS_TIMER_SC_M3 = (1 << 3),
};
#define GPFSEL0 ((volatile unsigned int*)(MMIO_BASE+0x00200000))
#define GPFSEL1 ((volatile unsigned int*)(MMIO_BASE+0x00200004))
#define GPFSEL2 ((volatile unsigned int*)(MMIO_BASE+0x00200008))
#define GPFSEL3 ((volatile unsigned int*)(MMIO_BASE+0x0020000C))
#define GPFSEL4 ((volatile unsigned int*)(MMIO_BASE+0x00200010))
#define GPFSEL5 ((volatile unsigned int*)(MMIO_BASE+0x00200014))
#define GPSET0 ((volatile unsigned int*)(MMIO_BASE+0x0020001C))
#define GPSET1 ((volatile unsigned int*)(MMIO_BASE+0x00200020))
#define GPCLR0 ((volatile unsigned int*)(MMIO_BASE+0x00200028))
#define GPLEV0 ((volatile unsigned int*)(MMIO_BASE+0x00200034))
#define GPLEV1 ((volatile unsigned int*)(MMIO_BASE+0x00200038))
#define GPEDS0 ((volatile unsigned int*)(MMIO_BASE+0x00200040))
#define GPEDS1 ((volatile unsigned int*)(MMIO_BASE+0x00200044))
#define GPREN0 ((volatile unsigned int*)(MMIO_BASE+0x0020004C))
#define GPREN1 ((volatile unsigned int*)(MMIO_BASE+0x00200050))
#define GPFEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200058))
#define GPFEN1 ((volatile unsigned int*)(MMIO_BASE+0x0020005C))
#define GPAREN0 ((volatile unsigned int*)(MMIO_BASE+0x0020007C))
#define GPAREN1 ((volatile unsigned int*)(MMIO_BASE+0x00200080))
#define GPAFEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200088))
#define GPAFEN1 ((volatile unsigned int*)(MMIO_BASE+0x0020008C))
#define GPHEN0 ((volatile unsigned int*)(MMIO_BASE+0x00200064))
#define GPHEN1 ((volatile unsigned int*)(MMIO_BASE+0x00200068))
// Controls actuation of pull up/down to ALL GPIO pins.
#define GPPUD ((volatile unsigned int*)(MMIO_BASE+0x00200094))
//// Controls actuation of pull up/down for specific GPIO pin.
#define GPPUDCLK0 ((volatile unsigned int*)(MMIO_BASE+0x00200098))
#define GPPUDCLK1 ((volatile unsigned int*)(MMIO_BASE+0x0020009C))
#endif
|