SiFive HiFive Unleashed
=======================

This file describes how to use the pre-defined Buildroot
configuration for the SiFive HiFive Unleashed board.

Further information about the HiFive Unleashed board can be found
at https://www.sifive.com/boards/hifive-unleashed

Building
========

Configure Buildroot using the default board configuration:

  $ make hifive_unleashed_defconfig

Customise the build as necessary:

  $ make menuconfig

Start the build:

  $ make

Result of the build
===================

Once the build has finished you will have the following files:

    output/images/
    +-- boot.scr
    +-- fw_dynamic.bin
    +-- fw_dynamic.elf
    +-- fw_jump.bin
    +-- fw_jump.elf
    +-- hifive-unleashed-a00.dtb
    +-- Image
    +-- rootfs.cpio
    +-- rootfs.ext2
    +-- rootfs.ext4
    +-- rootfs.tar
    +-- sdcard.img
    +-- u-boot.bin
    +-- u-boot.itb
    +-- u-boot-spl.bin


Creating a bootable SD card with genimage
=========================================

By default Buildroot builds a SD card image for you. All you need to do
is dd the image to your SD card, which can be done with the following
command on your development host:

  $ sudo dd if=output/images/sdcard.img of=/dev/sdb bs=4096

The above example command assumes the SD card is accessed via a USB card
reader and shows up as /dev/sdb on the host. Adjust it accordingly per
your actual setup.

Booting the SD card on the board
================================

Make sure that the all DIP switches are set to the off position for
default boot mode (MSEL mode = 1011), insert the SD card and power
up the board.

Connect the USB cable and open minicom (/dev/ttyUSB1, 115200, 8N1).

See the 'SiFive HiFive Unleashed Getting Started Guide' for
more details (https://www.sifive.com/documentation).

You will get a warning reported by fdisk when you examine the SD card.
This is because the genimage_sdcard.cfg file doesn't specify the SD card
size (as people will naturally have different sized cards), so the
secondary GPT header is placed after the rootfs rather than at the end
of the disk where it is expected to be.

You will see something like this at boot time:

[    0.989458] mmc0: host does not support reading read-only switch, assuming write-enable
[    0.996772] mmc0: new SDHC card on SPI
[    1.001634] mmcblk0: mmc0:0000 SD8GB 7.28 GiB
[    1.038079] GPT:Primary header thinks Alt. header is not at the end of the disk.
[    1.044759] GPT:52389 != 15264767
[    1.048051] GPT:Alternate GPT header not at the end of the disk.
[    1.054015] GPT:52389 != 15264767
[    1.057323] GPT: Use GNU Parted to correct GPT errors.
[    1.062479]  mmcblk0: p1 p2 p3


Creating a bootable SPI flash with genimage
===========================================

Adjust Buildroot configuration by:

  $ make menuconfig

Change "System configuration" -> "Extra arguments passed to custom scripts"
value to "-c board/sifive/common/genimage_spi-nor.cfg", save the
configuration and build. This creates a output/images/spi-nor.img that can
be programmed to the on-board SPI flash.

Boot the board from the SD card prepared above, stop the U-Boot auto boot,
and type the following commands to program the whole SPI flash:

  => tftp 82000000 output/images/spi-nor.img
  => sf probe
  => sf update 82000000 0 2000000

Booting the SPI flash on the board
==================================

Make sure that the all DIP switches are set to the off position for
default boot mode (MSEL mode = 0110) to boot from SPI flash.

Testing under QEMU
==================

The SD card image can be tested using QEMU:

$ qemu-system-riscv64 -M sifive_u,msel=11 -smp 5 -m 8G \
    -display none -serial stdio -nic user \
    -bios output/images/u-boot-spl.bin \
    -drive file=output/images/sdcard.img,if=sd

The SPI flash image can be tested with a slightly different command:

$ qemu-system-riscv64 -M sifive_u,msel=6 -smp 5 -m 8G \
    -display none -serial stdio -nic user \
    -bios output/images/u-boot-spl.bin \
    -drive file=output/images/spi-nor.img,if=mtd
