Flashing the RB5: Hands-on
Sau khi vào được chế độ EDL mode, thì mình dùng tool qdl của Qualcomm cung cấp để tiến hành flash trên device.
Luồng hoạt động của qdl

Như trên hình 1, luồng hoạt động hình dung như một cuộc chuyển chặng gồm 2 phần. Chặng đầu, PBL trong ROM nói chuyện bằng Sahara để nhận firehose programmer. Chặng sau, programmer ấy chạy trên chip, nói bằng Firehose (dạng XML), đọc các file rawprogram/patch và ghi từng phân vùng.
Chạy thử bằng dry-run
Mình có thể chạy câu lệnh dry-run để kiểm tra trước, chạy thực tế thì bạn bỏ dry-run:
qdl --dry-run prog_firehose_ddr.elf rawprogram*.xml patch*.xmlKết quả của câu lệnh dry-run sẽ check được trước lỗi trước khi flash lên device:
This is a dry-run execution of QDL. No actual flashing has been performedwaiting for programmer...flashed "persist" successfully...flashed "persist" successfullyflashed "system_a" successfully...flashed "system_a" successfullyflashed "system_b" successfully...flashed "system_b" successfullyflashed "userdata" successfully...flashed "userdata" successfullyflashed "PrimaryGPT" successfullyflashed "BackupGPT" successfullyflashed "xbl_a" successfullyflashed "xbl_config_a" successfullyflashed "PrimaryGPT" successfullyflashed "BackupGPT" successfullyflashed "xbl_b" successfullyflashed "xbl_config_b" successfullyflashed "PrimaryGPT" successfullyflashed "BackupGPT" successfullyflashed "ddr" successfullyflashed "PrimaryGPT" successfullyflashed "BackupGPT" successfullyflashed "aop_a" successfullyflashed "tz_a" successfullyflashed "hyp_a" successfullyflashed "bluetooth_a" successfullyflashed "abl_a" successfullyflashed "dsp_a" successfullyflashed "keymaster_a" successfullyflashed "boot_a" successfullyflashed "cmnlib_a" successfullyflashed "cmnlib64_a" successfullyflashed "devcfg_a" successfullyflashed "qupfw_a" successfullyflashed "dtbo_a" successfullyflashed "uefisecapp_a" successfullyflashed "multiimgoem_a" successfullyflashed "featenabler_a" successfullyflashed "imagefv_a" successfullyflashed "aop_b" successfullyflashed "tz_b" successfullyflashed "hyp_b" successfullyflashed "bluetooth_b" successfullyflashed "abl_b" successfullyflashed "dsp_b" successfullyflashed "keymaster_b" successfullyflashed "boot_b" successfullyflashed "cmnlib_b" successfullyflashed "cmnlib64_b" successfullyflashed "devcfg_b" successfullyflashed "qupfw_b" successfullyflashed "dtbo_b" successfullyflashed "uefisecapp_b" successfullyflashed "multiimgoem_b" successfullyflashed "featenabler_b" successfullyflashed "imagefv_b" successfullyflashed "apdp" successfullyflashed "spunvm" successfullyflashed "logfs" successfullyflashed "PrimaryGPT" successfullyflashed "BackupGPT" successfullyflashed "PrimaryGPT" successfullyflashed "BackupGPT" successfully78 patches appliedpartition 1 is now bootableTrong log, chỉ 4 partition là flash nhiều lệnh: persist, system_a, system_b, userdata. Vì chúng là sparse image, mỗi chunk qdl log một dòng.
Câu hỏi đặt ra: mình đã flash đủ và đúng chưa? Phần đúng thì chờ board boot lên là biết. Phần đủ thì khó hơn, vì log chỉ kể những gì qdl đã ghi, chứ không kể những gì lẽ ra phải ghi mà lại thiếu.
Ghi vào UFS
Toàn bộ số file trên đi vào UFS của board. Mô hình một chip UFS mình ghi lại trong bài UFS: My Understanding: mỗi partition nằm trên một LU riêng, nên mỗi dòng trong rawprogram phải nói đủ hai toạ độ, LU nào và LBA nào.
Hướng tiếp theo: bring-up bằng mã nguồn mở
Bản build mình vừa flash đến từ SDK của hãng, muốn lấy thì phải ký NDA. Nên câu hỏi mình muốn trả lời tiếp là: muốn đưa con board này lên tới mức chạy được Linux thì cần tối thiểu những gì, và trong đó phần nào đã có sẵn dưới dạng mã nguồn mở?
Tạm liệt kê từng mảnh theo thứ tự chúng xuất hiện trong một lần bring-up:
| Thành phần | Vai trò | Tình trạng |
|---|---|---|
qdl | Công cụ nạp chạy trên máy host | Mã nguồn mở: linux-msm/qdl |
Firehose programmer (prog_firehose_ddr.elf) | Chạy trên chip, nhận lệnh rồi ghi vào UFS | Do hãng ký, chỉ có trong bản phát hành |
| Bootloader: XBL, TZ, ABL | Khởi động sớm và giữ chain of trust | Binary của hãng |
| Kernel | Nhân Linux cho SM8250 | Mainline đã có hỗ trợ, do Linaro upstream (Qualcomm OnQ) |
| Rootfs | Hệ thống tệp gốc | Bản dựng công khai của Linaro, xem bài Linaro |
| Firmware DSP, WLAN, GPU | Nạp lúc chạy qua request_firmware() | Chủ yếu là blob; riêng WLAN QCA6390 có trong linux-firmware (ath11k/QCA6390/hw2.0) |
Nhìn bảng thì thấy ranh giới khá rõ: từ kernel trở lên đã có đường công khai, còn mọi thứ chạy trước kernel, tức programmer và bootloader, vẫn phải lấy từ bản phát hành của hãng.
Nên hướng thử tiếp theo của mình là đi đúng theo ranh giới đó: giữ nguyên bootloader của hãng, còn boot image và rootfs thì dựng từ nguồn mở, rồi xem cái gì gãy và thiếu firmware nào.
Comming soon.










