T153学习记录 - LT8912B HDMI 输出从 1080p 改为 720p
本文介绍了在全志T153开发板上修改HDMI输出分辨率的过程。原厂配置的1920x1080分辨率导致画面模糊,作者将其调整为更匹配屏幕物理分辨率的1280x720。修改涉及三个关键文件:LT8912B驱动、U-Boot和Linux内核的设备树,必须保持参数一致。过程中遇到1024x600原生分辨率导致蓝屏的问题,最终选择标准720p方案。验证结果显示画面清晰度明显提升,开机Logo和系统运行正常。
目录
硬件环境
| 项目 | 说明 |
|---|---|
| 板卡 | TLT153-MiniEVM (NAND) |
| 主控 | 全志 T153(4x Cortex-A7 1.608GHz + RISC-V E907) |
| 内存 | DDR3 |
| 存储 | NAND |
| 屏幕 | 10 寸 HDMI 触摸屏,物理分辨率 1024x600,触摸走 USB HID |
| 桥接芯片 | LT8912B(MIPI DSI → HDMI),挂在 I2C1,地址 0x48 |
| 信号链路 | T153 MIPI DSI (4-lane) → LT8912B → HDMI → 触摸屏 |
| SDK | aiot-t153-linux-v1.0 |
| 工具链 | arm-linux-gnueabihf-gcc |
背景
出厂配置 HDMI 输出 1920x1080,屏幕物理分辨率只有 1024x600,屏内部把 1080p 缩放下来,画面糊得不行。想改成跟屏幕更接近的分辨率,减少缩放带来的画质损失。
LT8912B 在 U-Boot 阶段通过 I2C 初始化,Linux 内核里没有对应驱动,所以改分辨率要动 U-Boot 代码。
改分辨率涉及三个地方必须同步改,否则花屏或无输出:
lt8912b.c— LT8912B 的 MIPI 接收端配置uboot-board.dts— U-Boot 阶段 SoC 的 MIPI 输出 timingboard.dts— Linux 内核阶段 SoC 的 MIPI 输出 timing
最终选了 720p(1280x720),原因见踩坑记录。
操作步骤
1. 备份原始文件
改底层显示的东西,先备份:
mkdir -p brandy/brandy-2.0/u-boot-bsp/drivers/video/drm/panels/backup_1080p/
cp lt8912b.c backup_1080p/lt8912b.c.1080p_backup
mkdir -p device/config/chips/t153/configs/tlt153-minievm-nand/backup_1080p/
cp uboot-board.dts backup_1080p/uboot-board.dts.1080p_backup
cp linux-5.10-origin/board.dts backup_1080p/board.dts.1080p_backup
2. 改 lt8912b.c
文件:brandy/brandy-2.0/u-boot-bsp/drivers/video/drm/panels/lt8912b.c
一共改 3 处。
宏定义(第 45 行),从 1080p 切到 720p:
//#define _1080P_60Hz
#define _720P_60Hz
改完这一行,下面这些函数自动走 720p 分支:
MipiBasicSet()里 settle time 走#else(0x05)AviInfoframe()里 VIC 变成 0x04,checksum 变成 0x33
lt8912b_probe() 里的 MIPI_Video_Setup(第 1075 行):
MIPI_Video_Setup(&video_1280x720_60Hz);
MIPI_Input_det() 里的 fallback(第 838 行):
MIPI_Video_Setup(&video_1280x720_60Hz);
3. 改 uboot-board.dts
文件:device/config/chips/t153/configs/tlt153-minievm-nand/uboot-board.dts
display-timings 节点改成 720p:
timing0: timing0 {
clock-frequency = <74250000>;
hback-porch = <220>;
hactive = <1280>;
hfront-porch = <110>;
hsync-len = <40>;
vback-porch = <20>;
vactive = <720>;
vfront-porch = <5>;
vsync-len = <5>;
};
这些参数从 lt8912b.c 第 127 行的 video_1280x720_60Hz 抄过来的:
{hfp=110, hs=40, hbp=220, hact=1280, htotal=1650, vfp=5, vs=5, vbp=20, vact=720, vtotal=750}
4. 改 board.dts
文件:device/config/chips/t153/configs/tlt153-minievm-nand/linux-5.10-origin/board.dts
和 uboot-board.dts 一模一样的 timing 参数,不赘述。
5. 编译烧写
不需要 loadconfig,只编 U-Boot 和内核:
./build.sh uboot
./build.sh kernel
./build.sh pack
踩坑记录
坑 1:先试了 1024x600 原生分辨率,蓝屏
- 现象:HDMI 屏纯蓝色,没有开机 Logo,没有任何画面内容
- 分析:蓝色说明 HDMI 信号本身是通的(否则屏幕会显示"无信号"),但 LT8912B 没有正确接收 MIPI 数据。问题出在
DDSConfig()里的strm_sw_freq_word(寄存器 0x4e-0x50),这组参数是按 148.5MHz 像素时钟校准的,1024x600 的像素时钟只有 42.5MHz,差了 3.5 倍 - 尝试过:把 settle time 改回 0x08、把 DDS enable bit 关掉(0x51=0x00),都不行
- 结论:1024x600 不是标准 CEA 分辨率,要用的话需要龙迅提供对应的 DDS 参数,不是随便算得出来的
坑 2:只改了设备树没改驱动(或反过来),花屏
- 原因:SoC 输出一个 timing,LT8912B 按另一个 timing 接收,对不上就乱了
- 教训:三个文件必须一起改,timing 参数要完全一致
最终选 720p 的理由
| 方案 | 像素时钟 | CEA 标准 | 缩放到 1024x600 | 结果 |
|---|---|---|---|---|
| 1024x600 | 42.5MHz | 不是 | 不用缩放 | 蓝屏,DDS 参数不对 |
| 1280x720 | 74.25MHz | 是,VIC=4 | 约 1.25 倍 | 成功,画面清晰 |
| 1920x1080 | 148.5MHz | 是,VIC=16 | 约 1.88 倍 | 能用但糊 |
720p 是标准分辨率,驱动里已经有完整的 #ifdef _720P_60Hz 条件编译路径,不用猜参数。缩放比也不大,实际看起来还行。
验证结果
开机 Logo 正常显示
进系统后 HDMI 输出 720p
LVGL Demo 正常跑,触摸正常
画面比 1080p 清晰不少
总结
- 改 LT8912B 分辨率要同时动三个文件(lt8912b.c + 两个 dts),timing 参数要一致,漏一个就出事
- LT8912B 走 HDMI 输出时尽量用标准 CEA 分辨率(720p/1080p/480p),非标分辨率的 DDS 参数没有公开的计算方法,得找龙迅要
sunxifb驱动从/dev/fb0读分辨率,改完设备树后 LVGL 会自动适配,不用动 LVGL 代码- 改之前一定备份,这种驱动级的修改很容易翻车
涉及文件
| 文件 | 改动说明 |
|---|---|
brandy/.../panels/lt8912b.c |
宏从 _1080P_60Hz 改成 _720P_60Hz,两处 MIPI_Video_Setup 参数改成 720p |
device/.../uboot-board.dts |
display-timings 改成 720p(74.25MHz, 1280x720) |
device/.../board.dts |
同上 |
device/.../backup_1080p/ |
三个原始文件的备份 |
更多推荐



所有评论(0)