本文转载自:http://blog.csdn.net/dearsq/article/details/55049182

Platform: RK3399 
OS: Android 6.0 
Version: v2016.08

本文分为两部分。 
[RK3399] 双屏异显代码实现流程分析(一)》为分析 RK video 部分标准的代码(base on 2017.2.13 updated) 
[RK3399] 双屏异显代码实现流程分析(二)》为打上双屏异显 patch 后的代码流程分析(eDP + mipi)

代码流程

参考 KrisFei 大神总结的 3288 display 模块加载流程。 
http://blog.csdn.net/kris_fei/article/details/52584903 
KrisFei 归纳的代码流程如下:

  1. mipi dsi 接口信息初始化
  2. fb相关信息读取
  3. timing参数初始化
  4. mipi dsi controller初始化
  5. lcdc控制器注册

代码详解

在 RK3399 上代码没有太大的变化。下面为 display 部分的标准流程。

在 make menuconfig 配置的时候 
Location: 
| -> Device Drivers 
| -> Graphics support 
| -> Rockchip Misc Video driver 
| -> LCD Panel Select ( [=y]) 
drivers/video/rockchip/screen/Kconfig

choice 包括 General lcd panel 和 rk mipi dsi lcd 
差别是

    < # CONFIG_LCD_GENERAL is not set
< CONFIG_LCD_MIPI=y
---
> CONFIG_LCD_GENERAL=y
> # CONFIG_LCD_MIPI is not set
  • 1
  • 2
  • 3
  • 4
  • 5

分别对应的驱动文件是 
lcd_general.c 
lcd_mipi.c

现在的版本(2017.2.13)中,lcd_general.c 还未实现代码。 
所以我们从分析默认的 lcd_mipi.c 开始。

mipi dsi 接口信息初始化

lcd_mipi.c 
rk_mipi_screen_init -> 
——platform_driver_probe -> //name是rk_mipi_screen 
————rk_mipi_screen_probe -> 
——————rk_mipi_screen_init_dt 
——————//读取mipi信息(包括 screen_init),dsi_lane,dsi_hs_clk,mipi_dsi_num, power, rst, gpio, 屏幕的 timing 信息(包括 sceen on cmds, cmd_type, cmd_delay, cmd_debug)

fb相关信息读取

rk_fb_init -> rk_fb.c 
——platform_driver_register -> //name: “rockchip,rk-fb” 
————rk_fb_probe -> //获取disp-mode, u-boot-logo-on等参数。 
——————rockchip_ion_client_create //创建ion client。

/* ION与PMEM类似,管理一或多个内存池,其中有一些会在boot time的时候预先分配,以备给特殊的硬件使用(GPU,显示控制器等)。它通过ION heaps来管理这些pool。它可以被userspace的process之间或者内核中的模块之间进行内存共享。*/

timing 参数初始化

//不管是那种接口类型的lcd,lcd的时序参数都是要读取的。 
rk_screen_init -> rk_screen.c 
——platform_driver_register -> //name: “rk-screen” 
————rk_screen_probe -> 
——————rk_fb_prase_timing_dt -> rk_fb.c //读取来的配置存在结构体 rk_screen 变量中 
————————of_get_display_timing //获取时序参数,dts中可以配置多组,这里会循环读取。 
————————display_timings_get //根据当前native-mode来选取当前使用哪组时序参数。 
————————rk_fb_video_mode_from_timing //把 timing转换到fb video mode中去供后续使用。

mipi dsi controller 初始化

//如果是另外的接口那就调用相应的接口控制器驱动来初始化. 
rk32_mipi_dsi_init -> rk32_mipi_dsi.c 
——platform_driver_register -> //name: “rk32-mipi” 
————rk32_mipi_dsi_probe -> //初始化struct dsi结构,包括clock, dsi ops, rk_screen 传递过来的参数, 
——————rk_fb_get_prmry_screen -> rk_screen.c //获取在之前 rk_screen_probe() 中初始化的rk_screen变量. 
————————//rk_mipi_dsi_probe -> //这个在 3399 代码中没有了 
————————register_dsi_ops //dsi->ops给dsi_ops 
————————//dsi_probe_current_chip //检测dsi chip是否存在,这个在 3399 的代码中没有了 
————————rk_fb_trsm_ops_register //注册trsm_mipi_ops为trsm_dsi_ops

这里 3288 中的 rk_mipi_dsi_probe 在 3399 中被删掉了 
直接在 rk_fb_get_prmry_screen 中 register_dsi_ops,也省略掉了 dsi_probe_current_chip

lcdc控制器注册

rk3368_lcdc_module_init -> rk3368_lcdc.c 
——platform_driver_register -> //.name = “rk3368-lcdc”, 
————rk3368_lcdc_probe -> 
——————of_property_read_u32(np, “rockchip,prop”, &prop); 
——————//判断屏幕是 primary 还是 extend,如果是 extend 会延后 register 
——————rk3368_lcdc_parse_dt //读取lcdc控制器的参数 
——————dev_drv->ops = &lcdc_drv_ops; //lcdc对应ops 
——————devm_request_irq //lcdc对应irq是rk3368_lcdc_isr() 
——————rk_fb_register -> //对应ops是lcdc_drv_ops 
————————rk_fb->lcdc_dev_drv[i] = dev_drv; //根据 RK30_MAX_LCDC_SUPPORT,循环注册两组 lcdc_dev_drv 
————————init_lcdc_device_driver -> //初始化 lcdc_device_driver 
——————————init_lcdc_win //一个lcdc能支持4层win. 
——————————rk_disp_pwr_ctr_parse_dt //解析lcdc power ctrl相关内容。 
——————————rk_fb_set_prmry_screen 
——————————rk_fb_trsm_ops_get //根据不同的屏幕类型选择对应的ops. 
————————framebuffer_alloc //系统根据 win 的多少来创建相应数量的 fb 
————————fb_videomode_to_var //将 fb_videomode 转化为 fb_var_screeninfo 
————————dsp_mode == ONE_VOP_DUAL_MIPI_VER_SCAN 
————————//判断双屏同显的刷新方式,这里如果是垂直刷新的话 
————————//设置 fbi->var.xres /= 2;fbi->var.yres = 2; fbi->var.xres_virtual /= 2; fbi->var.yres_virtual = 2; 
————————fbi->fbops = &fb_ops; //fb ops 
————————rkfb_create_sysfs //生成到/dev/graphics/fbx/下 
————————register_framebuffer 
————————rkfb_create_sysfs 
————————//以下 code 只跑一次 
————————kthread_run //创建rk_fb_wait_for_vsync_thread 
————————dev_drv->ops->post_dspbuf //show logo for primary display device

[Android6.0][RK3399] 双屏异显代码实现流程分析(一)【转】的更多相关文章

  1. [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】

    本文转载自:http://blog.csdn.net/dearsq/article/details/55050125 Patch Code dtsi rk3399-androiddtsi rk3399 ...

  2. RK3288 6.0 双屏异显,横屏+竖屏【转】

    本文转载自:http://blog.csdn.net/clx44551/article/details/78215730?locationNum=8&fps=1 RK3288 6.0 双屏异显 ...

  3. Android6.0以上关于RecyclerView显是不全的问题

    Android6.0以上关于RecyclerView显是不全的问题 需求描述 适配的时候发现Android 6.0以上,RecyclerView显示不全,以下是没有问题的.这个时候查看布局文件,可以看 ...

  4. RK3288 增加双屏异显 eDP+LVDS

    CPU:RK3288 系统:Android 5.1 下面是官方文档中的信息. 1.rk3288 支持的显示接口可以任意组合. 2.双屏异显时,一个显示接口当主屏,另一个当副屏:主副屏由板级 dts 文 ...

  5. iTOP-4418/6818开发板支持双屏异显,双屏同显

    iTOP-4418/6818开发板平台安卓系统下支持双屏异显,双屏同显,客户可按照不同用途,分别播放适合屏幕显示方式的内容 ,如HDMI屏幕和LCD屏幕显示不同内容, 一个屏幕播放广告,另一个屏幕运行 ...

  6. 【ARM开发板】迅为IMX6开发板QT下LVDS和HDMI双屏异显

    本文转自迅为论坛:http://www.topeetboard.com 平台:迅为-IMX6开发板 首先开发板分别连接9.7寸屏和HDMI显示器,然后使用MfgTool工具烧写QT系统,然后拨码开关设 ...

  7. Rk3288 双屏异显单触摸

    系统版本:RK3288 android 5.1 设备同时有两个lcd,主屏是mipi接口,带有触摸屏,触摸屏是usb接口,副屏是hdmi接口,没有触摸屏,正常情况下,两个lcd显示相同内容,触摸屏一切 ...

  8. RK3288 双屏异显,两屏默认方向不一致

    CPU:RK3288 系统:Android 5.1 RK3288 支持双屏异显,一般都会同方向显示,如果遇到两个 lcd 的默认方向不一致,只需修改下面参数即可. 例如:主屏为mipi接口,分辨率为 ...

  9. RK3288 双屏异显时,触摸屏(USB接口)无反应

    系统版本:RK3288 android 5.1 设备同时有两个lcd,主屏是mipi接口,带有触摸屏,触摸屏是usb接口,副屏是hdmi接口,没有触摸屏,正常情况下,两个lcd显示相同内容,触摸屏一切 ...

随机推荐

  1. [Luogu] P1131 [ZJOI2007]时态同步

    题目描述 题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3…进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何 ...

  2. [Luogu] P4910 帕秋莉的手环

    题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...

  3. MYSQL有那些优化?

    版权声明:本文为博主转载文章,原博主地址: https://blog.csdn.net/u013087513/article/details/77899412 MySQL优化三大方向 ① 优化MySQ ...

  4. c++基础_回文数

    #include <iostream> using namespace std; int main(){ ;i<;i++){ ; int n=i;//暂存该四位数来计算 ,以防改变i ...

  5. UVa 12333 - Revenge of Fibonacci manweifc(模拟加法竖式 & 字典树)

    题意: 给定n个(n<=40)数字, 求100000个以内有没有前面n个数字符合给定的数字的fibonacci项, 如果有, 给出最小的fibonacci项, 如果没有, 输出-1. 分析: 可 ...

  6. EGit应用

    [创建Dynamic Web Project项目] [创建仓库] 项目(鼠标右键) ==〉Team==〉Share Project..... ==〉选择Git 配置Repository的目录 创建完成 ...

  7. 九度oj 题目1062:分段函数

    题目1062:分段函数 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3874 解决:2278 题目描述: 编写程序,计算下列分段函数y=f(x)的值.y=-x+2.5; 0<=x& ...

  8. MTK平台添加防止误触代码

    ltr559_old: #include <linux/interrupt.h> #include <linux/i2c.h> #include <linux/slab. ...

  9. MVC Ajax.BeginForm重复提交解决方法

    mvc使用MVC Ajax.BeginForm提交的时候有重复提交结果的时候检查相关js文件引用情况, 其中mvc4注意 1 2 3 4 @Scripts.Render("~/bundles ...

  10. [NOIP2007] 提高组 洛谷P1005 矩阵取数游戏

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...