[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 //后面步骤和上面相同

其他调用类似,可自行研究。

你可能感兴趣的:(RK3399,子类__Display)