U-Boot (Universal Boot-loader), developed by Denx Software Engineering, is an open-source bootloader commonly used in embedded systems. It serves as the initial program that loads the operating system, notably the Linux kernel, into DRAM and prepares the system for execution. U-Boot is highly configurable and supports a wide range of architectures and hardware platforms. Moreover, it is licensed as free software under the GNU General Public License, fostering collaborative development and widespread adoption.
Refer to:
Table of Contents
Features of U-Boot
Key features and characteristics of U-Boot include:
Versatility: U-Boot is designed to be versatile and can be adapted to various architectures, including ARM, MIPS, x86, and more.
Open Source: U-Boot is released under the GNU General Public License (GPL), providing users with the freedom to view, modify, and distribute the source code.
Boot Sequence Control: U-Boot handles the initialization and configuration of the hardware during the boot process. It allows users to interact with the bootloader through a command-line interface, enabling them to control the boot sequence, load kernel images, and set various parameters.
Support for Various Storage Devices: U-Boot supports loading firmware and kernel images from a variety of storage devices, including NAND and NOR flash memory, SD cards, USB storage, TFTP servers, and more.
Environment Variables: U-Boot allows the configuration of environment variables that store important settings, such as boot parameters and memory addresses.
Network Booting: U-Boot supports network booting, allowing systems to load kernel images and other files over the network using protocols like TFTP or NFS.
Development and Debugging Tools: U-Boot includes tools for debugging and development, such as memory and register inspection, script execution.
Features of U-Boot of SP7350 Platform
U-Boot serves as the second-stage bootloader in SP7350 platform. After initializing itself, U-Boot then loads Linux kernel image from external storage devices into DRAM and executes it. As it runs in DRAM, its size is no longer limited by SRAM of SP7350 (only limited by the system's DRAM size), ranging from hundreds of kilobytes to several megabytes.
Apart from its role as a bootloader for loading the Linux kernel, U-Boot supports reading images from external storage devices such as USB flash drives or SD cards and writing images into NOR flash, NAND flash, and eMMC devices in system. Key features of U-Boot for SP7350 are as follows:
Support console at UART0 (@ 115,200 bps).
Support booting Linux from SPI-NOR flash, SPI-NAND flash, 8-bit NAND flash or eMMC device.
Support in-system program (ISP) for SPI-NOR flash, SPI-NAND flash, 8-bit NAND flash or eMMC device.
Support read images from USB flash drives or SD cards for in-system program (ISP).
Support secure-boot (check hash value of Linux image).
Support fastboot function for eMMC device.
Support fastboot function for SPI-NAND and 8-bit NAND flashes (only for updating Linux kernel or rootfs partition).
Supported Drivers for SP7350 Platform
The source files of U-Boot are conveniently located within the "boot/uboot/" directory under the project's top directory. For the SP7350 platform, a wide array of device drivers is supported. These drivers are within the "drivers" directory. Below is a reference table detailing the drivers along with their corresponding feature descriptions:
Drivers | Folders or files | Feature descriptions |
8-bit NAND | mtd/nand/raw/sp_paranand/ |
|
Clock | clk/sunplus/ |
|
eMMC | mmc/sp_mmc* |
|
Ethernet | net/designware.* |
|
fastboot | fastboot/ |
|
I2C | i2c/designware_i2c* |
|
OTP | soc/sunplus/ |
|
Reset | reset/reset-sunplus.c |
|
Pinctrl | pinctrl/sunplus/ |
|
SD card | mmc/sp_sd* |
|
SPI | spi/designware_spi.c |
|
SPI-NAND | mtd/nand/raw/sp_* |
|
SPI-NOR | mtd/spi/spi-nor-ids.c spi/sp_spi_nor.c |
|
UART | serial/serial_sunplus.c |
|
USB2.0 EHCI | usb/host/ehci-sunplus.c |
|
USB2.0 OHCI | usb/host/ohci-sunplus.c |
|
USB2.0 UDC | usb/gadget/sp_udc.c |
|
USB3.0 DRD | usb/host/xhci-spdwc3.c usb/gadget/spdwc3_udc.c |
|
Video | video/sunplus/sp7350/disp/ |
|
SP7350 Platform-specific Files or Folders
Board-specific Files
Board-specific files for the SP7350 platform can be found in the “board/sunplus/” directory. Below is a breakdown of the folders and their descriptions:
Folders | Descriptions |
common/secure_sp7350/ | Contains files related to secure boot functionality. |
sp7350/ | Houses SP7350 platform-specific or hardware-specific files. |
Architecture-specific Files
Architecture-specific files for the SP7350 platform are situated at “arch/arm/” within the U-Boot directory. Here's a summary of the files and folders:
Files or folders | Descriptions |
cpu/armv8/ | Contains ARMv8 CPU (ex: Cortex A55) related files. |
mach-pentagram/include/mach | Contains platform or hardware-related header files. |
mach-pentagram/cpu.c | Encompasses subroutines responsible for CPU reset, memory mapping, DRAM configuration, and more. |
Configuration Header File
The configuration header file comprises board-specific configuration options, hardware parameters, and initialization settings tailored to the target platform. For the SP7350 platform, the configuration header file is “include/configs/pentagram_common_sp7350_c.h.”
Default Configuration Files
Default configuration files of U-Boot are stored in the “configs” directory. Specifically for the SP7350 platform, default configuration files are prefixed with “sp7350_”.
Device-tree Source Files
U-Boot shares device-tree source files with Linux, which are located in the directory 'linux/kernel/arch/arm64/boot/dts/sunplus/'.
U-Boot Log and Explanation
Line 1: The banner (version) of U-Boot.
Line 3: The size of the CPU cache-line is 64 bytes.
Line 4: Model name is ‘Sunplus SP7350’.
Line 5: The DRAM size is 3.8 GiB.
Line 6: PLLA (Audio PLL) is set to 147,456,000 Hz.
Line 7: PLLC (CPU frequency) is set to 1,500,000,000 Hz.
Line 8: PLLL3 (L3 cache frequency) is set to 1,200,000,000 Hz.
Line 9: PLLD (SDRAM PLL) is set to 800,000,000 Hz.
Line 10: PLLH (Peripheral PLL) is set to 2,150,000,000 Hz.
Line 11: PLLN (NPU PLL) is set to 500,000,000 Hz.
Line 12: PLLS (System PLL) is set to 2,000,000,000 Hz.
Line 16: The U-Boot environment variable is successfully loaded.
Line 17-20: The display is successfully probed.
Line 21-23: Standard input, output and error are directed to the serial (UART0)
Line 27-39: Initializing and scanning USB devices.
Line 41: Starting to run the default script command.
Line 42: Boot-device is 0x1F (MX[6..2]), indicating eMMC boot.
Line 43: “[scr] emmc boot” indicates that U-Boot is executing the default 'eMMC boot' script.
Line 45: Loading the header of the Linux kernel image.
Line 47: Loading the Linux kernel image.
Line 48-48: Unzipping the Linux kernel image.
Line 50-58: Preparing to run Linux kernel.
U-Boot 2021.04-g93254255 (Feb 14 2024 - 18:41:47 +0800) CONFIG_SYS_CACHELINE_SIZE: 64 Model: Sunplus SP7350 DRAM: 3.8 GiB PLLA : 147456000 Hz PLLC : 1500000000 Hz PLLL3 : 1200000000 Hz PLLD : 800000000 Hz PLLH : 2150000000 Hz PLLN : 500000000 Hz PLLS : 2000000000 Hz reset: reset@f8800004 SPI: Manufacturer id = 0x00, Device id = 0x0000 MMC: emmc: 0, sd: 1 Loading Environment from MMC... OK Disp: probe ... Disp: init 1920x1080 settings Disp: lt8912b bridge not found Disp: probe done In: serial Out: serial Err: serial Net: Could not get PHY for stmmac@f8103000: addr 1 No ethernet found. starting USB... Bus usb@f8102100: ehci_sunplus_probe.204, dev_name:usb@f8102100,port_num:0 after write usbruncmd,usbcmd:80b01,retry_times:0 USB EHCI 1.10 Bus usb@f8102080: ohci_sunplus_probe.21, dev_name:usb@f8102080,port_num:1 USB OHCI 1.0 Bus dwc3@f80a1000: Register 2000140 NbrPorts 2 Starting the controller USB XHCI 1.10 scanning bus usb@f8102100 for devices... 1 USB Device(s) found scanning bus usb@f8102080 for devices... 1 USB Device(s) found scanning bus dwc3@f80a1000 for devices... 1 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found Hit any key to stop autoboot: 0 [scr] bootcmd started fa218008: 0000001f .... [scr] emmc boot MMC read: dev # 0, block # 8738, count 1 ... 1 blocks read: OK MMC read: dev # 0, block # 8738, count 19297 ... 19297 blocks read: OK unzip 10000000 2000000 Uncompressed size: 27285512 = 0x1A05808 booti 2000000 - ef8ec510 ## Flattened Device Tree blob at ef8ec510 Booting using the fdt blob at 0xef8ec510 ehci_usb_remove.214, dev_name:usb@f8102100,port_num:0 ohci_sunplus_remove.28, dev_name:usb@f8102080,port_num:1 Loading Device Tree to 00000000ef8d9000, end 00000000ef8e987f ... OK Starting kernel ...