LK 阶段 display流程整理,包括LCD显示流程,以及背光控制流程

MTK平台,kernel中的display框架和LK类似,后面更新

LK阶段display流程
./lk/kernel/main.c:186:
kmain// do any super early platform initializationplatform_early_init();thread_t *thread_bs2 = thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE);bootstrap2arch_init();fs_init();platform_init(); //./lk/platform/mt6735/platform.c:974/* framebuffer的大小透过读id找到现在插入的LCM,根据LCM的分辨率申请相应大小的frame buffer并确定frame buffer起始地址*/g_fb_size = mt_disp_get_vram_size();//framebuffer的起始地址g_fb_base = mblock_reserve_ext(&g_boot_arg->mblock_info, g_fb_size, 0x10000, 0x80000000, 0, "framebuffer");//mtk display系统初始化 ddp中各个模块和lcm配置初始化mt_disp_init((void *)g_fb_base);primary_display_init(NULL);/* 根据 lcm_name 名字从 lcm_driver_list 数组表当中寻找lcm驱动进行匹配。并将找到的lcm驱动赋值到plcm->drv中,那么返回的plcm变量则包含lcm_drv的访问地址,这样就能访问lcm驱动的接口了 */disp_lcm_handle *disp_lcm_probe(char *plcm_name, LCM_INTERFACE_ID lcm_id)/* 判断LCM_DRIVER链表中lcm驱动的数量,如果为1个就直接拿来用给设备,不需要调用compare_id函数,如果多个就需要匹配硬件id号了。 */lcm_drv->compare_id() for (i=0; i<_lcm_count(); i++) {/*vendor / mediatek/proprietary/bootable/bootloader/lk/dev/lcm/mt65xx_lcm_list.c我们一般需要把厂家提供的lcm_driver添加到lcm_driver_list数组,*/lcm_drv= lcm_driver_list[i]; DISPDBG("we will check lcm: %s\n", lcm_drv->name);/* 同kernel流程一样 */lcm_param = disp_lcm_get_params(pgc->plcm);if (primary_display_mode == DIRECT_LINK_MODE) {_build_path_direct_link();pgc->dpmgr_handle = dpmgr_create_path(DDP_SCENARIO_PRIMARY_DISP, pgc->cmdq_handle_config);//根据lcm接口类型获得目标模块,这里为DISP_MODULE_DSI0dst_module = _get_dst_module_by_lcm(pgc->plcm);//设置ddp的最后一个模块为DISP_MODULE_DSI0dpmgr_path_set_dst_module(pgc->dpmgr_handle, dst_module);dpmgr_set_lcm_utils(pgc->dpmgr_handle, pgc->plcm->drv);mod_drv->set_lcm_utils(module_name, lcm_drv);//设置各个模块中lcm相关的操作函数,调用ddp_dsi_set_lcm_utils,最终调用lcm_drv->set_util_funcs(utils)将操作函数赋给lcm_utilddp_dsi_set_lcm_utils DISPCHECK("primary display is DIRECT LINK MODE\n");} else if (primary_display_mode == DECOUPLE_MODE) {_build_path_decouple(); DISPCHECK("primary display is DECOUPLE MODE\n");} else if (primary_display_mode == SINGLE_LAYER_MODE) {_build_path_single_layer();DISPCHECK("primary display is SINGLE LAYER MODE\n");} else if (primary_display_mode == DEBUG_RDMA1_DSI0_MODE) {_build_path_debug_rdma1_dsi0();_build_cmdq_trigger_loop();_start_cmdq_trigger_loop();//ddp设置显示模式,video mode or command modedpmgr_path_set_video_mode(pgc->dpmgr_handle, primary_display_is_video_mode());//ddp上各个模块的初始化,ovl0、ovl1、rdma0、rdma1、color、aal、gamma、dither、dsi0dpmgr_path_init(pgc->dpmgr_handle, CMDQ_DISABLE);ddp_modules_driver[module_name]->init(module_name, cmdqHandle); //ddp_info.c中对ddp_modules_driver赋值//data_config结构体描述lcm分辨率、接口类型、数据排列等信息disp_ddp_path_config data_config;memset((void*)&data_config, 0, sizeof(disp_ddp_path_config));memcpy(&(data_config.dsi_config), &(lcm_param->dsi), sizeof(LCM_DSI_PARAMS)); //这里只考虑DSI接口/* 长宽高,BPP初始化 */data_config.dst_w = disp_lcm_width(pgc->plcm);data_config.dst_h = disp_lcm_height(pgc->plcm);//调用各个模块的config函数ret = dpmgr_path_config(pgc->dpmgr_handle, &data_config, CMDQ_DISABLE);ddp_modules_driver[module_name]->config(module_name, config, cmdqHandle);//lcm初始化,通过回读0x0A寄存器判断lcm是否连接//依次调用lcm的init_power和init函数,实现上电复位初始化的动作,并通过回读0x0A寄存器判断跟lcm之前是否连接OKret = disp_lcm_init(pgc->plcm);DISPFUNC();lcm_drv->init_power(); //调用LCM lcm init_power接口上电lcm_drv->init(); //调用LCM驱动lcm_init接口DISPCHECK("lcm init \n");ret = DSI_dcs_read_lcm_reg_v2(_get_dst_module_by_lcm(plcm), NULL, 0x0A, (UINT8 *)&buffer,1);DISPMSG("read from lcm 0x0A: %d\n", buffer);isLCMConnected = 1;DISPMSG("lcm is connected\n"); //LCM 驱动已经connect//关联event与irq,并且使能event,例如一帧刷完这个event,便产生一个中断//映射event和中断,并且使能中断事件dpmgr_map_event_to_irq(pgc->dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC, DDP_IRQ_DSI0_FRAME_DONE);dpmgr_enable_event(pgc->dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC);dpmgr_enable_event(pgc->dpmgr_handle, DISP_PATH_EVENT_FRAME_DONE);memset((void*)lcdbase, 0x0, DISP_GetVRamSize());//lk阶段定义了2层layer(最多支持4层layer),FB_LAYER和BOOT_MENU_LAYER, primary_display_config_input(&input);//将各层layer信息传递给overlayret = _convert_disp_input_to_ovl(&(data_config.ovl_config[input->layer]), input);//打开overlay模块配置,执行config函数(config函数会对ovl_dirty进行check,为0则直接返回,相当于bypass)data_config.ovl_dirty = 1;ret = dpmgr_path_config(pgc->dpmgr_handle, &data_config, primary_display_use_cmdq);// 设置显示需要触发overlaypgc->need_trigger_overlay = 1;drv_video_init();boot_mode_select(); //模式选择,例如fastboot,recoverary/* 将logo加载到分配的RAM中 */logo_size = mboot_common_load_logo((unsigned long)mt_get_logo_db_addr_pa(), "logo");mt_get_logo_db_addr_pa //返回logo的地址dprintf(0,"mt_get_logo_db_addr_pa: 0x%08x\n",(unsigned int)logo_db_addr_pa);PROFILING_START("show logo");//根据启动方式选择加载的logo,填充到fb中mt_disp_show_boot_logo(); dprintf(INFO, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);mt_logo_get_custom_if();init_fb_screen();fill_animation_logo(BOOT_LOGO_INDEX, mt_get_fb_buf(), (void *)mt_get_tempfb_addr(), logo_addr, phical_screen);mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);PROFILING_START("backlight");刷新fb有关的cache,并且调用各个模块start和trigger函数将fb内容更新到lcm上mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);apps_init();APP_START(mt_boot)
.init = mt_boot_init,APP_ENDmt_boot_initset_serial_num();boot_linux_from_storage(); //vendor/mediatek/proprietary/bootable/bootloader/lkapp/mt_boot/mt_boot.cbootargs_init((void *)tags_target_addr);custom_port_in_kernel(g_boot_mode, cmdline_get());send_root_of_trust_info();set_boot_phase(BOOT_PHASE_KERNEL);boot_linux((void *)kernel_target_addr, (unsigned *)tags_target_addr, board_machtype(), (void *)ramdisk_target_addr, ramdisk_real_sz);boot_linux_fdt((void *)kernel, (unsigned *)tags, machtype, (void *)ramdisk, ramdisk_sz);load_images(g_boot_mode);mt_disp_config_frame_buffer(fdt);target_fdt_firmware(fdt, sn_buf);res = mt_disp_get_lcd_product_codes(lcd_product_codes);res = primary_display_get_lcd_product_codes(out);res = disp_lcm_get_product_codes(pgc->plcm, out);lcm_drv->get_lcd_product_codes(out);fastboot:target_fastboot_init();mt_part_dump();sz = target_get_max_flash_size();fastboot_init(target_get_scratch_address(), sz);udc_start();/* LK将lcm相关的信息,写到cmdline中,传递给kernel */
void cmd_boot(const char *arg, void *data, unsigned sz) n = snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "lcm=%1d-%s", DISP_IsLcmFound(), mt_disp_get_lcm_id());cmdline_append(cmdline_tmpbuf);n = snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "fps=%1d", mt_disp_get_lcd_time());cmdline_append(cmdline_tmpbuf);n = snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "vram=%1d", DISP_GetVRamSize());cmdline_append(cmdline_tmpbuf);   /* kernel中从 "/chosen" 获取 LCM 信息 */
mtkfb_find_lcm_driver_parse_tag_videolfb();chosen_node = of_find_node_by_path("/chosen");__parse_tag_videolfb(chosen_node);videolfb_tag = (struct tag_video_lfb *)of_get_property(node, "atag,videolfb", (int *)&size);memset((void *)mtkfb_lcm_name, 0, sizeof(mtkfb_lcm_name));strncpy((char *)mtkfb_lcm_name, videolfb_tag->lcmname, sizeof(mtkfb_lcm_name));lcd_fps = videolfb_tag->fps;vramsize = videolfb_tag->vram;fb_base = videolfb_tag->fb_base;return mtkfb_lcm_name;

MTK LK阶段 display框架相关推荐

  1. MTK平台 在lk阶段,读取IMEI号

    MTK平台 在lk阶段,读取IMEI号 MTK的写号工具"SN_WITER tool",在写IMEI和SN的时候,会往"proinfo"分区里面也写一份IMEI ...

  2. 定制LK阶段开机LOGO

    文档说明 本文档以SC806-CN-00-04为例(8909平台),描述如何定制LK阶段开机logo图片. LOGO图片要求 图片后缀为 .png,颜色位深8/24/32都可以. 图片分辨率和屏的实际 ...

  3. mtk LK流程简介

    mtk LK流程简介 一.LK简介 Lk的主要功能: 1.初始化硬件模块,比如时钟,中断,UART,USB,LCD,PMIC,eMMC等.打开MMU,使能I/D-cache,加速lk执行,显示logo ...

  4. Qcom LK阶段如何使用ADC介绍

    点击打开链接 摘要 本文叙述了在高通平台LK阶段读取mpp2引脚电平的实现过程,附上实现代码.主要实现过程包括配置引脚功能,读取引脚电压.需要特别注意配置mpp2通道和AIN route的选择. 需要 ...

  5. 高通MSM8953 LK阶段配置使用I2C8

    项目场景: 因为项目需要,需要在高通MSM8953平台的LK阶段使用I2C8设备.但是MSM8953平台LK阶段并没有配置好I2C8接口,因此调试I2C8成为当务之急.本文只介绍在LK阶段配置使用I2 ...

  6. Qcom 平台 LK 阶段配置 I2C

    qcom平台LK 阶段配置IIC 版本号:V 1.0 作者:Leo 目录 目录... 1 前言... 4 1.      确定硬件... 4 2.      LK I2C 函数接口... 5 2.1 ...

  7. 高通平台lk阶段logo修改

    高通平台lk阶段logo修改: 1.通过logo图片得到要显示的数组: 运行"ffmpeg -i logo.png -f rawvideo -pix_fmt bgr24 logo.raw&q ...

  8. MTK平台LCD驱动框架详解(一)

    许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢 ...

  9. Android OrangePi 4G IOT(四) - MTK LK分析

    一.MTK启动流程 1-3:设备上电起来后,跳转到Boot ROM(不是flash)中的boot code中执行把pre-loader加载起到ISRAM, 因为当前DRAM(RAM分SRAM跟DRAM ...

  10. MTK 平台lcm驱动框架分析1

    源码路径: kernel-3.18/arch/arm/boot/dts/mt6580.dtsi kernel-3.18/drivers/misc/mediatek/video/common/mtkfb ...

最新文章

  1. python使用符号#表示单行注释-Pyhton中单行和多行注释的使用方法及规范
  2. 慕课网初识python_初识Python笔记
  3. 1129 Recommendation System (25 分)【难度: 一般 / 知识点: 滑动窗口】
  4. SAP UI5 responsiveLayout和responsiveGridLayout的区别
  5. ubuntu mv和cp命令
  6. REVERSE-PRACTICE-BUUCTF-15
  7. 性能调优的方法及概念
  8. Ajax+SpringMVC+JSON登录验证
  9. JAVA输入jdb,解决 JAVA 单步调试键盘输入被 JDB 占用的问题
  10. 1月23 Surface Pro3 ubuntu下想用键盘盖以及使用蓝牙
  11. 【大数据部落】r语言使用rjags R2jags建立贝叶斯模型
  12. 卷积编码verilog实现
  13. 【华为二面】2020/3/25_华为第二次技术面试_45分钟
  14. 简介 - 有哪些冗余技术?我应该用哪个,注意什么?
  15. 影视后期制作中AEnbsp;抠像技术浅…
  16. 网页版连连看(JS jQuery)
  17. 【邻接表】75 邻接表:删除边
  18. 微信小程序--计算器demo实现
  19. PB中执行动态SQL语句(温故知新)
  20. 微信小程序获取unionID思路整理

热门文章

  1. Linux修改文件保存时报错E45: 已设定选项 ‘readonly‘ (请加 ! 强制执行)
  2. OpenCV:边缘检测算法
  3. 校运会计算机应用口号,校运会入场霸气押韵口号(精选60句)
  4. JAVA实现微信支付功能
  5. 大量精品国学论文免费下载
  6. Keil工程窗口各项图标描述
  7. 某天的零点时刻0:0:0 和截至时刻23:59:59
  8. kivy python_另一款带有Kivy,Python的Android蛇
  9. 中美高通商标案一审宣判:驳回上海高通索赔1亿请求
  10. mysql等级保护_网络安全等级保护测评-MYSQL篇