目录


硬件环境

项目 说明
板卡 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 代码。

改分辨率涉及三个地方必须同步改,否则花屏或无输出:

  1. lt8912b.c — LT8912B 的 MIPI 接收端配置
  2. uboot-board.dts — U-Boot 阶段 SoC 的 MIPI 输出 timing
  3. board.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 清晰不少

总结

  1. 改 LT8912B 分辨率要同时动三个文件(lt8912b.c + 两个 dts),timing 参数要一致,漏一个就出事
  2. LT8912B 走 HDMI 输出时尽量用标准 CEA 分辨率(720p/1080p/480p),非标分辨率的 DDS 参数没有公开的计算方法,得找龙迅要
  3. sunxifb 驱动从 /dev/fb0 读分辨率,改完设备树后 LVGL 会自动适配,不用动 LVGL 代码
  4. 改之前一定备份,这种驱动级的修改很容易翻车

涉及文件

文件 改动说明
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/ 三个原始文件的备份
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐