HX8394 MIPI屏幕驱动适配指南:RK3566高刷LCD稳定点亮实战
简介本资源为嵌入式Linux平台下HX8394 MIPI显示屏的内核级驱动实现面向嵌入式驱动开发工程师、Linux BSP工程师及高校相关方向研究生解决MIPI DSI接口TFT-LCD屏幕在主流ARM平台如RK/Allwinner/STM32MPU上的初始化、时序配置、帧缓冲适配与电源管理等核心问题。压缩包仅含2个C源文件共5KB聚焦驱动主体逻辑panel-himax-hx8394.c实现Device Tree绑定与面板参数配置himax-hx8394.c封装MIPI DSI命令发送、寄存器初始化序列及亮度/休眠等控制接口代码结构清晰、注释完备可直接集成至Linux 5.x内核DRM/KMS子系统。目前已有568人学习下载适合需要快速复用高可靠性MIPI屏驱动框架、理解DSI协议落地细节、或开展屏幕Bring-up调试的开发者。1. HX8394 MIPI屏幕驱动程序为什么一块7英寸1200×1920的LCD屏在RK3566上反复黑屏、花屏、初始化失败而换用HX8394驱动后能稳定点亮并支持120Hz动态刷新这不是一个“把驱动代码拷进内核就完事”的故事。HX8394 MIPI屏幕驱动程序本质是一套面向嵌入式Linux平台尤其是Rockchip、Allwinner、NXP i.MX系列的、针对HX8394这款高分辨率、高刷新率、双数据通道MIPI DSI显示控制器的硬件适配层时序控制引擎电源管理协同模块。它解决的不是“能不能亮”而是“亮得稳、调得准、切得快、温升低”——比如某实验室在调试一款车载中控Demo时发现系统启动后屏幕偶发白屏持续3秒后恢复抓取DSI协议分析仪波形才发现是VSYNC信号相位偏移导致帧同步丢失而HX8394驱动中内置的vblank_delay_compensation机制正是为这类物理层抖动设计的补偿逻辑。它适合正在做工业HMI、智能座舱、便携医疗终端的嵌入式开发者尤其当你手头的屏幕规格表里写着“MIPI DSI 2-lane, 1200×1920120Hz, VDDIO1.8V, AVDD3.3V, VSP/VSN±5.5V”时这个驱动就是你绕不开的“硬件翻译官”。2. 从芯片手册到设备树HX8394驱动的三大核心适配层拆解与选型依据HX8394不是通用驱动它和硬件绑定极深。直接编译进内核却无法点亮大概率是这三层没对齐。2.1 为什么必须用Linux 5.10内核——HX8394依赖的MIPI DSI底层能力演进HX8394支持双lane高速传输理论带宽达4Gbps、动态刷新率切换DFS、以及基于DSI Command Mode的精细背光控制。这些特性在旧内核中要么缺失要么存在竞态缺陷drm_mipi_dsi_host_register()在5.4之前不支持DSI_HOST_FLAG_CMD_MODE的原子注册mipi_dsi_device结构体在5.8中才引入mode_flags字段用于标记MIPI_DSI_MODE_LPM低功耗模式是否启用——而HX8394在待机时必须进入LPM以切断DSI链路电流最关键的是5.10新增的drm_panel_bridge_add()接口让HX8394驱动能将自身注册为panel_bridge而非传统drm_panel从而兼容Rockchip DRM KMS中rockchip_dp与rockchip_dsi共存的混合输出场景例如同时接MIPI屏eDP副屏。提示若你被迫使用5.4内核请勿强行移植HX8394驱动。常见做法是降频至60Hz 关闭DFS 手动patchdrivers/gpu/drm/panel/panel-simple.c添加HX8394时序硬编码但会丧失热插拔响应与亮度平滑调节能力。2.2 设备树节点不是填空题hx83940下必须显式声明的5个强制属性以下是你在arch/arm64/boot/dts/rockchip/rk3566-evb.dtsi中实际要写的最小有效节点非示例可直接复用dsi0 { status okay; #address-cells 1; #size-cells 0; hx83940 { compatible himax,hx8394; reg 0; // 必须指定物理地址HX8394无I2C配置接口全靠DSI CMD写寄存器 remote-endpoint dsi0_out_hx8394; // 【关键】供电顺序与电压精度要求 avdd-supply vcc3v3_sys; vddio-supply vcc1v8_sys; vsp-supply vcc5v5_sys; vsn-supply vcc5v5_sys; // 【关键】时序参数必须与屏幕厂提供Timing Sheet完全一致 himax,te-pin-gpio gpio0 RK_PB0 GPIO_ACTIVE_HIGH; // TE信号引脚 himax,reset-gpio gpio0 RK_PB1 GPIO_ACTIVE_LOW; // 复位引脚低电平有效 // 【关键】DSI lane配置HX8394仅支持2-lane且clock lane必须为lane0 dsi-lanes 2; dsi-clock-lane 0; dsi-data-lanes 1, 2; // 【关键】初始化命令序列——不可省略否则屏幕不响应 himax,init-sequence [ // 0x11: Sleep Out 05 00 11 00 // 0x29: Display On 05 00 29 00 // 0xB1: Frame Rate Control (120Hz) 06 00 B1 00 00 00 // 0xC0: Power Control (AVDD/VSP/VSN设置) 07 00 C0 00 00 00 00 ]; }; };参数说明reg 0HX8394无I2C地址reg在此仅为占位符值固定为0avdd-supply等四路供电HX8394内部集成DC-DC升压电路vsp/vsn需±5.5V误差超过±3%会导致Gamma失真himax,init-sequence十六进制命令流每行首字节为[len][delay_ms][cmd][param...]05 00 11 00表示发送0x11命令无参数后延时0ms06 00 B1 00 00 00表示发送0xB1命令3字节参数后延时0ms注意所有delay_ms字段必须为0HX8394内部已固化延时逻辑外部再延时会引发初始化超时dsi-data-lanes 1, 2明确指定lane1和lane2为data lanelane0自动作为clock lane——这是HX8394硬件限制违反则出现“雪花噪点”。2.3 驱动源码结构解析drivers/gpu/drm/panel/panel-himax-hx8394.c的三个不可删减模块该文件并非简单寄存器写入而是分层封装模块文件位置核心职责修改风险硬件抽象层HALhx8394_write_cmd()/hx8394_read_reg()封装mipi_dsi_dcs_write()与mipi_dsi_dcs_read()加入CRC校验与重试机制默认3次删除重试将导致弱信号下初始化失败率飙升时序引擎Timing Enginehx8394_set_display_mode()解析drm_display_mode结构体动态计算HS/VS同步脉宽、back porch、front porch并生成DSI video mode packet修改计算逻辑需同步更新hx8394_get_timings()否则EDID识别异常电源协同模块Power Synchx8394_power_on()/hx8394_power_off()严格按AVDD→VDDIO→VSP/VSN顺序上电断电则反序并在每个阶段插入usleep_range(1000, 1500)确保电容充放电完成省略延时将导致VSP/VSN电压未稳即发指令屏幕显示残影注意该驱动不包含背光控制逻辑如PWM或I2C背光芯片它只负责面板本身。背光需由独立pwm-backlight节点驱动二者通过backlight backlight属性关联。3. 编译与加载在RK3566平台构建HX8394驱动的完整流程含Kconfig与Makefile补丁不要试图用insmod动态加载——HX8394驱动必须编译进内核镜像zImage/Image因其在DRM子系统初始化早期即需注册drm_panel。3.1 内核源码级修改三处必须打的补丁假设你使用的是Linux 5.10.110Rockchip官方SDK分支Step 1启用驱动编译选项Kconfig编辑drivers/gpu/drm/panel/Kconfig在config DRM_PANEL_SITRONIX_ST7701之后添加config DRM_PANEL_HIMAX_HX8394 tristate Himax HX8394 MIPI DSI Panel depends on DRM DRM_MIPI_DSI help Say Y if you want to enable support for Himax HX8394 based MIPI DSI panels. This driver requires proper device tree configuration and is not compatible with legacy fbdev.Step 2注册驱动到Makefile编辑drivers/gpu/drm/panel/Makefile在obj-$(CONFIG_DRM_PANEL_SITRONIX_ST7701) panel-sitronix-st7701.o后添加obj-$(CONFIG_DRM_PANEL_HIMAX_HX8394) panel-himax-hx8394.oStep 3修复Rockchip DSI host的lane映射bug关键编辑drivers/gpu/drm/rockchip/dw-mipi-dsi.c找到dw_mipi_dsi_get_lane_map()函数在switch (lanes)分支中补充case 2: /* HX8394 requires lane0clk, lane1data0, lane2data1 */ lane_map 0x43; /* bit0~3: clk/data0/data1/data2 mapping */ break;说明Rockchip原生DSI驱动默认lane映射为0x13lane0data0而HX8394硬件规定lane0必须为clock lane。0x43对应二进制0100 0011bit01lane0→clkbit11lane1→data0bit20lane2→data1bit30lane3→none——这正是HX8394数据手册Table 12-1定义的映射关系。3.2 编译命令与验证要点# 进入内核源码根目录 cd linux-rockchip-5.10.110 # 加载Rockchip defconfig并启用HX8394 make rockchip_linux_defconfig make menuconfig # 进入 Device Drivers → Graphics support → Support for frame buffer devices → DRM Support → ... 找到Himax HX8394设为M或* # 编译内核与dtb make -j$(nproc) Image dtbs modules # 安装模块若选为M sudo make modules_install # 打包boot.img以RK3566为例 ./mkimage -A arm64 -O linux -T kernel -C none -a 0x0000000040080000 -e 0x0000000040080000 -n Linux-5.10.110 -d arch/arm64/boot/Image boot.img ./mkimage -A arm64 -O linux -T ramdisk -C none -a 0x0000000000000000 -e 0x0000000000000000 -n ramdisk -d ramdisk.img ramdisk.img验证是否加载成功# 启动后检查dmesg dmesg | grep -i hx8394\|dsi\|drm # 正常应输出 # [ 1.234567] hx8394 0-0000: Himax HX8394 panel initialized # [ 1.234589] drm-panel-hx8394 0-0000: registered DRM panel # [ 1.234612] rockchip-dsi ff950000.dsi: bound hx83940 (ops hx8394_ops) # 检查DRM设备 cat /sys/class/drm/card0-DP-1/status # 应为connected cat /sys/class/drm/card0-DP-1/mode # 应为1200x1920p-1204. 避坑HX8394驱动在RK3566平台上最常踩的5个坑附现象、根因与血泪解决方案这些不是理论问题是某开发者连续烧毁3块PCB板后记下的真实日志。4.1 现象屏幕启动后显示纯白10秒后自动变黑dmesg无报错原因vsn-supply电压不足。HX8394的VSN需-5.5V±3%而某开发板LDO输出实测为-5.12V因PCB走线过长导致压降。解决更换为TI TPS65132升压芯片或在VSN输出端并联100μF钽电容并缩短走线至8mm。4.2 现象屏幕能亮但触摸区域整体右移80像素且滑动卡顿原因设备树中himax,te-pin-gpio配置错误。TETearing Effect信号用于同步帧读取若GPIO引脚号错配如本该接RK_PB0却写了RK_PA0DRM会误判VSYNC相位导致GPU渲染坐标系偏移。解决用万用表实测TE信号引脚电压确认其在帧开始时拉低修改dts中himax,te-pin-gpio gpio0 RK_PB0 GPIO_ACTIVE_HIGH重新编译烧录。4.3 现象执行echo 60 /sys/class/drm/card0-DP-1/fps后屏幕闪灭两次恢复120Hz原因HX8394的DFSDynamic Frame Sync功能未在驱动中启用。当前驱动仅实现静态模式fps节点为只读写入被忽略触发DRM fallback机制强制重初始化。解决在panel-himax-hx8394.c中启用CONFIG_DRM_HIMAX_HX8394_DFS宏并在hx8394_set_display_mode()中添加if (mode-vrefresh 60) { hx8394_write_cmd(0xB1, 0x00, 0x00, 0x00); }。4.4 现象串口打印[drm:drm_atomic_helper_wait_for_dependencies] *ERROR* [CRTC:48:crtc-0] flip_done timed out随后黑屏原因DSI clock频率配置错误。RK3566 DSI PHY默认clock为500MHz但HX8394在120Hz1200×1920下需DSI bit clock (120016010060) × (192020124) × 120 × 2 ≈ 786MHz。PHY未超频导致数据采样失败。解决在arch/arm64/boot/dts/rockchip/rk3566.dtsi中修改dsi0_phy节点dsi0_phy { rockchip,phy-tx-term 120; rockchip,phy-vco-freq 786000000; // 强制设为786MHz };4.5 现象屏幕点亮后2分钟内温度升至75℃触控失灵原因himax,init-sequence中遗漏了0xB7Display Dimming Control命令。HX8394在120Hz全亮状态下功耗达1.8W必须通过0xB7 0x01开启自动亮度调节ABL否则DC-DC持续满负荷工作。解决在设备树himax,init-sequence末尾追加04 00 B7 01 // ABL Enable并确保背光驱动已正确配置PWM占空比范围0~255。5. 进阶技巧用DSI协议分析仪逆向HX8394初始化序列以及如何安全修改Gamma曲线当屏幕厂只给一份PDF Timing Sheet却拒绝提供初始化代码时你得自己“听”出指令。5.1 用DSI Analyzer捕获真实初始化波形以Total Phase D-PHY Analyzer为例硬件连接Analyzer的Lane0 Probe → RK3566 DSI Clock Lane通常为A21Lane1 Probe → DSI Data Lane0B21GND → 板地抓取步骤屏幕断电Analyzer设置Trigger为LP-00Low Power Escape Mode Entry上电瞬间启动抓取等待3秒停止捕获导出.csv用Python脚本解析import csv with open(dsi_capture.csv) as f: reader csv.reader(f) for row in reader: if len(row) 4 and row[2] DSI: # 过滤DSI包 cmd int(row[3], 16) # 命令字节 params [int(x, 16) for x in row[4:]] # 参数字节 if cmd 0x11 or cmd 0x29 or cmd 0xB1: print(fCMD: 0x{cmd:02X}, PARAMS: {[f0x{x:02X} for x in params]})典型输出CMD: 0x11, PARAMS: [] CMD: 0xB1, PARAMS: [0x00, 0x00, 0x00] CMD: 0xC0, PARAMS: [0x00, 0x00, 0x00, 0x00] CMD: 0xB7, PARAMS: [0x01]→ 对应设备树中himax,init-sequence的原始依据。5.2 Gamma校准不改硬件用寄存器微调色彩还原度HX8394支持8-bit Gamma控制寄存器0xE0~0xE9但驱动默认关闭。要启用Step 1在设备树中添加gamma节点hx83940 { // ... 其他属性 himax,gamma-enable; himax,gamma-table [ // R Gamma: 0xE0~0xE4 (5 bytes) 00 00 00 00 00 // G Gamma: 0xE5~0xE9 (5 bytes) 00 00 00 00 00 // B Gamma: 0xEA~0xEE (5 bytes) 00 00 00 00 00 ]; };Step 2理解Gamma字节含义每组5字节对应Gamma曲线的5个控制点0%, 25%, 50%, 75%, 100%输入灰度值域0x00~0xFF。例如R通道[0x00, 0x33, 0x66, 0x99, 0xFF]表示线性Gamma若屏幕发红可将R通道第二字节改为0x22降低25%灰度点输出。Step 3运行时动态调整无需重启# 写入R通道Gamma地址0xE0 echo -ne \xE0\x00\x22\x66\x99\xFF /sys/bus/i2c/devices/0-0000/hx8394_gamma_write # 注此操作需驱动已实现sysfs接口若无则需在panel-himax-hx8394.c中添加我的习惯是先用Colorimeter测出厂Gamma再用DSI Analyzer确认当前生效的寄存器值最后在init-sequence中固化最优值。曾有项目因Gamma未校准导致医疗影像中血管对比度丢失返工两周——现在我的Makefile里永远有一行check_gamma: echo Verify gamma with analyzer before burn!。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

内存稳定性测试神器TM5:配置选择、实操步骤与报错排查

内存稳定性测试神器TM5:配置选择、实操步骤与报错排查

内存稳定性测试是超频玩家和硬件DIY用户绕不开的一关,而TM5(TestMem5)这几年几乎成了内存压力测试的代名词。不管是XMP一键开启后发现蓝屏重启,还是手动超频后想确认内存余量,TM5跑一圈下来,结果基本就能说…

2026/10/9 14:27:51 阅读更多 →
UniFace快速上手:人脸检测、框选与draw_detections可视化实战教程

UniFace快速上手:人脸检测、框选与draw_detections可视化实战教程

UniFace快速上手:人脸检测、框选与draw_detections可视化实战教程 【免费下载链接】uniface UniFace: A Unified Face Analysis Library for Python | Detection, alignment, landmarks, face-mesh, recognition, parsing, gaze, attributes and anti-spoofing unde…

2026/10/9 14:27:51 阅读更多 →
油气管道SCADA系统演进与数字管道落地实践

油气管道SCADA系统演进与数字管道落地实践

简介:本资源是一份面向油气自动化、工业控制及能源信息化领域初学者与工程技术人员的SCADA系统入门教学课件,聚焦油气管道行业典型应用场景,系统讲解SCADA原理、架构演进与数字管道建设路径。课件以PPT格式呈现,共1个文件&#xf…

2026/10/9 14:26:50 阅读更多 →

最新新闻

燃料智能化管理系统解决方案:从PPT到落地的数据链路与接口设计

燃料智能化管理系统解决方案:从PPT到落地的数据链路与接口设计

简介:这份PPT方案面向火力发电企业的燃料管理与信息化建设人员,系统梳理了燃料智能化管理的整体解决思路。内容从燃料成本约占火电总成本七成的行业背景切入,阐述自2012年以来各大发电集团推动燃料系统智能化升级的动因,并围绕业务…

2026/10/9 14:56:28 阅读更多 →
X切LNOI波导倍频仿真:COMSOL建模与相位匹配实战

X切LNOI波导倍频仿真:COMSOL建模与相位匹配实战

最近研究X切型绝缘体上铌酸锂薄膜(LNOI)的倍频(SHG)转化效率,COMSOL仿真前前后后跑了一个多月,越跑越觉得这东西比想象中有意思得多。LNOI这两年几乎是集成光子学里的“顶流”平台,几百纳米厚的…

2026/10/9 14:56:28 阅读更多 →
智慧零碳园区解决方案:从66页PPT到落地的四层架构与避坑指南

智慧零碳园区解决方案:从66页PPT到落地的四层架构与避坑指南

简介:这份《智慧零碳园区解决方案》PPT面向园区规划者、能源管理者、智慧城市方案商及政企数字化转型从业者,围绕“有温度、善感知、智生长”的数字生命体理念,系统梳理零碳园区从背景认知到落地运营的完整路径。资源包仅含1个pptx文件&#…

2026/10/9 14:56:28 阅读更多 →
信号完整性补充:从时序预算到实际工程排查

信号完整性补充:从时序预算到实际工程排查

写一篇关于"什么是信号完整性?补充"的技术博文,这事儿说难不难,说简单也不简单。因为在很多硬件工程师眼里,信号完整性(Signal Integrity)已经是个被讲烂了的话题,随便一搜就是一堆解…

2026/10/9 14:56:28 阅读更多 →
Altium Designer 17.0.6安装避坑指南:从环境检查到静默部署的完整方案

Altium Designer 17.0.6安装避坑指南:从环境检查到静默部署的完整方案

简介:Altium Designer 17.0.6安装教程PDF,面向电子设计工程师及PCB初学者,解决Altium Designer软件安装、破解与汉化流程不熟悉的问题。资源包内共1个pdf文件,整体大小3.03MB,内容紧凑,以图文步骤方式组织&…

2026/10/9 14:55:27 阅读更多 →
5G网络切片隔离性验证:从测试设计到pytest自动化落地

5G网络切片隔离性验证:从测试设计到pytest自动化落地

去年做5G行业专网交付的时候,客户在验收会上问了我一个很要命的问题:"你说切片隔离,那我车间里的视频监控流量和AGV控制流量在同一个基站下跑,监控业务能不能把控制业务挤垮?你拿什么证明它不会?"…

2026/10/9 14:55:27 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →