展讯平台 LCD(Mipi) 加载流程分析

stage1 阶段的详细分析参见 uboot 详细注释讲解

我们从 uboot 的 stage2 开始分析。

加载流程分析

首先是完成硬件的初始化。

函数调用流程为:

u-boot64/arch/arm/board.c:

board_init_r()

u-boot64/common/stdio.c:

stdio_init()

u-boot64/common/lcd.c:

drv_lcd_init()

lcd_init()

u-boot/drivers/video/sprdfb/sprdfb_main.c:

lcd_ctrl_init()

sprdfb_probe()

在 probe 中做了这样几件事:

1. 设置背光(set_blacklight(0),但是实际上函数被注释掉了)

2. 配置 GPIO(214 和 167,所以应该去检查 214 和 167 分别是干什么的?)

3. 将 sprdfb_dispc_ctrl 赋值给 dev->ctrl,调用 sprdfb_dispc_ctrl 中的 early_init :

u-boot64/drivers/video/sprdfb/Sprdfb_dispc.c:

先看 sprdfb_dispc_ctrl 结构体:

在前面的 probe 中我们看到 最开始调用了回调函数 early_init

4. sprdfb_panel_probe()

先执行 panel 的准备工作(panel_mount)

在 panel_mount 里:

根据 lcd 的类型(mipi)选择对应正确的结构体类型(dev->if_ctrl = & sprdfb_mipi_ctrl)。

在这个里面进行读屏幕 id 的操作(adapt_panel_from_readid())

在 adapt_panel_from_readid 里:

进行 dev->panel->ops->panel_readid 的操作,调用驱动里的 readid 函数读取 lcd 寄存器中的 id。

并且将其与 panel_cfg 结构体中的 id 进行比较

如果正确的话,就进行驱动中 panel_init 的操作,

并且将 id 保存为静态全局变量,以传给 kernel,

且将 panel_spec 类型的结构体 panel_cfg 返回到 sprdfb_panel_probe 中去。

如果错误的话,就执行移除卸载 panel 的操作。

5. 对屏幕的参数(分辨率)进行初始化。

6. 将 lcd 存为静态全局变量。

7. 执行 ctrl 中的 sprdfb_dispc_init 初始化函数。

在 u-boot64/drivers/video/sprdfb/Sprdfb_dispc.c 中的 init 函数 sprdfb_dispc_init 中,设置初始背景颜色等。

至此,完成了 LCD 的加载。

代码结构分析

sprdfb_main.c —- 与fbmem.c构成Framebuffer驱动

sprdfb_panel.c —- Ctrl到I/F驱动和panel驱动的桥接器

sprdfb_mipi.c —- Mipi接口驱动及为其提供操作接口的DSI驱动

sprdfb_dispc.c —– DispC驱动

MIPI 接口工作模式介绍

DSI(VideoMode)视频模式.

这种工作模式与传统RGB接口相似,主机需要持续刷新显示器。由于不使用专用的数据信号传输同步信息,控制信号和RGB数据是以报文的形式通过MIPI总线传输的。因为主机需要定期刷新显示器,显示器就不需要帧缓冲器。带RAM的屏一般比不带RAM的屏要贵一些,对于一些控制成本的方案,选择屏供应商需要格外关注这个!

DCS(Command mode)命令模式

MIPI总线控制器使用显示命令报文来向显示器发送像素数据流。显示器应该有一个全帧长的帧缓冲器来存储所有的像素数据。一旦数据被放在显示器的帧缓冲器中,定时控制器就从帧缓冲器中取出数据,并自动把它们显示在屏幕上。MIPI总线控制器不需要定期刷新显示器。

两种模式的优缺点

在成本和功耗方面,每个工作模式都有优点和缺点。视频模式显示架构无须帧缓冲器。然而,主机定期以高速模式发送DSI视频报文却消耗了大量的平均能量。

在理想情况,当显示内容不改变时(或不经常改变时),显示系统的中央处理器就应该切换到低功耗模式,而处理器和显示器之间的链路会在需要的时候激活。由于主机定期刷新的需要,部分中央处理器和存储器接口也需要保持激活状态,这可以使系统不会达到最好的功率预算。

另一方面,命令模式显示架构允许显示器直接对整个帧缓冲器进行自刷新。然而,在显示器中集成全帧长帧缓冲器总是需要成本的,特别是今天的大多数用户所需求的高分辨率显示器。这就要求接口芯片有更大的管芯尺寸。显示器制造商也不得不为每种显示分辨率提供具有特定容量帧缓冲器的显示控制器。

对于视频模式和命令模式显示架构,通常都需要对显示控制器的寄存器编程来设置相应的显示分辨率、外观比率和工作模式。MIPI并不定义任何标准协议来访问这些内部寄存器,因此,不同的显示器制造商可以定制自己专用的命令集。

在展讯平台上点亮MIPI接口屏正常显示需要满足以下几条:

1:确认Lcd的驱动文件被正常编译编译进去,并且lcd 和board name里面注册一致。

2. 必须保证数据能够正确的传输到屏上,一般在读取ic 的id和初始化设置指令时,都是在mipi的低速(lp)模式下,在初始化完成后,需要切换到高速(hp)状态下,才能正常的显示!

3. 必须保证ic设置的proch和timing,通道,速率正确,屏才可以正常的显示,一般显示出现花屏,显示偏移等问题,通常情况下,就是因为你设置的某些参数不正确,导致显示异常!

4:仔细检查上电同时测量,对于mipi和需要下code的RGB panel需要RST高低高操作,这样code才生效。注意一般sleep out(0x11)和display on(0x29)之间需要mdelay(120)左右,貌似这个对于大部分panel是必须的。如果这部分延时不够,会导致屏在进出睡眠或者显示过程中出现白屏,无法正常的显示!

5:最后还要确认是否有framebuffer输出,要是改动了display这块的clk很有可能没有buffer输出的,可以通过cat

/dev/graphyics/fb0查看有没有输出字符。

注:一般wvga以及更高分辨率的陪你过通常采用2 line甚至更高的通道数,hvga及以下分辨率的屏则通常采用单通道的mipi接口

时间: 2024-12-24 06:26:33

展讯平台 LCD(Mipi) 加载流程分析的相关文章

展讯平台 LCD(Mipi)移植步骤及问题归纳

原创文章,原文地址:http://blog.csdn.net/dearsq/article/details/51210703 欢迎转载,转载请保留地址! PortingGuide Backlight 背光的硬件设计有两种情况: 1. 内置并联背光 2. 外置串联背光 对于 1 的情况,步骤如下: 1.移植对应的 lcd 驱动. 2.设置u-boot\drivers\video\sprdfb\sprdfb_main.c中的背光为内置: void set_backlight(uint32_t val

展讯sc7731 LCD驱动简明笔记之二

此篇笔记基于sc7731 - android 5.1,对lcd的framebuffer做一个简明笔记. 一共分为两大部分:第一部分,关于LCD的硬件方面的:第二部分,关于lcd核心处理(framebuffer)部分的. 第一部分,LCD硬件相关的 一.液晶 液晶是一种高分子有机材料.当给它加上直流电场后,原本有序的分子排列被打乱,一部分液晶变得不透明,颜色加深,便因此显示出字符和图形. 液晶的光电效应:干涉.散射.衍射.旋光.吸收等. 二.LCD种类 1. 构造: 使用两块玻璃板夹着一块液晶:一

WebKit加载流程 - 概述

之前写了几篇加载流程的说明,是从下向上看,有点只见树木不见森林的感觉.经过最近一段时间的学习,有了能加以概括抽象的方法. WebKit加载流程和页面组成是直接相关的,页面就是WebKit要加载的对象.所以WebKit负责加载的类也与负责页面管理的类相对应.Apple关于WebView的说明里清楚表现了页面视图上的MVC结构: 一个页面从元素上也有其层次结构,并且和加载类对应,如下: 从页面元素上讲WebView代表了一个页面的呈现,对应一个Page. 一个Page包含一个或多个Frame,其中一

webkit 子资源加载流程

一个网页由主文档和子资源组成.主文档描述网页的框架,布局.子资源是组成网页的子元素,包括图片.CSS.JS等.为了显示网页,先要把资源加载到内存.加载就是指把需要的资源加载到内存这一过程.Webkit用到很多缓存机制,加载可能是从网络加载,也可能是从本地缓存加载.Webkit的加载分为两条线,一条是主文档的加载,一条是子资源的加载. 首先需要解析主文档才知道用到哪些子资源.但并不一定要等到解析完主文档才加载子资源,也可能是边解析边加载子资源,即受到部分主文档就开始解析,解析到某个子资源就开始加载

Android5.1图库Gallery2代码分析数据加载流程

图片数据加载流程. Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->PhotoPage 相册集                        照片集                 某张图片 1,AlbumSetPage.java private void initializeData(Bundle data) { String mediaPath = data.getString(A

kettle插件加载流程

kettle插件加载流程 1.前言 kettle遵循着插件机制,基于插件使得kettle整个结构非常清晰,耦合性低,移植性强,特别是对kettle进行二次开发尤其方便,根据个人了解,扩展step类型的插件比较多,具体步骤可以参考:http://blog.csdn.net/d6619309/article/details/50020977  .通过了解插件的加载流程,不仅kettle的原理有深一层的认识,还有助于在进行二次开发遇到问题的时候进行定位(例如,最近遇到个情况就是通过kettle api

android源码解析(十七)-->Activity布局加载流程

好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与android中另外一个很重要的组件Service最大的不同,但是这个展示的界面的功能是Activity直接控制的么?界面的布局文件是如何加载到内存并被Activity管理的?android中的View是一个怎样的概念?加载到内存中的布局文件是如何绘制出来的? 要想回答这些问题,我们就需要对android的界面加载与绘制流程有所了解,这里我们先来学习一下Act

spring IOC加载流程

看了网上.书上很多对于spring IOC容器加载过程的分析.大多都只是粗略的讲一下加载流程.其实这样也不错,简单粗暴.清晰记得之前和一个前辈交流时他说的一句话:什么设计模式.设计框架都是扯淡,能实现这个功能就是最好的.其实这样的说法是话走偏锋的,为什么要有各种框架.设计模式,主要还是因为没有它们不能够很好的实现功能.就比如说IOC容器加载中常用的FileSystemXmlApplicationContext,这个类到最顶层的BeanFactory接口,之间有8层集成实现关系.为什么只需要一个类

Android之SystemUI加载流程和NavigationBar的分析

Android之SystemUI加载流程和NavigationBar的分析 本篇只分析SystemUI的加载过程和SystemUI的其中的一个模块StatusBar的小模块NavigationBar,以Android6.0代码进行分析 AndroidManifest.xml <application android:name=".SystemUIApplication" android:persistent="true" android:allowClearU