README.txt
==========
This board configuration will use FVP_BaseR_AEMv8R to emulate
generic ARM64v8-R (Cotex-R82) series hardware platform and
provides support for these devices:
- GICv3 interrupt controllers for ARMv8-r
- PL011 UART controller(FVP)
Contents
========
- Getting Started
- Status
- Platform Features
- References
Getting Started
===============
1. Compile Toolchain
The FVP platform using same Compiler like qemu, read the following
file for How to get the Tool:
https://github.com/apache/nuttx/tree/master/boards/arm64/qemu/qemu-armv8a
Note:
1 My host environment is Ubuntu 22.04.1 LTS, Ubuntu 18.04 will work too
2 The newest GNU toolchain is 12.2, available from:
https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
2. Getting Armv8-R AEM FVP
The Armv8-R AEM FVP is a free of charge Armv8-R Fixed Virtual Platform.
It supports the latest Armv8-R feature set. we can get it from:
https://developer.arm.com/downloads/-/arm-ecosystem-models
Please select to download Armv8-R AEM FVP product, extract the tool package
the FVP tool is locate at:
AEMv8R_FVP/AEMv8R_base_pkg/models/Linux64_GCC-9.3/FVP_BaseR_AEMv8R
3. Configuring and building
3.1 FVP Overview
Just like QEMU, Fixed Virtual Platforms (FVP) are complete simulations of an Arm system,
including processor, memory and peripherals. These are set out in a "programmer's view",
which gives you a comprehensive model on which to build and test your software.
The FVP tools simulate 4 serial port and implement them to wait on local socket port:
$ /home/qinwei/workdir/tools/AEMv8R_FVP/AEMv8R_base_pkg/models/Linux64_GCC-9.3/FVP_BaseR_AEMv8R \
-f boards/arm64/fvp-v8r/fvp-armv8r/scripts/fvp_cfg.txt -a ./nuttx
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
FVP has four UART port and I choice UART1 as tty, so just telnet to port 5001
will enter nsh:
telnet localhost 5001
3.1 Single Core
Configuring NuttX and compile:
$ ./tools/configure.sh -l fvp-armv8r:nsh
$ make
3.2 SMP
Configuring NuttX and compile:
$ ./tools/configure.sh -l fvp-armv8r:nsh_smp
$ make
4. Running
4.1 Single Core
Step1: Booting NuttX
$ AEMv8R_FVP/AEMv8R_base_pkg/models/Linux64_GCC-9.3/FVP_BaseR_AEMv8R \
-f boards/arm64/fvp-v8r/fvp-armv8r/scripts/fvp_cfg.txt \
-a ./nuttx
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
- Ready to Boot Primary CPU
- Boot from EL2
- Boot from EL1
- Boot to C runtime for OS Initialize
[ 0] (null): arm64_chip_boot: Main CPU 0x80000000
[ 0] (null): nx_start: Entry
[ 0] (null): up_allocate_heap: heap_start=0x0x3c000, heap_size=0x7fc4000
[ 0] Idle Task: gic_validate_dist_version: GICv3 version detect
[ 0] Idle Task: gic_validate_dist_version: GICD_TYPER = 0x490067
[ 0] Idle Task: gic_validate_dist_version: 224 SPIs implemented
[ 0] Idle Task: gic_validate_dist_version: 0 Extended SPIs implemented
[ 0] Idle Task: gic_validate_dist_version: Distributor has no Range Selector support
[ 0] Idle Task: gic_validate_dist_version: MBIs is present, But No support
[ 0] Idle Task: gic_validate_redist_version: GICR_TYPER = 0x0
[ 0] Idle Task: gic_validate_redist_version: 16 PPIs implemented
[ 0] Idle Task: gic_validate_redist_version: no VLPI support, no direct LPI support
[ 0] Idle Task: up_timer_initialize: up_timer_initialize: cp15 timer(s) running at 100.00MHz, cycle 100000
[ 0] Idle Task: uart_register: Registering /dev/console
[ 0] Idle Task: uart_register: Registering /dev/ttyS0
[ 0] Idle Task: work_start_highpri: Starting high-priority kernel worker thread(s)
[ 0] Idle Task: nx_start_application: Starting init thread
[ 0] Idle Task: task_spawn: name=nsh_main entry=0xa590 file_actions=0 attr=0x3bf88 argv=0x3bf80
nsh: mkfatfs: command not found
NuttShell (NSH) NuttX-12.0.0
nsh> [ 0] Idle Task: nx_start: CPU0: Beginning Idle Loop
Step2: telnet to UART1
Starting another terminal and enter:
$ telnet localhost 5001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
nsh: mkfatfs: command not found
NuttShell (NSH) NuttX-12.0.0
nsh>
4.2 SMP
$ AEMv8R_FVP/AEMv8R_base_pkg/models/Linux64_GCC-9.3/FVP_BaseR_AEMv8R \
-f boards/arm64/fvp-v8r/fvp-armv8r/scripts/fvp_cfg_smp.txt \
-a ./nuttx
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
- Ready to Boot Primary CPU
- Boot from EL2
- Boot from EL1
- Boot to C runtime for OS Initialize
[CPU0] [ 0] (null): arm64_chip_boot: Main CPU 0x80000000
[CPU0] [ 0] (null): nx_start: Entry
[CPU0] [ 0] (null): up_allocate_heap: heap_start=0x0x4a000, heap_size=0x7fb6000
[CPU0] [ 0] CPU0 IDLE: gic_validate_dist_version: GICv3 version detect
[CPU0] [ 0] CPU0 IDLE: gic_validate_dist_version: GICD_TYPER = 0x490067
[CPU0] [ 0] CPU0 IDLE: gic_validate_dist_version: 224 SPIs implemented
[CPU0] [ 0] CPU0 IDLE: gic_validate_dist_version: 0 Extended SPIs implemented
[CPU0] [ 0] CPU0 IDLE: gic_validate_dist_version: Distributor has no Range Selector support
[CPU0] [ 0] CPU0 IDLE: gic_validate_dist_version: MBIs is present, But No support
[CPU0] [ 0] CPU0 IDLE: gic_validate_redist_version: GICR_TYPER = 0x0
[CPU0] [ 0] CPU0 IDLE: gic_validate_redist_version: 16 PPIs implemented
[CPU0] [ 0] CPU0 IDLE: gic_validate_redist_version: no VLPI support, no direct LPI support
[CPU0] [ 0] CPU0 IDLE: up_timer_initialize: up_timer_initialize: cp15 timer(s) running at 100.00MHz, cycle 100000
[CPU0] [ 0] CPU0 IDLE: uart_register: Registering /dev/console
[CPU0] [ 0] CPU0 IDLE: uart_register: Registering /dev/ttyS0
- Ready to Boot Second CPU
- Boot from EL2
- Boot from EL1
- Boot to C runtime for OS Initialize
[CPU1] [ 1] CPU1 IDLE: gic_validate_redist_version: GICR_TYPER = 0x100000100
[CPU1] [ 1] CPU1 IDLE: gic_validate_redist_version: 16 PPIs implemented
[CPU1] [ 1] CPU1 IDLE: gic_validate_redist_version: no VLPI support, no direct LPI support
[CPU1] [ 1] CPU1 IDLE: nx_idle_trampoline: CPU1: Beginning Idle Loop
- Ready to Boot Second CPU
- Boot from EL2
- Boot from EL1
- Boot to C runtime for OS Initialize
[CPU2] [ 2] CPU2 IDLE: gic_validate_redist_version: GICR_TYPER = 0x200000200
[CPU2] [ 2] CPU2 IDLE: gic_validate_redist_version: 16 PPIs implemented
[CPU2] [ 2] CPU2 IDLE: gic_validate_redist_version: no VLPI support, no direct LPI support
[CPU2] [ 2] CPU2 IDLE: nx_idle_trampoline: CPU2: Beginning Idle Loop
- Ready to Boot Second CPU
- Boot from EL2
- Boot from EL1
- Boot to C runtime for OS Initialize
[CPU3] [ 3] CPU3 IDLE: gic_validate_redist_version: GICR_TYPER = 0x300000310
[CPU3] [ 3] CPU3 IDLE: gic_validate_redist_version: 16 PPIs implemented
[CPU3] [ 3] CPU3 IDLE: gic_validate_redist_version: no VLPI support, no direct LPI support
[CPU3] [ 3] CPU3 IDLE: nx_idle_trampoline: CPU3: Beginning Idle Loop
[CPU0] [ 0] CPU0 IDLE: work_start_highpri: Starting high-priority kernel worker thread(s)
[CPU0] [ 0] CPU0 IDLE: nx_start_application: Starting init thread
[CPU0] [ 0] CPU0 IDLE: task_spawn: name=nsh_main entry=0xc41c file_actions=0 attr=0x43f68 argv=0x43f60
[CPU0] [ 0] CPU0 IDLE: nx_start: CPU0: Beginning Idle Loop
nsh: mkfatfs: command not found
NuttShell (NSH) NuttX-12.0.0
nsh>
Step2: telnet to UART1
Starting another terminal and enter:
$ telnet localhost 5001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
nsh: mkfatfs: command not found
NuttShell (NSH) NuttX-12.0.0
nsh>
Status
======
2023-2-18:
1. Release the frist version for ARMv8-R, Single Core and SMP is supported
OS test is passed.
Platform Features
=================
The following hardware features are supported:
+--------------+------------+----------------------+
| Interface | Controller | Driver/Component |
+==============+============+======================+
| GICv3 | on-chip | interrupt controller |
+--------------+------------+----------------------+
| PL011 UART | on-chip | serial port |
+--------------+------------+----------------------+
| ARM TIMER | on-chip | system clock |
+--------------+------------+----------------------+
References
===========
1. (ID050815) ARM® Cortex®-A Series - Programmer’s Guide for ARMv8-A
2. (ID020222) Arm® Architecture Reference Manual - for A profile architecture
3. (ARM062-948681440-3280) Armv8-A Instruction Set Architecture
4. AArch64 Exception and Interrupt Handling
5. AArch64 Programmer's Guides Generic Timer
6. Arm Generic Interrupt Controller v3 and v4 Overview
7. Arm® Generic Interrupt Controller Architecture Specification GIC architecture version 3 and version 4
8. (DEN0022D.b) Arm Power State Coordination Interface Platform Design Document
9. Arm® Architecture Reference Manual Supplement, Armv8, for R-profile AArch64 architecture,
ARM DDI 0600B.a (ID062922)
10.Arm® Cortex®-R82 Processor Technical Reference Manual, Revision: r0p2