1. Yêu cầu phần cứng và thiết lập vật lý
Mục tiêu: Đảm bảo bạn có đầy đủ các linh kiện cần thiết để tạo thành một hệ thống Raspberry Pi Compute Module 5 (CM5) hoàn chỉnh trước khi bắt đầu cấu hình phần mềm.
Thiết bị cần thiết:
- Raspberry Pi Compute Module 5 (CM5): Module chính chứa SoC Broadcom BCM2712. Chọn phiên bản có sẵn bộ nhớ eMMC (4GB/8GB/16GB) hoặc phiên bản RAM chỉ (chưa có eMMC).
- Carrier Board: Tấm mạch mang (Baseboard) tương thích CM5. Ví dụ: Raspberry Pi CM5IO Baseboard hoặc Custom Carrier Board do bạn tự thiết kế có hỗ trợ boot từ eMMC/SD.
- Bộ nhớ ngoài (Nếu cần): Thẻ microSD ít nhất 32GB (Class 10) nếu Carrier Board không có eMMC onboard hoặc cần boot từ thẻ để flash eMMC.
- Cổng kết nối: Đầu nối USB-C để cấp nguồn (5V/3A) và kết nối mạng/UART cho quá trình debug.
- Bo mạch UART (Optional): Adapter USB-to-Serial (CP210x hoặc FTDI) nếu cần truy cập console log trong quá trình boot sớm.
Thao tác vật lý:
Lắp module CM5 vào slot trên Carrier Board. Đảm bảo các chân tiếp xúc (pins) thẳng hàng và lực ép đều. Cắm thẻ microSD vào khe nếu đang sử dụng phương thức boot từ thẻ để flash hệ thống vào eMMC.
Kết quả mong đợi: Module CM5 được lắp đặt chắc chắn, không bị lỏng. Khi cấp nguồn qua USB-C, các LED trên Carrier Board (Power, Activity) sáng lên.
2. Cấu hình máy chủ Linux để biên dịch Kernel
Mục tiêu: Thiết lập môi trường làm việc trên máy chủ Linux (Ubuntu 22.04 hoặc Debian 12) với đầy đủ các công cụ cross-compiler và build dependencies để biên dịch Kernel cho kiến trúc ARM64 của CM5.
Lý do: Kernel Linux cho Raspberry Pi CM5 sử dụng kiến trúc ARM64 (aarch64). Bạn không thể biên dịch trực tiếp trên chính con chip Raspberry Pi vì thiếu tài nguyên và bộ công cụ phù hợp. Cần một máy chủ x86_64 mạnh hơn để biên dịch.
Cài đặt các gói phần mềm cần thiết:
Trên máy chủ Linux của bạn, mở terminal và chạy lệnh sau để cài đặt các công cụ biên dịch, Git, và các thư viện hỗ trợ:
sudo apt update && sudo apt install -y git build-essential libncurses-dev libssl-dev bc libelf-dev liblz4-dev libzstd-dev libpixman-1-dev kconfig-dtc libncurses5-dev libncursesw5-dev
Kết quả mong đợi: Hệ thống báo cáo "0 upgraded, X newly installed". Các công cụ như `make`, `gcc`, `git`, `dtc` đã sẵn sàng.
Tải và cài đặt Cross-compiler (ARM64):
Chúng ta cần bộ công cụ biên dịch ARM64 từ Raspberry Pi Foundation hoặc Linaro. Ở đây sử dụng phiên bản mới nhất của Raspberry Pi để đảm bảo tương thích tốt nhất với BCM2712.
cd ~
git clone --depth 1 https://github.com/raspberrypi/tools.git
cd tools
tar -xzf arm-bcm2711-prod-1.2.2-linux.tar.gz
export CROSS_COMPILE=~/tools/arm-bcm2711-prod-1.2.2-linux/bin/aarch64-linux-gnu-
echo "export CROSS_COMPILE=~/tools/arm-bcm2711-prod-1.2.2-linux/bin/aarch64-linux-gnu-" >> ~/.bashrc
source ~/.bashrc
Giải thích: Lệnh `export` thiết lập biến môi trường `CROSS_COMPILE` để `make` biết sử dụng bộ biên dịch ARM64 thay vì x86. Việc thêm vào `~/.bashrc` giúp biến này tồn tại sau khi đóng terminal.
Verify kết quả: Chạy lệnh kiểm tra phiên bản compiler:
$CROSS_COMPILE/gcc --version
Kết quả mong đợi: Hiển thị phiên bản GCC ARM64 (ví dụ: `gcc version 10.2.1` hoặc cao hơn) với kiến trúc `aarch64-linux-gnu`.
3. Tải nguồn code Kernel Raspberry Pi
Mục tiêu: Clone kho mã nguồn chính thức của Raspberry Pi Kernel, bao gồm cả các driver và thiết bị cây (Device Tree) dành riêng cho dòng BCM2712 (CM5).
Lý do: Kernel stock của Linux upstream chưa có các driver đặc thù cho phần cứng Raspberry Pi (như GPU VideoCore, NPU, hay các GPIO mapping cụ thể). Chúng ta cần fork chính thức của Raspberry Pi.
Clone kho mã nguồn:
Thực hiện lệnh sau để tải code. Chúng ta sẽ clone cả repository `rpi-kernel` (chứa kernel) và `rpi-firmware` (chứa firmware và bootloader) để đảm bảo tính đồng bộ.
cd ~
mkdir -p raspberry-pi-build
cd raspberry-pi-build
git clone --depth 1 https://github.com/raspberrypi/linux.git
git clone --depth 1 https://github.com/raspberrypi/firmware.git
Kết quả mong đợi: Hai thư mục `linux` và `firmware` được tạo ra trong thư mục `raspberry-pi-build`. Quá trình clone mất vài phút tùy tốc độ mạng.
Chọn Branch phù hợp cho CM5:
CM5 sử dụng SoC BCM2712. Chúng ta cần chuyển sang branch ổn định nhất hỗ trợ dòng chip này. Thường là `rpi-5.15.y` hoặc `rpi-6.1.y` tùy thuộc vào phiên bản OS bạn nhắm đến. Ở đây chọn `rpi-6.1.y` để hỗ trợ tính năng mới nhất.
cd linux
git fetch --all
git checkout rpi-6.1.y
Verify kết quả: Kiểm tra version của kernel hiện tại:
cat include/config/kernel.release
Kết quả mong đợi: Hiển thị số version kernel (ví dụ: `6.1.55` hoặc cao hơn).
4. Cài đặt công cụ Device Tree và U-Boot
Mục tiêu: Đảm bảo các công cụ xử lý Device Tree (`dtc`) và bootloader (`U-Boot`) được cài đặt và cấu hình đúng để biên dịch file `.dts` thành `.dtb` và chuẩn bị cho quá trình boot.
Lý do: Kernel ARM64 yêu cầu Device Tree Blob (DTB) để khởi động. File DTB được biên dịch từ file Device Tree Source (DTS) bằng công cụ `dtc`. U-Boot đóng vai trò khởi tạo phần cứng trước khi truyền tay cho Kernel.
Đảm bảo `dtc` đã sẵn sàng:
Trước khi cài đặt thêm, kiểm tra xem `dtc` đã có sẵn từ bước 2 chưa. Nếu chưa, cài đặt:
which dtc
if [ ! -f "$(which dtc)" ]; then sudo apt install -y dtc; fi
Kết quả mong đợi: Lệnh `which dtc` trả về đường dẫn (ví dụ: `/usr/bin/dtc`).
Cấu hình U-Boot cho CM5:
CM5 có thể boot từ eMMC hoặc SD. Để phát triển driver và kernel, chúng ta cần U-Boot để load Kernel và DTB vào RAM. Clone và cấu hình U-Boot tương thích với Raspberry Pi 5/CM5.
cd ~/raspberry-pi-build
git clone --depth 1 -b v2024.01 https://github.com/u-boot/u-boot.git
cd u-boot
make menuconfig
Cấu hình trong menuconfig: Trong giao diện `make menuconfig`, thực hiện các bước sau:
- Chọn Target Board Type -> ARM.
- Chọn Board Selection -> Raspberry Pi.
- Chọn Raspberry Pi Compute Module 5 (hoặc `Raspberry Pi 5` nếu không thấy CM5 riêng biệt, vì chúng dùng cùng SoC).
- Vào Boot devices -> Bật Support booting from eMMC (nếu Carrier Board của bạn dùng eMMC).
- Vào File systems -> Bật EXT4 và FAT (để đọc thẻ SD hoặc eMMC).
- Vào Device Driver Support -> MMC/SD Card support -> Bật Support for MMC/SD/SDIO cards.
- Chọn Save và Exit.
Biên dịch U-Boot:
Sau khi lưu cấu hình, biên dịch U-Boot để tạo file boot image.
make -j$(nproc)
Kết quả mong đợi: Quá trình biên dịch hoàn thành, tạo ra file `u-boot-dtb.bin` trong thư mục làm việc. File này chứa bootloader và device tree blob mặc định.
Copy file U-Boot ra thư mục firmware:
Để sử dụng file U-Boot này trong quá trình boot của hệ thống, chúng ta cần copy nó vào thư mục firmware đã clone ở bước 3.
cp u-boot-dtb.bin ~/raspberry-pi-build/firmware/boot/
Verify kết quả: Kiểm tra sự tồn tại của file U-Boot:
ls -lh ~/raspberry-pi-build/firmware/boot/u-boot-dtb.bin
Kết quả mong đợi: File `u-boot-dtb.bin` xuất hiện trong thư mục `firmware/boot/` với kích thước khoảng 1-2MB.
5. Kiểm tra tổng thể môi trường phát triển
Mục tiêu: Xác nhận toàn bộ chuỗi công cụ đã được liên kết chặt chẽ và sẵn sàng cho bước biên dịch Kernel trong phần tiếp theo.
Thực hiện lệnh kiểm tra:
Chạy script kiểm tra nhanh để đảm bảo biến môi trường, đường dẫn và các file cấu hình đều đúng.
echo "=== Environment Check ==="
echo "CROSS_COMPILE: $CROSS_COMPILE"
echo "Kernel Source: $(pwd)"
echo "DT Tool: $(which dtc)"
echo "U-Boot Image: $(ls ~/raspberry-pi-build/firmware/boot/u-boot-dtb.bin 2>/dev/null)"
echo "=== End Check ==="
Kết quả mong đợi:
- Dòng `CROSS_COMPILE` hiển thị đường dẫn đầy đủ đến `aarch64-linux-gnu-gcc`.
- Dòng `Kernel Source` hiển thị đường dẫn đến thư mục `linux`.
- Dòng `DT Tool` hiển thị `/usr/bin/dtc`.
- Dòng `U-Boot Image` hiển thị đường dẫn đến file `u-boot-dtb.bin`.
Nếu tất cả các dòng trên đều hiển thị đúng, môi trường phát triển cho Raspberry Pi CM5 đã hoàn tất. Bạn đã sẵn sàng cho Phần 2: Cấu hình Kernel cho tính năng AI và NPU.
Điều hướng series:
Mục lục: Series: Tối ưu hóa Linux Kernel cho Raspberry Pi CM5 để chạy AI Edge
Phần 2: Cấu hình Kernel cho tính năng AI và NPU »