summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/raspberrypi/include/raspberrypi.h
blob: ddcd4ffde966c875421af93b2acf81ebee2ac640 (plain) (blame)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/**
 * @file raspberrypi.h
 *
 * @ingroup raspberrypi_reg
 *
 * @brief Register definitions.
 */

/*
 *  Copyright (c) 2014 Andre Marques <andre.lousa.marques at gmail.com>
 *  Copyright (c) 2013 Alan Cudmore.
 *
 *  The license and distribution terms for this file may be
 *  found in the file LICENSE in this distribution or at
 *
 *  http://www.rtems.org/license/LICENSE
 *
 */

#ifndef LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H
#define LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H

#include <stdint.h>
#include <bsp/utility.h>

/**
 * @defgroup raspberrypi_reg Register Definitions
 *
 * @ingroup arm_raspberrypi
 *
 * @brief Register Definitions
 *
 * @{
 */

/**
 * @name Register Macros
 *
 * @{
 */

#define BCM2835_REG(x)           (*(volatile uint32_t *)(x))
#define BCM2835_BIT(n)           (1 << (n))

/** @} */

/**
 * @name Peripheral Base Register Address
 *
 * @{
 */

#if (BSP_IS_RPI2 == 1)
   #define RPI_PERIPHERAL_BASE      0x3F000000
#else
   #define RPI_PERIPHERAL_BASE      0x20000000
#endif

#define RPI_PERIPHERAL_SIZE         0x01000000

/**
 * @name Internal ARM Timer Registers
 *
 * @{
 */

#define BCM2835_CLOCK_FREQ       250000000

#define BCM2835_TIMER_BASE       (RPI_PERIPHERAL_BASE + 0xB400)

#define BCM2835_TIMER_LOD        (BCM2835_TIMER_BASE+0x00)
#define BCM2835_TIMER_VAL        (BCM2835_TIMER_BASE+0x04)
#define BCM2835_TIMER_CTL        (BCM2835_TIMER_BASE+0x08)
#define BCM2835_TIMER_CLI        (BCM2835_TIMER_BASE+0x0C)
#define BCM2835_TIMER_RIS        (BCM2835_TIMER_BASE+0x10)
#define BCM2835_TIMER_MIS        (BCM2835_TIMER_BASE+0x14)
#define BCM2835_TIMER_RLD        (BCM2835_TIMER_BASE+0x18)
#define BCM2835_TIMER_DIV        (BCM2835_TIMER_BASE+0x1C)
#define BCM2835_TIMER_CNT        (BCM2835_TIMER_BASE+0x20)

#define BCM2835_TIMER_PRESCALE    0xF9

/** @} */

/**
 * @name GPIO Registers
 *
 * @{
 */

#define BCM2835_GPIO_REGS_BASE   (RPI_PERIPHERAL_BASE + 0x200000)

#define BCM2835_GPIO_GPFSEL1     (BCM2835_GPIO_REGS_BASE+0x04)
#define BCM2835_GPIO_GPSET0      (BCM2835_GPIO_REGS_BASE+0x1C)
#define BCM2835_GPIO_GPCLR0      (BCM2835_GPIO_REGS_BASE+0x28)
#define BCM2835_GPIO_GPLEV0      (BCM2835_GPIO_REGS_BASE+0x34)
#define BCM2835_GPIO_GPEDS0      (BCM2835_GPIO_REGS_BASE+0x40)
#define BCM2835_GPIO_GPREN0      (BCM2835_GPIO_REGS_BASE+0x4C)
#define BCM2835_GPIO_GPFEN0      (BCM2835_GPIO_REGS_BASE+0x58)
#define BCM2835_GPIO_GPHEN0      (BCM2835_GPIO_REGS_BASE+0x64)
#define BCM2835_GPIO_GPLEN0      (BCM2835_GPIO_REGS_BASE+0x70)
#define BCM2835_GPIO_GPAREN0     (BCM2835_GPIO_REGS_BASE+0x7C)
#define BCM2835_GPIO_GPAFEN0     (BCM2835_GPIO_REGS_BASE+0x88)
#define BCM2835_GPIO_GPPUD       (BCM2835_GPIO_REGS_BASE+0x94)
#define BCM2835_GPIO_GPPUDCLK0   (BCM2835_GPIO_REGS_BASE+0x98)  

/** @} */

/**
 * @name AUX Registers
 *
 * @{
 */

#define BCM2835_AUX_BASE         (RPI_PERIPHERAL_BASE + 0x215000)

#define AUX_ENABLES              (BCM2835_AUX_BASE+0x04)
#define AUX_MU_IO_REG            (BCM2835_AUX_BASE+0x40)
#define AUX_MU_IER_REG           (BCM2835_AUX_BASE+0x44)
#define AUX_MU_IIR_REG           (BCM2835_AUX_BASE+0x48)
#define AUX_MU_LCR_REG           (BCM2835_AUX_BASE+0x4C)
#define AUX_MU_MCR_REG           (BCM2835_AUX_BASE+0x50)
#define AUX_MU_LSR_REG           (BCM2835_AUX_BASE+0x54)
#define AUX_MU_MSR_REG           (BCM2835_AUX_BASE+0x58)
#define AUX_MU_SCRATCH           (BCM2835_AUX_BASE+0x5C)
#define AUX_MU_CNTL_REG          (BCM2835_AUX_BASE+0x60)
#define AUX_MU_STAT_REG          (BCM2835_AUX_BASE+0x64)
#define AUX_MU_BAUD_REG          (BCM2835_AUX_BASE+0x68)

/** @} */

/**
 * @name UART 0 (PL011) Registers
 *
 * @{
 */

#define BCM2835_UART0_BASE       (RPI_PERIPHERAL_BASE + 0x201000)

#define BCM2835_UART0_DR         (BCM2835_UART0_BASE+0x00)
#define BCM2835_UART0_RSRECR     (BCM2835_UART0_BASE+0x04)
#define BCM2835_UART0_FR         (BCM2835_UART0_BASE+0x18)
#define BCM2835_UART0_ILPR       (BCM2835_UART0_BASE+0x20)
#define BCM2835_UART0_IBRD       (BCM2835_UART0_BASE+0x24)
#define BCM2835_UART0_FBRD       (BCM2835_UART0_BASE+0x28)
#define BCM2835_UART0_LCRH       (BCM2835_UART0_BASE+0x2C)
#define BCM2835_UART0_CR         (BCM2835_UART0_BASE+0x30)
#define BCM2835_UART0_IFLS       (BCM2835_UART0_BASE+0x34)
#define BCM2835_UART0_IMSC       (BCM2835_UART0_BASE+0x38)
#define BCM2835_UART0_RIS        (BCM2835_UART0_BASE+0x3C)
#define BCM2835_UART0_MIS        (BCM2835_UART0_BASE+0x40)
#define BCM2835_UART0_ICR        (BCM2835_UART0_BASE+0x44)
#define BCM2835_UART0_DMACR      (BCM2835_UART0_BASE+0x48)
#define BCM2835_UART0_ITCR       (BCM2835_UART0_BASE+0x80)
#define BCM2835_UART0_ITIP       (BCM2835_UART0_BASE+0x84)
#define BCM2835_UART0_ITOP       (BCM2835_UART0_BASE+0x88)
#define BCM2835_UART0_TDR        (BCM2835_UART0_BASE+0x8C)

#define BCM2835_UART0_MIS_RX    0x10
#define BCM2835_UART0_MIS_TX    0x20
#define BCM2835_UART0_IMSC_RX   0x10
#define BCM2835_UART0_IMSC_TX   0x20
#define BCM2835_UART0_FR_RXFE   0x10
#define BCM2835_UART0_FR_TXFF   0x20
#define BCM2835_UART0_ICR_RX    0x10
#define BCM2835_UART0_ICR_TX    0x20

/** @} */

/**
 * @name I2C (BSC) Registers
 *
 * @{
 */

#define BCM2835_I2C_BASE           (0x20804000)

#define BCM2835_I2C_C              (BCM2835_I2C_BASE+0x00)
#define BCM2835_I2C_S              (BCM2835_I2C_BASE+0x04)
#define BCM2835_I2C_DLEN           (BCM2835_I2C_BASE+0x08)
#define BCM2835_I2C_A              (BCM2835_I2C_BASE+0x0C)
#define BCM2835_I2C_FIFO           (BCM2835_I2C_BASE+0x10)
#define BCM2835_I2C_DIV            (BCM2835_I2C_BASE+0x14)
#define BCM2835_I2C_DEL            (BCM2835_I2C_BASE+0x18)
#define BCM2835_I2C_CLKT           (BCM2835_I2C_BASE+0x1C)

/** @} */

/**
 * @name SPI Registers
 *
 * @{
 */

#define BCM2835_SPI_BASE           (0x20204000)

#define BCM2835_SPI_CS             (BCM2835_SPI_BASE+0x00)
#define BCM2835_SPI_FIFO           (BCM2835_SPI_BASE+0x04)
#define BCM2835_SPI_CLK            (BCM2835_SPI_BASE+0x08)
#define BCM2835_SPI_DLEN           (BCM2835_SPI_BASE+0x0C)
#define BCM2835_SPI_LTOH           (BCM2835_SPI_BASE+0x10)
#define BCM2835_SPI_DC             (BCM2835_SPI_BASE+0x14)

/** @} */

/**
 * @name I2C/SPI slave BSC Registers
 *
 * @{
 */

#define BCM2835_I2C_SPI_BASE       (0x20214000)

#define BCM2835_I2C_SPI_DR         (BCM2835_I2C_SPI_BASE+0x00)
#define BCM2835_I2C_SPI_RSR        (BCM2835_I2C_SPI_BASE+0x04)
#define BCM2835_I2C_SPI_SLV        (BCM2835_I2C_SPI_BASE+0x08)
#define BCM2835_I2C_SPI_CR         (BCM2835_I2C_SPI_BASE+0x0C)
#define BCM2835_I2C_SPI_FR         (BCM2835_I2C_SPI_BASE+0x10)
#define BCM2835_I2C_SPI_IFLS       (BCM2835_I2C_SPI_BASE+0x14)
#define BCM2835_I2C_SPI_IMSC       (BCM2835_I2C_SPI_BASE+0x18)
#define BCM2835_I2C_SPI_RIS        (BCM2835_I2C_SPI_BASE+0x1C)
#define BCM2835_I2C_SPI_MIS        (BCM2835_I2C_SPI_BASE+0x20)
#define BCM2835_I2C_SPI_ICR        (BCM2835_I2C_SPI_BASE+0x24)
#define BCM2835_I2C_SPI_DMACR      (BCM2835_I2C_SPI_BASE+0x28)
#define BCM2835_I2C_SPI_TDR        (BCM2835_I2C_SPI_BASE+0x2C)
#define BCM2835_I2C_SPI_GPUSTAT    (BCM2835_I2C_SPI_BASE+0x30)
#define BCM2835_I2C_SPI_HCTRL      (BCM2835_I2C_SPI_BASE+0x34)

/** @} */

/**
 * @name IRQ Registers
 *
 * @{
 */

#define BCM2835_BASE_INTC         (RPI_PERIPHERAL_BASE + 0xB200)

#define BCM2835_IRQ_BASIC         (BCM2835_BASE_INTC + 0x00)
#define BCM2835_IRQ_PENDING1      (BCM2835_BASE_INTC + 0x04)
#define BCM2835_IRQ_PENDING2      (BCM2835_BASE_INTC + 0x08)
#define BCM2835_IRQ_FIQ_CTRL      (BCM2835_BASE_INTC + 0x0C)
#define BCM2835_IRQ_ENABLE1       (BCM2835_BASE_INTC + 0x10)
#define BCM2835_IRQ_ENABLE2       (BCM2835_BASE_INTC + 0x14)
#define BCM2835_IRQ_ENABLE_BASIC  (BCM2835_BASE_INTC + 0x18)
#define BCM2835_IRQ_DISABLE1      (BCM2835_BASE_INTC + 0x1C)
#define BCM2835_IRQ_DISABLE2      (BCM2835_BASE_INTC + 0x20)
#define BCM2835_IRQ_DISABLE_BASIC (BCM2835_BASE_INTC + 0x24)

/** @} */

/**
 * @name GPU Timer Registers
 *
 * @{
 */

/**
 * NOTE: The GPU uses Compare registers 0 and 2 for
 *       it's own RTOS. 1 and 3 are available for use in
 *       RTEMS.
 */
#define BCM2835_GPU_TIMER_BASE    (RPI_PERIPHERAL_BASE + 0x3000)

#define BCM2835_GPU_TIMER_CS      (BCM2835_TIMER_BASE+0x00)
#define BCM2835_GPU_TIMER_CLO     (BCM2835_TIMER_BASE+0x04)
#define BCM2835_GPU_TIMER_CHI     (BCM2835_TIMER_BASE+0x08)
#define BCM2835_GPU_TIMER_C0      (BCM2835_TIMER_BASE+0x0C)
#define BCM2835_GPU_TIMER_C1      (BCM2835_TIMER_BASE+0x10)
#define BCM2835_GPU_TIMER_C2      (BCM2835_TIMER_BASE+0x14)
#define BCM2835_GPU_TIMER_C3      (BCM2835_TIMER_BASE+0x18)

/** @} */

/** @} */

#endif /* LIBBSP_ARM_RASPBERRYPI_RASPBERRYPI_H */