olragon

HiMedia Q10 Pro chạy Linux mainline 6.18

🌿 buddingupdated 2026-10-14#linux#phan-cung#tv-box#mainline#hi3798cv200#tai-lieu

Viết cho ai đang cầm một con Q10 Pro, hay bất kỳ thiết bị Hi3798CV200 nào. Kết quả nào cũng đo trên máy thật và có bằng chứng ghi ngay bên cạnh. Chỗ nào mình chỉ suy ra, mình ghi rõ là suy ra.

English: HiMedia Q10 Pro on mainline Linux 6.18.

Bo mạch Q10 Pro: mạch tím, chip Hi3798CV200 dưới tản nhiệt đen, module WiFi AP6255 bên dưới
Bo v2.2: Hi3798CV200 (4 nhân Cortex-A53) nằm dưới tản nhiệt, RAM 2 GB, WiFi/BT AP6255. Tem serial đã làm mờ.

Tóm tắt

Vấn đề

Phần cứng con này còn ngon, chỉ có phần mềm là đã chết. Câu hỏi đặt ra: làm sao cho nó chạy một hệ điều hành mới, còn được cập nhật, mà vẫn giữ được giải mã video phần cứng?

Hướng giải

Chạy Linux mainline (bản longterm 6.18) ở chế độ 32-bit, driver media nào thiếu thì port hoặc tự viết.

Vì sao 32-bit: firmware boot và TEE đều là 32-bit, nên kernel phải chạy AArch32. App chỉ có bản arm64 sẽ không chạy.

Các bước

Nên làm đúng thứ tự, vì bước trước cho bạn công cụ để làm bước sau.

1. Lấy root và sao lưu trước khi đụng vào bất cứ thứ gì

Firmware gốc là bản eng, có ro.debuggable=1, nên chỉ cần adb root là có root, không phải ghi gì vào máy. Dùng nó để dump cả 19 phân vùng eMMC, rồi so sha256 của từng file với sha256 tính ngay trên máy. Lưu luôn bản firmware gốc đúng phiên bản. Máy của mình chạy HMD-2.1.7, và fingerprint trong gói phải khớp với ro.build.fingerprint của máy.

2. Cho U-Boot boot từ USB trước

Bootloader gốc có sẵn USB host và đọc được FAT (usb start, fatload), chỉ là không ai cấu hình. Sửa bootcmd trong biến môi trường để nó:

  1. nạp trustedcore (TEE) trước, như lệnh gốc;
  2. thử fatload + bootm file uImage trên USB;
  3. nếu không được thì chạy tiếp các lệnh eMMC gốc, giữ nguyên từng chữ.

Không cắm USB, hoặc bootm từ chối kernel, thì máy vào Android như thường. Giữ lại bản dump biến môi trường gốc để ghi trả khi cần.

⚠️ Biến môi trường gốc có verify=n: bootm không kiểm CRC của uImage. Image hỏng vẫn được chạy chứ không bị từ chối, và máy đứng luôn. Hãy kiểm cả hai CRC và trường arch trước khi chép image vào USB.

3. Build kernel và device tree

4. Debug khi không có console: watchdog làm "thước đo"

Ở mỗi mốc trong giai đoạn boot sớm, kernel hẹn lại watchdog SP805 với một thời hạn khác nhau. Máy tự reset sau bao lâu thì biết nó đã chạy tới mốc nào. Sau bảy lần flash với 18 mốc:

reset saumốc cuốinghĩa là
~19 sstextđã vào kernel
134 s__create_page_tablesxong phần chạy trước MMU
194 s__mmap_switchedMMU đã bật
216 skernel_init_freeablechạy hết initcall, sắp exec /init

Mấy nguyên tắc để số đo đáng tin:

5. CPU, reboot và nguồn

6. Màn hình và GPU

7. Giải mã video phần cứng

Port VDH + VPSS từ HiSilicon-Development/linux-6.12.y sang 6.18 bản 32-bit, dùng FFmpeg có bộ patch v4l2-request của Kwiboo. Lần giải mã đầu "thành công" nhưng khung nào cũng xanh lè. Có hai lỗi chồng lên nhau:

  1. VDH báo lỗi đúng ở những ảnh có byte chống giả mã khởi đầu (emulation-prevention). Sửa: cho driver tự gỡ các byte đó.
  2. VPSS báo lỗi state=0x8d. Sửa: ghi thanh ghi ở chế độ non-secure, và cấp bộ đệm ghi ngược thật thay vì địa chỉ vật lý 0.
Một khung hình toàn màu xanh lá
Trước: ngắt có về, nhưng bộ đệm NV12 vẫn toàn số 0.
Khung 150 của testsrc2, mốc giờ 00:00:05.000
Sau: khung 150 của mẫu thử, khớp từng điểm ảnh.

Hai thiết lập quyết định tốc độ:

8. Âm thanh

Một driver ALSA nhỏ: một ring buffer cho cả ba cổng cùng đọc, con trỏ đọc thì hỏi định kỳ bằng hrtimer, nên không cần ngắt và không cần node device tree. Âm thanh HDMI ở 48 kHz cần N=6144 (CTS đo được 148,351).

9. Userland và các phiên

Menu chọn phiên trên TV: Desktop, Music (mặc định, đang chạy), Kodi, Web, Android 13, Original Android 7 (chưa cài), Audio settings
Menu đúng như máy đang vẽ. Nghe nhạc là phiên mặc định; Android 7 gốc là tuỳ chọn, chưa cài trên USB này.

Kết quả

bộ phậntình trạngbằng chứng
4 nhân CPU, DVFSchạy396–1596 MHz, 840–1150 mV
Rebootchạyreset qua SP805, lên lại sau 65 s
Mạng dây, WiFichạyAP6255, sau khi sửa GPIO và mức chân 1.8 V
USB 3 (cổng bên)chạyđo được 91.7 MB/s
Remote + phím cảm ứngchạychung một keymap NEC
Đồng hồ VFD (TM1629A)chạyfont 16 đoạn canh theo ảnh chụp
Màn hình, GPUchạyVDP DRM, Panfrost, kmscube 59.9 fps
Giải mã video phần cứngchạyxem bảng dưới
Âm thanh: RCA, quang, HDMI, DAC USBchạynghe được tiếng thử trên từng cổng; DAC 16/48 bit-perfect, không bị hụt bộ đệm
HDMI-CECchỉ gửichưa thử nhận: không có TV hỗ trợ CEC
SATAchạy tốthệ thống file gốc nằm trên ổ 3.5" (kernel k26)

Giải mã video, so md5 của toàn bộ dữ liệu giải ra với FFmpeg giải bằng phần mềm:

clipsố khungso với phần mềmfps
H.264 1080p602400/2400md5 trùng khớp75
HEVC 1080p 8-bit300/300md5 trùng khớp51
HEVC Main10 1080p300/300md5 trùng khớp (P010)31
HEVC 2160p150/150md5 trùng khớp15
VP9 1080p300/300md5 trùng khớp52
MPEG-2 1080p / 576i300 / 250PSNR thấp nhất 68.4 / 66.1 dB41 / 68

Những gì đang chạy trên máy:

Màn hình chờ của chế độ nghe nhạc: sẵn sàng, phát từ AirPlay, Spotify Connect, ứng dụng UPnP hoặc thư viện trên trình duyệt; ngõ ra Onboard (HDMI / RCA / quang); âm lượng 8
Nghe nhạc: MPD, AirPlay 2, Spotify Connect, UPnP/OpenHome và thư viện nhạc trên web. Chọn ngõ ra, bật tắt từng cổng, chỉnh lệch trái phải bằng remote, dòng lệnh hoặc điện thoại. Địa chỉ mạng LAN đã làm mờ.
Màn hình đang phát: 01 Tone 96k, FLAC 24/96 ra onboard, chuyển xuống 48 kHz
Ngõ ra onboard chỉ chạy 48 kHz, nên khi phải chuyển tần số mẫu thì màn hình ghi rõ.
Desktop LXQt có menu Start liệt kê Chromium, Kodi, Android 13
Desktop: LXQt, tăng tốc GPU qua glamor, dùng 293 MB RAM.
Màn hình khởi động Kodi 21.2 Omega
Kodi 21.2 chạy GBM + GLES, giải mã qua V4L2-request.
Màn hình chính Android 13
Android 13 (LineageOS 20 trong Waydroid): vào launcher sau 100 s khi chạy từ ổ SATA, dùng 724 MB RAM.
Khối lập phương nhiều màu của kmscube do Mali-T720 vẽ
Panfrost trên Mali-T720, hiển thị qua VDP.

Để Android 13 chạy được trong Waydroid cần ba thứ:

Hạn chế

Việc còn lại

Bài học dùng được cho board khác

Tham khảo

Nhật ký thay đổi

Chăm trồng bởi Ba rồng & AI nữa.