首页 / 资讯中心 / 文章详情

ST7701S驱动移植实战:MIPI屏初始化序列与平台配置要点解析

ST7701S驱动移植实战:MIPI屏初始化序列与平台配置要点解析 ★ FEATURED ARTICLE
简介面向嵌入式Linux开发人员的ST7701/ST7701S液晶显示驱动资源包主要解决小尺寸SPI/I2C接口显示屏在Linux系统上的适配与图像输出问题适合正在调试LCD驱动、需要参考寄存器配置或移植方案的工程师使用。压缩包共6个文件大小约5.3MB包含3个PDF文档、2个C语言驱动源文件和1个系统缩略图缓存文件。PDF文档包括ST7701规格书V1.0-3与V1.2及应用笔记详细描述芯片的初始化序列、时序参数和命令格式两个C源码文件分别针对MTK和展锐Spreadtrum平台给出驱动实例覆盖通信接口配置、分辨率与颜色模式设置等关键逻辑可作为不同硬件平台间移植的对照模板。目前已有3709人学习下载。借助这套资料开发者既能通过规格书快速核对寄存器定义也能根据现成代码理清驱动注册、数据传输和设备节点的建立流程从而减少重复造轮子、排查启动黑屏和不显示等问题。1. ST7701S 驱动移植这块小尺寸 LCD 驱动到底怎么落地ST7701S 是当前 3.5 到 4.3 寸 MIPI 屏里出场率相当高的一颗显示驱动 ICMTK 平台和 Spreadtrum 平台都在大规模用。这个压缩包里装的是完整可用的驱动参考代码加原厂 SPEC对正在做 Linux 显示驱动移植的人来说价值在于它把初始化序列、时序参数、接口定义这些容易被坑到的东西一次给全了。我拆包后第一反应是这套资料比大部分 SDK 里带的 demo 干净PH040NA-01C 这颗屏不同平台的配置写法可以直接对比着看省掉很多翻手册的时间。下文我会把文件结构、内核配置、初始化序列的坑一个一个说清楚。2. 驱动包拆解SPEC、应用笔记和平台代码各自解决什么问题2.1 文件清单和每个文件的真实用途压缩包解压后一共五个文件其中 Thumbs.db 是 Windows 系统自动生成的缩略图缓存可以直接忽略。真正有用的是 ST7701_SPEC_Version 1.0-3.pdf、ST7701_SPEC_V1.2.pdf.pdf、ST7701_ApplicationNote_V0.9.pdf 以及两套平台代码 MTK_CTC3.97TN(PH040NA-01C).C 和 SPREADTRUM_CTC3.97TN(PH040NA-01C).C。两份 SPEC 一个是 1.0 初版一个是 1.2 修订版修订版在时序参数、电源上电顺序和寄存器默认值上有更新如果有条件用 V1.2 作为主参考V1.0 留着对照差异。ApplicationNote 是原厂写给模组厂和驱动工程师的实践指引里面包含 MIPI 参数配置建议、初始化序列的写入时序和数据格式定义。两套平台代码分别对应 MTK IC 方案和 Spreadtrum IC 方案拿到手上先对比看同一个模组在两个平台下的差异化配置这个对比过程就是理解初始化序列参数含义的最佳入口。MTK 版本的文件名里带 CTC3.97TNSPREADTRUM 版本的文件名里也带同样的模组型号说明这两个文件都针对同一颗屏差异点在平台对 MIPI 控制器寄存器配置的封装方式上。MTK 平台习惯用setparam和dbi接口写命令Spreadtrum 平台用sprd_panel_...结构体加函数指针的方式注册。移植的时候不需要逐行理解每个参数但需要搞清楚初始化序列、帧参数和平台结构体之间的关系这三个部分对应的工作量占移植总时间的百分之六十以上。2.2 SPEC 手册里你真正需要精读的四个章节拿到 ST7701S 的 SPEC 先不要从头读到尾这份手册核心内容是命令表、时序参数、电源特性和寄存器描述四块。命令表里要重点看初始化序列支持的 page 切换机制ST7701S 的三个 page 简单说就是三组寄存器切换命令分别是 C6FF、C677、C601这是个关键机制初始化序列前半部分是切到 page1 写 L2P 相关配置后半部分切到 page2 写 GIP 相关配置两块都完成后再切回 page0 设置显示相关参数。有很多初学者直接照抄初始化序列但忘了确认当前 page 状态导致某段配置被写进错误的寄存器分组里显示异常但排查半天找不到原因。时序参数章节里要关注 PCLK、VCLK、VBP、VFP、VSA、VACT、HBP、HFP、HSA、HACT 这些参数的具体值PH040NA-01C 是 3.97 寸 480×800 分辨率的 TN 屏帧率一般配置成 60 赫兹或者 50 赫兹MIPI 数据速率由平台侧 DSI 控制器的时钟配置决定屏端的 VCLK 设置决定了扫描一帧需要多少个 line clock不是自由配置的。电源特性章节是很多人忽略的一个关键部分。ST7701S 内部集成 DC/DC 转换器VSP、VSN、AVDD 这几个电压通道全部由内部 LDO 或 DC/DC 产生这意味着外部电路只需要提供单一 VCI 2.8V 或者 3.0V 供压就不需要额外做负电压电源。上电顺序上逻辑电源先于模拟电源具体顺序为 VCI 先上电然后是 VDDI 逻辑 IO 电源之后经过几毫秒延时再使能 TE 信号这个顺序必须在驱动初始化或平台侧 panel 配置里体现清楚硬件设计没按规范来的话SPI 读写正常但 MIPI 数据通道完全不输出的现象就可能在硬件上出现。2.3 ApplicationNote 和 SPEC 的差异在哪里ApplicationNote 是原作者实际调屏过程中得出的经验集合时序参数中的 PCLK 范围、TFT 充电时间的最小保证值和 RGB 数据建立时间在 SPEC 里是一组边界条件到了 ApplicationNote 里会被转换成一组更安全、收敛明显更紧凑的推荐值。我在做模组兼容性检查时基本以 ApplicationNote 的推荐时序为准因为它已经经过了原厂针对批量生产良率的窗口缩窄。还有一类差异集中在初始化序列的长度上。SPEC 里给出的 initialization sequence 要短一些部分 GIP 相关的寄存器没有列出推荐值ApplicationNote 则补充了大量 GIP 相关寄存器内容这些配置在某几款 ST7701S 模组里是建议保留的尤其涉及 GOA 电路时序的寄存器如 C3h、C4h、D5h、D6h、D7h实际调屏时这些寄存器参数直接关系到屏体内部 GOA 电路的充放电窗口。我一般以 V1.2 SPEC 的 base 序列为基础对照 ApplicationNote 逐条 diff 初始化序列多出来的寄存器条目逐个去 V1.2 SPEC 里查含义这样既不会漏配原厂建议的稳定参数也不会被 ApplicationNote 里一些针对特定 case 的调整参数带偏。3. 初始化序列和时序配置ST7701S 上屏跑起来的核心参数3.1 ST7701S 三页寄存器机制ST7701S 的一个设计特点是把寄存器分成三个 page通过软命令切换访问。Page 选择命令的值常见的是C6h FFh进入扩展命令模式再用C6h 77h或者C6h 01h做 page 内切换实际项目中不同的模组厂对 page 的划分可能不同但整体思路一致。初始化序列第一部分通常是进入 page 1配置 L2Pline to pixel相关的参数比如扫描方向、左右反转、上下反转第二部分切到 page 2配置 GIPgate in panel相关的参数包括 GOA 电路的时钟组、有效电平、充电时序最后切回 page 0配置显示参数如分辨率、颜色深度、帧率、TE 信号极性等。这份资源提供的 MTK 平台代码里以DCS命令序列逐条写入Spreadtrum 平台代码里则定义了一个sprd_panel_desc结构体初始化序列按{0x, 0x}的格式排成数组由sprd_panel_prepare函数统一发送。从结构上看SPI 接口的 ST7701S 用 SPI 写入 C6h/C7h/FFh 等寄存器MIPI DSI 接口则通过 DCS 短包写入。下面是一份参考的标准初始化序列分段方式基于 MTK 平台代码可以提炼出基本逻辑// ST7701S init sequence with page switching static void st7701s_init_sequence(void) { /* Enter extension command mode */ dsi_dcs_write_seq(0xC6, 0xEF); // page select dsi_dcs_write_seq(0xC6, 0xFF); dsi_dcs_write_seq(0xC6, 0xEF); // unlock extension command /* Page 1: L2P settings */ dsi_dcs_write_seq(0x00, 0x08); dsi_dcs_write_seq(0x01, 0x08); dsi_dcs_write_seq(0x02, 0x42); dsi_dcs_write_seq(0x03, 0x42); dsi_dcs_write_seq(0x04, 0x43); dsi_dcs_write_seq(0x05, 0x43); dsi_dcs_write_seq(0x06, 0x00); dsi_dcs_write_seq(0x07, 0x02); dsi_dcs_write_seq(0x08, 0x00); dsi_dcs_write_seq(0x09, 0x00); /* Page 2: GIP sequence settings */ dsi_dcs_write_seq(0xC6, 0x77); // switch to page 2 dsi_dcs_write_seq(0x20, 0x01); dsi_dcs_write_seq(0x21, 0x0C); dsi_dcs_write_seq(0x22, 0x0C); dsi_dcs_write_seq(0x23, 0x0C); dsi_dcs_write_seq(0x24, 0x0C); dsi_dcs_write_seq(0x25, 0x0C); dsi_dcs_write_seq(0x26, 0x08); dsi_dcs_write_seq(0x27, 0x08); dsi_dcs_write_seq(0x28, 0x0C); dsi_dcs_write_seq(0x29, 0x08); dsi_dcs_write_seq(0x2A, 0x08); /* Page 0: display settings */ dsi_dcs_write_seq(0xC6, 0x01); // back to page 0 dsi_dcs_write_seq(0x11, 0x00); // sleep out dsi_dcs_write_seq(0x3A, 0x77); // 24-bit RGB dsi_dcs_write_seq(0x35, 0x00); // TE enable dsi_dcs_write_seq(0xC6, 0x02); // positive/negative polarity config dsi_dcs_write_seq(0xD5, 0x02); // VCOM adjustment dsi_dcs_write_seq(0x29, 0x00); // display on }以上是一个示意性序列实际使用时要从压缩包里的平台代码中提取原生序列不要直接使用这里展示的参数ST7701S 的寄存器值在不同模组之间可能完全不通。我在实际使用中会先做一次完整的diff对比把 MTK 和 SPREADTRUM 两个平台代码里的序列提取出来逐字节对比不一致的条目以 SPEC 或者屏厂提供的 Guide 为准。参数说明DTG 寄存器在 ST7701S 上大概影响 line time 内的时序分配RGB 的建立时间、保持时间和各通道点位都有明确设置调整范围不大一般锁定默认值C3h和C4h是 GIP 的时钟分组配置决定每条 GOA 输出扫描线的驱动时间窗口这两组值是屏幕花屏和单声道显示的高频原因之一D5h到D7h是 GOA 充电窗口配置TN 屏对这几个寄存器的取值比 IPS 屏更敏感直接关系到显示均匀性、闪烁和残影。3.2 帧参数与平台配置的对应关系ST7701S 驱动模组时的帧参数包括水平方向的前肩 HFP、后肩 HBP、同步脉冲 HSA以及垂直方向的 VFP、VBP、VSA。这些参数分别存在初始化序列的10h到15h对应的寄存器里同时也需要跟平台 DSI 控制器的时序配置对齐。MTK 平台的 lcm 参数结构体里hsa、hsb、hbp与初始化序列里的参数必须保持一致否则可能会出现屏能亮但左右偏移若干像素的情况这是多因一果的典型问题。驱动里如果对不上优先改内核侧的panel-simple配置。在配置帧率时用以下换算逻辑确认像素频率。480 宽加水平消隐乘上 800 高加垂直消隐再乘帧率就是 DSI 时钟的像素链路速率# Pixel clock calculation for 480x800, 60Hz # H_total HACT HBP HSA HFP # V_total VACT VBP VSA VFP # PCLK H_total * V_total * fps H_total 480 40 20 40 # 调整到初始化序列里的实际值 V_total 800 20 8 20 # 对应你的实际配置 PCLK H_total * V_total * 60 echo $PCLK Hz # 单通道 DSI 时这条链路速率要落在平台支持范围这里计算得到的 PCLK 是参考链路速率实际 MIPI DSI 时钟还要考虑数据通道数、BPP 和 lane count。在 MTK 平台下这些配置通常在mtkfb的 dts 节点里完成常用配置方式是在lcm_params中分别设置hsa、hbp、hfp、vsa、vbp、vfp、width、height等字段同时初始化序列里的时序寄存器和这些字段应该配合调整如果一边改了另一边不动最典型的故障是画面上方或下方出现一条亮暗线。在 Spreadtrum 平台里参数入口为struct sprd_panel_desc定义形式如下static struct sprd_panel_desc st7701s_panel_desc { .name ctc_3.97tn_st7701s, .width_mm 62, /* 3.97 inch, 4:3 screen ratio approx */ .height_mm 104, .mode video, /* or cmd if using TE sync */ .fps 60, .lanes 2, .bpp 24, .hsa 20, /* horizontal sync active */ .hbp 40, /* horizontal back porch */ .hfp 40, /* horizontal front porch */ .vsa 8, /* vertical sync active */ .vbp 20, /* vertical back porch */ .vfp 20, /* vertical front porch */ };在这份代码里结构和 MTK 平台表达的是同一套时序信息。两边参数的数值需要一致不愿意一致的话画面横向或纵向偏移就是大概率结果。注意fps为 60 时hfp和hbp要同时考虑 DSI 吞吐量的余量不会让链路速率逼近上限。3.3 初始化序列寄存器的关键参数参考表ST7701S 初始化序列中寄存器分布大致涉及三个 group分别在 page 0、page 1、page 2 下。下表是基于 ST7701S 常见配置整理的参数范围和用途具体数值以这个压缩包里的平台代码或者屏厂最终指导书为准。寄存器所属 Page典型作用配置时的注意事项C6h0切换 page 的主命令在 page 切换命令后需要等待若干 us 稳定20h~2Ah2GIP 时钟组和扫描方向改动会影响扫描方向用错会镜像显示2Bh~2Eh2GOA 有效脉冲宽度控制调窄可能引起横纹调宽会增加功耗85h~87h1电压相关设定尽量保持 SPEC 默认值小屏对 VCOM 敏感D5h~D7h0GOA 充电窗口与补偿花屏或残影优先查这几组3Ah0颜色深度 18/16/24bit与平台 framebuffer 的 bpp 配置必须一致35h0TE 信号使能在 cmd mode 下常见video mode 下可不配置这些寄存器只是定位用的地图具体取值在平台代码里都有不要凭感觉去改。我见过不少人裸配 3Ah 之后换了一套平台代码就没有重新核对 bpp导致平台读到视频帧数据后拆包错位画面出现类似噪声的彩色杂点这类问题排查起来相当费劲。原则是寄存器配置跟平台描述符里的字段保持一一对应其中 bpp、分辨率、lane 这三个要素优先级最高。4. 内核驱动移植从拿到代码到屏幕上出图的全过程4.1 内核 Kconfig 和 DTS 节点配置把驱动代码要接进内核第一件事是确认内核的 DRM/KMS 或者 FBDEV 框架已经使能。ST7701S 在 MTK 平台常见的接入方式是修饰panel-simple或新建一个独立驱动然后在 dts 里声明 panel 节点在 Spreadtrum 平台上则是走五路显示控制器框架直接在sprd-panel的 kconfig 里选中对应屏参。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站