当前位置: 首页 > news >正文

MTK Linux DRM分析(十一)- MTK KMS Panel显示屏驱动

一、简介

Panel驱动目前主要指显示屏LCM的驱动,当前分析的代码主要基于MT6985(天玑9000)天马显示屏,型号为compatible = "tianma,nt36672e,vdo,120hz"

https://github.com/oppo-source/android_kernel_oppo_mt6985https://github.com/oppo-source/android_kernel_oppo_mt6985

代码位置为

android_kernel_oppo_mt6985-oppo-mt6985_t_13.1_find_x6\drivers\gpu\drm\panel\panel-tianma-nt36672e-vdo-120hz-hfp.c

二、代码分析

这个驱动程序是基于Linux内核的DRM (Direct Rendering Manager) 子系统实现的MIPI DSI (Mobile Industry Processor Interface Display Serial Interface) 面板驱动,针对Tianma NT36672E VDO 120Hz LCD面板。驱动的主要目的是管理面板的电源、初始化、模式切换、背光控制等操作。它支持多种刷新率(60Hz、90Hz、120Hz),并集成MediaTek特定的面板扩展(通过CONFIG_MTK_PANEL_EXT宏),包括DSC (Display Stream Compression)、动态FPS切换和ESD (Electro-Static Discharge)检查。

驱动的整体框架遵循标准的DRM面板驱动模式:

  • 核心API:使用drm_panel结构体和函数(如drm_panel_init、drm_panel_add)来注册面板。
  • DSI接口:通过mipi_dsi_device处理DSI命令(如DCS写/读),用于面板配置和控制。
  • GPIO和背光管理:使用GPIO控制复位和电源,背光通过backlight_device管理。
  • 模式支持:定义多个drm_display_mode结构体,支持动态分辨率和刷新率。
  • MediaTek扩展:集成MTK面板框架,提供额外的功能如背光命令队列、ATA检查和参数动态调整。
  • 初始化序列:驱动包含一个长序列的DCS (Display Command Set) 命令,用于面板硬件初始化(例如设置寄存器、时序、伽马曲线等)。

驱动的生命周期包括探测(probe)、准备(prepare)、启用(enable)、禁用(disable)、取消准备(unprepare)和移除(remove)。下面详细分析框架结构和主要函数接口。

1. 驱动整体结构
  • 关键头文件
    • DRM相关:drm/drm_mipi_dsi.h、drm/drm_panel.h、drm/drm_modes.h 等。
    • MIPI DSI:video/mipi_display.h。
    • GPIO和设备:linux/gpio/consumer.h、linux/platform_device.h。
    • MediaTek特定:mtk_panel_ext.h、mtk_drm_graphics_base.h 等(条件编译)。
  • 核心数据结构
    • struct tianma:面板上下文结构体,包含:
      • dev:DSI设备指针。
      • panel:DRM面板实例。
      • backlight:背光设备。
      • pm_enable_gpio、reset_gpio:GPIO描述符,用于电源和复位控制。
      • prepared、enabled:状态标志。
      • error:错误码。
    • struc
http://www.xdnf.cn/news/1345033.html

相关文章:

  • 使用html+css+javascript练习项目布局--创建导航栏
  • Linux驱动开发笔记(六)——pinctrl GPIO
  • MTK Linux DRM分析(十三)- Mediatek KMS实现mtk_drm_drv.c(Part.1)
  • chapter07_初始化和销毁方法
  • 【连接器专题】连接器接触界面的理解
  • CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作--读取店铺信息(6)
  • 彩笔运维勇闯机器学习--最小二乘法的数学推导
  • 在线教育领域的视频弹题功能如何打造高互动性在线课程
  • 【Tech Arch】Hadoop YARN 大数据集群的 “资源管家”
  • 全栈开发:从LAMP到云原生的技术革命
  • Kali Linux 发布重构版Vagrant镜像:通过命令行快速部署预配置DebOS虚拟机
  • Pandas中的SettingWithCopyWarning警告出现原因及解决方法
  • DbLens:告别手动Mock数据,右键一键智能生成数据库内容
  • httpclient与hertzclient在处理Host header时的差别
  • 【GPT入门】第53课 LlamaFactory微调效果与vllm部署效果不一致问题解决
  • open webui源码分析6-Function
  • FPGA学习笔记——简单的IIC读写EEPROM
  • FPGA高端项目:图像采集+Aurora 8B10B+UDP图传架构,基于GTH高速收发器的光口转网口,提供工程源码和技术支持
  • IntelliJ IDEA 常用快捷键笔记(Windows)
  • SRE系列(二) | 从可用性到 SLI/SLO
  • 【数据结构】B 树——高度近似可”独木成林“的榕树——详细解说与其 C 代码实现
  • MySQL编程开发(了解)
  • 08高级语言逻辑结构到汇编语言之逻辑结构转换 continue break 完结汇编按逻辑结构
  • Redis---事务
  • 51单片机-驱动步进电机模块教程
  • C#_组合优于继承的实际应用
  • Kafka Broker 核心原理全解析:存储、高可用与数据同步
  • 如何从根源上理解并解决前端的CORS跨域问题
  • 【PSINS工具箱】MATLAB例程,二维平面上的组合导航,EKF融合速度、位置和IMU数据,4维观测量
  • Unreal Engine ClassName Rule