注:文章都是通过阅读 Android && Linux 平台源码、各位前辈总结的资料、加上自己的思考分析总结出来的,其中难免有理不对的地方,欢迎大家批评指正。文章为个人学习、研究、欣赏之用。图文内容、源码整理自互联网,如有侵权,请联系删除(◕‿◕),转载请注明出处( ©Android @Linux @Rockchip版权所有),谢谢(๑乛◡乛๑) 、( ͡° ͜ʖ ͡°)、(ಡωಡ)!!!。
(==文章基于 Kernel-4.4==)&&(==文章基于 Android-8.1==)
【开发板 - Firefly-RK3399 7.85寸1024x768显示屏模组(MIPI接口)】
正是由于前人的分析和总结,帮助我节约了大量的时间和精力,特别感谢!!!
(1)【[RK3399][Android7.1] Uboot display 加载过程小结】
(2)【Connect to TS050 Touchscreen】
==源码(部分)==
U-boot
- I:\RK3399_Android8.1_MIPI\u-boot\drivers\video*
- I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\drm*
- I:\RK3399_Android8.1_MIPI\u-boot\arch\arm\lib\board.c
显示模块主要分 vop, dsi, panel三大模块,另加gpio, 背光的控制,另外还有logo的解析和加载。整个流程基本上就是解析各个模块参数,然后准备,使能各个模块。
(一)、MIPI屏幕配置
(1)、LCD使用
Firefly-RK3399开发板外置了两个LCD屏接口,一个是EDP,一个是MIPI,接口对应板子上的位置如下图,我们这里是mipi:
1.1、Config配置
以Android8.1配置MIPI屏为例,Firefly-RK3399默认的配置文件kernel/arch/arm64/configs/firefly_defconfig已经把LCD相关的配置设置好了,如果自己做了修改,请注意把以下配置加上:
CONFIG_LCD_MIPI=y
CONFIG_MIPI_DSI=y
CONFIG_RK32_MIPI_DSI=y
1.2、DTS配置
以rk3399-firefly-mipi.dt为例介绍:MIPI
1.2.1、使能对应显示设备节点
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
1.2.2、绑定 VOP
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
1.2.3、开机 logo
如果 uboot logo 未开启,那 kernel 阶段也无法显示开机 logo,只能等到 android 启动后才能看到显示。在 dts 里面将对应的 route 使能即可打开 uboot logo 支持,比如打开 hdmi 的uboot logo 显示:
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
1.2.4、绑定 PLL
rk3399 的 hdmi 所绑定的 vop 时钟需要挂载到 vpll 上,若是双显需将另一个 vop 时钟挂到cpll 这样可以分出任意 dclk 的频率。如当 hdmi 绑定到 vopb 时配置:
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
1.2.5、打开音频
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
1.2.6、配置Panel && timing
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
这里定义了LCD的电源控制引脚:
lcd_en:(GPIO1_A1)GPIO_ACTIVE_HIGH
lcd_en:(GPIO4_D5)GPIO_ACTIVE_HIGH
都是高电平有效。
Firefly-RK3399硬件文档原理图:
LCD的时序参数(timing),一般在屏的datasheet都可以找到,时序属性参考下图:
属性说明图:
1.2.7、MIPI-DPHY
1 | &mipi_dphy { |
Note:rk3288/rk3399没有该节点,不需要配置。
1.2.8、Command
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
说明:前3个字节(16进制),分别代表DataType,Delay,Payload Length。
从第四个字节开始的数据代表长度为Length的实际有效Payload。
panel-init-sequence 一条命令的解析如下:
Data Type:0x05(DCS Long Write)
Delay:0x20(32s)
Payload Length:0x01 (1 Bytes)
Payload:029
panel-init-sequence 后一条命令的解析如下:
Data Type:0x05(DCS Long Write)
Delay:0x96(150s)
Payload Length:0x01 (1 Bytes)
Payload:11
第一个字节代表的命令类型分两大类:DCS 命令和 Generic 命令。DCS 命令是有 mipi 标准协议里面指定的命令,具体可以参考《MIPI Alliance Specification for Display CommandSet.pdf 》。Generic 命令一般应用于厂商自定义的命令。具体使用哪种类型需要参考屏规格书或者咨询屏厂 FAE。如果没有特别指定,建议按 DCS 命令类型配置。DCS 命 令 的 类 型 有 三 种 : 0x05/0x15/0x39 。 Generic 命 令 的 类 型 分 为 :0x03/0x13/0x23/0x29。
1.2.9、背光 backlight
1 | I:\RK3399_Android8.1_MIPI\kernel\arch\arm64\boot\dts\rockchip\rk3399-firefly-mipi.dts |
pwms属性:配置PWM,MIPI屏使用的pwm输出是pwm1,25000ns是周期(40 KHz)。
(二)、U-boot Display 显示过程分析
首先看看全部Log:
1 | [09:50:13]zjj.sye.display board/rockchip/common/rkboot/fastboot.c board_fbt_preboot 474 |
(2)、U-boot Display 显示过程流程图
(三)、vop, dsi, panel三大模块init分析
3.1、panel模块init分析
3.1.1、rockchip_display_init()
1 |
|
3.1.2、rockchip_get_crtc()
此函数主要获取crtc(即VOP)寄存器相关信息
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_crtc.c |
我们这里compatible name是:
compatible name rockchip,rk3399-vop-big
所以具体的寄存器信息是:
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_crtc.c |
此处VOP的操作函数是:
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_vop.c |
VOP寄存器信息是:
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_crtc.c |
3.1.3、rockchip_get_connector()
compatible name rockchip,rk3399-mipi-dsi
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_connector.c |
此处DSI的操作函数是:
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
DSI寄存器信息是:
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
3.1.4、connector_panel_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
3.1.5、rockchip_get_panel()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_panel.c |
3.1.6、rockchip_panel_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_panel.c |
3.1.7、rk_pwm_bl_config()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_dsi_panel.c |
3.2、dsi模块init分析
3.2.1、rockchip_show_logo()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
3.2.2、load_bmp_logo()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
3.2.3、display_logo()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
3.2.4、display_init()
1 | static int display_init(struct display_state *state) |
3.2.5、rockchip_dw_mipi_dsi_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
3.2.6、display_get_timing()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
3.3、vop模块init分析
3.3.1、rockchip_vop_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_vop.c |
3.3.2、display_set_plane()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
(四)、vop, dsi, panel三大模块prepare分析
4.1、vop模块prepare分析
4.1.1、display_enable()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
4.1.2、connector_panel_power_prepare()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_display.c |
4.1.3、rockchip_vop_prepare()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_vop.c |
4.2、dsi模块prepare分析
4.2.1、rockchip_dw_mipi_dsi_prepare()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.2.2、dw_mipi_dsi_vop_routing()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.2.3、rockchip_dw_dsi_pre_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.2.4、rockchip_dw_dsi_controller_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.2.5、mipi_dphy_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.2.6、dw_mipi_dsi_phy_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.2.7、dw_mipi_dsi_set_mode()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
4.3、panel模块prepare分析
4.3.1、rockchip_panel_prepare()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_panel.c |
(五)、vop, dsi, panel三大模块enable分析
5.1、vop模块enable分析
5.1.1、rockchip_display_init()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_vop.c |
5.2、dsi模块enable分析
5.2.1、rockchip_dw_mipi_dsi_enable()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip-dw-mipi-dsi.c |
5.3、panel模块enable分析
5.3.1、rockchip_dw_mipi_dsi_enable()
1 | I:\RK3399_Android8.1_MIPI\u-boot\drivers\video\rockchip_dsi_panel.c |
(六)、参考资料(特别感谢):
(1)【[RK3399][Android7.1] Uboot display 加载过程小结】