ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RK3576 LCD驱动实战:从黑屏到稳定点亮的全链路解析

RK3576 LCD驱动实战:从黑屏到稳定点亮的全链路解析 1. 项目概述从一块“黑屏”开始的RK3576 LCD驱动实战你拿到一块崭新的RK3576开发板上电后串口有log系统能起来但LCD屏就是不亮——不是花屏不是闪屏是彻底的黑屏。你查dmesg看到一长串“failed to probe display”、“panel not found”、“backlight init failed”你翻SDK文档发现RK3576的Display SubsystemDSI/RGB/LVDS模块描述密密麻麻几十页参数表里光时序参数就有二十多个你试着改设备树里的timing节点结果屏直接变绿、变紫或者干脆报错卡死。这不是玄学这是LCD驱动开发最真实的第一课硬件链路没打通软件再漂亮也是空中楼阁。“驱动之路#04LCD 驱动序析基于 RK3576”这个标题表面看是讲一段代码怎么写实则是一套完整的嵌入式显示系统工程方法论。它覆盖从硬件信号完整性验证、Panel Spec解读、设备树精准建模、内核Display Framework适配、到用户空间调试闭环的全链路。核心关键词LCD、驱动、RK3576不是孤立存在——LCD是终端呈现载体驱动是软硬协同的粘合剂RK3576则是这套系统的物理基座。它决定了你能用什么接口DSI v2.0还是RGB 24bit、支持多大分辨率4K60Hz还是FHD120Hz、能否做HDR动态背光控制、甚至影响Linux DRM/KMS子系统的选型策略。这个内容适合三类人一是刚接手RK平台显示模块的嵌入式工程师需要避开“改完设备树就跑”的陷阱二是Linux内核驱动新手想理解DRM框架下encoder/bridge/panel如何协作三是硬件工程师需掌握如何通过示波器抓取DSI clock/lane信号来反推时序配置是否合理。它不教你怎么抄代码而是告诉你为什么RK3576的DSI PHY要配0x10000000这个寄存器值为什么同一块ILI9881C Panel在RK3399上能亮在RK3576上必须加delay_ms(50)才能初始化成功为什么背光PWM占空比调到80%屏幕反而更暗这些答案藏在芯片手册第387页的Timing Tolerance表格里藏在Panel Spec第12页的Power Sequence图中更藏在你第一次用逻辑分析仪抓到DSI D-PHY Clock Lane波形失真时的皱眉瞬间。我试过三次烧录错误的DSI时序导致Panel IC锁死也踩过因未关闭RK3576默认的Gamma LUT校准而让白色偏黄的坑——这些经验比任何教程都来得实在。2. 硬件层与协议层深度拆解RK3576显示子系统架构与LCD通信本质2.1 RK3576 Display Subsystem的三大支柱DSI/RGB/LVDS与硬件选型逻辑RK3576的显示引擎不是单一模块而是由三个物理接口一个统一调度中枢构成的立体架构。它的Display SubsystemDSS核心框图里VOPVideo Output Processor作为图像合成引擎通过三条独立数据通路分别连接DSI Controller、RGB Controller和LVDS Transmitter。这三条通路并非并列关系而是有明确的优先级和适用场景DSIDisplay Serial Interface是RK3576的主力接口支持DSI v2.0协议最大带宽达4.5Gbps双lane 2.25Gbps。它专为高分辨率、高刷新率的AMOLED/LCD模组设计典型应用如1080p120Hz或2K90Hz。DSI的优势在于布线简洁仅需CLKD0~D3四对差分线、功耗低、支持Command Mode可关屏保显存和Video Mode持续刷新。但它的致命弱点是信号完整性极其敏感——PCB走线长度超过15cm、阻抗不匹配5Ω、参考地平面断裂都会导致眼图闭合表现为闪屏或初始化失败。我实测过同一块7寸IPS屏在RK3576 EVB板上DSI走线长度12cm时稳定点亮当移植到客户定制板走线22cm且无包地时必须将DSI PHY的DRV_STRENGTH从0x3调至0x7并在设备树中强制启用LP11低功耗状态保持否则初始化必超时。RGBRed-Green-Blue接口是传统TFT-LCD的“老朋友”RK3576支持24bit RGBR8G8B8HSYNC/VSYNC/DE信号。它的优势是协议简单、兼容性极广几乎所有工业LCD屏都支持。但缺点同样突出需要27根信号线含电源/地PCB布线成本高EMI干扰大且最高仅支持1920×108060Hz。关键点在于RK3576的RGB Controller不支持“像素时钟倍频”这意味着如果你的Panel标称时钟为74.25MHz标准1080p你必须在CLK引脚上提供精确的74.25MHz方波不能靠PLL倍频生成——这直接决定了你是否需要外置晶振或专用时钟发生器。LVDSLow-Voltage Differential Signaling是长距离传输的解决方案RK3576支持单/双通道LVDS最大分辨率可达3840×216030Hz。它通过将RGB数据编码为差分对如TX0/TX0-大幅提升抗干扰能力适合车载、工控等严苛环境。但LVDS需要专用的LVDS Transmitter芯片如TI SN65LVDS31且Panel端必须有匹配的LVDS Receiver。这里有个易忽略的细节RK3576的LVDS PHY输出电压为±350mV而部分老旧Panel要求±400mV此时必须在LVDS线上串联10Ω电阻进行阻抗补偿否则接收端眼图张开度不足导致误码。选择哪个接口绝不是看Datasheet参数表里的“Supported”打钩就完事。它取决于你的Panel Spec、PCB Layout能力、EMC测试要求和成本预算。比如某医疗设备项目客户指定7寸1200×1920 AMOLED屏原计划用DSI但EMC测试在800MHz频段超标3dB。最终方案是放弃DSI改用RGB接口——虽然多布12根线但通过优化电源滤波和屏蔽罩顺利过检。这就是硬件选型的真实逻辑没有最优解只有最适合当前约束条件的妥协解。2.2 LCD Panel通信协议的本质MIPI DSI Command Mode vs Video Mode的底层差异LCD屏的“驱动”二字常被误解为单纯写寄存器。实际上LCD Panel与SoC之间的通信本质是两种截然不同的数据流模型Command Mode指令模式和Video Mode视频模式。它们的区别决定了你整个驱动架构的设计思路。Command Mode的核心是“按需唤醒”。SoC的DSI Controller不持续发送像素数据而是像一个智能快递员当应用需要更新画面时如GUI刷新它打包一帧图像数据通常压缩为JPEG或PNG通过DSI的Command Packet发送给Panel内置的GRAM图形内存。Panel的Display IC如NT35521收到后自行从GRAM读取数据并驱动像素。这种模式下SoC只需在画面变更时工作其余时间DSI Link可进入LPLow Power状态功耗极低。但代价是刷新率受限于GRAM读写速度且无法实现真正的“实时视频流”。RK3576的DSI Controller在Command Mode下必须配置为“BTABus Turn AroundEnabled”即每次发送Command Packet后主动释放总线控制权等待Panel回传ACK信号。若Panel未响应BTAController会触发Timeout中断——这正是dmesg里“dsi dsiff450000: cmd timeout”错误的根源。我遇到过一次某国产Panel的BTA响应延迟为120us而RK3576默认Timeout值为100us结果频繁超时。解决方案是在设备树中修改rockchip,dsi-timeout-ms 150。Video Mode则是“永不停歇的流水线”。SoC的VOP持续生成像素数据流DSI Controller将其打包成Video Packet含HS/VS同步信号以固定帧率如60Hz源源不断地灌入Panel。Panel Display IC没有GRAM它边收边显示因此刷新率稳定、延迟极低是视频播放、游戏等场景的刚需。但功耗显著高于Command Mode且DSI Link必须始终保持HSHigh Speed状态。Video Mode的致命挑战在于时序精度。RK3576的DSI PHY输出时钟相位抖动Jitter必须小于±15ps否则Panel的Clock Recovery Circuit无法锁定表现为水平条纹或撕裂。这要求PCB设计时DSI CLK Lane必须严格等长误差5mil且紧邻GND Plane。我曾用示波器对比过同一块板CLK Lane绕线多一圈导致长度差8milJitter飙升至±22ps屏直接无法同步。这两种模式在RK3576的设备树中通过rockchip,screen-type属性区分dsi { rockchip,screen-type SCREEN_DSI_CMD; // Command Mode // 或 rockchip,screen-type SCREEN_DSI_VIDEO; // Video Mode };选错模式轻则屏不亮重则烧毁Panel IC。因为Command Mode下Panel期望接收的是短小的Command Packet若SoC强行发Video PacketDisplay IC的协议解析器会崩溃进入未知状态。2.3 背光与触控的耦合关系为什么LCD驱动必须包含BL_PWM和TP_I2CLCD屏的“显示”只是表象其背后是背光Backlight、触控Touch Panel、供电Power Sequencing三者的精密协同。忽略任一环节都会导致“能初始化但不实用”的尴尬局面。背光控制BL_PWM不是简单的亮度调节。RK3576的背光驱动采用PWMDC混合方案PWM信号通常由GPIO或专用PWM控制器输出控制LED电流开关频率DC电压由PMIC的BUCK输出设定电流基准。这种设计既能实现0.1%~100%的宽范围调光又能避免纯PWM在低频时产生人眼可察觉的闪烁。关键参数是PWM频率——必须高于20kHz人耳听阈上限否则会听到“滋滋”声同时要避开Panel的LCMLiquid Crystal Module共振频率通常在18~22kHz。RK3576 SDK默认PWM频率为10kHz实测在某款7寸屏上引发明显啸叫。解决方案是修改drivers/video/backlight/rk_backlight.c中的pwm_period_ns将其设为50000ns对应20kHz并确保PWM GPIO的驱动能力足够需配置为Push-Pull而非Open-Drain。触控集成TP_I2C常被当作独立模块处理但在LCD驱动中它必须与Display Subsystem同步初始化。原因在于许多Capacitive Touch IC如Goodix GT911的I2C地址在Reset后是动态分配的而Reset时序依赖于LCD Panel的Power On Sequence。如果TP先于Panel上电IC可能进入错误状态如果TP晚于PanelGUI系统启动时触控不可用。RK3576的解决方案是在设备树中定义reset-gpios和power-supply并设置rockchip,panel-enable-delay 100单位ms确保Panel稳定后再使能TP。更深层的耦合在于Android HAL层的SurfaceFlinger会根据Display的VSYNC信号同步触控事件上报若VSYNC相位漂移会导致触控“跟手性”变差。我调试过一个案例客户抱怨触控延迟最后发现是DSI的hs_clk_rate配置偏差0.5%导致VSYNC周期误差累积每秒偏差3帧——这需要在rockchip,dphy-timing中微调clk_pre_delay和clk_post_delay参数。供电时序Power Sequencing是LCD驱动中最易被忽视的“隐形杀手”。一块标准LCD模组的上电流程通常为VDDIOIO电压→ VDDCore电压→ RESET#复位信号→ VCC背光电压→ VGH/VGLGate Driver电压。任意一步时序错误都可能导致Panel IC内部状态机卡死。RK3576通过PMIC如RK806的GPIO控制序列实现但必须在设备树中精确建模panel { power-supply vddio, vdd, vcc; reset-gpios gpio0 12 GPIO_ACTIVE_LOW; rockchip,panel-enable-delay 10; // VDDIO→VDD延时 rockchip,panel-reset-delay 5; // VDD→RESET#延时 rockchip,panel-on-delay 120; // RESET#→VCC延时 };我曾因panel-on-delay设为100ms实际需120ms导致某款AUO屏在低温环境下-10℃初始化失败——低温下液晶响应慢VGH/VGL建立时间延长100ms不足以完成充电。3. 软件层核心实现设备树建模、内核驱动适配与用户空间调试闭环3.1 设备树DTS建模从Panel Spec到可执行配置的精准翻译设备树不是配置文件它是硬件拓扑的“机器可读说明书”。对LCD驱动而言DTS文件的质量直接决定80%的调试成败。RK3576的LCD相关DTS节点分为三层Display Subsystem Root、DSI Controller、Panel Device每一层都需与硬件Spec逐字对照。Display Subsystem Root节点定义全局资源vopb { // VOP-B Video Output Processor status okay; rockchip,slave-mode; // 启用Slave Mode由DSI Controller触发帧同步 assigned-clocks cru SCLK_VOPB, cru ACLK_VOPB; assigned-clock-rates 300000000, 300000000; // VOP时钟必须≥Panel像素时钟 }; dsi { status okay; #address-cells 1; #size-cells 0; rockchip,grf grf; rockchip,phy dsi_phy; rockchip,dsi-host dsi_host; };关键点在于assigned-clock-ratesVOP时钟必须大于等于Panel所需像素时钟Pixel Clock。例如1920×108060Hz的Pixel Clock为148.5MHz那么SCLK_VOPB至少需设为150MHz。若设为100MHzVOP无法生成足够像素数据dmesg会报“vopb: pixel clock too low”。DSI Controller节点是协议层的核心dsi { dsi_out: endpoint0 { remote-endpoint panel_in; >panel { compatible auo,b101uan02; reg 0; enable-gpios gpio0 15 GPIO_ACTIVE_HIGH; reset-gpios gpio0 12 GPIO_ACTIVE_LOW; backlight backlight; port { panel_in: endpoint { remote-endpoint dsi_out; }; }; display-timings { timing0: timing-1920x1080 { clock-frequency 148500000; // Pixel Clock hactive 1920; vactive 1080; hfront-porch 80; // Horizontal Front Porch hback-porch 48; // Horizontal Back Porch hsync-len 32; // Horizontal Sync Length vfront-porch 3; // Vertical Front Porch vback-porch 3; // Vertical Back Porch vsync-len 5; // Vertical Sync Length hsync-active 0; // Polarity: 0Active Low vsync-active 0; de-active 1; pixelclk-active 0; }; }; };这里每个参数都来自Panel Spec的“Timing Diagram”章节。例如hfront-porch 80必须与Spec中HFPHorizontal Front Porch数值完全相同。差1个clock就可能导致画面左移或右移一像素。我调试某款Sharp屏时Spec标注HFP为88我误抄为80结果画面右侧缺失8像素——因为VOP在HFP期间停止输出提前进入了HSYNC。3.2 内核驱动适配DRM/KMS框架下的Encoder-Bridge-Panel分工协作RK3576的LCD驱动运行在Linux DRMDirect Rendering Manager/KMSKernel Mode Setting框架下这是一个高度模块化的架构。理解各组件职责是解决“为什么改了Panel参数却没生效”的关键。Encoder编码器是DSI Controller的软件抽象负责将VOP输出的像素数据打包成DSI Packet。RK3576的DSI Encoder驱动位于drivers/gpu/drm/rockchip/rockchip_dsi.c。它不关心Panel具体型号只负责协议转换。当你看到dmesg中出现“rockchip-dsi ff450000.dsi: bound encoderff450000”说明Encoder已加载成功。Bridge桥接器是Encoder与Panel之间的“翻译官”。对于标准DSI PanelBridge通常是simple-panel位于drivers/gpu/drm/panel/panel-simple.c它只做基础初始化如发送Reset、Delay。但对于带复杂时序或特殊命令的Panel如需要Gamma校准、Color Space转换需自定义Bridge驱动。例如某款支持HDR的LG屏需在Bridge中实现drm_panel_enable()函数向Panel发送0x55 0xAA等Vendor特定命令。Panel面板是最终的设备对象由drivers/gpu/drm/panel/下的具体驱动实现。RK3576 SDK已预置数十种Panel驱动如panel-ilitek-ili9881c.c但它们只是模板。真正适配时必须修改panel-funcs结构体static const struct drm_panel_funcs ilitek_ili9881c_funcs { .prepare ilitek_ili9881c_prepare, .enable ilitek_ili9881c_enable, .disable ilitek_ili9881c_disable, .unprepare ilitek_ili9881c_unprepare, .get_modes ilitek_ili9881c_get_modes, };其中.prepare()函数执行Power On Sequence.enable()发送初始化命令序列Init Code。这些Init Code必须100%照抄Panel Spec的“Initialization Sequence”表格。曾有项目因漏掉一条0xB1命令设置Frame Rate导致屏在高温下自动黑屏——因为该命令控制着Panel内部温度补偿电路。整个流程的调用栈是drm_kms_helper_hotplug_event()→drm_panel_enable()→ilitek_ili9881c_enable()→dsi_panel_enable()→dsi_gen_pkt_hdr_write()发送DSI Packet。若某步失败dmesg会显示对应函数名这是定位问题的第一线索。3.3 用户空间调试闭环从fbtest到drm-kms-tools的渐进式验证内核日志只能告诉你“哪里错了”用户空间工具才能证明“哪里对了”。构建一套渐进式调试闭环是高效解决问题的基石。第一阶段Framebuffer基础验证fbtest这是最粗粒度的验证。编译fbtest工具源码在tools/testing/selftests/drivers/video/fbtest.c执行fbtest -d /dev/fb0 -t 1 # 显示纯色测试图若屏幕显示红色/绿色/蓝色块说明Framebuffer设备已注册VOP数据通路基本正常。若报错“Cannot open /dev/fb0”检查cat /proc/devices | grep fb是否列出fb0以及ls -l /dev/fb*权限是否为crw-rw----。第二阶段DRM/KMS功能验证modetestmodetest是DRM框架的瑞士军刀。先查看设备能力modetest -M rockchip -c # 列出ConnectorDSI-1 modetest -M rockchip -s # 列出CRTCVOPB modetest -M rockchip -P # 列出PlaneOverlay Plane关键命令是modetest -M rockchip -s 33:1920x1080ARGB8888它强制设置CRTC 33VOPB输出1920×1080分辨率。若成功屏幕应显示彩色条纹。若失败dmesg会输出详细错误如“rockchip-dsi ff450000.dsi: failed to set mode”。第三阶段真实场景模拟weston drm-kmsWeston是Wayland Compositor它直接使用DRM API渲染。启动Westonweston --backenddrm-backend.so --tty1 --device/dev/dri/card0若桌面环境正常启动说明整个Display PipelineVOP→DSI→Panel完全贯通。此时可运行glmark2-es2-drm测试GPU性能验证3D加速是否启用。第四阶段时序级诊断logic analyzer sigrok当以上工具均正常但画面仍有异常如轻微撕裂、色彩偏移必须深入信号层。用Logic Analyzer如Saleae Logic 8抓取DSI CLK Lane和D0 Lane波形导入Sigrok软件分析检查CLK频率是否等于clock-frequency设定值测量HS/VS脉冲宽度是否符合hback-porch等参数观察Packet Header0x29 for Video, 0x15 for Command是否正确。 我曾用此法发现某次hfront-porch设为80但实测波形显示为72——因为VOP的HSYNC Generator存在2个clock的固有延迟必须在DTS中补偿hfront-porch 82。这套闭环的价值在于它把抽象的“驱动失败”分解为可测量的物理量电压、频率、时序让调试从玄学回归科学。4. 实战避坑指南RK3576 LCD驱动开发中高频问题与独家解决方案4.1 “黑屏但dmesg无报错”的五大隐性故障与排查路径黑屏是LCD驱动最常见症状但dmesg沉默不语往往意味着问题发生在DRM框架之外。以下是我在RK3576项目中总结的五大隐性故障故障1DSI PHY Clock未锁定PHY PLL Unlock现象屏完全无反应dmesg无DSI相关log。根因RK3576的DSI PHY需要外部参考时钟REFCLK输入通常由PMIC的CLKOUT提供。若REFCLK未连接或频率错误如应为24MHz却接入27MHzPHY PLL无法锁定DSI Controller不会启动。排查用示波器测PMIC CLKOUT引脚确认频率和波形应为干净方波。若无信号检查PMIC配置寄存器0x1ACLKOUT Control是否使能。解决在PMIC DTS中添加pmic { clocks cru SCLK_PMIC; clock-names pmic-clk; rockchip,clkout 24000000; };故障2Panel Reset信号电平错误现象屏偶尔亮、偶尔不亮或低温下必黑。根因Panel Spec要求Reset#为低电平有效但GPIO配置为GPIO_ACTIVE_HIGH导致Reset信号始终为高Panel处于永久复位态。排查用万用表测Reset引脚电压正常应为0VReset有效→ 3.3VRelease。若始终3.3V检查reset-gpios属性。解决修正DTSreset-gpios gpio0 12 GPIO_ACTIVE_LOW; // 必须是LOW故障3背光PWM占空比计算错误现象屏亮但亮度极低调节echo 100 /sys/class/backlight/rk2818-bl/brightness无效。根因RK3576的PWM控制器占空比计算公式为Duty (period - duty_cycle) / period * 100%而非直观的duty_cycle / period。若设duty_cycle100,period200实际占空比为50%非100%。排查用示波器测PWM引脚观察高电平时间。解决在drivers/video/backlight/rk_pwm_bl.c中修改rk_pwm_bl_config()函数确保duty_cycle参数传入正确值。故障4DSI Lane极性反转Lane Polarity Swap现象屏显示严重错乱如红蓝颠倒、图像撕裂dmesg报“dsi dsiff450000: phy test fail”。根因DSI PHY的Lane极性P/N在PCB上被交叉焊接导致信号相位相反。排查用示波器对比CLK Lane P/N波形若P为正弦、N为反相则正常若两者同相则极性错误。解决在DTS中启用极性反转dsi { rockchip,dsi-lane-polarity 0x1 0x1 0x1 0x1; // 所有Lane反转 };故障5VOP时钟域冲突VOP Clock Domain Mismatch现象屏亮但画面滚动、撕裂modetest显示分辨率正确但图像错位。根因RK3576的VOPB和VOPC共享同一时钟源若VOPC被其他模块如HDMI占用VOPB时钟可能被动态关闭。排查cat /sys/kernel/debug/clk/clk_summary | grep vop查看VOPB clock rate是否为0。解决在DTS中强制VOPB独立时钟vopb { assigned-clocks cru SCLK_VOPB, cru ACLK_VOPB; assigned-clock-parents cru PLL_VOP, cru PLL_VOP; };4.2 “花屏/闪屏”的信号完整性SI实战调优七步法花屏和闪屏是SI问题的典型表现根源在于DSI信号在PCB上传输时的反射、串扰和衰减。以下是经过量产验证的七步调优法Step 1确认走线长度与阻抗DSI差分对CLK/D0/D1/D2/D3必须严格等长误差≤5mil特性阻抗50Ω±5%。用PCB设计软件如Allegro检查若长度超15cm必须增加Driver Strength。Step 2调整DSI PHY Driver Strength在DTS中修改rockchip,dsi-phy-strengthdsi_phy { rockchip,dsi-phy-strength 0x7; // 0x0弱, 0x7强 };强度越高驱动能力越强但EMI越大。实测0x5通常为最佳平衡点。Step 3优化参考地平面DSI走线下方必须有完整GND Plane禁止打孔或分割。若必须跨分割需在分割处放置0.1uF去耦电容。Step 4添加端接电阻在DSI接收端Panel侧添加100Ω差分端接电阻跨接CLK/-、D0/-等。这是抑制反射最有效的方法。Step 5降低DSI PHY工作速率若Panel支持将hs_clk_rate从默认2.25Gbps降至1.5Gbpsdsi { rockchip,dsi-hs-clk-rate 1500000000; };Step 6启用DSI PHY EqualizationRK3576 PHY支持RX Equalization可在DTS中开启dsi_phy { rockchip,dsi-phy-eq 0x3; // 0x0off, 0x3max };Step 7验证眼图质量用高速示波器≥1GHz带宽抓取CLK Lane眼图要求眼高300mV眼宽0.6UIUnit Interval。若不达标返回Step 1重新Layout。这套方法在某车载项目中将DSI误码率从1e-3降至1e-12通过了ISO 11452-4汽车电子EMC测试。4.3 “中文显示异常”的字体与渲染链路深度修复LCD屏显示中文异常如方块、乱码、偏移表面是字体问题实则是从内核Framebuffer到用户空间渲染的全链路故障。内核层Framebuffer Console字体若使用fbcon中文显示依赖drivers/video/fbdev/core/fbcon.c中的字体。默认font_8x16不支持中文需替换为font_16x32cp /usr/share/consolefonts/lat9w-16.psfu.gz /usr/share/consolefonts/default.psfu.gz更可靠的方式是编译内核时启用CONFIG_FONT_16x32y并在DTS中指定fb0 { font 16x32; };用户空间X11/Wayland字体配置X11下编辑/etc/X11/xorg.conf.d/10-fonts.confSection Files FontPath /usr/share/fonts/truetype/wqy/ FontPath /usr/share/fonts/truetype/dejavu/ /SectionWaylandWeston下修改/etc/xdg/weston/weston.ini[core] xwaylandtrue [shell] fontNoto Sans CJK SC, 12应用层Qt/SDL渲染优化Qt应用需设置字体QFont font(Noto Sans CJK SC, 12); QApplication::setFont(font);SDL2应用需加载TrueType字体TTF_Font* font TTF_OpenFont(/usr/share/fonts/truetype/wqy/wqy-microhei.ttc, 16);最关键的修复点在于禁用GPU的Texture Compression。RK3576的GPUMali-G52默认启用ASTC压缩但中文Bitmap字体纹理若被压缩会丢失边缘细节导致笔画粘连。解决方案是在/etc/mali/mali.config中添加# Disable ASTC for font textures astc_enable0
返回列表