[Android6.0][RK3399] 雙屏異顯代碼實現流程分析(一)【轉】

來源:互聯網
上載者:User

標籤:版本   can   預設   amp   載入   記憶體池   rom   config   choice   

本文轉載自:http://blog.csdn.net/dearsq/article/details/55049182

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

 

    • 代碼流程
    • 代碼詳解
      • mipi dsi 介面資訊初始化
      • fb相關資訊讀取
      • timing 參數初始化
      • mipi dsi controller 初始化
      • lcdc控制器註冊

 

本文分為兩部分。 
《[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] 雙屏異顯代碼實現流程分析(一)【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.