These instructions document how FreeBSD (head) can be built for, and installed on the Helios-4. This has been made possible by the initial port of FreeBSD to the SolidRun Clearfog that has been submitted June 2017 by Semihalf and Stormshield: [Read the announcement here](https://lists.freebsd.org/pipermail/freebsd-arm/2017-June/016314.html).

## Compiling FreeBSD
There is a manual way to compile FreeBSD, and it is documented on the [SolidRun Wiki Clearfog page](https://wiki.solid-run.com/doku.php?id=products:a38x:software:os:freebsd). The process is almost identical for the Helios-4 in that a suitable DTB has to be copied to the boot partition.
The following instructions use the [crochet](https://github.com/FreeBSD/crochet/) utility for automating the build and imaging process.

### Get the source
We use a fork of crochet that has added the necessary bits for Helios-4.
```bash
mkdir work; cd work
git clone --checkout pr-clearfog https://github.com/Artox/crochet.git
svn checkout https://svn.freebsd.org/base/head src
```

### Configure the build
crochet uses a configuration file to perform builds. config.sh.sample is an example, and can be adapted as needed. As a bare minimum, a line
```bash
board_setup Clearfog
```
has to be at the top near the other commented board_setup_* lines.
In addition enabling the growfs feature has proven useful for autoresizing the rootfs on first boot: simply uncomment the line
```bash
option Growfs
```

There are plenty of other settings to change, but these suffice for creating a bootable image.

### Build
Navigate to the crochet folder, and assuming you called your config file config.sh, run:
```bash
sudo /bin/sh crochet.sh -c config.sh
```
On success an sdcard image will have been produced in the build directory, for example */opt/work/build/FreeBSD-armv7-12.0-GENERIC-333641-Clearfog.img*.
This image is a complete FreeBSD installation, without U-Boot installed.

### Create SD-Card
The previously created image can be written to an sdcard as is; assuming your SD-Card is available at /dev/sdX, write the image to it:
```bash
pv FreeBSD-armv7-12.0-GENERIC-333641-Clearfog.img | sudo tee /dev/sdX >/dev/null
```

## Boot It
In an ideal world U-Boot would already be installed in SPI flash, including the necessary patch for FreeBSD. If you happen to have such an ideal system, you may skip the next section

### Install U-Boot
Please refer to [U-boot](/uboot) for build instructions.

The Boot-ROM expects to find U-Boot at 512 bytes into the sdcard. Assuming your SD-Card is available at /dev/sdX, write the u-boot binary to it using dd:
```bash
sudo dd bs=512 seek=1 conv=fsync if=u-boot-a38x-5-15-mmc.bin of=/dev/sdX
```

### Boot
Insert the sd-card into your device, connect a serial console and turn it on.
The U-Boot console will come up with a prompt:
```bash
Hit any key to stop autoboot: 3
```
Press a key to abort automatic boot, or wait till it fails to do a network boot.
Once it has dropped to a terminal prompt, indicated by *Marvell>>* at the start of the line, configure U-Boot to load the FreeBSD loader by default:
```bash
setenv fdt_addr_r 0x1000000
setenv loadaddr 0x2000000
setenv bootcmd 'fatload mmc 0:2 ${fdt_addr_r} armada-388-helios4.dtb; fatload mmc 0:2 ${loadaddr} ubldr.bin; go ${loadaddr}'
setenv bootdelay 1
saveenv
```
Beware: You probably have to paste these lines individually, or U-Boot may mess it up. You can set bootdelay to 0 if you want, that way you will never again get to the u-boot console unless you delete the FreeBSD loader.

Finally, type *boot*, or *reset*, or reset the board by pressing the button labeled U16 on the board.
This time, just sit back and watch as FreeBSD comes up.

### Default User
The FreeBSD image by crochet comes with an unlocked root account. This means you do not need to enter a password to log in as root.
