R-Car/Boards/Salvator-XS

= Introduction =

This is the Wiki for the Renesas Salvator-XS (Salvator-X 2nd version) board, which is available in different versions, depending on the actual SiP mounted: Refer to the R-Car page for information about Renesas' R-Car SoC family.
 * RTP0RC7795SIPB0012S (with R-Car H3 ES2.0),
 * RTP0RC7796SIPB0012S (with R-Car M3-W),
 * RTP0RC7796SIPB0012SA5A (with R-Car M3-W+, aka R-Car M3-W ES3.0),
 * RTP0RC77965SIPB012S (with R-Car M3-N).

= Serial Console =

Use a micro-USB cable to connect to "Debug Serial 0". Serial settings are 115200 8N1.

Unfortunately the CP2102 USB-to-UART bridges on Salvator-XS boards have the same serial strings (0001 resp. 00002 for Debug Serial 0 resp. 1), complicating identifying consoles on multiple boards. If you have multiple boards connected to the same host and you want stable serial ports, there are two options:
 * 1) Refer to the ports using the symbolic links under /dev/serial/by-path/, instead of the /dev/ttyUSB* names,
 * 2) Program the ports' serial strings to your liking (e.g. salvator-xs-1884-debug0) using the tool at https://github.com/DiUS/cp210x-cfg, and refer to the ports using the symbolic links under /dev/serial/by-id/, instead of the /dev/ttyUSB* names.

= Booting Linux =

* Kernel config: defconfig * Kernel image: arch/arm64/boot/Image * DTB: arch/arm64/boot/dts/renesas/r8a77951-salvator-xs.dtb (for R-Car H3) * DTB: arch/arm64/boot/dts/renesas/r8a77960-salvator-xs.dtb (for R-Car M3-W) * DTB: arch/arm64/boot/dts/renesas/r8a77961-salvator-xs.dtb (for R-Car M3-W+) * DTB: arch/arm64/boot/dts/renesas/r8a77965-salvator-xs.dtb (for R-Car M3-N)

U-Boot boot command: tftpboot 0x50000000 Image tftpboot 0x58000000 r8a77951-salvator-xs.dtb (for R-Car H3) tftpboot 0x58000000 r8a77960-salvator-xs.dtb (for R-Car M3-W) tftpboot 0x58000000 r8a77961-salvator-xs.dtb (for R-Car M3-W+) tftpboot 0x58000000 r8a77965-salvator-xs.dtb (for R-Car M3-N) booti 0x50000000 - 0x58000000

Kernel v5.5 and older used different DTB names: * DTB: arch/arm64/boot/dts/renesas/r8a7795-salvator-xs.dtb (for R-Car H3) * DTB: arch/arm64/boot/dts/renesas/r8a7796-salvator-xs.dtb (for R-Car M3-W) * DTB: arch/arm64/boot/dts/renesas/r8a77965-salvator-xs.dtb (for R-Car M3-N)

= Suspend-to-RAM =

PSCI System Suspend
The system can be suspended by triggering a PSCI System Suspend: echo mem > /sys/power/state

Caveats: echo on > /sys/bus/i2c/drivers/bd9571mwv/*/bd9571mwv-regulator*/backup_mode i2cset -f -y 7 0x30 0x20 0x0F
 * Before you can use the above, you must configure the PMIC for DDR Backup Mode first, using the command below, followed by switching SW23 off:
 * On kernels up to and including v4.18, the "backup_mode" sysfs file doesn't exist. Hence you must use i2cset instead, and repeat this operation after each wake-up:
 * PSCI System Suspend supports wake-up by PMIC only. Switch SW23 on to resume the system.

Suspend-to-Idle
If you want to suspend the system, and wake up through other wake-up sources, you must use Suspend-to-Idle instead of PSCI System Suspend.

The system can be suspended ("frozen") using: echo freeze > /sys/power/state

Alternatively (since v4.10), you can configure the system to use Suspend-to-Idle by default: echo s2idle > /sys/power/mem_sleep

After that, you can suspend the system using the standard: echo mem > /sys/power/state

Wake-Up Sources
Suspend-to-Idle supports the following wake-up sources:

ethtool -s eth0 wol g # Enable wake on MagicPacket ethtool -s eth0 wol d # Disable Wake-up by sending a MagicPacket from another system using: wakeonlan  | |  # or  must be in /etc/ethers
 * gpio-keys: Not enabled in the upstream kernel due to sharing of GPIOs between switches and LEDs, but see Remote Control below.
 * ravb (Ethernet): Configure using one of:
 * sh-sci (Serial): Disabled by default
 * usb: Disabled by default

= Remote Control =

= An Experiment in U-Boot for Cortex-R7 = R-Car Gen3 currently boots up using Cortex-A cores

[Boot ROM(CA57)] --> [BL2(CA57)] --> [U-Boot(CA57)] --> [Linux kernel(CA57]

R-Car Gen3 has two Cortex-R7 cores and it could be used for booting as well. This experiment attempts to boot R-Car Gen3 up using a Cortex-R7 core. The boot sequence of this experiment will be like this:

[Boot ROM(CR7)] --> [CR7 Loader(CR7)] --> [U-Boot(CR7)] --> [RTOS(CR7)] `--> [BL2(CA57)] --> [U-Boot(CA57)]

To do this, a simple tarball called rcg3-cr7-uboot is provided. rcg3-cr7-uboot package includes patches related to Cortex-R7 and provides a makefile to help to build sources.

This section describes how to build sources and test it on the Salvator-XS.

Prerequisite
rcg3-cr7-uboot uses the Renesas Cortex-R7 Loader package. You should contact Renesas to get Cortex-R7 Loader since this is a proprietary package. After procuring Cortex-R7 Loader, these two files, CortexR7_Loader_20191220.tar.gz and Dummy_RTOS_0615.tar.gz, must be copied into the tarballs directory.

With an installed toolchain
If you already have an development environment for Cortex-R7, you could use it. If you don't have a toolchain, you could get it here [Cortex-RM Toolchain]. Git must be installed because rcg3-cr7-uboot uses it for patching and managing code. In addition, you should install bison and flex to build U-Boot. To build source, type it. make all Generated files needed will be copied into the artifacts directory.

With Docker
You could use Docker to build sources as well. The built files will be located in the artifacts directory. make docker-build

Flashing
After building sources, a few files generated by rcg3-cr7-uboot must be written into the HyperFlash memory on the System in Package.


 * 1) bootparam_sa0.srec: It has information used by an Initial Program Loader resided in the BootROM
 * 2) cr7_loader.srec: It's a SREC-formatted blob file which contains a binary. The binary, Renesas CR7 Loader, is a some kind of Secondary Program Loader running on Cortex-R7.
 * 3) cert_header_sa3.srec: It has information about the text and sector address of U-Boot to be loaded by CR7 Loader.
 * 4) u-boot.srec: It' a SREC-formatted blob file which contains an U-Boot binary.

In here, MiniMonitor is used for flashing them. Please consult [Sterter Kit] for how to use MiniMonitor.

Please note that the configuration of DIP switches is different between Stater Kit and Salvator-XS. Here is information about DIP switches for Salvator-XS

SW1[all] = [On] SW2[all] = [On] SW3      = Off SW10[1:8] = [On, On, On, On, On, Off, On, On]
 * To run MiniMonitor

SW1[all] = [Off] SW2[all] = [Off] SW3      = On
 * To enable HyperFlash memory

SW1[all] = [Off] SW2[all] = [Off] SW3      = On SW10[1:8] = [Off, Off, On, On, On, On, Off, Off]
 * To use Cortex-R7 and HyperFlash memory

Please following the instruction of MiniMointor. This is messages of MiniMonitor when writing bootparam_sa0.srec

R-Car Gen3 MiniMonitor H3ES2.0/M3ES1.1 V0.04 2017.02.28 Work Memory : SystemRAM (H'E6328000-H'E632FFFF) Board Name  : Salvator Product Code : R-Car H3 ES20 .00 >xls2

Qspi/HyperFlash writing of Gen3 Board Command
======= Load Program to Spiflash Writes to any of SPI address. Please select,FlashMemory. 1 : QspiFlash      (U5 : S25FS128S) 2 : QspiFlash Board (CN3: S25FL512S) 3 : HyperFlash     (SiP internal) Select (1-3)>3 SW1 SW2 All OFF! Setting OK? (Push Y key) SW3 ON! Setting OK? (Push Y key) READ ID OK. Program Top Address & Qspi/HyperFlash Save Address

Please Input Program Top Address
====== Please Input : H'E6320000

Please Input Qspi/HyperFlash Save Address
Please Input : H'0 Work RAM(H'50000000-H'53FFFFFF) Clear.... please send ! ('.' & CR stop load) SPI Data Clear(H'FF) Check :H'00000000-0003FFFF,Clear OK?(y/n) H'00000000-0003FFFF Erasing..Erase Completed SAVE SPI-FLASH....... complete!

= Qspi/HyperFlash Save Information
=========== SpiFlashMemory Stat Address : H'00000000 SpiFlashMemory End Address : H'00000E67

=
==============================================

>

This is information about text addresses of binaries and HyperFlash sector addresses.

Please note that BL2 and BL31 of Arm Trusted Firmware must be rewritten because BL2 is replaced with CR7 Loader.

Using U-Boot for Cortex-R7
If all binaries have successfully been flashed and SW1, SW2, SW3 and SW10 DIP switches are configured to enable Cortex-R7 and HyperFlash memory, SW1[all] = [Off] SW2[all] = [Off] SW3      = On SW10[1:8] = [Off, Off, On, On, On, On, Off, Off] the U-Boot prompt would be appeared on your serial terminal after powering up a Salvator-XS board.

NOTICE: R-Car Gen3 Initial Program Loader(CR7) Rev.1.0.14a NOTICE: Built : 04:12:33, Apr 13 2021 NOTICE: PRR is R-Car H3 Ver2.0 NOTICE: LCM state is CM NOTICE:  BL2: DDR3200(rev.0.39) NOTICE: BL2: [COLD_BOOT] NOTICE: BL2: DRAM Split is 4ch NOTICE: BL2: QoS is default setting(rev.0.21) NOTICE: BL2: DRAM refresh interval 1.95 usec NOTICE: BL2: Periodic Write DQ Training NOTICE: R-Car Gen3 tcm loader(CR7) NOTICE: Normal boot(CR7) NOTICE: RTOS load address=0x51000000 RTOS image size=0x00400000

U-Boot 2020.01-cr7-0.1-00006-g409eea96c3 (Apr 13 2021 - 04:12:39 +0000)

CPU: Renesas Electronics R8A7795 rev 2.0 Model: Renesas Salvator-X 2nd version board based on r8a7795 ES2.0+ DRAM: 896 MiB Bank #0: 0x048000000 - 0x07fffffff, 896 MiB

MMC:  sd@ee100000: 0, sd@ee140000: 1, sd@ee160000: 2 Loading Environment from MMC... OK In:   serial@e6e88000 Out:  serial@e6e88000 Err:  serial@e6e88000 Net:  eth0: ethernet@e6800000 Hit any key to stop autoboot: 3 (CR7) =>

Speeding up a development using TFTP
In short, this is an example of setting up U-Boot to use TFTP. (CR7) => setenv ethact 'ravb' (CR7) => setenv ethaddr '2e:09:0a:00:a3:41' (CR7) => setenv ipaddr '192.168.0.200' (CR7) => setenv serverip '192.168.0.14'

After setting up U-Boot, you could download a file like this: (CR7) => tftp 0x48000000 dummy_rtos.bin Using ethernet@e6800000 device TFTP from server 192.168.0.14; our IP address is 192.168.0.200 Filename 'dummy_rtos.bin'. Load address: 0x48000000 Loading: *#### 2.8 MiB/s done Bytes transferred = 49152 (c000 hex)

Running a binary
U-Boot could run a binary by directly setting up processor's registers. This is an example how to run the Dummy RTOS of Renesas using U-Boot. (CR7) => setenv rtos_boot_addr 0x48000000 (CR7) => tftp 0x48000000 dummy_rtos.bin Using ethernet@e6800000 device TFTP from server 192.168.0.14; our IP address is 192.168.0.200 Filename 'dummy_rtos.bin'. Load address: 0x48000000 Loading: *#### 2.8 MiB/s done Bytes transferred = 49152 (c000 hex) (CR7) => bootrtos Running RTOS: boot address = 0x48000000

NOTICE: R-Car Gen3 Dummy RTOS(CR7) NOTICE: PRR is R-Car H3 ES2.0 NOTICE: MIDR = (0x410fc171) NOTICE: CBAR = (0xf0000000) NOTICE: CPSR = (0x600001d3) NOTICE: Dummy RTOS boot end

The bootrtos command has been added to U-Boot for Cortex-R7. bootrtos refers the rtos_boot_addr environment variable so you must set up this variable according to the text address of a binary that you want to run.

Bringing up Cortex-A
The caup command has been added to U-Boot for Cortex-R7 as well to bring up Cortex-A. If you execute the caup command, U-Boot for Cortex-A would be appeared. (CR7) => caup CPU0 will be powered up (base addr = 0x00000000e6304000) CPU0 has been powered up.We don't need to power it up. (CR7) =>

U-Boot 2015.04 (Oct 23 2018 - 17:56:46)

CPU: Renesas Electronics R8A7795 rev 2.0 Board: Salvator-X I2C:  ready DRAM: 3.9 GiB Bank #0: 0x048000000 - 0x07fffffff, 896 MiB Bank #1: 0x500000000 - 0x53fffffff, 1 GiB Bank #2: 0x600000000 - 0x63fffffff, 1 GiB Bank #3: 0x700000000 - 0x73fffffff, 1 GiB

MMC:  sh-sdhi: 0, sh-sdhi: 1, sh-sdhi: 2 In:   serial Out:  serial Err:  serial Net:  ravb Hit any key to stop autoboot: 3 => version

U-Boot 2015.04 (Oct 23 2018 - 17:56:46) aarch64-poky-linux-gcc (GCC) 7.3.0 GNU ld (GNU Binutils) 2.29.1.20170915 => From here, you could boot up Linux or do something else.

There is an issue regarding the serial port. Arm Trusted Firmware by Renesas doesn't seem to enable the clock of the serial port so TF-A’s messages aren't displayed after transiting from Cortex-R to Cortex-A.