[RK3399][Android7.1] Display中的edp驅動呼叫流程
阿新 • • 發佈:2019-01-02
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 //後面步驟和上面相同
其他呼叫類似,可自行研究。