最近刚调试了基于rk3128平台的lcd驱动,顺便记录总结一下,有不足之处,望各位不吝赐教!
关于framebuffer(帧缓冲设备)的架构这里就不多罗嗦了,不会的可以去网上百度,这个很多的
1.代码架构
drivers/video/rockchip/transmitter/
|_ rk32_mipi_dsi.c /* MIPI 驱动主体文件 */
|_ rk32_mipi_dsi.h /* 寄存器以及结构体的定义 */
|_ mipi_dsi.c /* 封装的函数指针接口函数, 供 lcd_mipi.c 调用, 函数的具体实现
在 rk32_mipi_dsi.c 中 */
|_ mipi_dsi.h /* mipi 协议相关的宏定义以及函数指针结构体定义 */
drivers/video/rockchip/screen/
|_ lcd_mipi.c /* 屏参 dtsi 文件的解析 */
由于rk3128平台使用了3.10以后的内核,所以采用了dts的形式来管理驱动,刚开始的时候会觉得不顺手,用多了还是相当方便的
2.代码架构图
无论是正常的开机流程以及休眠唤醒的流程,显示相关的模块都是要和 fb 以及
vop(lcdc)交互的。rk32_dsi_enable()和 rk32_dsi_disable()函数作为 MIPI 和 vop 之
间 的 交 互 的 总 入 口 函 数 。 另 外 还 有 一 对 rk32_mipi_power_up_DDR() 和
rk32_mipi_power_down_DDR()函数是单独供 ddr 变频的时候使用,
正常的开机以及休
眠唤醒流程不走这两个函数。开机流程图如下图所示:
dsi_init() : 该函数主要实现 mipi host 和 phy 的上电以及初始化工作。
rk_mipi_screen_standby() : 屏的供电以及屏的初始化工作(屏初始化命令的发送)
dsi_enable_video_mode() : command 模式和 video 模式的切换,发送命令一般是在 command 模式下,正常数据传输是在 video 模下。
dsi_is_enable() : mipi host 的关闭与开启。
3.移植过程
a.配置menuconfig
b.添加关于lcd的dtsi文件(屏参文件)
在kernel/arch/arm/boot/dts中随便找一个其他mipi屏的dtsi文件参考其写法(3.10内核的新变化,也可以不用)
屏参文件包含四个部分:mipi host 配置、屏电源控制配置、屏初始化序列和屏参。
b.1 mipi host的配置
disp_mipi_init: mipi_dsi_init{
compatible = "rockchip,mipi_dsi_init";
rockchip,screen_init = <1>;