LG SoundBar SK8 - Cứu boot phần cứng & Giải mã thuật toán MediaTek NFI BCH ECC
MỤC LỤC BÀI VIẾT (Nhấn để xem)
Khi can thiệp script khởi động sai cách, loa SK8 bị rơi vào vòng lặp khởi động (bootloop). Vì U-Boot mặc định khóa bootdelay=0, cổng UART console hoàn toàn vô dụng. Bài viết này trình bày quy trình cứu boot phần cứng bằng máy nạp ngoại vi và giải mã ngược thuật toán MediaTek NFI BCH ECC để vá dump.
I. Nguyên nhân gây Bootloop & Khóa UART
- Tranh chấp driver ALSA (
/dev/AudDrv0): Driver âm thanh MT8530 hoạt động độc quyền, không códmix. Tiến trình lõibdpprogbắt buộc phải mở/dev/AudDrv0đầu tiên để khởi tạo DSP Atmos. Việc chạy daemon âm thanh nền trước khibdpprogkhởi tạo khiến tiến trình này văng lỗi, kích hoạt lệnh reboot tự động trongrc5. - Khóa UART (
bootdelay=0): U-Boot bỏ qua hàm kiểm tra phímabortboot(), tước bỏ khả năng dừng bootloader qua cổng UART.
II. Cấu trúc phần cứng NAND Flash Hynix H27U4G8F2D
Chip nhớ SLC NAND 512MB tổ chức theo cấu trúc trang kèm vùng nhớ mở rộng (OOB / Spare Area):
+---------------------------------------------------------------------------------+
| 1 NAND PAGE (4224 Bytes) |
+-----------------------------------+---------------------------------------------+
| Sector 0: 1024B Data + 32B OOB | Sector 1: 1024B Data + 32B OOB |
+-----------------------------------+---------------------------------------------+
| Sector 2: 1024B Data + 32B OOB | Sector 3: 1024B Data + 32B OOB |
+-----------------------------------+---------------------------------------------+
Thông số kỹ thuật:
- Kích thước trang dữ liệu (Page Data): 4096 bytes.
- Kích thước vùng mở rộng (Page OOB): 128 bytes (32 bytes cho mỗi sector 1024B).
- Tổng kích thước 1 trang thực tế: 4096 + 128 = 4224 bytes.
- Dung lượng file dump thô toàn bộ chip: 131,072 trang x 4224 = 553,648,128 bytes (528 MB).
Cấu trúc OOB 32 bytes của mỗi Sector 1024 bytes:
| Offset OOB | Kích thước | Tên trường | Ý nghĩa |
|---|---|---|---|
0x00 - 0x07 | 8 bytes | FDM | Metadata phân vùng hoặc Bad Block Marker (0xFF). |
0x08 | 1 byte | Prefix Spare | Đệm phần cứng (0xFF). |
0x09 - 0x1D | 21 bytes | BCH ECC Parity | Mã sửa sai BCH ECC (t=12, 168 bits nhị phân). |
0x1E - 0x1F | 2 bytes | Suffix Spare | Đệm kết thúc (0xFF 0xFF). |
Nếu sửa dữ liệu 1024B trong file dump mà không tính lại 21 bytes BCH ECC này, bộ điều khiển MediaTek MT8530 khi nạp trang sẽ báo lỗi phần cứng
-EBADMSGvà từ chối boot.
III. Bảng phân vùng MediaTek (PIT - Partition Information Table)
SoC MT8530 định danh phân vùng bằng bảng PIT đặt tại Page 512 (Offset file dump thô 0x210000), nhận diện qua Magic Header 0x8530EADC (30 phân vùng).
Các phân vùng trọng yếu:
boot_1(0x000000): U-Boot bootloader & boot env.kernel_1(0x840000): Linux Kernel Bank 1 (3MB).rootfs_normal_1(0x1188000): Rootfs SquashFS Bank 1 (100MB).rootfs_normal_2(0x7CC8000): Rootfs SquashFS Bank 2 (100MB).ubi0(0xF1B6000): Phân vùng UBIFS/mnt/ubi_boot.
IV. Giải mã toán học MediaTek NFI BCH ECC bằng Đại số tuyến tính
Bộ điều khiển MediaTek NFI sử dụng mã BCH:
- Trường hữu hạn Galois: GF(2^14) (với m = 14).
- Khả năng sửa sai: t = 12 bits trên mỗi khối dữ liệu 1024 bytes (8192 bits).
- Số bit Parity dư thừa: 12 x 14 = 168 bits = 21 bytes.
Vì mã BCH là mã tuyến tính trên trường nhị phân GF(2), quan hệ giữa 8192 bit dữ liệu M = (m_0, ..., m_8191) và 168 bit Parity P = (p_0, ..., p_167) thỏa mãn hệ phương trình ma trận tuyến tính affine:
P = (M * G) XOR P0
Trong đó G là ma trận sinh kích thước 8192 x 168 và P0 là vector parity ứng với khối dữ liệu toàn 0.
Bằng cách trích xuất các cặp vector (M_i, P_i) từ các trang dữ liệu hợp lệ trong file dump gốc, thiết lập hệ 8192 phương trình tuyến tính trên trường nhị phân GF(2) và giải bằng phép khử Gauss-Jordan, ta tái tạo hoàn toàn ma trận G và vector P0.
Từ đây, ta xây dựng script Python patch_ecc.py để tính toán tức thì 21 byte ECC chuẩn xác cho bất kỳ sector nào bị thay đổi.
V. Quy trình cứu boot bằng máy nạp XGecu T48
- Khò chip: Dùng mỏ hàn khò nhiệt độ 350°C nhấc chip NAND TSOP-48 H27U4G8F2D ra khỏi bo mạch, vệ sinh chân và gắn vào socket máy nạp XGecu T48.
- Dump dữ liệu: Đọc toàn bộ chip ở chế độ raw (bao gồm OOB) ra file
sk8_nand_raw.bin(553,648,128 bytes). - Vá dữ liệu:
- Ở đây, ta có thể sửa lại script hoặc nạp lại ROM gốc để loa có thể boot được, sau đó nạp lại rom mod.
- Chạy công cụ giải mã ECC để tính lại 21 bytes Parity cho các sector đã chỉnh sửa.
- Nạp & Hàn lại: Nạp file dump đã vá trở lại chip bằng T48, hàn lại chip lên bo mạch.
- Khởi động: Cắm nguồn, soundbar khởi động trở lại trạng thái bình thường.
Nếu cần ROM dump để nghiên cứu hoặc unbrick thì liên hệ mình.
LG-Soundbar
- LG SoundBar SK8 - Cứu boot phần cứng & Giải mã thuật toán MediaTek NFI BCH ECC Đang đọc
- LG SoundBar SK8 - Phần cứng & Kiến trúc hệ thống: SoC MediaTek MT8530, MTD Layout và Dual-Bank A/B
- LG SoundBar SK8 - Quá trình hồi sinh SoundBar gần 10 năm tuổi
Bình luận & Thảo luận 0
Chia sẻ thắc mắc, phản hồi hoặc kinh nghiệm thực chiến của bạn