Custom Uboot Flashing

Which Khadas SBC do you use?

Target Machine: Vim3
Host Machine: Ubuntu 22.10

Which version of system do you use? Khadas official images, self built images, or others?

Using U-boot source from here: GitHub - khadas/khadas-uboot: khadas-uboot
Using some images of U-boot from this folder: dl.khadas.com - Index of /firmware/vim3/uboot/mainline/
Using some custom U-boot binaries

Please describe your issue below:

What is the process for flashing a new version of uboot to a Vim3 board? I am attempting to load a new version of U-boot to the board, but I am unaware of how to transfer the uboot.sd.bin file to the board. I will detail how I have made these images and then how I have attempted to load not only my custom images but the official images as well

Building the U-boot image

  1. First pull the khadas-u-boot source from GitHub - khadas/khadas-uboot: khadas-uboot
    a. It looks like there might be several uboot sources. Should users be looking at [this](https://github.com/khadas/u-boot/tree/khadas-vims-v2015.01) or this for their uboot source?
  2. Then I use the bash script scripts/prepare and scripts/make
    • This is where the first issue arises, when running ./scripts/prepare this error appears

~/khadas-uboot$ ./scripts/prepare

[i] prepare tc
[i] make_010_dtc.sh
[i] make dtc-1.6.0.tar.gz
[i] DOWNLOAD https://github.com/dgibson/dtc/archive/v1.6.0.tar.gz => dtc-1.6.0.tar.gz DIR …/…/dl
[w] already downloaded
CHK version_gen.h
CC fdtdump.o
In file included from fdtdump.c:14:
In function ‘fdt_set_magic’,
inlined from ‘main’ at fdtdump.c:220:3:
libfdt/libfdt.h:251:28: error: array subscript ‘struct fdt_header[0]’ is partly outside array bounds of ‘unsigned char[4]’ [-Werror=array-bounds]
251 | fdth->name = cpu_to_fdt32(val);
| ~^~~~~~~~~
libfdt/libfdt.h:253:1: note: in expansion of macro ‘fdt_set_hdr_’
253 | fdt_set_hdr_(magic);
| ^~~~~~~~~~~~
fdtdump.c: In function ‘main’:
fdtdump.c:216:31: note: object ‘smagic’ of size 4
216 | unsigned char smagic[FDT_MAGIC_SIZE];
| ^~~~~~
cc1: all warnings being treated as errors
make: *** [Makefile:345: fdtdump.o] Error 1
[i] prepare tc DONE

    • the environment already has device-tree-compiler downloaded, it seems that this error has already been reported (see this forum post).
      What needs to be corrected for scripts/prepare to function correctly?
    • Next I use the ./scripts/make script. I would have thought that after a failure in prepare that the make script would not run. However I can see that files are created in my /tmp folder such as khadas-uboot-build and u-boot-mainline and several u-boot files such as u-boot.sd.bin.
    • The bin output here does not meet the naming convention listed here in the documentation. Is this the correct output bin file from the make script?

Flashing the U-boot Image

  1. The next step is flashing the bin file to an sd card and loading the flashed file onto the Vim3 board
    • Flashing both the output of the previous scripts and the officially supported images listed here to an sd card with the commands found here and then following the instructions for TF cards found here I received the same error after running run update with both binary files flashed
> G12B:BL:6e7c85:2a3b91;FEAT:E0F83180:402000;POC:F;RCY:0;EMMC:0;READ:0;0.
                                                                        bl2_stage_init 0x01
bl2_stage_init 0x81
hw id: 0x0000 - pwm id 0x01
bl2_stage_init 0xc1
bl2_stage_init 0x02
>
>L0:00000000
L1:20000703
L2:00008067
L3:14000000
B2:00402000
B1:e0f83180
>
>TE: 231891
>
>BL2 Built : 19:23:21, Sep 18 2020. g12b g9fde858 - gongwei.chen@droid11-sz
>
>Board ID = 10
Set A53 clk to 24M
Set A73 clk to 24M
Set clk81 to 24M
A53 clk: 1200 MHz
A73 clk: 1200 MHz
CLK81: 166.6M
smccc: 0003d30e
eMMC boot @ 0
sw8 s
board id: 10
Load FIP HDR DDR from eMMC, src: 0x00010200, des: 0xfffd0000, size: 0x00004000, part: 0
Get wrong ddr fw magic! Error!!
fw parse done
PIEI prepare done
00000000
emmc switch 1 ok
00000000
emmc switch 2 ok
 NO find ddr boot_info from eMMC
fastboot data verify
result: 255
Cfg max: 12, cur: 1. Board id: 255. Force loop cfg
LPDDR4 probe
>
>LPDDR4_PHY_V_0_1_22-Built : 14:57:26, Sep  1 2020. g12b g3c95fed - gongwei.chen@droid11-sz
ddr clk to 1608MHz
00000000
emmc switch 0 ok
>
>dmc_version 0001
Check phy result
INFO : End of CA training
INFO : End of initialization
INFO : Training has run successfully!
Check phy result
INFO : End of initialization
INFO : End of read enable training
INFO : End of fine write leveling
INFO : End of read dq deskew training
INFO : End of MPR read delay center optimization
INFO : End of Write leveling coarse delay
INFO : End of read delay center optimization
INFO : Training has run successfully!
Check phy result
INFO : End of initialization
INFO : End of MPR read delay center optimization
INFO : End of write delay center optimization
INFO : End of read delay center optimization
INFO : End of max read latency training
INFO : Training has run successfully!
1D training succeed
Check phy result
INFO : End of initialization
INFO : End of 2D read delay Voltage center optimization
INFO : End of 2D read delay Voltage center optimization
INFO : End of 2D write delay Voltage center optimization
INFO : End of 2D write delay Voltage center optimization
INFO : Training has run successfully!
>
>soc_vref_reg_value 0x 00000028 00000028 00000025 00000025 00000026 00000024 00000026 00000024 00000024 00000027 00000025 00000026 00000025 00000028 00000025 00000026 0000002a 00000028 00000026 00000028 00000025 
 dram_vref_reg_value 0x 00000016
2D training succeed
auto size-- 65535DDR cs0 size: 2048MB
DDR cs1 size: 2048MB
DMC_DDR_CTRL: 00e00024DDR size: 3928MB
cs0 DataBus test pass
cs1 DataBus test pass
cs0 AddrBus test pass
cs1 AddrBus test pass
>
>non-sec scramble use zero key
ddr scramble enabled
>
>100bdlr_step_size ps== 450
result report
boot times 0Enable ddr reg access
00000000
emmc switch 3 ok
Authentication key not yet programmed
get rpmb counter error 0x00000007
00000000
emmc switch 0 ok
Load FIP HDR from eMMC, src: 0x00010200, des: 0x01700000, size: 0x00004000, part: 0
Load BL3X from eMMC, src: 0x00078200, des: 0x01768000, size: 0x0010ac00, part: 0
0.0;M3 CHK:0;cm4_sp_mode 0
[Image: g12b_v1.1.3396-c893a7153 2020-11-11 13:54:36 gongwei.chen@droid11-sz]
OPS=0x10
ring efuse init
chipver efuse init
29 0b 10 00 01 18 10 00 00 18 30 34 33 42 42 50 
[0.016082 Inits done]
secure task start!
high task start!
low task start!
run into bl31
NOTICE:  BL31: v1.3(release):5c909a099
NOTICE:  BL31: Built : 17:18:21, Nov 20 2020
NOTICE:  BL31: G12A normal boot!
NOTICE:  BL31: BL33 decompress pass
ERROR:   Error initializing runtime service opteed_fast
>
>
>U-Boot 2015.01-g10d1af967c (Dec 20 2021 - 09:34:48)
>
>DRAM:  3.8 GiB
Relocation Offset is: d6d38000
mmu cfg end: 0xe0000000
mmu cfg end: 0xe0000000
spi_post_bind(spifc): req_seq = 0
register usb cfg[0][1] = 00000000d7e826c0
aml_i2c_init_port init regs for 0
MCU version: 0x00 0x03
MCU version is to low! Doesn't support froce boot from SD card.
NAND:  get_sys_clk_rate_mtd() 292, clock setting 200!
bus cycle0: 6,timing: 7
NAND device id: 0 9f ff ff ff ff 
No NAND device found!!!
nand init failed: -6
get_sys_clk_rate_mtd() 292, clock setting 200!
bus cycle0: 6,timing: 7
NAND device id: 0 9f ff ff ff ff 
No NAND device found!!!
nand init failed: -6
MMC:   aml_priv->desc_buf = 0x00000000d3d28a70
aml_priv->desc_buf = 0x00000000d3d2adb0
SDIO Port B: 0, SDIO Port C: 1
co-phase 0x3, tx-dly 0, clock 400000
co-phase 0x3, tx-dly 0, clock 400000
co-phase 0x3, tx-dly 0, clock 400000
emmc/sd response timeout, cmd8, cmd->cmdarg=0x1aa, status=0x3ff2800
emmc/sd response timeout, cmd55, cmd->cmdarg=0x0, status=0x3ff2800
co-phase 0x3, tx-dly 0, clock 400000
co-phase 0x1, tx-dly 0, clock 40000000
[set_emmc_calc_fixed_adj][875]find fixed adj_delay=20
init_part() 297: PART_TYPE_AML
[mmc_init] mmc init success
start dts,buffer=00000000d3d2d620,dt_addr=00000000d3d2d620
get_partition_from_dts() 92: ret 0
parts: 17
00:      logo   0000000000800000 1
01:  recovery   0000000001800000 1
02:      misc   0000000000800000 1
03:      dtbo   0000000000800000 1
04:  cri_data   0000000000800000 2
05:     param   0000000001000000 2
06:      boot   0000000001000000 1
set has_boot_slot = 0
07:       rsv   0000000001000000 1
08:  metadata   0000000001000000 1
09:    vbmeta   0000000000200000 1
10:       tee   0000000002000000 1
11:    vendor   000000001c000000 1
12:       odm   0000000008000000 1
13:    system   0000000064000000 1
14:   product   0000000008000000 1
15:     cache   0000000046000000 2
16:      data   ffffffffffffffff 4
init_part() 297: PART_TYPE_AML
eMMC/TSD partition table have been checked OK!
crc32_s:0x1577dad == storage crc_pattern:0x1577dad!!!
crc32_s:0xee152b83 == storage crc_pattern:0xee152b83!!!
crc32_s:0x79f50f07 == storage crc_pattern:0x79f50f07!!!
mmc env offset: 0x4d400000 
In:    serial
Out:   serial
Err:   serial
aml log : internal sys error!
reboot_mode=cold_boot
[store]To run cmd[emmc dtb_read 0x1000000 0x40000]
_verify_dtb_checksum()-3354: calc 82c4fa02, store 82c4fa02
_verify_dtb_checksum()-3354: calc 82c4fa02, store 82c4fa02
dtb_read()-3569: total valid 2
update_old_dtb()-3550: do nothing
aml_i2c_init_port init regs for 0
fusb302_init: Device ID: 0x91
CC connected in 1 as UFP
fusb302 detect chip.port_num = 0
amlkey_init() enter!
[EFUSE_MSG]keynum is 1
vpu: driver version: v20190313
vpu: detect chip type: 9
vpu: clk_level default: 7(666667000Hz), max: 7(666667000Hz)
vpu: clk_level in dts: 7
vpu: vpu_power_on
vpu: set_vpu_clk
vpu: set clk: 666667000Hz, readback: 666666667Hz(0x100)
vpu: set_vpu_clk finish
vpu: vpu_module_init_config
vpp: vpp_init
vpp: vpp osd2 matrix rgb2yuv..............
hdr_func 4, hdr_process_select 0x1
cvbs: cpuid:0x29
cvbs: find performance_pal config
LCD_RESET PIN: 0
lcd: lcd_debug_print flag: 0
lcd: detect mode: tablet, key_valid: 0
lcd: detect lcd_clk_path: 1
lcd: failed to get lcd_cpu_gpio_names
lcd: load config from dts
lcd: pinctrl_version: 2
lcd: use panel_type=lcd_1
lcd: bl: pinctrl_version: 2
lcd: bl: name: backlight_pwm, method: 1
lcd: error: gpio: wrong name invalid
lcd: bl: pwm_reg=0x00800002
lcd: bl: aml_bl_power_ctrl: 0
Net:   use internal ethernet
--------ext_ethernet=0
+++++++++ext_ethernet=0
dwmac.ff3f0000amlkey_init() enter!
amlkey_init() 71: already init!
[EFUSE_MSG]keynum is 1
MACADDR:02:00:00:10:18:01(from chipid)
>
>ramdump_init, add:0, size:0
CONFIG_AVB2: null 
Start read misc partition datas!
info->magic = 
info->version_major = 1
info->version_minor = 0
info->slots[0].priority = 15
info->slots[0].tries_remaining = 7
info->slots[0].successful_boot = 0
info->slots[1].priority = 14
info->slots[1].tries_remaining = 7
info->slots[1].successful_boot = 0
info->crc32 = -1075449479
active slot = 0
>
>wipe_data=successful
wipe_cache=successful
upgrade_step=2
aml log : internal sys error!
reboot_mode:::: cold_boot
lcd: error: outputmode[576cvbs] is not support
hpd_state=0
do_hpd_detect: hdmimode=1080p60hz
do_hpd_detect: colorattribute=444,8bit
Saving Environment to aml-storage...
mmc env offset: 0x4d400000 
Writing to MMC(1)... done
no sink, fallback to 720p60hz[4]
hdr mode is 0
dv  mode is ver:0  len: 0
hdr10+ mode is 0
read hdmichecksum 0x00000000, colorattribute 444,8bit
read hdmimode 1080p60hz, colorspace <NULL>, colordepth <NULL>
do_get_parse_edid: autoMode = false, manualMode=16
isYuv4kSink: false, maxTMDSRate=150
do_get_parse_edid: non-yuv4k sink: inColorSpace: HDMI_COLOR_FORMAT_RGB
do_get_parse_edid: default inColorDepth: HDMI_COLOR_DEPTH_24B
TV is same, initial mode is: 576cvbs attr: 444,8bit
dolby_status 0
dolby_status 0
dolby_vision_process: no tv and dv disabled
Saving Environment to aml-storage...
mmc env offset: 0x4d400000 
Writing to MMC(1)... done
[OSD]load fb addr from dts:/meson-fb
[OSD]set initrd_high: 0x7f800000
[OSD]fb_addr for logo: 0x7f800000
[OSD]load fb addr from dts:/meson-fb
[OSD]fb_addr for logo: 0x7f800000
[OSD]VPP_OFIFO_SIZE:0xfff01fff
[CANVAS]canvas init
[CANVAS]addr=0x7f800000 width=3840, height=2160
[OSD]osd_hw.free_dst_data: 0,719,0,575
[OSD]osd1_update_disp_freescale_enable
vpp: vpp_matrix_update: 2
cvbs_performance_enhancement
cvbs_config_hdmipll_g12a
cvbs_set_vid2_clk
hdr_packet
vpp: hdr_policy = 1
vpp: Rx hdr_info.hdr_sup_eotf_smpte_st_2084 = 0
normal power on
boot wol: disable
[reg_31] 0xd8a
[reg_16] 0x0
[reg_17] 0x7fff
[reg_19] 0x0
[reg_31] 0x0
[reg_31] 0xd40
[reg_22] 0x0
[reg_31] 0x0
saradc: 0x34d, hw_ver: 0x0 (Unknow)
>
>
>gpio: pin GPIOAO_7 (gpio 7) value is 1
port mode is usb3.0
Command: bcb uboot-command 
Start read misc partition datas!
BCB hasn't any datas,exit!
>
>
>Hit Enter or space or Ctrl+C key to stop autoboot -- :  0 
kvim3#run update
InUsbBurn
wait for phy ready count is 0
noSof
sof timeout, reset usb phy tuning
card in
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 40000000
[set_emmc_calc_fixed_adj][875]find fixed adj_delay=20
init_part() 282: PART_TYPE_DOS
[mmc_init] mmc init success
Device: SDIO Port B
Manufacturer ID: 27
OEM: 5048
Name: SD32G 
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: (0x734400000 Bytes) 28.8 GiB
mmc clock: 40000000
Bus Width: 4-bit
** Unrecognized filesystem type **
Device: SDIO Port B
Manufacturer ID: 27
OEM: 5048
Name: SD32G 
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: (0x734400000 Bytes) 28.8 GiB
mmc clock: 40000000
Bus Width: 4-bit
** Unrecognized filesystem type **
** Unrecognized filesystem type **
(Re)start USB...
USB0:   USB3.0 XHCI init start
Register 3000140 NbrPorts 2
Starting the controller
USB XHCI 1.10
scanning bus 0 for devices... 2 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
** Bad device usb 0 **
** Bad device usb 0 **
Start read misc partition datas!
info->magic = 
info->version_major = 1
info->version_minor = 0
info->slots[0].priority = 15
info->slots[0].tries_remaining = 7
info->slots[0].successful_boot = 0
info->slots[1].priority = 14
info->slots[1].tries_remaining = 7
info->slots[1].successful_boot = 0
info->crc32 = -1075449479
active slot = 0
active_slot: normal
Unknown command 'wipeisb' - try 'help'
avb2: 0
ee_gate_off ...
avb2: 0
>##Booting Android Image at 0x03080000 ...
    • The issue seems to be that the filesystem is not recognized by uboot to allow for the sdc_burning commands to run. Are there any other ways to flash a u-boot.sd.bin file to the vim3?

TL;DR

How can I take an official (or custom) u-boot binary file and transfer it over to the VIM3 board?

Please let me know if I can provide any other information about the build or flash process.

Hello @swell

Which system you used?

For Ubuntu you check check the documentation to upgrade the U-Boot.

https://docs.khadas.com/products/sbc/vim3/configurations/upgrade-linux-uboot

Could you describe one of two things:

  1. How are the uboot binary files that are created from the khadas-uboot git repo supposed to be loaded onto the vim3 board? Why does the following error occur in uboot when I follow the instructions listed here?

or

  1. How does the debian package you’ve suggested allow me to make changes to the uboot config? Can I make configuration changes to uboot by using that package?

When you ask :

Are you asking which operating system my Vim3 is running or which operating system I am using as my host?
My host computer is using Ubuntu, but the target board hasn’t been loaded with anything beyond the default android operating system that the board has been shipped with.

Could you address this question? I appreciate your time reviewing my posts

Thank you

Flashing the image VIM3.u-boot.sd.bin gives me a slightly different set of errors after running run update

Flashing commands:

sudo dd if=VIM3.u-boot.sd.bin of=/dev/sda conv=fsync,notrunc bs=442 count=1
sudo dd if=VIM3.u-boot.sd.bin of=/dev/sda conv=fsync,notrunc bs=512 skip=1 seek=1

Uboot Log Output:

Hit Enter or space or Ctrl+C key to stop autoboot – : 0
kvim3#run update
InUsbBurn
wait for phy ready count is 0
noSof
sof timeout, reset usb phy tuning
card in
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 400000
co-phase 0x2, tx-dly 0, clock 40000000
[set_emmc_calc_fixed_adj][875]find fixed adj_delay=20
init_part() 282: PART_TYPE_DOS
[mmc_init] mmc init success
Device: SDIO Port B
Manufacturer ID: 27
OEM: 5048
Name: SD32G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: (0x734400000 Bytes) 28.8 GiB
mmc clock: 40000000
Bus Width: 4-bit
Device: SDIO Port B
Manufacturer ID: 27
OEM: 5048
Name: SD32G
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: (0x734400000 Bytes) 28.8 GiB
mmc clock: 40000000
Bus Width: 4-bit
reading aml_autoscript
** Unable to read file aml_autoscript **
reading recovery.img
** Unable to read file recovery.img **
(Re)start USB…
USB0: USB3.0 XHCI init start

Yes, the system your VIM3 running, Ununtu or Android ?

I am using ubutnu image with the setup with aml burn tool as noted here
The actual image is this one: vim3-ubuntu-20.04-gnome-linux-4.9-fenix-1.4-221229-emmc.img.xz
I can also swap to the OS that was delivered with the board if need be ( I have a krescue image with the original android os in it).

I have answered my question, I’ll include my process for posterity.
Using the Fenix source code (see here),
the aml flasher tool ( source and documentation),
and an ubuntu image ( vim3-ubuntu-20.04-gnome-linux-4.9-fenix-1.4-221229-emmc.img.xz).

Install Custom U-boot Image

This is how I went about doing it, I am sure there are easier methods.

  1. Prepare vim3 board
    a. Because I’ve only been able to update uboot via the debian package process (linked in replies above) I installed the Ubuntu image in order to later install debian packages.
    b. Download the flasher tool and follow the documentation to setup the tool
    c. Burn the Ubuntu image to the Vim3 board:
$ burn-tool -v aml -b VIM3 -i /path/to/image
  1. d. you should be able to see the ubuntu console (either through a serial connection or through an HDMI connection). User/Password is khadas/khadas
  2. Make the deb file
    a. Clone Fenix: Fenix comes with the u-boot-mainline distro inside of it.
    b. Set the environment: make sure to make a note of which version of uboot you’ve selected as the defconfig file will change for each one(see this Fenix file for uboot files).
<path-to-Fenix>$ source env/setenv.sh
  1. c. Locate Uboot defconfig file location (/build//configs) and make edits to the file
    d. from the top-level Fenix directory run make uboo-deb. I included NO_HOST_CHECK=1 because I was on a non-supported Ubuntu distro (kinetic).
    e. Locate newly created deb file in /build/images/deb//<.deb file> and copy to a usb
    f. Insert USB into VIM3 board running Ubuntu and mount the device
    g. Navigate to USB and run on the VIM3 board
$ sudo dpkg -i <.deb file>
$ sync
$ sudo reboot

Congrats! You have updated U-boot