Cấu hình firmware Raspberry Pi và file config.txt cho CM5
Bootloader của Raspberry Pi Compute Module 5 (CM5) hoạt động dựa trên firmware được nhúng sẵn trên chip BCM2712, nhưng nó cần các file cấu hình để biết cách tải kernel và device tree. Chúng ta sẽ chuẩn bị thư mục chứa firmware và file cấu hình chính.
Việc này cần thiết để đảm bảo bootloader nhận diện đúng phần cứng (CM5 vs CM4) và cấu hình các tham số khởi động như clock speed, memory split, và boot device.
Trước tiên, hãy tạo thư mục firmware trong cây build của dự án Yocto hoặc thư mục build tùy chỉnh của bạn. Chúng ta sẽ sử dụng firmware từ repository chính thức của Raspberry Pi.
mkdir -p ${WORKDIR}/boot/firmware
cd ${WORKDIR}/boot/firmware
git clone https://github.com/raspberrypi/firmware.git .
Kết quả: Thư mục firmware được tải về, chứa các file binary như start_xxx.elf, fixup_xxx.dat và các thư mục con như boot, overlay.
Bây giờ, tạo file cấu hình chính config.txt tại đường dẫn đầy đủ. File này là đầu vào quan trọng nhất cho bootloader.
File config.txt tại đường dẫn ${WORKDIR}/boot/firmware/config.txt sẽ có nội dung hoàn chỉnh như sau, được tối ưu cho CM5 boot từ SPI:
arm_freq=2166
core_freq=500
sdram_freq=800
over_voltage_sdram=2
over_voltage_sdram_ddr=2
gpu_freq=500
enable_uart=1
dtoverlay=cm5
dtoverlay=spi0-0
kernel=kernel8.img
device_tree=cm5.dtb
initramfs=initramfs.cpio.gz
boot_delay=0
Kết quả mong đợi: File config.txt được tạo thành công. Các tham số clock đã được đẩy lên mức cao cho CM5, UART được bật để debug console, và device tree cm5.dtb được chỉ định.
Verify kết quả cấu hình firmware
Để kiểm tra, hãy chạy lệnh hiển thị nội dung file vừa tạo và xác nhận các tham số quan trọng.
cat ${WORKDIR}/boot/firmware/config.txt | grep -E "kernel|device_tree|dtoverlay"
Kết quả: Đầu ra phải hiển thị dòng kernel=kernel8.img, device_tree=cm5.dtb và dtoverlay=cm5.
Tích hợp Kernel và Device Tree vào thư mục boot
Copy Kernel Image và Device Tree Blob
Ở phần 3, bạn đã biên dịch kernel thành file Image và tạo device tree thành dtb. Bây giờ cần chuyển đổi và copy chúng vào đúng định dạng mà bootloader CM5 yêu cầu.
Bootloader CM5 mong đợi file kernel có tên kernel8.img và file device tree có tên cm5.dtb (hoặc tên tương ứng với overlay) trong thư mục firmware.
Thực hiện lệnh copy và rename từ thư mục build kernel (giả sử tại ${KERNEL_SRC}/arch/arm64/boot/) vào thư mục firmware đã tạo.
cp ${KERNEL_SRC}/arch/arm64/boot/Image ${WORKDIR}/boot/firmware/kernel8.img
cp ${KERNEL_SRC}/arch/arm64/boot/dts/broadcom/cam5.dtb ${WORKDIR}/boot/firmware/cm5.dtb
Lưu ý: Nếu file dtb của bạn có tên khác (ví dụ rpi-cm5.dtb), hãy đổi tên thành cm5.dtb để khớp với file config.txt ở trên, hoặc sửa lại dòng device_tree trong config.
Kết quả: Hai file kernel8.img và cm5.dtb xuất hiện trong thư mục ${WORKDIR}/boot/firmware.
Thêm file fixup cho CM5
CM5 cần file fixup.dat đặc biệt để tải firmware GPU và thiết lập memory map chính xác cho module. Nếu thiếu file này, hệ thống có thể treo ở màn hình đen hoặc không nhận RAM đầy đủ.
Tải file fixup.dat (phiên bản cho CM5 thường dùng fixup.dat hoặc fixup_x.dat tùy vào RAM, ở đây ta dùng fixup.dat mặc định cho 8GB/4GB).
wget https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat -O ${WORKDIR}/boot/firmware/fixup.dat
Kết quả: File fixup.dat được tải về và nằm cùng thư mục với kernel.
Verify kết quả tích hợp
Liệt kê thư mục boot để đảm bảo tất cả các file cần thiết đều có mặt.
ls -lh ${WORKDIR}/boot/firmware/ | grep -E "kernel8|cm5|fixup"
Kết quả: Đầu ra hiển thị 3 file: kernel8.img, cm5.dtb, và fixup.dat.
Xây dựng Image Boot cho SPI Flash hoặc SD Card
Tạo Image Boot cho SD Card (Dùng cho phát triển/debug)
Để kiểm tra nhanh, ta tạo image boot cho thẻ SD. Cấu trúc này tương tự như booting trên Raspberry Pi 4 nhưng với cấu hình CM5.
Chúng ta sẽ tạo một file image raw (ví dụ boot.img) có kích thước 64MB, format bằng FAT32, và copy toàn bộ nội dung thư mục firmware vào đó.
dd if=/dev/zero of=${WORKDIR}/boot_sd.img bs=1M count=64
mkdosfs -F 32 ${WORKDIR}/boot_sd.img
mkdir -p ${WORKDIR}/mnt_boot
mount -o loop ${WORKDIR}/boot_sd.img ${WORKDIR}/mnt_boot
cp -r ${WORKDIR}/boot/firmware/* ${WORKDIR}/mnt_boot/
umount ${WORKDIR}/mnt_boot
Kết quả: File boot_sd.img được tạo, có thể burn vào thẻ SD và cắm vào slot SD của CM5 (nếu bo mạch chủ hỗ trợ) hoặc dùng để test trên Pi 4/5.
Xây dựng Image Boot cho SPI Flash (Dùng cho sản phẩm cuối)
CM5 có thể boot trực tiếp từ SPI NOR Flash gắn trên bo mạch chủ. Để làm được điều này, chúng ta cần đóng gói firmware, kernel và dtb vào một file binary duy nhất để flash vào chip SPI.
Công cụ raspi-spi-flash (hoặc script tự viết) sẽ tạo ra file image có cấu trúc: [BL2] [BL31] [Firmware] [Kernel] [DTB]. Tuy nhiên, cách đơn giản nhất là tạo file boot.bin chứa firmware và config, sau đó dùng dd hoặc công cụ flashing.
Tạo file spi_boot.bin bằng cách gộp các thành phần. Ở đây chúng ta sẽ tạo file config.txt và kernel8.img nằm trên một vùng memory giả lập, nhưng thực tế trên CM5, bootloader sẽ đọc từ SPI.
Để đơn giản hóa quy trình cho Yocto, ta tạo file spi-image.bin chứa toàn bộ nội dung thư mục firmware, sau đó dùng công cụ rpi-imagemaker hoặc script bash để đóng gói đúng định dạng SPI.
cd ${WORKDIR}
mkdir -p spi_image
cp -r boot/firmware/* spi_image/
# Tạo file bootcode.bin nếu chưa có (lấy từ firmware repo)
cp firmware/boot/bootcode.bin spi_image/
# Đóng gói thành file SPI flash (giả định dùng script đóng gói chuẩn)
./scripts/create_spi_flash.sh spi_image/ ${WORKDIR}/cm5_spi_boot.bin
Lưu ý: Script create_spi_flash.sh cần được viết riêng để layout đúng theo spec của Broadcom. Nếu chưa có script, ta dùng phương pháp đơn giản: tạo file boot.bin chứa bootcode.bin + fixup.dat + config.txt + kernel8.img + cm5.dtb nối tiếp nhau (concatenate) hoặc dùng cat nếu bootloader hỗ trợ đơn giản.
Tuy nhiên, cách chuẩn xác nhất cho CM5 SPI là dùng rpi-spi-flash tool. Nếu không có tool đó, ta sẽ tạo file image bằng cách gộp bootcode.bin và các file còn lại vào một file duy nhất.
cat ${WORKDIR}/boot/firmware/bootcode.bin ${WORKDIR}/boot/firmware/fixup.dat ${WORKDIR}/boot/firmware/config.txt ${WORKDIR}/boot/firmware/kernel8.img ${WORKDIR}/boot/firmware/cm5.dtb > ${WORKDIR}/cm5_spi_flash.bin
Kết quả: File cm5_spi_flash.bin được tạo, chứa toàn bộ dữ liệu cần thiết để flash vào SPI NOR Flash.
Verify kết quả tạo Image
Kiểm tra kích thước file image để đảm bảo nó không vượt quá dung lượng của chip SPI (thường là 16MB hoặc 32MB).
ls -lh ${WORKDIR}/cm5_spi_flash.bin
du -h ${WORKDIR}/boot_sd.img
Kết quả: File cm5_spi_flash.bin có kích thước hợp lý (dưới 16MB) và boot_sd.img là 64MB.
Kiểm tra và xác thực quá trình boot từ SPI Flash
Flash Image vào SPI NOR Flash
Sử dụng công cụ flashrom hoặc rpi-spi-flash (tùy vào bo mạch chủ có JTAG hay không) để ghi file cm5_spi_flash.bin vào chip SPI.
Giả sử bạn đang dùng một Raspberry Pi 4/5 làm host để flash vào CM5 thông qua GPIO (SPI mode), hoặc dùng JTAG programmer.
flashrom -p linux_spi:dev=/dev/spidev0.0,speed=100000 -w ${WORKDIR}/cm5_spi_flash.bin
Lưu ý: Đường dẫn /dev/spidev0.0 có thể thay đổi tùy theo bo mạch chủ và cấu hình SPI. Cần đảm bảo kernel driver spi-bcm2835 đã được load.
Kết quả: Công cụ flashrom báo "Programming erasing... OK" và "Verifying... OK".
Kiểm tra Boot từ Console UART
Sau khi flash, hãy reset CM5 và kết nối UART (TX/RX) từ bo mạch chủ vào PC (dùng USB-to-TTL). Cấu hình terminal: 115200 8N1.
Quan sát dòng log từ bootloader (U-Boot hoặc Raspberry Pi Firmware) để xác nhận nó đã đọc đúng device tree và load kernel.
screen /dev/ttyUSB0 115200
Kết quả mong đợi: Màn hình hiển thị dòng Starting kernel..., sau đó là log của kernel Linux ([ 0.000000] Booting Linux...) và cuối cùng là login prompt.
Verify Boot Device trong System
Khi hệ thống đã chạy, vào terminal và kiểm tra xem hệ thống đang boot từ đâu. Trên CM5, ta có thể kiểm tra qua file /proc/device-tree hoặc log dmesg.
dmesg | grep -i "boot device"
cat /proc/device-tree/chosen/bootargs
Kết quả: Log dmesg có thể hiển thị Booting from SPI hoặc mmc0 (nếu boot từ SD). Dòng bootargs chứa tham số root= chỉ đúng partition rootfs.
Để chắc chắn 100% đang boot từ SPI, hãy rút thẻ SD card (nếu có) và reset lại. Nếu hệ thống vẫn lên, nghĩa là boot từ SPI thành công.
cat /sys/firmware/devicetree/base/model
Kết quả: Đầu ra hiển thị Raspberry Pi Compute Module 5 hoặc tương tự, xác nhận device tree được load đúng.
Điều hướng series:
Mục lục: Series: Xây dựng hệ điều hành Linux tùy biến từ source cho Raspberry Pi CM5
« Phần 3: Tùy chỉnh Linux Kernel cho Raspberry Pi CM5
Phần 5: Xây dựng Rootfs với Package Manager và dịch vụ hệ thống »