Video failed to load

Flashing the RB5: Hands-on

694 words
3 minutes
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#

Hình 1: Luồng hoạt động của qdl.
Hình 1: 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:

Terminal window
qdl --dry-run prog_firehose_ddr.elf rawprogram*.xml patch*.xml

Kế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 performed
waiting for programmer...
flashed "persist" successfully
...
flashed "persist" successfully
flashed "system_a" successfully
...
flashed "system_a" successfully
flashed "system_b" successfully
...
flashed "system_b" successfully
flashed "userdata" successfully
...
flashed "userdata" successfully
flashed "PrimaryGPT" successfully
flashed "BackupGPT" successfully
flashed "xbl_a" successfully
flashed "xbl_config_a" successfully
flashed "PrimaryGPT" successfully
flashed "BackupGPT" successfully
flashed "xbl_b" successfully
flashed "xbl_config_b" successfully
flashed "PrimaryGPT" successfully
flashed "BackupGPT" successfully
flashed "ddr" successfully
flashed "PrimaryGPT" successfully
flashed "BackupGPT" successfully
flashed "aop_a" successfully
flashed "tz_a" successfully
flashed "hyp_a" successfully
flashed "bluetooth_a" successfully
flashed "abl_a" successfully
flashed "dsp_a" successfully
flashed "keymaster_a" successfully
flashed "boot_a" successfully
flashed "cmnlib_a" successfully
flashed "cmnlib64_a" successfully
flashed "devcfg_a" successfully
flashed "qupfw_a" successfully
flashed "dtbo_a" successfully
flashed "uefisecapp_a" successfully
flashed "multiimgoem_a" successfully
flashed "featenabler_a" successfully
flashed "imagefv_a" successfully
flashed "aop_b" successfully
flashed "tz_b" successfully
flashed "hyp_b" successfully
flashed "bluetooth_b" successfully
flashed "abl_b" successfully
flashed "dsp_b" successfully
flashed "keymaster_b" successfully
flashed "boot_b" successfully
flashed "cmnlib_b" successfully
flashed "cmnlib64_b" successfully
flashed "devcfg_b" successfully
flashed "qupfw_b" successfully
flashed "dtbo_b" successfully
flashed "uefisecapp_b" successfully
flashed "multiimgoem_b" successfully
flashed "featenabler_b" successfully
flashed "imagefv_b" successfully
flashed "apdp" successfully
flashed "spunvm" successfully
flashed "logfs" successfully
flashed "PrimaryGPT" successfully
flashed "BackupGPT" successfully
flashed "PrimaryGPT" successfully
flashed "BackupGPT" successfully
78 patches applied
partition 1 is now bootable

Trong 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:

Bảng 1: Các thành phần cần cho một lần bring-up và tình trạng nguồn mở
Thành phầnVai tròTình trạng
qdlCông cụ nạp chạy trên máy hostMã 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 UFSDo hãng ký, chỉ có trong bản phát hành
Bootloader: XBL, TZ, ABLKhởi động sớm và giữ chain of trustBinary của hãng
KernelNhân Linux cho SM8250Mainline đã có hỗ trợ, do Linaro upstream (Qualcomm OnQ)
RootfsHệ thống tệp gốcBản dựng công khai của Linaro, xem bài Linaro
Firmware DSP, WLAN, GPUNạ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.

Comments

Profile Image of the Author
Art
When the world stopped, I started compiling.
Announcement
Welcome to my blog!
Latest Moments
Table of Contents