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

时间:2024-03-30 08:01:50

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(Mipi) 加载流程分析
lcd_init() 
展讯平台 LCD(Mipi) 加载流程分析

u-boot/drivers/video/sprdfb/sprdfb_main.c: 
lcd_ctrl_init() 
展讯平台 LCD(Mipi) 加载流程分析
sprdfb_probe() 
展讯平台 LCD(Mipi) 加载流程分析
在 probe 中做了这样几件事: 
1. 设置背光(set_blacklight(0),在一开始向 PWM 寄存器中写 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 结构体: 
展讯平台 LCD(Mipi) 加载流程分析
在前面的 probe 中我们看到 最开始调用了回调函数 early_init 
展讯平台 LCD(Mipi) 加载流程分析
4. sprdfb_panel_probe() 
展讯平台 LCD(Mipi) 加载流程分析
先执行 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驱动

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

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

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接口