[RK3399][Android7.1] Uboot display 加载过程小结

OS: Android 7.1
Board: Firefly-RK3399
Uboot: v2017.02

显示模块主要分 vop, edp, panel三大模块,另加gpio, 背光的控制,另外还有logo的解析和加载。整个流程基本上就是解析各个模块参数,然后准备,使能各个模块。



fdt_path_offset(gd->fdt_blob, "/display-subsystem"); //找到display-subsystem这个noded,在rk3399-android.dtsi中指定为有效。
rockchip_display_init ->
  fdt_path_offset(blob, "/display-subsystem/route"); //寻找route node.
  fdt_device_is_available //查看route是否是okay的
  init_display_buffer //获取fb地址
  fdt_for_each_subnode //依次解析route下的子节点,当前用的edp,所以只解析route_edp节点。
  fdt_node_offset_by_phandle //获取connect node.
  find_crtc_node//获取对应的ctrl node.
  rockchip_get_crtc  //根据ctrl node从g_crtc数组中找到具体的元素,这里compatible是"rockchip,rk3399-vop-big",在rk3399.dtsi中定义
  find_connector_node //获取对应的connector node
  rockchip_get_connector //根据connector node从g_connector数组中找到具体的元素,这里compatible是"rockchip,rk3399-edp",在rk3399.dtsi中定义
  malloc(sizeof(*s)); //display相关信息都放在struct display_state *s中
  fdt_get_string(blob, child, "logo,uboot", &s->ulogo_name);    //分别获取uboot/kernel中的logo name以及模式
  fdt_get_string(blob, child, "logo,kernel", &s->klogo_name);
  fdt_get_string(blob, child, "logo,mode", &name);
  connector_phy_init //无phy node,3368平台需要配置。
  connector_panel_init ->
    get_panel_node //获取edp panel node
    rockchip_get_panel //根据panel node从g_panel数组中找到具体型号panel,因此要添加一块新panel,那么对应timing信息需要添加到此数组中
    connector_pclist_parse_dt //解析电源控制节点power_ctr,即lcd的enable以及reset gpio.
    rockchip_panel_init ->
      panel->funcs->init ->
        panel_simple_init ->
          panel_simple_parse_dt ->  //此函数参数解析针对mipi屏,这块可忽略
            gpio_direction_output(enable_gpio->gpio, !!(enable_gpio->flags & OF_GPIO_ACTIVE_LOW)); //初始化之前先关屏
            rk_pwm_bl_config(0); //关背光
rockchip_show_logo ->
  display_logo ->
   conn_funcs->init -> funcs 是 rockchip_analogix_dp_funcs
     rockchip_analogix_dp_init -> rockchip_analogix_dp.c 初始化edp控制器
     conn_funcs->detect //空函数
     conn_funcs->get_timing //空函数
     display_get_timing ->
       get_panel_node //获取edp panel node,在rk3399-firelfy-edp.dts中定义
       display_get_timing_from_dts //从dts中获取timing,项目中没定义
       rockchip_get_display_mode_from_panel //直接从g_panel数组中获取对应的timing值
       rockchip_panel_prepare ->
         panel->funcs->prepare -> funcs: panel_simple_funcs
           panel_simple_prepare
             fdtdec_set_gpio //enable gpio
     crtc_funcs->init -> g_crtc数组中的rockchip_vop_funcs
       rockchip_vop_init //vop初始化
   display_set_plane //设置vop
   display_enable ->
     connector_panel_power_prepare //设置电源相关gpio
     crtc_funcs->prepare ->
       rockchip_vop_prepare //空函数
     conn_funcs->prepare ->
       rockchip_analogix_dp_prepare //设置dp模块
     rockchip_panel_prepare ->
       panel->funcs->prepare ->
         panel_simple_prepare //前面重复做过设置了
     crtc_funcs->enable -> 
       rockchip_vop_enable //enable vop
     conn_funcs->enable ->
       rockchip_analogix_dp_enable //enable dp
     rockchip_panel_enable ->
       panel_simple_enable ->
         rk_pwm_bl_config(-1) //开启背光

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