This file will talk about how we can update the kernel image on the Firefly RK3399 boards. The easiest thing would be to download the existing unified firmware image and then just burn that to the board, which you can easily find useful information on the Firefly official documents. The following shows the links to the unified firmware images: Download the unified Firmware image from http://en.t-firefly.com/doc/download/3.html. Try Google Drive https://drive.google.com/drive/folders/0B7HO8lbGgAqAdXBsaG9NMEl5bm8 for Ubuntu 16.04. We have made a local copy named "Firefly-RK3399-ubuntu16.04-20180416112819.tgz" in this link (http://plrg.eecs.uci.edu/git/?p=FireflyImages.git). Unzip it and you will get a file named "Firefly-RK3399-ubuntu16.04-20180416112819.img", which is the unified firmware. The unfortunate part is that we used the Linux kernel 4.4.55, which is a slightly older version than the Firefly official website has, so we need to rebuild the kernel with the right version and then burn it to the board. The following steps show how you can do it: 1. Burn the unified Ubuntu firmware image that you can download with the previously mentioned links. To burn that to the board, you need to use the "upgrade_tool" (http://en.t-firefly.com/doc/product/info/263.html). Note that we need to enter Loader mode first --- plug the type-C cable to the host machine, and enter Loader mode (http://en.t-firefly.com/doc/product/info/265.html). You can also see the html file "BootMode/265.html". 2. Build the Firefly RK3399 kernel, which generates the kernel.img & resource.img (http://en.t-firefly.com/doc/product/info/id/290.html). The kernel git repo is at https://gitlab.com/TeeFirefly/linux-kernel/tree/firefly_0821_release. We use kernel 4.4.55. Specifically, we build the kernel with the follwing commit: * 70b6d4f (HEAD -> 4.4.55, tag: firefly_0821_release)(1 year, 3 months ago) account@t-firefly.com ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1 To do that, do the following in command line (don't forget to install the AArch64 cross compile environment on your host machine first): git clone https://gitlab.com/TeeFirefly/linux-kernel git reset --hard 70b6d4f export ARCH=arm64 export CROSS_COMPILE=aarch64-linux-gnu- make firefly_linux_defconfig make rk3399-firefly-linux.img -j4 You will find the generated kernel.img & resource.img files after the compilation. We have made a copy of both files in the follwoing link: http://plrg.eecs.uci.edu/git/?p=FireflyImages.git. 3. Create an Ubuntu root filesystem. The point of this step is to create a file called "rootfs.img" that is the ubuntu file system. You will need to burn this file system along with the kernel to the board in later steps. The version of Ubuntu we used is "Ubuntu 16.04.2 LTS (GNU/Linux 4.4.55 aarch64)". The link that you will find useful and will follow is this link: http://en.t-firefly.com/doc/product/info/id/291.html. Just in case, we made local copies of the instructions in "BuildUbuntuRootFS/291.html" & "BuildUbuntuRootFS/334.html" A few caveats: a. Try to give the root system 4GBs of space. b. It will be good to set up the following config/softwares when you create the Ubuntu file system: /etc/network/interfaces -> IP, etc /etc/hostname -> dw-*, etc /etc/fstab -> If mounted with external hard drive c. It's also good to install the following necessary applications on the host machine. It's a lot faster than installing them on the board natively. sudo apt install vim git cmake libtool software-properties-common autoconf \ libboost-all-dev \ libevent-dev \ libdouble-conversion-dev \ libiberty-dev \ liblz4-dev \ liblzma-dev \ libsnappy-dev \ zlib1g-dev \ binutils-dev \ libjemalloc-dev \ libssl-dev \ pkg-config sudo add-apt-repository universe sudo apt update sudo apt upgrade 4. Use upgrade_tool to ONLY burn the kernel.img, resource.img (generated in step 2), and rootfs.img (generated in step 3). Useful local copy of instruction can be found in "FlashImage/310.html". 5. Restart the board and all should be good.