Embedded Linux A-Z

Embedded Linux A-Z

    • About
    • Beaglebone Black
    • STM32MP157
  • Facebook
  • GitHub
  • LinkedIn

[Boot-BBB] 2. Compile U-boot và chạy test MLO, u-boot.img

Ở bài này, mình sẽ hướng dẫn các bạn compile từ source của u-boot và cấu hình cho board Beaglebone Black. Về u-boot là gì, các bạn có thể đọc thêm tại https://embeddedlinux.blog/2025/05/10/bbb-linux-3-beaglebone-black-boot-process-u-boot/

  1. 1. Clone, cấu hình và compile u-boot
    1. 1.1 Clone và checkout
    2. 1.2 Cài đặt biến môi trường cho Cross-compile
    3. 1.3. Compile default config và device tree
    4. 1.4 Sửa lỗi thiếu thư viện, package
  2. 2. Chuẩn bị thẻ nhớ
    1. 2.1 Format thẻ nhớ
    2. 2.2 Tạo phân vùng cho thẻ nhớ
    3. 2.3 Tạo file system cho từng phân vùng
  3. 3. Copy MLO và u-boot.img vào thẻ nhớ test
    1. 3.1 Copy chỉ MLO
    2. 3.2 Copy tiếp u-boot.img

1. Clone, cấu hình và compile u-boot

1.1 Clone và checkout

git clone https://source.denx.de/u-boot/u-boot.git
cd u-boot
git checkout v2023.01

Mình checkout v2023.01 bởi đó là phiên bản được sử dụng trong worklabs bootlin, mang độ tương thích cao với busybox và buildroot trong cùng series

1.2 Cài đặt biến môi trường cho Cross-compile

Ta đang cross-compile, do đó ta phải sử dụng toolchain đã build ra từ bài trước. Mình đã thêm vào PATH nên ta chỉ cần chạy câu lệnh đơn giản sau.

export CROSS_COMPILE=arm-linux-

Bạn hiểu đơn giản nếu không set biến này thì nó sẽ là rỗng, khi gọi gcc sẽ đang là gọi gcc hiện tại có trên laptop bạn dùng để build. Thay vì arm-linux-gcc ta build từ bài trước, dùng để build cho ARM vậy

1.3. Compile default config và device tree

Ta chọn tiếp default config và device tree cho beaglebone black. Về device tree các bạn có thể đọc thêm tại đây : https://embeddedlinux.blog/2025/05/10/bbb-linux-3-1-tai-sao-can-co-device-tree/

make am335x_evm_defconfig .
make DEVICE_TREE=am335x-boneblack

1.4 Sửa lỗi thiếu thư viện, package

Trong lúc build trên máy mình, mình có gặp lỗi sau, các bạn có thể gặp lỗi khá tương tự

include/image.h:1383:12: fatal error: openssl/evp.h: No such file or directory
 1383 | #  include <openssl/evp.h>

Ở đây thì hiểu khá đơn giản là mình đang chưa có thư viện openssl trên máy, do đó ta sẽ phải cài thêm gói.

sudo apt-get install libssl-dev

Nhưng cài thêm bao nhiêu là đủ ? Đó là khi bạn nên kiểm tra tài liệu từ u-boot, với keyword U-boot prerequisites, link tài liệu tại đây: https://docs.u-boot.org/en/stable/build/gcc.html

sudo apt-get install bc bison build-essential coccinelle \
  device-tree-compiler dfu-util efitools flex gdisk graphviz imagemagick \
  libgnutls28-dev libguestfs-tools libncurses-dev \
  libpython3-dev libsdl2-dev libssl-dev lz4 lzma lzma-alone openssl \
  pkg-config python3 python3-asteval python3-coverage python3-filelock \
  python3-pkg-resources python3-pycryptodome python3-pyelftools \
  python3-pytest python3-pytest-xdist python3-sphinxcontrib.apidoc \
  python3-sphinx-rtd-theme python3-subunit python3-testtools \
  python3-venv swig uuid-dev

Thừa hơn thiếu, các bạn cài đủ để quá trình compile u-boot diễn ra 1 cách trơn tru.

2. Chuẩn bị thẻ nhớ

2.1 Format thẻ nhớ

Hiểu đơn giản là ta ghi 0 (/dev/zero) lên phân vùng boot của thẻ

sudo dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=16
  • if=/dev/zero: input file là /dev/zero, nội dung là 0x00
  • of=/dev/mmcblk0: output file là /dev/mmcblk0 (ở đây là địa chỉ thẻ nhớ của mình, nếu các bạn cắm thẻ qua usb nó sẽ là /dev/sda, /dev/sdb. Nhớ lưu chỗ này )
  • bs=1M: block size là 1Mb: mega bytes
  • count=16: ghi 16 block size (Xóa phần đầu, sạch MBR/GPT/bootloader cũ)

Có 1 cách khác là bạn khi 0 lên toàn bộ thẻ, nhưng việc này là không cần thiết. Vì thiếu phân vùng boot và các header hợp lý, dữ liệu khác 0 trên thẻ chỉ là dữ liệu rác vậy.

2.2 Tạo phân vùng cho thẻ nhớ

sudo sfdisk /dev/mmcblk0 << EOF
,64M,0x0c,*
,1024M,L,
EOF

Tạo phân vùng 1

  • Kích thước : 64Mb,
  • 0x0C ở đây hiểu là Partition Type ID https://gist.github.com/mxpv/5187707?utm_source=chatgpt.com
  • * là bootable flag (Có thể boot từ đây)

Phân vùng 2

  • Kích thước 1024Mb
  • L ở đây là viết tắt cho Linux (https://www.man7.org/linux/man-pages/man8/sfdisk.8.html) mục Shortcut and Aliases
  • Không chứa bootable flag

2.3 Tạo file system cho từng phân vùng

sudo mkfs.vfat -a -F 16 -n boot /dev/mmcblk0p1
sudo mkfs.ext4 -L rootfs /dev/mmcblk0p2

FAT cho phân vùng boot

  • mkfs.vfat : tạo FAT12/16/32 (FAT = File Allocation Table)
  • -F 16: FAT16
  • -n boot: name = boot
sudo mkfs.ext4 -L rootfs /dev/mmcblk0p2

ext4 cho rootfs

  • mkfs.ext4 : (make file system – ext4)
  • -L rootfs : label = rootfs . Mình tìm hiểu thì mkfs.ext4 mkfs.vfat lại thuộc 2 bộ công cụ khác nhau nên có cách dùng param hơi khác nhau

Okay vậy là xong, giờ khi bạn check bằng lsblk (list block) máy ta sẽ hiển thị như sau

mmcblk0     179:0    0   7,4G  0 disk 
├─mmcblk0p1 179:1    0    64M  0 part /media/zk47/boot
└─mmcblk0p2 179:2    0     1G  0 part /media/zk47/rootfs

3. Copy MLO và u-boot.img vào thẻ nhớ test

3.1 Copy chỉ MLO

Ở đây để hiển thị kĩ hơn về trình tự tìm kiếm các file trong quá trình boot mình sẽ copy từng file vào thẻ nhớ (Đọc kỹ hơn tại 1. BBB-Linux Overview https://embeddedlinux.blog/beaglebone-black/). Đầu tiên là MLO.

Các bạn copy file MLO vừa build ra vào phân vùng boot trên thẻ nhớ

zk47@ltu:~/Learning/Bootlin_practice/u-boot$ sudo cp MLO /media/zk47/boot/

Khởi động board ta sẽ nhận được nội dung sau

U-Boot SPL 2023.01 (Sep 18 2025 - 23:22:33 +0700)
Trying to boot from MMC1
spl_load_image_fat: error reading image u-boot.img, err - -2
SPL: failed to boot from all boot devices
### ERROR ### Please RESET the board ###

Dễ thấy, ta đang không cung cấp cho u-boot file u-boot.img, nên nó sẽ lỗi.

3.2 Copy tiếp u-boot.img

zk47@ltu:~/Learning/Bootlin_practice/u-boot$ sudo cp u-boot.img /media/zk47/boot/

Lần này khởi động board lên ta sẽ thấy nội dung sau

U-Boot SPL 2023.01 (Sep 18 2025 - 23:22:33 +0700)
Trying to boot from MMC1


U-Boot 2023.01 (Sep 18 2025 - 23:22:33 +0700)

CPU  : AM335X-GP rev 2.1
Model: TI AM335x BeagleBone Black
DRAM:  512 MiB
Core:  160 devices, 18 uclasses, devicetree: separate
WDT:   Started wdt@44e35000 with servicing every 1000ms (60s timeout)
NAND:  0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
Loading Environment from FAT... Unable to read "uboot.env" from mmc0:1... 
<ethaddr> not set. Validating first E-fuse MAC
Net:   eth2: ethernet@4a100000, eth3: usb_ether
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
No EFI system partition
BootOrder not defined
EFI boot manager: Cannot load any image
switch to partitions #0, OK
mmc1(part 0) is current device
Scanning mmc 1:1...
BootOrder not defined
EFI boot manager: Cannot load any image
## Error: "bootcmd_nand0" not defined

Lần này ta gặp lỗi uboot.env, do đó ta sẽ cần bổ sung file này ở bài sau.

Ở bài sau mình sẽ compile kernel và dùng uboot.env để cài đặt các biến môi trường cho u-boot.

Mong được các bạn tiếp tục đón đọc và ủng hộ !!

Chia sẻ:

  • Nhấp để chia sẻ trên X (Mở trong cửa sổ mới) X
  • Nhấn vào chia sẻ trên Facebook (Mở trong cửa sổ mới) Facebook
Thích Đang tải…
Trước đó
Kế tiếp

Bình luận về bài viết này Hủy trả lời

  • Facebook
  • GitHub
  • LinkedIn
  • Bình luận
  • Đăng lại
  • Theo dõi Đã theo dõi
    • Embedded Linux A-Z
    • Đã có tài khoản WordPress.com? Đăng nhập.
    • Embedded Linux A-Z
    • Theo dõi Đã theo dõi
    • Đăng ký
    • Đăng nhập
    • URL rút gọn
    • Báo cáo nội dung
    • Xem toàn bộ bài viết
    • Quản lý theo dõi
    • Ẩn menu
%d