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

本文转载自: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

时间: 2024-10-17 02:02:02

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

围观迅为IMX6开发板QT下LVDS和HDMI如何双屏异显的

首先将迅为-IMX6开发板分别连接9.7寸屏和HDMI显示器 然后使用MfgTool工具烧写QT系统 然后拨码开关设置成从emmc启动 在uboot命令行下设置开发板为9.7寸屏显示(这样也会同时设置HDMI) 设置完,保存配置,如下图: 然后设置启动QT系统,并保存设置,如下图: 然后开发板重新启动,可以看到默认9.7寸屏显示qt的触摸校准程序了,点击屏幕校准,最后会在9.7寸屏上运行QT的demo程序.HDMI显示通道默认是关闭的,在串口命令行下输入命令"echo 0 > /sys/c

iTOP-iMX6开发板Android系统下LVDS和HDMI双屏异显方法

迅为iMX6 开发板 android 系统下 LVDS 和 HDMI 双屏异显的使用过程. 使用"Mfgtools-Rel-1.1.0_180403_MX6Q_UPDATER"版本的烧写工具,把系统烧写进开发板.系统启动之后,把".mp4"格式的视频文件放到"/sdcard"目录下,如下图所示. 然后打开系统自带的"HdmiDualVideo"应用程序.如下图. 在 lvds 屏幕上显示如下图所示. 点击"Small

Android 双屏异显

android双屏是克隆模式,如果要在第二屏幕显示不同内容,需要自定义一个Presentation类 1.先设置权限 (刚开始折腾很久没有效果,后来发现是没设置权限) <!-- 显示系统窗口权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- 在 屏幕最顶部显示addview--> <uses-permission android

Android 双屏异显的实现

先说重点 <!-- 显示系统窗口权限 --> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <!-- 在 屏幕最顶部显示addview--> <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" /> 注意权限,开始没注意,代码写

android6.0权限管理工具EasyPermissionUtil

前言 android6.0開始,权限的申请发生了改变,申请变的动态化,也就是执行时权限,和iOS相仿,动态化的意思是指,在每次使用须要危急权限的方法的时候.须要检查程序是否获得了该权限的许可.动态化的权限申请能够让用户更加清晰的知道程序须要什么权限.以及程序中哪些地方的操作须要涉及用户安全. 不再是只在程序安装的时候,一次性把所须要的普通的.危急级别的权限一次性列出来.然后展示给用户. 当project项目的target Sdk为23时,因为考虑到用户假设没有进行权限的动态检查,那么在执行到须要

Android6.0使用BaiDu地图SDK动态获取定位权限

1.报错原因: 在集成百度地图SDK的时候在手机上无法定位,检查没有任何错误,最后通过搜索才知道是Android版本为6.0的问题,这是因为在Android6.0采用了运行时权限(RuntimePermissions),Android6.0的权限一般分为两种,一种时普通权限,可以直接获取,其它的运行时权限,需要提示用户手动同意之后,才能获取. 失败的原因就是,小米手机MIUI是Android6.0.1,如果不加动态获取权限的代码,是不会提示的,没有得到权限,当然无法定位. 2.解决代码: pri

Android6.0获取权限

照着<第一行代码>打代码,然并卵,感叹技术进步的神速.最后提醒一点:IT类的书籍一定要注意出版时间!出版时间!出版时间!重要的事情说三遍 问题出在android6.0的权限获取问题上,以前只要在Manifest.xml一次性获取便可以了,android6.0之后要手动去获得运行时权限才行. 1. 新增的api ContextCompact.checkSelfPermission()--->检查是否有权限 ActivityCompat.requestPermission()--->去

Android6.0运行时权限管理

自从Android6.0发布以来,在权限上做出了很大的变动,不再是之前的只要在manifest设置就可以任意获取权限,而是更加的注重用户的隐私和体验,不会再强迫用户因拒绝不该拥有的权限而导致的无法安装的事情,也不会再不征求用户授权的情况下,就可以任意的访问用户隐私,而且即使在授权之后也可以及时的更改权限.这就是6.0版本做出的更拥护和注重用户的一大体现. 一.认知 今天我们就来学习下Android6.0的权限管理. Android6.0系统把权限分为两个级别: 一个是Normal Permiss

Ubuntu虚拟机编译Android6.0总结

1 前言 昨天使用清华的源下载了android 6.0的源码,校园网可以达到10M的速度,爽!今天一大早就迫不及待地准备编译一个模拟器版本,看看效果,哪知竟然耗费了一整天的时间才搞定...为了避免其他人在同样的问题上浪费时间,特记录整个编译过程中遇到的问题和解决方案,毕竟时间就是金钱! 2 背景 我是在MAC上安装的ubuntu14.04 64bit系统,起初分配了3G的内存(血的教训,完全不够用!),和两个核心.编译的系统版本为6.0.1_r9和6.0.0_r26 3 编译过程遇到的问题和解决