summaryrefslogtreecommitdiffstats
path: root/user/bsps/aarch64/raspberrypi4.rst
blob: efb09b6991f13db2e5c908eec927a877ff892bb9 (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
.. SPDX-License-Identifier: CC-BY-SA-4.0

.. Copyright (C) 2022 Mohd Noor Aman

.. _BSP_aarch64_Raspberrypi_4:

Raspberry Pi 4B
===============

The 'raspberrypi4b' BSP currently supports only the LP64 ABI. ILP32 is not
supported. Raspberry pi 4B all variants and Raspberry Pi 400  are supported. The
default bootloader which is used by the Raspbian OS or other OS can be used to
boot RTEMS. SMP is currently not supported.

Raspberry Pi 4B has 2 types of interrupt controller, GIC-400 (GICv2) and ARM
legacy generic controller. Both are supported. By default, raspberrypi 4B uses
ARM legacy generic controller. Set ``enable_gic=1`` in the ``config.txt`` file
to enable GIC.

Clock Driver
------------

The clock driver uses the `ARM Generic Timer`.

Console Driver
--------------

Raspberry pi 4B has 2 types of UARTs, ARM PL011 and Mini-uart. The PL011 is a
capable, broadly 16550-compatible UART, while the mini UART has a reduced
feature set. The console driver supports the default Qemu emulated ARM PL011
PrimeCell UART as well as the physical ARM PL011 PrimeCell UART in the
raspberrypi hardware. Mini-uart is not supported.

Preparing to boot
------------------

Raspberry Pi uses a different mechanism to boot when compared with any ARM SoC.
First the GPU initializes, loads the bootloader (Raspberry pi firmware) and then
looks for the kernel img. This whole process is done by the GPU (VideoCore IV)
till the kernel is loaded. More information can be found on the `Raspberry pi
documentation page
<https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#boot-sequence>`_.
By default the arm64 mode looks for the ``kernel8.img``. Any other kernel can be
loaded by adding ``kernel=<img_name>`` to the ``config.txt`` file.

The Firmware files are required in order to boot RTEMS. The latest firmware can
be downloaded from the `Raspberry Pi Firmware Repository
<https://github.com/raspberrypi/firmware/>`_. USB boot is supported. All the
files (Firmwares and kernel) must be place in the FAT32 partition only. Add
``arm_64bit=1`` in the ``config.txt`` file in order to boot the BSP in 64bit
kernel mode.


UART Setup
^^^^^^^^^^

Connect your serial device to the GPIO15 and GPIO14. Add the following to the
``config.txt`` file in order to use the PL011 UART0 and thus disabling the
default Mini-uart.

.. code-block:: none

  # if user wants to enable GIC, uncomment the next line
  # enable_gic=1
  arm_64bit=1
  dtoverlay = disable-bt
  enable_uart=1

.. note::
  The Raspberry Pi 4B and 400 have an additional four PL011 UARTs. They are not
  supported.

Generating kernel image
^^^^^^^^^^^^^^^^^^^^^^^

The following steps show how to run ``hello.exe`` on the BSP. Other executables
can be processed in a similar way.

To create the kernel image:

.. code-block:: shell

  $ aarch64-rtems@rtems-ver-major@-objcopy -Obinary hello.exe kernel8.img

Copy the kernel image to the SD card.

JTAG Setup
----------

The Raspberry Pi 4 doesn't have dedicated JTAG pins. Instead, you must configure
the GPIO pins (GPIO22-GPIO27) to activate the JTAG functionality. The RPi 4
documentation refers to this as Alt4 functions of those pins. Alt5 does exist
too, which goes from GPIO4, 5, 6, 12 and 13. you can check this out from
`pinout.xyz <https://pinout.xyz/pinout/jtag#>`_ or `eLinux
<https://elinux.org/RPi_BCM2835_GPIOs>`_

One more thing to note on JTAG with Raspberry pi 4B is that, by default, All the
GPIO pins are pulled down, according to the `BCM2711 documentation
<https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf>`_. This
wasn't the case in the earlier models. So in order to let the data flow freely,
we will have to disable them.

.. code-block:: none

  # Disable pull downs
  gpio=22-27=np

  # Enable jtag pins (i.e. GPIO22-GPIO27)
  enable_jtag_gpio=1