Jump to content

NixOS on ARM/PINE64 ROCK64: Difference between revisions

Document how to increase space for kernel
imported>Lopsided98
No edit summary
(Document how to increase space for kernel)
 
(22 intermediate revisions by 8 users not shown)
Line 22: Line 22:
The ROCK64 is a single board computer built around the Rockchip RK3328 SoC.
The ROCK64 is a single board computer built around the Rockchip RK3328 SoC.


There are three models of the board, with 1, 2 or 4 GB of RAM. It can boot from an microSD card or an eMMC. It also has a 128 Mbit SPI flash that can be used to store the bootloader.
There are three models of the board, with 1, 2 or 4 GB of RAM. It can boot from an microSD card or an eMMC. It also has a 128 Mbit SPI flash (not populated on recently manufactured boards) that can be used to store the bootloader.


== Status ==
== Status ==
Line 28: Line 28:
This board has upstream U-Boot and kernel support, although the mainline kernel may still be missing some features. NixOS can be installed using manual partitioning and <code>nixos-install</code> or by modifying the aarch64 installation image as described in the next section.
This board has upstream U-Boot and kernel support, although the mainline kernel may still be missing some features. NixOS can be installed using manual partitioning and <code>nixos-install</code> or by modifying the aarch64 installation image as described in the next section.


U-Boot for this board is packaged in nixpkgs, and Hydra builds can be found here: https://hydra.nixos.org/job/nixpkgs/trunk/ubootRock64.aarch64-linux
U-Boot for this board is packaged in nixpkgs, and Hydra builds can be found here:
 
https://hydra.nixos.org/job/nixpkgs/trunk/ubootRock64.aarch64-linux
 
This bootloader is not entirely open, incorporating a binary blob for the tertiary program loader (TPL).
This bootloader is not entirely open, incorporating a binary blob for the tertiary program loader (TPL).
If your have nix installed you can download the latest version with (This command also works on different
architectures since it can be downloaded from the binary cache):
<syntaxHighlight lang=console>
$ nix-build '<nixpkgs>' -A ubootRock64 --argstr system aarch64-linux
$ ls -la result
-r--r--r-- 2 root root    107683 Jan  1  1970 idbloader.img
dr-xr-xr-x 1 root root        40 Jan  1  1970 nix-support
-r--r--r-- 2 root root    789504 Jan  1  1970 u-boot.itb
</syntaxHighlight>
{{note|ROCK64 v2 boards have marginal DRAM routing and may experience memory corruption with the standard U-Boot build. It is recommended to use the <code>ubootRock64v2</code> package for these devices, which reduces the DRAM clock to increase stability.}}


== Board-specific installation notes ==
== Board-specific installation notes ==


U-Boot needs to be copied to specific sectors on the microSD card, eMMC or image with <code>dd</code>. Download/build U-Boot for the board, and write <code>idbloader.img</code> and <code>u-boot.itb</code> to the correct locations with (replace <code>/dev/mmcblkX</code> with the correct path to the card or image):
U-Boot needs to be copied to specific sectors on the microSD card, eMMC or image with <code>dd</code>.  This can be done either by using a prebuilt image or by manually formatting the storage.
 
=== Using Prebuilt Images ===
 
You can use [https://github.com/Mic92/nixos-aarch64-images nixos-aarch64-images] to get an ROCK64 compatible disk image.
 
=== Manually Formatting ===
 
To manually format your storage, first install the NIXOS ARM 64 image by following the instructions here. Download and flash the SD Card/SBC image to your SD Card
 
[[NixOS_on_ARM#SD card images (SBCs and similar platforms)]]
 
Next, download/build U-Boot for the board, and write <code>idbloader.img</code> and <code>u-boot.itb</code> to the storage. As mentioned previously, Hydra builds can be found here:
 
https://hydra.nixos.org/job/nixpkgs/trunk/ubootRock64.aarch64-linux
 
Replace in the command below <code>/dev/mmcblkX</code> with the correct device to the sdcard i.e.  <code>/dev/mmcblk0</code>. You can use the <code>lsblk</code> command to get a list of all devices:


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Line 39: Line 71:
dd if=u-boot.itb of=/dev/mmcblkX conv=fsync,notrunc bs=512 seek=16384
dd if=u-boot.itb of=/dev/mmcblkX conv=fsync,notrunc bs=512 seek=16384
</syntaxhighlight>
</syntaxhighlight>
This will make the first partition of the installation device unmountable and it can be deleted, but the space needs to be kept to not overwrite the bootloader with another filesystem.
{{note|As an alternative to the above, the <code>u-boot-rockchip.bin</code> file combines both  <code>idbloader.img</code> and <code>u-boot.itb</code> and can be written using the single command below:
<syntaxhighlight lang="bash">
dd if=u-boot-rockchip.bin of=/dev/mmcblkX seek=64
</syntaxhighlight>
}}


{{note|Prior to NixOS 20.03, a downstream version of U-Boot 2017.09 was packaged, which placed U-Boot in a single <code>idbloader.img</code> file. If that version is used, simply disregard the second command above.}}
{{note|Prior to NixOS 20.03, a downstream version of U-Boot 2017.09 was packaged, which placed U-Boot in a single <code>idbloader.img</code> file. If that version is used, simply disregard the second command above.}}
=== uboot Memory Issues  ===
If you are facing memory issues, kernel panics, kernel oops or general system instability while using the uboot images above (especially with the Rock64 version 2), you can use the ubootRock64v2 image instead, which improves system stability by lowering the memory clock speed at the cost of memory bandwidth.
Hydra builds can be found here (note the v2) https://hydra.nixos.org/job/nixpkgs/trunk/ubootRock64v2.aarch64-linux
Simply follow the manual formatting instructions as above.


== Serial console==
== Serial console==
Line 63: Line 113:
|}
|}


The serial console runs at 1500000 baud in the bootloader. When using the standard NixOS aarch64 sd image, set <code>console=ttyS2,115200n8</code> as kernel option in <code>extlinux/extlinux.conf</code> on the boot partition of the sdimage to get a serial linux console. For debugging, <code>console=uart8250,mmio32,0xff130000</code> should give you an early UART console, before the full serial console is up.
The serial console runs at 1500000 baud in the bootloader. When using the standard NixOS aarch64 sd image, set <code>console=tty1 console=ttyS2,1500000n8</code> as kernel option in <code>extlinux/extlinux.conf</code> on the boot partition of the sdimage to get a serial linux console (tty1 is for standard HDMI output and ttyS2 is for the serial, baud rate setting is optional, simple console=ttyS2 seems to be working fine too). For debugging, <code>console=uart8250,mmio32,0xff130000</code> should give you an early UART console, before the full serial console is up.
 
From the host computer run (update /dev/ttyUSB0 with your USB-to-serial device)
 
<code>
minicom -b 1500000 -8 -D /dev/ttyUSB0  --color=on
</code>
 


== Compatibility notes ==
== Compatibility notes ==
Line 78: Line 135:
|-
|-
! HDMI
! HDMI
| Works || Works
| Video works, Sound does not || Works
| -
|}
|}


Line 88: Line 146:
* [https://github.com/ayufan-rock64/linux-mainline-kernel ayufan-rock64/linux-mainline-kernel] mainline based, with potentially fewer hardware features supported. This kernel is not based on a kernel stable branch, so it may have more bugs (unrelated to the hardware).
* [https://github.com/ayufan-rock64/linux-mainline-kernel ayufan-rock64/linux-mainline-kernel] mainline based, with potentially fewer hardware features supported. This kernel is not based on a kernel stable branch, so it may have more bugs (unrelated to the hardware).


{{note|The old vendor U-Boot 2017.09 did not leave enough room between the kernel and initrd, causing recent kernels to overwrite the beginning of the initrd. This can be fixed by increasing <code>ramdisk_addr_r</code> in the U-Boot console, or using upstream U-Boot. }}
Mic92 has packaged the mainline kernel in his [https://github.com/nix-community/NUR NUR] packages repository:
 
<syntaxHighlight lang=nix>
boot.kernelPackages = pkgs.nur.repos.mic92.linuxPackages_ayufan;
</syntaxHighlight>
 
This provides sound over HDMI, which the default kernel does not.
 
=== Initrd fails to unpack during boot ===
 
The old vendor U-Boot 2017.09 did not leave enough room between the kernel and initrd, causing recent kernels to overwrite the beginning of the initrd. This can be fixed by increasing <code>ramdisk_addr_r</code> in the U-Boot console, or using upstream U-Boot.
 
Here is how to achieve in the uboot console (hit enter during boot to access it):
 
<syntaxHighlight>
=> print ramdisk_addr_r # this prints the old value
ramdisk_addr_r=0x06000000
=> set ramdisk_addr_r 0x07000000 # this sets a new value
=> saveenv # this persist the the configuration
=> boot # than you can normally boot, if it still fails, you can try to increase the ramdisk_addr_r value further
</syntaxHighlight>
 
== Video decoding ==
 
MPV has support for the rockchip hardware decoder, it is used by default when playing a file.
Without this decoder videos will likely stutter during playing.
To use his for example in [https://kodi.tv/ kodi], add the following configuration in <code>.kodi/userdata/playercorefactory.xml</code>
 
<syntaxHighlight lang=xml>
<playercorefactory>
        <players>
                <player name="MPV" type="ExternalPlayer" audio="false" video="true">
                        <filename>mpv</filename>
                        <args>--fs=yes "{1}"</args>
                        <hidexbmc>true</hidexbmc>
                </player>
        </players>
        <rules action="prepend">
                <rule video="true" player="MPV"/>
        </rules>
</playercorefactory>
</syntaxHighlight>
 
When using kodi it is also recommend to use kodi-wayland rather than the x11 variant to reduce the CPU usage. Mic92 has an [https://github.com/Mic92/dotfiles/blob/d457b53a1c032b84147113b8cd1be1383facd68e/nixos/rock/modules/kodi.nix#L22 example configuration].


== Resources ==
== Resources ==


* [https://www.pine64.org/?page_id=7147 Official product page]
* [https://pine64.org/devices/rock64/ Official product page]