384 lines
5.9 KiB
Markdown
384 lines
5.9 KiB
Markdown
# U-Boot Build Guide for Lichee Pi Zero
|
|
|
|
## Introduction
|
|
|
|
This guide explains how to build U-Boot for the Lichee Pi Zero board based on the Allwinner V3s SoC.
|
|
|
|
U-Boot is the first-stage bootloader responsible for:
|
|
|
|
- Initializing hardware
|
|
- Loading the Linux kernel
|
|
- Preparing the boot environment
|
|
|
|
Older LicheePi U-Boot repositories are based on Python 2 and may not work correctly on modern Linux distributions without additional setup.
|
|
|
|
---
|
|
|
|
# What is Cross Compilation?
|
|
|
|
The Lichee Pi Zero uses an ARM CPU, but the build process usually runs on an x86_64 Linux PC.
|
|
|
|
Because of this, a cross compiler is required.
|
|
|
|
A cross compiler runs on your PC but generates binaries for ARM devices.
|
|
|
|
This project uses the following toolchain:
|
|
|
|
- gcc-linaro-6.3.1-2017.05
|
|
- Target architecture: `arm-linux-gnueabihf`
|
|
|
|
---
|
|
|
|
# Why Use pyenv?
|
|
|
|
Older U-Boot versions used in LicheePi projects depend on Python 2.
|
|
|
|
Modern Ubuntu and Debian releases no longer provide Python 2 packages directly:
|
|
|
|
```bash
|
|
sudo apt install python2
|
|
```
|
|
|
|
will fail on newer systems.
|
|
|
|
To solve this problem, we use `pyenv` to install and manage Python 2 locally.
|
|
|
|
Example:
|
|
|
|
```bash
|
|
pyenv install 2.7.18
|
|
pyenv local 2.7.18
|
|
```
|
|
|
|
Then build U-Boot using:
|
|
|
|
```bash
|
|
make PYTHON=$(pyenv which python)
|
|
```
|
|
|
|
---
|
|
|
|
# Install the Cross-Compile Toolchain
|
|
|
|
## Download the Toolchain
|
|
|
|
Download from one of the following sources:
|
|
|
|
- https://licheepizero.us/arm-linux-gnueabihf/
|
|
- https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/
|
|
|
|
---
|
|
|
|
## Install the Toolchain
|
|
|
|
```bash
|
|
wget https://licheepizero.us/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
|
|
```
|
|
|
|
```bash
|
|
tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz
|
|
```
|
|
|
|
```bash
|
|
sudo mv gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf /opt/
|
|
```
|
|
|
|
---
|
|
|
|
# Add the Toolchain to PATH
|
|
|
|
Open the global bash configuration:
|
|
|
|
```bash
|
|
sudo nano /etc/bash.bashrc
|
|
```
|
|
|
|
Add this line:
|
|
|
|
```bash
|
|
PATH="$PATH:/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin"
|
|
```
|
|
|
|
Reload the shell configuration:
|
|
|
|
```bash
|
|
source /etc/bash.bashrc
|
|
```
|
|
|
|
---
|
|
|
|
# Verify the Toolchain
|
|
|
|
```bash
|
|
arm-linux-gnueabihf-gcc -v
|
|
```
|
|
|
|
If GCC version information appears, the toolchain is installed correctly.
|
|
|
|
---
|
|
|
|
# Install Device Tree Compiler
|
|
|
|
```bash
|
|
sudo apt-get install device-tree-compiler
|
|
```
|
|
|
|
This package is required for compiling device tree files.
|
|
|
|
---
|
|
|
|
# Download and Build U-Boot
|
|
|
|
## Clone the Repository
|
|
|
|
Standard branch:
|
|
|
|
```bash
|
|
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
|
|
```
|
|
|
|
Experimental SPI branch:
|
|
|
|
```bash
|
|
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-spi-experimental
|
|
```
|
|
|
|
Then:
|
|
|
|
```bash
|
|
cd u-boot
|
|
```
|
|
|
|
---
|
|
|
|
# Select Board Configuration
|
|
|
|
Choose one of the available defconfig targets depending on your display.
|
|
|
|
## 800x480 LCD
|
|
|
|
```bash
|
|
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig
|
|
```
|
|
|
|
## 480x272 LCD
|
|
|
|
```bash
|
|
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero480x272LCD_defconfig
|
|
```
|
|
|
|
## No LCD
|
|
|
|
```bash
|
|
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig
|
|
```
|
|
|
|
---
|
|
|
|
# Optional Configuration Menu
|
|
|
|
You can customize the build configuration using:
|
|
|
|
```bash
|
|
make ARCH=arm menuconfig
|
|
```
|
|
|
|
From this menu you can:
|
|
|
|
- Enable or disable drivers
|
|
- Configure boot options
|
|
- Enable SPI flash support
|
|
- Change UART settings
|
|
- Enable debugging features
|
|
|
|
---
|
|
|
|
# Build U-Boot
|
|
|
|
## Standard Build
|
|
|
|
```bash
|
|
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
|
|
```
|
|
|
|
## Build With Log Output
|
|
|
|
```bash
|
|
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log
|
|
```
|
|
|
|
---
|
|
|
|
# Build Using pyenv Python
|
|
|
|
If the U-Boot tree requires Python 2:
|
|
|
|
```bash
|
|
make PYTHON=$(pyenv which python) ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
|
|
```
|
|
|
|
This ensures that tools such as `binman` use the Python version managed by pyenv.
|
|
|
|
---
|
|
|
|
# Build Output
|
|
|
|
After a successful build, the following file will be generated:
|
|
|
|
```text
|
|
u-boot-sunxi-with-spl.bin
|
|
```
|
|
|
|
This image contains:
|
|
|
|
- SPL
|
|
- U-Boot
|
|
- Device Tree
|
|
|
|
and can be written directly to the boot media.
|
|
|
|
---
|
|
|
|
# Flash U-Boot to SD Card
|
|
|
|
## Find the SD Card Device
|
|
|
|
Insert the SD card and run:
|
|
|
|
```bash
|
|
lsblk
|
|
```
|
|
|
|
Example output:
|
|
|
|
```text
|
|
sda 931G
|
|
├─sda1
|
|
sdb 16G
|
|
├─sdb1
|
|
```
|
|
|
|
Usually, `/dev/sdb` is the SD card.
|
|
|
|
Be very careful to select the correct device.
|
|
|
|
---
|
|
|
|
## Unmount SD Card Partitions
|
|
|
|
```bash
|
|
sudo umount /dev/sdb1
|
|
```
|
|
|
|
Or unmount all partitions:
|
|
|
|
```bash
|
|
sudo umount /dev/sdb*
|
|
```
|
|
|
|
---
|
|
|
|
## Write U-Boot with 8KB Offset
|
|
|
|
```bash
|
|
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
|
|
```
|
|
|
|
Explanation:
|
|
|
|
| Parameter | Meaning |
|
|
|---|---|
|
|
| `if=` | Input file |
|
|
| `of=` | Output device |
|
|
| `bs=1024` | Block size = 1KB |
|
|
| `seek=8` | Start writing at 8KB offset |
|
|
|
|
The Allwinner BootROM expects the SPL at this offset.
|
|
|
|
---
|
|
|
|
## Flush Buffered Writes
|
|
|
|
```bash
|
|
sync
|
|
```
|
|
|
|
---
|
|
|
|
# Verify the Flash
|
|
|
|
You can inspect the beginning of the SD card:
|
|
|
|
```bash
|
|
sudo hexdump -C /dev/sdb | head
|
|
```
|
|
|
|
Or check partitions:
|
|
|
|
```bash
|
|
sudo fdisk -l /dev/sdb
|
|
```
|
|
|
|
---
|
|
|
|
# Boot Test
|
|
|
|
Insert the SD card into the board and connect UART.
|
|
|
|
If everything is correct, U-Boot logs should appear on the serial console.
|
|
|
|
---
|
|
|
|
# Common Errors
|
|
|
|
## Python 2 Syntax Errors
|
|
|
|
Example:
|
|
|
|
```text
|
|
SyntaxError: Missing parentheses in call to 'print'
|
|
```
|
|
|
|
Cause:
|
|
|
|
- Python 2 scripts executed using Python 3
|
|
|
|
Solutions:
|
|
|
|
- Use pyenv with Python 2
|
|
- Run `2to3`
|
|
- Patch the scripts manually
|
|
|
|
---
|
|
|
|
## Cross Compiler Not Found
|
|
|
|
Example:
|
|
|
|
```text
|
|
arm-linux-gnueabihf-gcc: command not found
|
|
```
|
|
|
|
Solutions:
|
|
|
|
- Verify PATH configuration
|
|
- Verify toolchain installation
|
|
|
|
---
|
|
|
|
# Summary
|
|
|
|
To successfully build U-Boot for the Lichee Pi Zero:
|
|
|
|
1. Install the ARM cross-compilation toolchain
|
|
2. Install the Device Tree Compiler
|
|
3. Clone the correct U-Boot repository
|
|
4. Use pyenv if Python 2 is required
|
|
5. Build the project
|
|
6. Flash the generated image to the SD card
|
|
|
|
After this step, you can continue with:
|
|
|
|
- Linux kernel compilation
|
|
- Root filesystem generation
|
|
- Embedded Linux setup |