blob: 8ddbe9fc00ee044947aa4f8b1c011a7479a29a9b [file] [log] [blame] [view]
# Khadas VIM3 development guide
The [Khadas VIM3] is an ARM64-based single board computer. It is possible to run
Fuchsia on the VIM3. This guide shows Fuchsia [contributors] how to [install
Fuchsia on a VIM3] and do other common development tasks.
See [Appendix: Feature support](#features) for details on which VIM3 features
Fuchsia supports.
## Audience {#audience}
This guide assumes you're comfortable with:
* Tinkering with electronics and hardware.
* Building Fuchsia from source and other CLI workflows.
## Install Fuchsia on a Khadas VIM3 board {#install}
See [Troubleshooting](#troubleshooting) and [Appendix: Support](#support) if you
have any trouble completing the installation process.
### Prerequisites {#prerequisites}
You'll need all of the following hardware and software:
* A Khadas VIM3 single-board computer. Googlers should request a board through
the Fuchsia Ops team.
Caution: Fuchsia is primarily focused on supporting the Pro model VIM3. The
Basic model may work but is less of a priority.
* A desktop or laptop computer that's running Linux and has 2 USB ports
available. This computer is called the **host**.
* A power supply of at least 24W to your host. The VIM3 can draw that much power
when [DVFS] is enabled.
* A working Fuchsia development environment on your host. In other words, you
should be able to [build Fuchsia] from its source code on your host.
* A [USB to TTL serial cable].
* A USB-C to USB-A cable that supports both data and power delivery. The USB-C
side is for the VIM3. The other side is for your host.
Caution: Other USB cable types, like USB-C to USB-C, may work, but appear to
have power delivery issues more frequently than USB-C to USB-A. See
[Troubleshooting: Bootloops].
The following is optional:
* A [heatsink]. This enables running 2 CPU cores on the VIM3 at full speed
without reaching 80°C, the critical temperature beyond which cores are
throttled down.
See the [VIM3 collection] in the Khadas shop for examples of compatible
accessories.
Note: All the links in this section are only for your convenience. You don't
need to buy from these exact stores or these exact parts.
### Build Fuchsia {#build}
If you don't already have an [in-tree][glossary.in-tree] environment set up,
you should start the process now because it can take a while to complete:
1. [Download the Fuchsia source code].
1. [Configure and build Fuchsia].
* When configuring the build, use `fx set core.vim3`.
Note: The rest of this guide assumes that your Fuchsia source code directory is
located at `~/fuchsia`. This guide assumes that you run all `fx` commands from
`~/fuchsia`.
You'll use the Fuchsia development environment to build the Fuchsia image for
VIM3 and run an in-tree CLI tool for flashing the Fuchsia image onto the VIM3.
### Set up the hardware {#hardware}
Set up the VIM3 to communicate with your host:
1. Connect the VIM3 and your host to each other with the USB-C to USB-\* cable.
The white LED on the VIM3 should turn on.
Caution: Don't put a [USB hub] between the VIM3 and your host. The hub may
make it harder for your VIM3 and host to detect and communicate with each
other.
This connection is used to power and flash the VIM3 with [`fastboot`].
1. Connect the serial cable wires to the VIM3's GPIOs:
* GND to pin 17.
* TX (out from VIM3) to pin 18.
* RX (into VIM3) to pin 19.
* Don't connect the power wire of your serial cable to any VIM3 GPIO.
The VIM3 is getting power through the USB cable.
Tip: Pins 1, 20, 21, and 40 are labeled on the circuit board.
Caution: In general the colors for TX and RX wires are not standardized.
For example your RX wire may be blue or green. If your host is unable to see
the serial logs, power off the VIM3 board and swap the TX and RX connections.
Some USB-to-serial adapters have their wires improperly labeled.
See [Serial Debugging Tool] for an example image of how your serial wires
should be connected to the VIM3.
1. Connect the USB end of the serial cable to your host.
#### Verify the serial connection {#serial}
Make sure that you can view the serial logs:
1. Open Fuchsia's serial console:
```posix-terminal
fx serial
```
Tip: If `fx serial` detects multiple USB devices and you don't know which one
to use, try disconnecting the serial cable from your host, running
`ls /dev/ttyUSB*`, then re-connecting the serial cable and running the
command again. If you see no difference when running `ls /dev/ttyUSB*` try
`ls /dev/tty*` or `ls /dev/*` instead.
1. Press the reset button on the VIM3. The reset button is the one with the
**R** printed next to it on the circuit board. See [VIM3/3L Hardware] for a
diagram. In your serial console you should see human-readable logs.
See [Troubleshooting: Bootloops] if your VIM3 seems to keep rebooting.
### Erase the eMMC {#emmc}
Before you can install Fuchsia, you need to get the VIM3 firmware and software
to a known-good state. The first step is to erase the eMMC.
1. Press the reset button on your VIM3.
1. Right after you press the reset button, start repeatedly pressing the
<kbd>Space</kbd> key as your VIM3 boots up. Make sure that your cursor is
focused on your serial console. The bootloader process should pause and your
serial console should show a `kvim3#` prompt. Your serial console is now
providing you access to the **U-Boot shell**.
1. Run the following command in the U-Boot shell:
```posix-terminal
store init 3
```
Your serial console logs should verify that the eMMC was correctly erased.
See [Erase eMMC] for more details.
### Update the Android image on the VIM3 {#android}
<!-- Context: https://forum.khadas.com/t/unable-to-change-bootloader-for-vim3/12708/6 -->
Now you need to get the VIM3 firmware and software to a known-good state:
1. Click the following URL to download an Android image that is known to work
well with subsequent Fuchsia installations:
<https://dl.khadas.com/firmware/vim3/android/VIM3_Pie_V211220.7z>
1. Extract the compressed archive file (`VIM3_Pie_V211220.7z`). After the
extraction you should have a `VIM3_Pie_V211220` directory with an
`update.img` file in it.
1. Follow the instructions in [Install OS into eMMC]. When running
`aml-burn-tool` the value for the `-i` flag should be the path to your
`update.img` file. Your command should look similar to this:
```posix-terminal
aml-burn-tool -b VIM3 -i ~/Downloads/VIM3_Pie_V211220/update.img
```
Tip: The `TST Mode` workflow is probably the easiest and fastest way to get
your VIM3 into Upgrade Mode.
1. If the white and red LEDs on your VIM3 are off and the blue LED is on, it
means that your VIM3 is in sleep mode. Try putting your VIM3 back into
[Upgrade Mode] and then pressing the reset button again.
At this point the white LED on your VIM3 should be on and you should see logs in
your serial console after you press the reset button on your VIM3.
### Update the bootloader {#bootloader}
This section explains how to flash a prebuilt version of Fuchsia's modified
U-Boot onto the VIM3. See the following link if you would prefer to build the
modified U-Boot from source:
<https://third-party-mirror.googlesource.com/u-boot/+/refs/heads/vim3>
1. Access the U-Boot shell again by pressing the reset button and then
repeatedly pressing the <kbd>Space</kbd> key in your serial console. When
your serial console shows the `kvim3#` prompt, you're in the U-Boot shell.
1. In your U-Boot shell run the following command:
```posix-terminal
fastboot
```
You should see the following logs in your serial console:
```
g_dnl_register: g_dnl_driver.name = usb_dnl_fastboot
USB RESET
SPEED ENUM
USB RESET
SPEED ENUM
```
If you see the first line
(`g_dnl_register: g_dnl_driver.name = usb_dnl_fastboot`) but not the lines
after that, try using a different USB-C to USB-\* cable and make sure that
it supports both data and power delivery.
1. Open a new terminal window in your host and run the following commands:
```posix-terminal
cd ~/fuchsia/prebuilt/third_party/fastboot
./fastboot flashing unlock
./fastboot flashing unlock_critical
./fastboot flash bootloader ~/fuchsia/prebuilt/third_party/firmware/vim3/u-boot.bin.unsigned
./fastboot reboot bootloader
```
Important: When working with Fuchsia, remember to use the
[in-tree][glossary.in-tree] version of `fastboot` at
`~/fuchsia/prebuilt/third_party/fastboot/fastboot`. The `fastboot` protocol
allows arbitrary vendor protocol extensions and Fuchsia may rely on this
functionality in the future.
### Flash Fuchsia into the eMMC (one-time only) {#fuchsia}
Use this workflow only the first time you flash Fuchsia onto the VIM3. If you've
already got Fuchsia running on the VIM3, use the [Update your Fuchsia image]
workflow because it's faster.
1. If you just ran the `./fastboot reboot bootloader` command from the last
section then your VIM3 should already be in `fastboot` mode. You can check
your `fx serial` logs to confirm. Otherwise press the reset button and then
repeatedly press the <kbd>f</kbd> key in your `fx serial` console until you
see `USB RESET` and `SPEED ENUM` again.
Caution: You have to press the <kbd>f</kbd> key now to enter
<code>fastboot</code> mode. Previously you pressed the <kbd>Space</kbd> key.
1. From a separate terminal on your host run the following command:
```posix-terminal
fx flash
```
Your VIM3 is now running Fuchsia!
## Update your Fuchsia image {#update}
Complete these steps when you already have Fuchsia running on your VIM3 and want
to update the Fuchsia image.
1. Run the following command from a terminal on your host:
```posix-terminal
fx serve
```
Leave this command running.
1. Make some changes in your in-tree Fuchsia checkout and build the changes.
1. Open a new terminal window and perform an OTA update of the Fuchsia image on
your VIM3:
```posix-terminal
fx ota
```
## Reduce VIM3 noise by disabling its fan {#fan}
If the VIM3 fan's loud noise is bothering you, you can disable it with any
of the following workflows:
* Add `--args vim3_mcu_fan_default_level=0` to your `fx set` invocation.
* Add `vim3_mcu_fan_default_level=0` to `~/fuchsia/local/args.gn` if you use
[persistent local build arguments].
Caution: Disabling the fan interferes with thermal throttling, which will impact
performance modeling and benchmarking.
Experimental: This GN flag will get disabled at some point. Your local build
will break when that happens.
## Ensure that VIM3 tryjobs run {#tryjobs}
Include the following line in your commit message to ensure that VIM3 tryjobs run:
```
Cq-Include-Trybots: luci.turquoise.global.try:bringup.vim3-debug,core.vim3-debug,core.vim3-vg-debug
```
## Troubleshooting {#troubleshooting}
This section explains workarounds for common issues.
### Troubleshooting: Bootloops {#bootloops}
Problem:
You're looking at the VIM3 serial logs. The logs suggest that the VIM3
keeps rebooting.
Root cause:
Unknown. There appears to be an underlying bug in Khada's power delivery
implementation. Fuchsia addressed the bug in [issue 122113].
Workaround 1:
Un-plug and re-plug the USB cable. Repeat 2-3 times if necessary.
Workaround 2:
Always use a USB-C to USB-A cable.
### Troubleshooting: Hardware mismatch {#mismatch}
Problem:
This error when flashing fuchsia: `Hardware mismatch! Trying to flash images
built for vim3 but have 0`
Solution:
Go back to [Update the Android image](#android) step.
## Appendix: Fix a bricked VIM3 {#brickfix}
Do these steps if you've [bricked] your VIM3 and need to "factory reset" it:
1. [Erase the eMMC](#emmc).
1. [Update the Android image](#android).
1. [Update the bootloader](#bootloader).
1. [Flash Fuchsia into the eMMC (one-time only)](#fuchsia).
## Appendix: Support {#support}
* For issues that seem related to VIM3 hardware or firmware, try the
[VIM3 official docs](https://docs.khadas.com/linux/vim3/index.html) and
[Khadas VIM3 official forum](https://forum.khadas.com/c/khadas-vim3/30).
* For issues that seem related to Fuchsia, try the
[Fuchsia mailing lists and chat rooms](/docs/contribute/community/mailing-lists.md).
## Appendix: Feature support {#features}
Fuchsia currently supports these features of the VIM3:
* UART Serial Debugger
* Paving over ethernet and USB
* Storage (eMMC)
* HDMI Display and Framebuffer
* GPU (Mali) and Vulkan graphics
* Ethernet
* SDIO
* I2C
* GPIO
* Temperature Sensors and DVFS
* RTC
* Clock
* Fan
* NNA
* USB-C in peripheral mode
* USB-A
* Audio[^1]
[^1]: VIM3 does not include transducers like speakers and microphones,
in addition to the transducers, external hardware including DACs/ADCs
need to be added and integrated via the GPIO header to be able to
playback and capture audio this way.
These features are under development and may not be supported:
* Video decoder
* SPI
The following features are not supported, but might be added by future
contributions:
* SPI Flash
* USB-C in host mode
* Power management and PMIC
* Wake on LAN
* UART BT
These features are not supported and are unlikely to be added:
* Video encoding (due to non-public firmware)
* Trusted Execution Environment / secure boot
## Appendix: Update the boot splash screen {#splash}
To update the boot splash screen to be the Fuchsia logo, run the following
command from a host terminal while the VIM3 is in `fastboot` mode:
```posix-terminal
~/fuchsia/prebuilt/third_party/fastboot/fastboot flash logo \
~/fuchsia/zircon/kernel/target/arm64/board/vim3/firmware/logo.img
```
[Khadas VIM3]: https://www.khadas.com/vim3
[install Fuchsia on a VIM3]: #install
[contributors]: /docs/contribute/community/contributor-roles.md#member
[DVFS]: https://en.wikipedia.org/wiki/Dynamic_frequency_scaling
[build Fuchsia]: #build
[USB to TTL serial cable]: https://www.adafruit.com/product/954
[heatsink]: https://www.khadas.com/product-page/new-vim-heatsink
[VIM3 collection]: https://www.khadas.com/shop?Collection=VIM3&sort=price_descending
[Download the Fuchsia source code]: /docs/get-started/get_fuchsia_source.md
[Configure and build Fuchsia]: /docs/get-started/build_fuchsia.md
[USB hub]: https://en.wikipedia.org/wiki/USB_hub
[`fastboot`]: https://en.wikipedia.org/wiki/Fastboot
[Serial Debugging Tool]: https://docs.khadas.com/products/sbc/vim3/development/setup-serial-tool
[VIM3/3L Hardware]: https://docs.khadas.com/products/sbc/vim3/hardware/start
[Erase eMMC]: https://docs.khadas.com/products/sbc/vim3/development/erase-emmc
[Install OS into eMMC]: https://docs.khadas.com/products/sbc/vim3/install-os/install-os-into-emmc-via-usb-tool#install-on-ubuntu-pc
[Upgrade Mode]: https://docs.khadas.com/products/sbc/vim3/install-os/boot-into-upgrade-mode
[bricked]: https://en.wikipedia.org/wiki/Brick_(electronics)
[Erase the eMMC]: #emmc
[Update the Android image]: #android
[Update the bootloader]: #bootloader
[Flash Fuchsia into the eMMC (one-time only)]: #fuchsia
[VIM3 official docs]: https://docs.khadas.com/linux/vim3/index.html
[Khadas VIM3 official forum]: https://forum.khadas.com/c/khadas-vim3/30
[Fuchsia mailing lists and chat rooms]: /docs/contribute/community/mailing-lists.md
[persistent local build arguments]: /docs/development/build/fx.md#defining_persistent_local_build_arguments
[Update your Fuchsia image]: #update
[Troubleshooting: Bootloops]: #bootloops
[issue 122113]: https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=122113
[bricked]: https://en.wikipedia.org/wiki/Brick_(electronics)