现在 3.10 以上的内核都是使用设备树的方式管理代码,所以就RK 3.10以上的代码都是修改 dts 下的配置的,我们3399 android 8.1的代码是 arm64 linux 4.4.126 内核版本,可以使用 make menuconfig来查看
我们介绍下修改地方是什么意思
- Mipi
1 打开 mipi 通道,并设置 mipi 每条lane 的速率
&dsi {
status = "okay";
rockchip,lane-rate = <1000>;
2 panel
panel {
compatible ="simple-panel-dsi"; // 默认
status = "okay";// 默认
reg = <0>;// 默认
power-supply = <&vcc3v3_sys>; //
backlight = <&backlight>; //可选
cmd_later_reset = <2>;
enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>; //
reset-gpios = <&gpio1 0 GPIO_ACTIVE_HIGH>; //
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_VIDEO_SYNC_PULSE)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
// bus-format = <MEDIA_BUS_FMT_RGB666_1X24>;
dsi,lanes = <4>; // mipi lane 数 看 sch
reset-delay-ms = <20>;// 时序参考屏datasheet
init-delay-ms = <20>;
enable-delay-ms = <120>;
prepare-delay-ms = <120>;
panel-init-sequence = [// 上电使用命令行就需要填写
05 78 01 11
15 00 02 E0 00 //都是 十六进制
//15 是短数据类型,要是数据是有十几个的话,就一般使用39 ,也有 13 23 29 等,很多的,一般使用 05 13 15 23 39
//00 表示上下两个命令数据需要延时0ms
//02 表示有多少个数据,要是03或者以上的话,15 就一般使用39
//E0 00 就是具体的数据
39 00 0A E1 93 E1 93 E1 93 E1 93 E1 93
15 00 02 E1 93
05 78 01 29
];
panel-exit-sequence = [// 断电使用命令
05 00 01 28
05 78 01 10
];
display-timings { //这里的参数参考datasheet
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <70000000>;
hactive = <800>;
vactive = <1280>;
hback-porch = <40>;
hfront-porch = <40>;
vback-porch = <22>;
vfront-porch = <16>;
hsync-len = <4>;
vsync-len = <2>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
}
Logo:
route_dsi: route-dsi {
status = "okay";
//status = "disabled";
logo,uboot = "logo.bmp";
logo,kernel = "logo_kernel.bmp";
logo,mode = "fullscreen";
charge_logo,mode = "center";
connect = <&vopb_out_dsi>;
};
- EDP
&edp {
status = "okay";
force-hpd;
ports {
port@1 {
reg = <1>;
edp_out: endpoint {
remote-endpoint = <&panel_in>;
};
};
};
};
Panel
panel {
compatible = "simple-panel";
backlight = <&backlight>;
power-supply = <&vcc3v3_sys>;
enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;
prepare-delay-ms = <20>;
enable-delay-ms = <20>;
reset = <&gpio1 0 GPIO_ACTIVE_HIGH>;
reset-delay-ms = <200>;
display-timings {
native-mode = <&timing1>;
timing0: timing0 {//EDP 13.3
clock-frequency = <150000000>;
hactive = <1920>;
vactive = <1080>;
hfront-porch = <12>;
hsync-len = <16>;
hback-porch = <48>;
vfront-porch = <8>;
vsync-len = <4>;
vback-porch = <8>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};
ports {
panel_in: endpoint {
remote-endpoint = <&edp_out>;
};
};
}
route_edp: route-edp {
status = "okay";
//status = "disabled";
logo,uboot = "logo.bmp";
logo,kernel = "logo_kernel.bmp";
logo,mode = "fullscreen";
charge_logo,mode = "center";
connect = <&vopb_out_edp>;
};
接着我们讲下 mipi 使用 cmd 命令行模式控制的,刚才也有讲到
命令行模式点亮显示屏
参考 百度网盘的 rk3399-urbetter-mipi.dts
RK3399 mipi相关驱动位置
drivers/gpu/drm/rockchip/dw-mipi-dsi.c
2. edp 屏详解 参考 rk3399-urbetter-edp.dts 或者 rgf_lcd_edp_1920_1080.dtsi
rk3399 edp 相关驱动
drivers/gpu/drm/rockchip/analogix_dp-rockchip.c
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
drivers/gpu/drm/bridge/analogix/analogix_dp_reg.c
时序修改
3. 由于显示屏种类繁多,现在在 ARM 平台使用的比较多的就是 MIPI 、EDP、LVDS 这几种,其中Mipi 就是有两种控制模式,只有 mipi的cmd模式才需要 命令行初始化的,剩下 MIPI的video、edp、lvds 都只需要上电后,修改分辨率和 合适的前后阶、时钟、时序就差不多可以点亮,之所以是差不多,是因为不排除一些平台有稍微的不一样的地方,不过整体的思路都是一样的
再看看另外两个 其他公司的开发板上面的显示屏接口
最后我们看看其他两份开发板原理图
分析sch
相信大家现在都知道大概是怎样点亮显示屏了!现在自己感觉把显示屏点亮步骤记下来,就4部分的分析
- 上电背光
- Lcd_en lcd _rst 脚是否控制正确
- 上电时序参数、分辨率
- 最后要是还不行,就通过串口看打印信息,看看驱动的打印有什么错误,再根据打印来分析驱动是否有问题,这个3399 基本很少会动的了,基本保障前3个步骤都正确,就可以点亮我们的显示屏!