BCM2837 ARM Peripherals
V2.1
Revised edition by FA on 2018/03/20 partially based on the valuable errata information available in:
https://elinux.org/BCM2835_datasheet_errata and starting from a previous updated document done
by a professor at Stanford: https://web.stanford.edu/class/cs140e/docs/BCM2837-ARM-Peripherals.pdf
© 2012 Broadcom Corporation.
All rights reserved
Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Table of Contents
Introduction
Overview
Address map
1
1.1
1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.3
Diagrammatic overview
ARM virtual addresses (standard Linux kernel only)
ARM physical addresses
Bus addresses
Peripheral access precautions for correct memory ordering
Overview
Mini UART
AUX registers
2 Auxiliaries: UART1 & SPI1, SPI2
2.1
2.1.1
2.2
2.2.1
2.2.2
2.3
2.3.1
2.3.2
2.3.3
2.3.4
SPI implementation details
Interrupts
Long bit streams
SPI register details.
Universal SPI Master (2x)
Mini UART implementation details.
Mini UART register details.
3 BSC
3.1
3.2
3.3
Introduction
Register View
10 Bit Addressing
Overview
DMA Controller Registers
4 DMA Controller
4.1
4.2
4.2.1
4.3
4.4
4.5
AXI Bursts
Error Handling
DMA LITE Engines
DMA Channel Register Address Map
5
o
o
External Mass Media Controller
Introduction
Registers
6 General Purpose I/O (GPIO)
6.1
6.2
6.3
Register View
Alternative Function Assignments
General Purpose GPIO Clocks
7
7.1
7.2
7.3
7.4
7.5
Interrupts
Introduction
Interrupt pending.
Fast Interrupt (FIQ).
Interrupt priority.
Registers
PCM / I2S Audio
Block Diagram
Typical Timing
Operation
Software Operation
8
8.1
8.2
8.3
8.4
8.4.1
8.4.2
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Operating in Polled mode
Operating in Interrupt mode
© 2012 Broadcom Corporation. All rights reserved
4
4
4
4
6
6
6
7
8
8
9
10
11
11
20
20
21
21
22
28
28
28
36
38
38
39
40
63
63
63
65
65
66
89
90
102
105
109
109
110
110
110
112
119
120
120
121
122
122
123
Page ii
8.4.3
8.5
8.6
8.7
8.8
DMA
Error Handling.
PDM Input Mode Operation
GRAY Code Input Mode Operation
PCM Register Map
9
9.1
9.2
9.3
9.4
9.5
9.6
Pulse Width Modulator
Overview
Block Diagram
PWM Implementation
Modes of Operation
Quick Reference
Control and Status Registers
10 SPI
10.1
10.2
10.2.1
10.2.2
10.3
10.3.1
10.3.2
10.3.3
10.3.4
10.3.5
10.4
10.5
10.6
10.6.1
10.6.2
10.6.3
10.6.4
Introduction
SPI Master Mode
Standard mode
Bidirectional mode
LoSSI mode
Command write
Parameter write
Byte read commands
24bit read command
32bit read command
Block Diagram
SPI Register Map
Software Operation
Polled
Interrupt
DMA
Notes
11 SPI/BSC SLAVE
11.1
Introduction
11.2
Registers
12 System Timer
12.1
System Timer Registers
13 UART
13.1
13.2
13.3
13.4
Variations from the 16C650 UART
Primary UART Inputs and Outputs
UART Interrupts
Register View
14 Timer (ARM side)
14.1
14.2
Introduction
Timer Registers:
15 USB
15.1
15.2
Configuration
Extra / Adapted registers.
123
123
124
124
125
138
138
138
139
139
140
141
148
148
148
148
149
150
150
150
151
151
151
152
152
158
158
158
158
159
160
160
160
172
172
175
175
176
176
177
196
196
196
200
200
202
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Page iii
© 2012 Broadcom Corporation. All rights reserved
1
Introduction
1.1 Overview
BCM2835 contains the following peripherals which may safely be accessed by the ARM:
Interrupt controller
• Timers
•
• GPIO
• USB
• PCM / I2S
• DMA controller
•
•
• SPI0, SPI1, SPI2
• PWM
• UART0, UART1
I2C master
I2C / SPI slave
The purpose of this datasheet is to provide documentation for these peripherals in sufficient
detail to allow a developer to port an operating system to BCM2835.
There are a number of peripherals which are intended to be controlled by the GPU. These are
omitted from this datasheet. Accessing these peripherals from the ARM is not recommended.
1.2 Address map
1.2.1 Diagrammatic overview
In addition to the ARM’s MMU, BCM2835 includes a second coarse-grained MMU for
mapping ARM physical addresses onto system bus addresses. This diagram shows the main
address spaces of interest:
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Page 4
© 2012 Broadcom Corporation. All rights reserved
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Page 5
© 2012 Broadcom Corporation. All rights reserved
Addresses in ARM Linux are:
issued as virtual addresses by the ARM core, then
•
• mapped into a physical address by the ARM MMU, then
• mapped into a bus address by the ARM mapping MMU, and finally
• used to select the appropriate peripheral or location in RAM.
1.2.2 ARM virtual addresses (standard Linux kernel only)
As is standard practice, the standard BCM2835 Linux kernel provides a contiguous mapping
over the whole of available RAM at the top of memory. The kernel is configured for a
1GB/3GB split between kernel and user-space memory.
The split between ARM and GPU memory is selected by installing one of the supplied
start*.elf files as start.elf in the FAT32 boot partition of the SD card. The minimum amount
of memory which can be given to the GPU is 32MB, but that will restrict the multimedia
performance; for example, 32MB does not provide enough buffering for the GPU to do
1080p30 video decoding.
Virtual addresses in kernel mode will range between 0xC0000000 and 0xEFFFFFFF.
Virtual addresses in user mode (i.e. seen by processes running in ARM Linux) will range
between 0x00000000 and 0xBFFFFFFF.
Peripherals (at physical address 0x3F000000 on) are mapped into the kernel virtual address
space starting at address 0xF2000000. Thus a peripheral advertised here at bus address
0x7Ennnnnn is available in the ARM kenel at virtual address 0xF2nnnnnn.
1.2.3 ARM physical addresses
Physical addresses start at 0x00000000 for RAM.
• The ARM section of the RAM starts at 0x00000000.
• The VideoCore section of the RAM is mapped in only if the system is configured to
support a memory mapped display (this is the common case).
The VideoCore MMU maps the ARM physical address space to the bus address space seen
by VideoCore (and VideoCore peripherals). The bus addresses for RAM are set up to map
onto the uncached1 bus address range on the VideoCore starting at 0xC0000000.
Physical addresses range from 0x3F000000 to 0x3FFFFFFF for peripherals. The
bus addresses for peripherals are set up to map onto the peripheral bus address range
starting at 0x7E000000. Thus a peripheral advertised here at bus address 0x7Ennnnnn is
available at physical address 0x3Fnnnnnn.
1.2.4 Bus addresses
The peripheral addresses specified in this document are bus addresses. Software directly
accessing peripherals must translate these addresses into physical or virtual addresses, as
described above. Software accessing peripherals using the DMA engines must use bus
addresses.
1 BCM2835 provides a 128KB system L2 cache, which is used primarily by the GPU. Accesses to memory are
routed either via or around the L2 cache depending on senior two bits of the bus address.
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Page 6
© 2012 Broadcom Corporation. All rights reserved
Software accessing RAM directly must use physical addresses (based at 0x00000000).
Software accessing RAM using the DMA engines must use bus addresses (based at
0xC0000000).
1.3 Peripheral access precautions for correct memory ordering
The BCM2835 system uses an AMBA AXI-compatible interface structure. In order to keep
the system complexity low and data throughput high, the BCM2835 AXI system does not
always return read data in-order2. The GPU has special logic to cope with data arriving out-
of-order; however the ARM core does not contain such logic. Therefore some precautions
must be taken when using the ARM to access peripherals.
Accesses to the same peripheral will always arrive and return in-order. It is only when
switching from one peripheral to another that data can arrive out-of-order. The simplest way
to make sure that data is processed in-order is to place a memory barrier instruction at critical
positions in the code. You should place:
• A memory write barrier before the first write to a peripheral.
• A memory read barrier after the last read of a peripheral.
It is not required to put a memory barrier instruction after each read or write access. Only at
those places in the code where it is possible that a peripheral read or write may be followed
by a read or write of a different peripheral. This is normally at the entry and exit points of the
peripheral service code.
As interrupts can appear anywhere in the code so you should safeguard those. If an interrupt
routine reads from a peripheral the routine should start with a memory read barrier. If an
interrupt routine writes to a peripheral the routine should end with a memory write barrier.
2Normally a processor assumes that if it executes two read operations the data will arrive in order. So a read
from location X followed by a read from location Y should return the data of location X first, followed by the
data of location Y. Data arriving out of order can have disastrous consequences. For example:
a_status = *pointer_to_peripheral_a;
b_status = *pointer_to_peripheral_b;
Without precautions the values ending up in the variables a_status and b_status can be swapped around.
It is theoretical possible for writes to go ‘wrong’ but that is far more difficult to achieve. The AXI system
makes sure the data always arrives in-order at its intended destination. So:
*pointer_to_peripheral_a = value_a;
*pointer_to_peripheral_b = value_b;
will always give the expected result. The only time write data can arrive out-of-order is if two different
peripherals are connected to the same external equipment.
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Page 7
© 2012 Broadcom Corporation. All rights reserved
2 Auxiliaries: UART1 & SPI1, SPI2
2.1 Overview
The Device has three Auxiliary peripherals: One mini UART and two SPI masters. These
three peripheral are grouped together as they share the same area in the peripheral register
map and they share a common interrupt. Also all three are controlled by the auxiliary enable
register.
Auxiliary peripherals Register Map
(offset = 0x7E21 5000)
Address
Register Name3
Description
Size
0x7E21 5000 AUX_IRQ
Auxiliary Interrupt status
0x7E21 5004 AUX_ENABLES
Auxiliary enables
0x7E21 5040 AUX_MU_IO_REG
Mini Uart I/O Data
0x7E21 5044 AUX_MU_IER_REG
Mini Uart Interrupt Enable
3
3
8
8
0x7E21 5048 AUX_MU_IIR_REG
Mini Uart Interrupt Identify 8
0x7E21 504C AUX_MU_LCR_REG
Mini Uart Line Control
0x7E21 5050 AUX_MU_MCR_REG
Mini Uart Modem Control
0x7E21 5054 AUX_MU_LSR_REG
Mini Uart Line Status
0x7E21 5058 AUX_MU_MSR_REG
Mini Uart Modem Status
0x7E21 505C AUX_MU_SCRATCH
Mini Uart Scratch
0x7E21 5060 AUX_MU_CNTL_REG Mini Uart Extra Control
0x7E21 5064 AUX_MU_STAT_REG Mini Uart Extra Status
0x7E21 5068 AUX_MU_BAUD_REG Mini Uart Baudrate
0x7E21 5080 AUX_SPI1_CNTL0_REG SPI 1 Control register 0
0x7E21 5084 AUX_SPI1_CNTL1_REG SPI 1 Control register 1
0x7E21 5088 AUX_SPI1_STAT_REG
SPI 1 Status
0x7E21 5090 AUX_SPI1_IO_REG
SPI 1 Data
0x7E21 5094 AUX_SPI1_PEEK_REG
SPI 1 Peek
0x7E21 50C0 AUX_SPI2_CNTL0_REG SPI 2 Control register 0
0x7E21 50C4 AUX_SPI2_CNTL1_REG SPI 2 Control register 1
8
8
8
8
8
8
32
16
32
8
32
32
16
32
8
3 These register names are identical to the defines in the AUX_IO header file. For programming purposes these
names should be used wherever possible.
06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW
Page 8
© 2012 Broadcom Corporation. All rights reserved