[RK3399][Android7.1] Display中的edp驱动调用流程
Posted KrisFei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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][Android7.1] Display中的edp驱动调用流程的主要内容,如果未能解决你的问题,请参考以下文章
[RK3399][Android7.1] 调试笔记 --- 制作update.img时提示参数错误
RK3399平台开发系列讲解(电源管理篇)11.8runtime PM