驱动之#04LCD 驱动程序分析基于 RK3576摘以 RK3576 的panel-simple.c为例从字符设备驱动入口、设备树匹配、probe流程、背光到 MIPI-DSI 挂理 LCD 驱动的整体析方法。1. 为什么要分析 LCD 驱动实际工作中通常不需要从零编写 LCD 驱动但必须掌握 LCD 驱动框架读和理解现有驱动定位显示问题在需要时修改驱动以适配硬件或产品需求。LCD 驱动本质上也是字符设。掌握字符设备动的架后以从驱动入口函数开始沿着driver与deviceDTS的匹配关系追踪到probe函数和后续初始化流程。本文以 RK3576 平台的以文件为例kernel-6.1/drivers/gpu/drm/panel/panel-simple.c2. 从口函数开始阅读panel-simple.c的口函数注册了 3 个驱动说明该文件同时兼容 DPI、DSI 和 SPI 接口连接的 panel。以panel_simple_dsi_driver为例驱动和 device备树compatible属性匹配内核会调用panel_simple_dsi_probe。因此读该probe函数的具体操作就能基本掌握该 DSI panel 驱的工作方式。3.panel_simple_dsi_probe流程下面的代码按执行顺序标注了关键骤/* MIPI-DSI 面板测函数负责初始 DSI 接口的面板设备 */staticintpanel_simple_dsi_probe(structmipi_dsi_device*dsi){/* 局变量定义 */structpanel_simple*panel;structdevice*devdsi-dev;conststructpanel_desc_dsi*desc;structpanel_desc_dsi*d;conststructof_device_id*id;interr;/* 1. 设备树匹 */idof_match_node(dsi_of_match,dsi-dev.of_node);if(!id)return-ENODEV;/* 2. 处理面描述符 */if(!id-data){ddevm_kzalloc(dev,sizeof(*d),GFP_KERNEL);if(!d)return-ENOMEM;errpanel_simple_dsi_of_get_desc_data(dev,d);if(err){dev_err(dev,failed to get desc data: %d\\n,err);returnerr;}}/* 3. 选择最终述符 */descid-data?id-data:d;/* 4. 通用面板初始化 */errpanel_simple_probe(dsi-dev,desc-desc);if(err0)returnerr;/* 5. 获取面板数据并关联 DSI 设备 */paneldev_get_drvdata(dev);panel-dsidsi;/* 6. 有背光备时注册 DCS 背光 */if(!panel-base.backlight){structbacklight_propertiesprops;memset(props,0,sizeof(props));props.typeBACKLIGHT_RAW;props.brightness255;props.max_brightness255;panel-base.backlightdevm_backlight_device_register(dev,dev_name(dev),dev,panel,dcs_bl_ops,props);if(IS_ERR(panel-base.backlight)){errPTR_ERR(panel-base.backlight);dev_err(dev,failed to register dcs backlight: %d\\n,err);returnerr;}}/* 7. 配置 DSI 主机控制器参 */dsi-mode_flagsdesc-flags;dsi-formatdesc-format;dsi-lanesdesc-lanes;/* 8. 将面板附加到 DSI 主机 */errmipi_dsi_attach(dsi);if(err){structpanel_simple*panelmipi_dsi_get_drvdata(dsi);drm_panel_remove(panel-base);}/* 9. 成功返回 0失败返回错误码 */returnerr;} 从这段流程可以看到probe 要负责1.匹配设备树2.2.获取或解析 panel 描述符3.3.调用用 panel 初始化4.4.注册或关背光设备5.5.设置 DSI 参数6.6.将 panel 挂接到 DSI 机。 ##4.备树参数从哪来 设备树中定义的屏参以及 MIPI 初始化相内容最终通过以下两个函数获取 cpanel_simple_dsi_of_get_desc_data()panel_simple_of_get_desc_data()4.1 解 DSI 专有数staticintpanel_simple_dsi_of_get_desc_data(structdevice*dev,structpanel_desc_dsi*desc){structdevice_node*npdev-of_node;u32 val;interr;errpanel_simple_of_get_desc_data(dev,desc-desc);if(err)returnerr;desc-desc.connector_typeDRM_MODE_CONNECTOR_DSI;if(!of_property_read_u32(np,dsi,flags,val))desc-flagsval;if(!of_property_read_u32(np,dsi,format,val))desc-formatval;if(!of_property_read_u32(np,dsi,lanes,val))desc-lanesval;return0;}|属性|作用||---|---||dsi,flags|DSI 工作式标志||dsi,format|像素据格式||dsi,lanes|DSI 通道数量|###4.2解析通用 panel 参数 cstaticintpanel_simple_of_get_desc_data(structdevice*dev,structpanel_desc*desc){structdevice_node*npdev-of_node;u32 bus_flags;constvoid*data;intlen;interr;/* 1. 解析显示时序 */if(of_child_node_is_present(np,display-timings)){structdrm_display_mode*mode;modedevm_kzalloc(dev,sizeof(*mode),GFP_KERNEL);if(!mode)return-ENOMEM;if(of_get_drm_display_mode(np,mode,bus_flags,OF_USE_NATIVE_MODE)){desc-modesmode;desc-num_modes1;desc-bus_flagsbus_flags;}}elseif(of_child_node_is_present(np,panel-timing)){structdisplay_timing*timing;structvideomodevm;timingdevm_kzalloc(dev,sizeof(*timing),GFP_KERNEL);if(!timing)return-ENOMEM;if(!of_get_display_timing(np,panel-timing,timing)){desc-timingstiming;desc-num_timings1;bus_flags0;vm.flagstiming-flags;drm_bus_flags_from_videomode(vm,bus_flags);desc-bus_flagsbus_flags;}}/* 2. 解析基本面属 */if(desc-num_modes||desc-num_timings){of_property_read_u32(np,bpc,desc-bpc);of_property_read_u32(np,connector-type,desc-connector_type);of_property_read_u32(np,bus-format,desc-bus_format);of_property_read_u32(np,width-mm,desc-size.width);of_property_read_u32(np,height-mm,desc-size.height);}/* 3. 解析时序延迟参数 */of_property_read_u32(np,prepare-delay-ms,desc-delay.prepare);of_property_read_u32(np,enable-delay-ms,desc-delay.enable);of_property_read_u32(np,disable-delay-ms,desc-delay.disable);of_property_read_u32(np,unprepare-delay-ms,desc-delay.unprepare);of_property_read_u32(np,reset-delay-ms,desc-delay.reset);of_property_read_u32(np,init-delay-ms,desc-delay.init);/* 4. 解析初序列 */dataof_get_property(np,panel-init-sequence,len);if(data){desc-init_seqdevm_kzalloc(dev,sizeof(*desc-init_seq),GFP_KERNEL);if(!desc-init_seq)return-ENOMEM;errpanel_simple_parse_cmd_seq(dev,data,len,desc-init_seq);if(err){dev_err(dev,failed to parse init sequence\\n);returnerr;}}/* 5. 解析退出序 */dataof_get_property(np,panel-exit-sequence,len);if(data){desc-exit_seqdevm_kzalloc(dev,sizeof(*desc-exit_seq),GFP_KERNEL);if(!desc-exit_seq)return-ENOMEM;errpanel_simple_parse_cmd_seq(dev,data,len,desc-exit_seq);if(err){dev_err(dev,failed to parse exit sequence\\n);returnerr;}}return0;} 该函数解析范围包括-display-timings 或 panel-timing 示时序--色深 bpc、接器型、总线格式--板物理尺寸--prepare/enable/disable 等时序延迟--panel-init-sequence 初始化命令序列--panel-exit-sequence 出命令序。 ##5.分析驱动时应关注什么 分析字符设备动建议按下面的路径阅读 text 入口注册 driver 与 device/DTS 匹配 → probe → 资源与参数解析 子设/背光注册 → 总线或控制器 attach → 后续 enable/disable 流程 不需要花大量时逐行解释所有代码。更有价值的是掌握整体驱动框、关键函数的调用关系以及设备树参数如何进入驱动。 ##6.小结 本文以 RK3576 的 panel-simple.c 为例梳理 MIPI-DSI LCD 动的核心流程1.通过 compatible 完成设备树匹配2.2.在 probe 中获取预定义动态解析的 panel 描述符3.3.由通用函数解析显示时、尺寸、延迟和初始化序列4.4.配置背光与 DSI 的 flagsformat、lanes5.5.调用 mipi_dsi_attach() 将 panel 附加 DSI 主机。 握这主线后就可以更高效地阅读和体 LCD 驱动问题。
企业数字化 ERP 产品动态
相关推荐
网站无法被百度收录?3个实战案例拆解排查逻辑 网站无法被百度收录?3个实战案例拆解排查逻辑 域名服务器搞不懂,代码写了一堆却搜不到?别急,这行干久了都知道, 网站无法被百度收录… · 2026/9/27 11:00:05
PD受电芯片选型:协议鲁棒性、PDO协商与VCONN管理深度解析 1. 项目概述:为什么PD快充受电芯片选型是硬件开发的“生死线”你手里的Type-C充电线插进设备,屏幕右上角跳出来一个“快充中”的提示——这背后不是简单的“电压高一点、电流大一点”就能搞定的事。真正起作用的,是一颗藏在主板角落、面积不到… · 2026/9/27 10:59:38
米醋·McoreSTM32 电控板 BSP 上手与进阶配置指南(STM32F407VET6 / RT-Thread) 操作系统嵌入式物联网嵌入式OSRTOS 【免费下载链接】rt-thread RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/ 项目地址: https://gitcode.com/gh_mirrors/rt/rt-thread 点击查看 免费下载 本文以 … · 2026/9/27 10:59:32
STM32嵌入式C++实战:从寄存器操作点亮LED到类封装 说实话,看到这个标题的时候,我盯着屏幕乐了好几秒,因为前三篇我们一直在聊为什么在 STM32 嵌入式开发里值得用 C、C 和 C 在单片机上到底差在哪、编译工具链用的又是什么套路——结果评论区和私信里已经有朋友憋不住了:“CLion 都… · 2026/9/27 11:49:43
网站有什么用?3张图解步骤讲透SEO获客真相 网站有什么用?3张图解步骤讲透SEO获客真相 刚做完网站,每天盯着后台,访客数是个位数,心里直发慌。这种“网站做好了没人访问”的焦虑,比代码报错还让人抓狂。很多老板以为建个站就能坐等订单,结果发现百度搜不到,谷歌没排名,钱全打水漂。其实,网… · 2026/9/27 11:49:42
STM32从入门到实战:开发资源、外设方案与避坑指南 1. 内容整体设计与项目背景拆解1.1 为什么要写这篇STM32资源汇总这两年被问得最多的问题,翻来覆去就那么几个:STM32到底怎么入门?学标准库还是HAL库?Keil5怎么动不动就报错?毕业设计想用STM32做点东西,有没… · 2026/9/27 11:49:36
怎么做wordpress别被坑5个核心注意事项与避坑指南 怎么做wordpress别被坑5个核心注意事项与避坑指南 找建站公司报价三万五,自己搭却只要几百块?这行水太深,很多人第一反应就是找外包,结果被收了高额“技术费”和“维护费”。其实, 怎么做wordpress… · 2026/9/27 11:49:36
电控故障排查:别猜零件,沿信号链路逐级找断点 1. 电控故障的本质:你修的不是"某个零件",而是一条信号链路在汽车电子这行干了十几年,我最深的一个体会是:90%以上的电控硬件故障,根源都不在故障码指向的那个传感器或执行器本身,而在于这条完整… · 2026/9/27 11:49:36
IDEA 新 UI 配置启用指南:TaoToken 统一 Key 接入 settings.json 骨架与验证 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 11:49:24
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01