内容和参考
内容
参考
系统框架
软件流程
软件代码
设备树配置
参考文档:Documentation/devicetree/bindings/display/arm,malidp.txt
编译选项
mali-dp-y := malidp_drv.o malidp_hw.o malidp_planes.o malidp_crtc.o
mali-dp-y += malidp_mw.o
代码流程
malidp软件框架
malidp初始化流程
malidp_bind // component 组件的master
// 1. 分配私有数据结构体
malidp = devm_kzalloc(dev, sizeof(*malidp), GFP_KERNEL);
hwdev = devm_kzalloc(dev, sizeof(*hwdev), GFP_KERNEL);
// 2. (重点)根据设备树匹配相应的硬件 platform data数据信息 ; malidp_drm_of_match 里边的 .data = &malidp_device[MALIDP_550]
hwdev->hw = (struct malidp_hw *)of_device_get_match_data(dev);
// 可选:获取reserved内存 作为framebuffer
of_reserved_mem_device_init(dev);
// 3. drm框架-分配drm_device
drm_dev_alloc(&malidp_driver, dev);
// 检测 寄存器空间大小 resouce_size 是否够用
malidp_has_sufficient_address_space(res, dev_id)
// 4. 硬件相关:malidp550_query_hw 根据 CONFIGURATION_ID 获取 max/min line size
// 支持三种配置: 2x2 - 1280x1280 pixels的HD配置,2x2 - 2048x2048 的2K配置,2x2 - 4096x4096 的4K配置,
hwdev->hw->query_hw(hwdev);
hwdev->min_line_size = 2;
hwdev->max_line_size = SZ_2K/SZ_4K/1280;
hwdev->rotation_memory[0] = hwdev->rotation_memory[1] = rsize * SZ_1K;
// 5. 硬件相关:从 MALIDP_DE_CORE_ID 获取Core ID信息
malidp_hw_read(hwdev, hwdev->hw->map.dc_base + MALIDP_DE_CORE_ID);
// 6. ??? TBD:
// .out_depth_base = MALIDP550_DE_OUTPUT_DEPTH, 指定启用抖动操作时的输出颜色深度。
// [19:16] OUT_DEPTH_R Red component output color depth for dithering process.
// [11:8] OUT_DEPTH_G Green component output color depth for dithering process.
// [3:0] OUT_DEPTH_B Blue component output color depth for dithering process.
of_property_read_u32(dev->of_node,"arm,malidp-arqos-value",&hwdev->arqos_value)
of_property_read_u8_array(dev->of_node,"arm,malidp-output-port-lines",output_width, MAX_OUTPUT_CHANNELS);
for (i = 0; i < MAX_OUTPUT_CHANNELS; i++)
out_depth = (out_depth << 8) | (output_width[i] & 0xf);
malidp_hw_write(hwdev, out_depth, hwdev->hw->map.out_depth_base); // MALIDP550_DE_OUTPUT_DEPTH 寄存器
hwdev->output_color_depth = out_depth;
// 7. 重点:kms init ,参考后边:malidp crtc初始化流程
malidp_init(drm)
// 8. 等待 port 完成初始化
component_bind_all(dev, drm);
// 9. 硬件相关:中断初始化
// mali-dp550支持2-4路中断,(因为支持1-2路显示)
// • IRQDE0. Interrupt request signal from the primary display core and primary display engine.
// • IRQDE1. Interrupt request signal from the secondary display core and secondary display engine. Not
// used in single display configuration.
// • IRQSE0. Interrupt request signal from the primary scaling engine.
// • IRQSE1. Interrupt request signal from the secondary scaling engine: Not used in single display configuration.
malidp_irq_init(pdev);
// 10. vblank初始化,后续详解
drm_vblank_init(drm, drm->mode_config.num_crtc);
// 11. kms初始化,后续详解
drm_mode_config_reset(drm);
drm_kms_helper_poll_init(drm);
// 12. drm_device 注册
drm_dev_register(drm, 0);
// 13.???
drm_fbdev_generic_setup(drm, 32);
malidp crtc初始化流程
// 官方流程:初始化 (struct drm_mode_config *) drm_device->mode_config 空间
// 释放调用: drm_mode_config_cleanup(drm);
drm_mode_config_init(drm);
// 初始化硬件显示分辨率 及 操作接口
// 用户空间调用 drmIoctl(fd, DRM_IOCTL_MODE_GETRESOURCES, &res) 可获取到对应分辨率信息
drm->mode_config.min_width = hwdev->min_line_size;
drm->mode_config.min_height = hwdev->min_line_size;
drm->mode_config.max_width = hwdev->max_line_size;
drm->mode_config.max_height = hwdev->max_line_size;
drm->mode_config.funcs = &malidp_mode_config_funcs;
drm->mode_config.helper_private = &malidp_mode_config_helpers;
drm->mode_config.allow_fb_modifiers = true;
drmm_mode_config_init
drm->mode_config.xxx ; // drm->mode_config 初始化结构体
malidp_crtc_init(drm); // !!! modeset 初始化结构体,难点
malidp_de_planes_init(drm); //
// skip:if (!(map->features & MALIDP_DEVICE_AFBC_SUPPORT_SPLIT)); // DP550支持 MALIDP_DEVICE_AFBC_SUPPORT_SPLIT
// 根据 malidp_device 的 malidp550_layers 和 每一层 malidp550_de_formats 来初始化plane
// DP550支持4层layer: DE_VIDEO1, DE_GRAPHICS1, DE_VIDEO2, DE_SMART, VIDE01是Primary,其他都是Overlay,SMART显示在最上层
// 每层都支持 MALIDP_COMMON_FORMATS 格式
drm_universal_plane_init();
drm_plane_helper_add();
drm_plane_create_alpha_property();
drm_plane_create_blend_mode_property();
drm_plane_create_rotation_property();
// 硬件相关:LV1_CONTROL 配置 对应 video 层的合成参数 ??? TBD
malidp_hw_write(malidp->dev, MALIDP_ALPHA_LUT,plane->layer->base + MALIDP_LAYER_COMPOSE);
// LV1和LV2支持 Attach the YUV->RGB property only to video layers
drm_plane_create_color_properties();
malidp_mw_connector_init(drm);