1. 程式人生 > >[RK3399][Android7.1] Display中的edp驅動呼叫流程

[RK3399][Android7.1] Display中的edp驅動呼叫流程

OS: Android 7.1
Board: Firefly-RK3399
Kernel: v4.4.55

edp驅動被分成兩個檔案,一個是rk驅動檔案: analogix_dp-rockchip.c, 另一個是drm驅動檔案analogix_dp_core.c

rockchip_dp_bind -> analogix_dp-rockchip.c
  of_graph_get_port_by_id(dev->of_node, 1); //注意第二個引數,配置位於rk3399- firefly-edp.dts中的edp node中
  of_get_child_by_name(port, "endpoint"
); //獲取subnode of_graph_get_remote_port_parent(endpoint) //獲取remote-endpoint的parent node,也就是值為edp_out_panel的parent, 即edp_panel node. of_drm_find_panel(panel_node); //從panel_list中查詢是否有edp_panel這個node, panel_list在panel-simple.c的drm_panel_init()新增 rockchip_dp_init //初始化clk以及grf rockchip_dp_drm_create_encoder ->
//建立encoder drm_of_find_possible_crtcs //找到crtcs,即vops drm_encoder_init //encoder資訊新增到drm device中去管理,encoder_funcs為rockchip_dp_encoder_funcs analogix_dp_bind -> devm_phy_get phy_power_on drm_panel_prepare -> panel->funcs->prepare -> //呼叫的是panel-simple.c中的panel_simple_funcs
panel_simple_prepare -> //配置lcd的gpio, power analogix_dp_create_bridge -> drm_bridge_attach -> bridge->funcs->attach -> //呼叫的drm_bridge_funcs是analogix_dp_bridge_funcs analogix_dp_bridge_attach -> drm_connector_init //初始化connnector drm_mode_connector_attach_encoder //把connector新增到encoder上去 drm_panel_attach //把panel和drm device以及connector關聯起來

可以看到,驅動裡有很多回調函式,類似於ALSA那樣,DRM也會一級級地從逐個調取回調函式,例如下面的get_modes例子,
系統在開機初始化的時候會有如下呼叫:

rockchip_drm_bind -> Rockchip_drm_fbdev.c
  rockchip_drm_fbdev_init -> 
    drm_fb_helper_initial_config ->
      drm_fb_helper_probe_connector_modes
        connector->funcs->fill_modes ->
          drm_helper_probe_single_connector_modes -> analogix_dp_core.c
            drm_helper_probe_single_connector_modes_merge_bits ->
              (*connector_funcs->get_modes)(connector); ->
                analogix_dp_get_modes -> Analogix_dp_core.c
                  drm_panel_get_modes -> 
                    panel->funcs->get_modes ->  //panel的回撥
                      panel_simple_get_modes panel-simple.c
                  dp->plat_data->get_modes-> //edp回撥
                    rockchip_dp_get_modes Analogix_dp-rockchip.c 

另外HAL層在獲取connector時也會呼叫,作為drm ioctl呼叫的一個例子:

DrmResources::Init -> DrmResources.cpp
  drmModeGetConnector ->
    _drmModeGetConnector ->
      drmIoctl -> //cmd:DRM_IOCTL_MODE_GETCONNECTOR
       ioctl ->
         do_vfs_ioctl ->
           drm_ioctl ->
             drm_mode_getconnector ->
               connector->funcs->fill_modes //後面步驟和上面相同

其他呼叫類似,可自行研究。