一、lk进入kmain()

1. vendor/mediatek/proprietary/bootable/bootloader/lk/arch/arm/srt0.S

  1. bl kmain

二、初始化lk,分配framebuffer

1. vendor/mediatek/proprietary/bootable/bootloader/lk/kernel/main.c

  1. void kmain(void)
  2. {
  3. #if !defined(MACH_FPGA) && !defined(SB_LK_BRINGUP)
  4. boot_time = get_timer();
  5. #endif
  6.  
  7. // get us into some sort of thread context
  8. thread_init_early();
  9.  
  10. // early arch stuff
  11. arch_early_init();
  12.  
  13. // do any super early platform initialization
  14. platform_early_init();
  15.  
  16. #if defined(MACH_FPGA) || defined(SB_LK_BRINGUP)
  17. boot_time = get_timer();
  18. #endif
  19.  
  20. // do any super early target initialization
  21. target_early_init();
  22.  
  23. dprintf(INFO, "welcome to lk\n\n");
  24.  
  25. // deal with any static constructors
  26. dprintf(SPEW, "calling constructors\n");
  27. call_constructors();
  28.  
  29. // bring up the kernel heap
  30. dprintf(SPEW, "initializing heap\n");
  31. heap_init();
  32.  
  33. // initialize the threading system
  34. dprintf(SPEW, "initializing threads\n");
  35. thread_init();
  36.  
  37. // initialize the dpc system
  38. dprintf(SPEW, "initializing dpc\n");
  39. dpc_init();
  40.  
  41. // initialize kernel timers
  42. dprintf(SPEW, "initializing timers\n");
  43. timer_init();
  44.  
  45. #ifdef MTK_LK_IRRX_SUPPORT
  46. mtk_ir_init();
  47. #endif
  48.  
  49. #if (!ENABLE_NANDWRITE)
  50. // create a thread to complete system initialization
  51. dprintf(SPEW, "creating bootstrap completion thread\n");
  52. thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
  53.  
  54. // enable interrupts
  55. exit_critical_section();
  56.  
  57. // become the idle thread
  58. thread_become_idle();
  59. #else
  60. bootstrap_nandwrite();
  61. #endif
  62. }
  1. static int bootstrap2(void *arg)
  2. {
  3. dprintf(SPEW, "top of bootstrap2()\n");
  4.  
  5. arch_init();
  6.  
  7. // XXX put this somewhere else
  8. #if WITH_LIB_BIO
  9. bio_init();
  10. #endif
  11. #if WITH_LIB_FS
  12. fs_init();
  13. #endif
  14.  
  15. // initialize the rest of the platform
  16. dprintf(SPEW, "initializing platform\n");
  17.  
  18. platform_init();
  19.  
  20. // initialize the target
  21. dprintf(SPEW, "initializing target\n");
  22. target_init();
  23.  
  24. dprintf(SPEW, "calling apps_init()\n");
  25. apps_init();
  26.  
  27. return ;
  28. }

 2. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/platform.c

  1. void platform_init(void)
  2. {
  3. #ifdef LK_PROFILING
  4. unsigned int time_nand_emmc;
  5. unsigned int time_led_init;
  6. unsigned int time_env;
  7. unsigned int time_disp_init;
  8. unsigned int time_load_logo;
  9. unsigned int time_backlight;
  10. unsigned int time_boot_mode;
  11. #ifdef MTK_SECURITY_SW_SUPPORT
  12. unsigned int time_security_init;
  13. #endif
  14. unsigned int time_bat_init;
  15. unsigned int time_RTC_boot_Check;
  16. unsigned int time_show_logo;
  17. unsigned int time_sw_env;
  18. unsigned int time_platform_init;
  19.  
  20. time_platform_init = get_timer();
  21. #endif
  22. u64 pl_start_addr = ;
  23. plinfo_get_brom_header_block_size(&pl_start_addr);
  24.  
  25. dprintf(CRITICAL," ==LK info ==\n");
  26. dprintf(CRITICAL," Build time:%s, %s\n", __DATE__,__TIME__);
  27. dprintf(CRITICAL," chip_code[0x%x]\n", mt_get_chip_hw_code());
  28. dprintf(CRITICAL," chip_ver[0x%x]\n", mt_get_chip_sw_ver());
  29. dprintf(CRITICAL," ==LK info ==\n");
  30. dprintf(CRITICAL, "platform_init()\n");
  31.  
  32. #if defined (MTK_EFUSE_DOWNGRADE)
  33. set_sw_segment_code();
  34. #endif
  35.  
  36. mt_set_gpio_mode(GPIO11, GPIO_MODE_00);
  37. mt_set_gpio_dir(GPIO11, GPIO_DIR_OUT);
  38. mt_set_gpio_out(GPIO11, GPIO_OUT_ZERO);
  39.  
  40. mt_set_gpio_mode(GPIO119, GPIO_MODE_00);
  41. mt_set_gpio_dir(GPIO119, GPIO_DIR_OUT);
  42. mt_set_gpio_out(GPIO119, GPIO_OUT_ZERO);
  43.  
  44. #ifdef DUMMY_AP
  45. dummy_ap_entry();
  46. #endif
  47.  
  48. #ifdef LK_PROFILING
  49. time_nand_emmc = get_timer();
  50. #endif
  51. #ifdef MTK_EMMC_SUPPORT
  52. mmc_legacy_init();
  53. #else
  54. #ifndef MACH_FPGA
  55. nand_init();
  56. nand_driver_test();
  57. #endif
  58. #endif
  59. #ifdef LK_PROFILING
  60. dprintf(INFO, "[PROFILE] ------- NAND/EMMC init takes %d ms -------- \n", (int)get_timer(time_nand_emmc));
  61. #endif
  62. #if defined(CFG_DTB_EARLY_LOADER_SUPPORT)
  63.  
  64. if (bldr_load_dtb("boot")<)
  65. {
  66. printf("bldr_load_dtb fail\n");
  67. }
  68. else
  69. {
  70. printf("bldr_load_dtb success\n");
  71. }
  72.  
  73. #endif
  74.  
  75. #ifndef MACH_FPGA
  76. #ifdef LK_PROFILING
  77. time_led_init = get_timer();
  78. #endif
  79. leds_init();
  80. #ifdef LK_PROFILING
  81. dprintf(INFO, "[PROFILE] ------- led init takes %d ms -------- \n", (int)get_timer(time_led_init));
  82. #endif
  83. #endif
  84.  
  85. #ifdef MTK_KERNEL_POWER_OFF_CHARGING
  86. if ((g_boot_arg->boot_reason == BR_USB) && (upmu_is_chr_det() == KAL_FALSE)) {
  87. dprintf(INFO, "[%s] Unplugged Charger/Usb between Pre-loader and Uboot in Kernel Charging Mode, Power Off \n", __func__);
  88. mt6575_power_off();
  89. }
  90. #endif
  91.  
  92. #ifdef LK_PROFILING
  93. time_env = get_timer();
  94. #endif
  95. env_init();
  96. print_env();
  97. #ifdef MTK_USB2JTAG_SUPPORT
  98. extern void usb2jtag_init(void);
  99. usb2jtag_init();
  100. #endif
  101. #ifdef LK_PROFILING
  102. dprintf(INFO, "[PROFILE] ------- ENV init takes %d ms -------- \n", (int)get_timer(time_env));
  103. #endif
  104.  
  105. #ifdef LK_PROFILING
  106. time_disp_init = get_timer();
  107. #endif
  108.  
  109. /* initialize the frame buffet information */
  110. #ifndef MACH_FPGA_NO_DISPLAY
  111. g_fb_size = mt_disp_get_vram_size();
  112. #else
  113. g_fb_size = 0x1000000;
  114. #endif
  115.  
  116. #if 0
  117. g_fb_base = memory_size() - g_fb_size + DRAM_PHY_ADDR;
  118. #else
  119.  
  120. #if 0
  121. if (g_is_64bit_kernel) {
  122. g_fb_base = mblock_reserve(&g_boot_arg->mblock_info, g_fb_size, 0x200000, 0x100000000, RANKMAX);
  123. g_fb_base = ALIGN_TO(g_fb_base,0x200000); // size 2MB align
  124. } else {
  125. g_fb_base = mblock_reserve(&g_boot_arg->mblock_info, g_fb_size, 0x100000, 0x100000000, RANKMAX);
  126. }
  127. #else
  128. g_fb_base = mblock_reserve(&g_boot_arg->mblock_info, g_fb_size, 0x10000, 0x100000000, RANKMAX);
  129. #endif
  130.  
  131. if (!g_fb_base) {
  132. /* ERROR */
  133. }
  134. #endif
  135.  
  136. dprintf(CRITICAL, "FB base = 0x%x, FB size = %d\n", g_fb_base, g_fb_size);
  137.  
  138. #ifndef MACH_FPGA_NO_DISPLAY
  139. mt_disp_init((void *)g_fb_base);
  140. /* show black picture fisrtly in case of backlight is on before nothing is drawed*/
  141. mt_disp_fill_rect(, , CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, 0x0);
  142. mt_disp_update(, , CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  143. #ifdef LK_PROFILING
  144. dprintf(INFO, "[PROFILE] ------- disp init takes %d ms -------- \n", (int)get_timer(time_disp_init));
  145. #endif
  146.  
  147. #ifdef MTK_SECURITY_SW_SUPPORT
  148. #ifdef LK_PROFILING
  149. time_security_init = get_timer();
  150. #endif
  151.  
  152. /* initialize security library */
  153. sec_func_init(pl_start_addr);
  154.  
  155. #ifdef LK_PROFILING
  156. dprintf(INFO,"[PROFILE] ------- Security init takes %d ms -------- \n", (int)get_timer(time_security_init));
  157. #endif
  158.  
  159. seclib_set_oemkey(g_oemkey, OEM_PUBK_SZ);
  160. /* logo image authentication */
  161. if ( != sec_logo_check() ) {
  162. dprintf(CRITICAL,"<ASSERT> %s:line %d\n",__FILE__,__LINE__);
  163. while ();
  164. }
  165. #ifdef MTK_DTBO_FEATURE
  166. /* dtbo image authentication */
  167. if ( != sec_dtbo_check() ) {
  168. dprintf(CRITICAL,"<ASSERT> %s:line %d\n",__FILE__,__LINE__);
  169. while ();
  170. }
  171. #endif
  172. #endif
  173. drv_video_init();
  174. #endif
  175.  
  176. /*for kpd pmic mode setting*/
  177. set_kpd_pmic_mode();
  178.  
  179. #ifndef MACH_FPGA
  180. #ifdef LK_PROFILING
  181. time_boot_mode = get_timer();
  182. #endif
  183. boot_mode_select();
  184. #ifdef CFG_DTB_EARLY_LOADER_SUPPORT
  185. /* reload dtb when boot mode = recovery */
  186. if ((g_boot_mode == RECOVERY_BOOT) && (bldr_load_dtb("recovery") < ))
  187. dprintf(CRITICAL, "bldr_load_dtb fail\n");
  188. #endif
  189.  
  190. #ifdef LK_PROFILING
  191. dprintf(INFO, "[PROFILE] ------- boot mode select takes %d ms -------- \n", (int)get_timer(time_boot_mode));
  192. #endif
  193. #endif
  194.  
  195. #ifndef MACH_FPGA_NO_DISPLAY
  196. #ifdef LK_PROFILING
  197. time_load_logo = get_timer();
  198. #endif
  199. mboot_common_load_logo((unsigned long)mt_get_logo_db_addr_pa(), "logo");
  200. #ifdef LK_PROFILING
  201. dprintf(INFO, "[PROFILE] ------- load_logo takes %d ms -------- \n", (int)get_timer(time_load_logo));
  202. #endif
  203. #endif
  204.  
  205. /*Show download logo & message on screen */
  206. if (g_boot_arg->boot_mode == DOWNLOAD_BOOT) {
  207. dprintf(CRITICAL, "[LK] boot mode is DOWNLOAD_BOOT\n");
  208.  
  209. #ifdef MTK_SECURITY_SW_SUPPORT
  210. /* verify da before jumping to da*/
  211. if (sec_usbdl_enabled()) {
  212. u8 *da_addr = (u8*)g_boot_arg->da_info.addr;
  213. u32 da_len = g_boot_arg->da_info.len;
  214. u32 sig_len = g_boot_arg->da_info.sig_len;
  215. u8 *sig_addr = (unsigned char *)da_addr + (da_len - sig_len);
  216.  
  217. if (da_len == || sig_len == ) {
  218. dprintf(INFO, "[LK] da argument is invalid\n");
  219. dprintf(INFO, "da_addr = 0x%x\n", (int)da_addr);
  220. dprintf(INFO, "da_len = 0x%x\n", da_len);
  221. dprintf(INFO, "sig_len = 0x%x\n", sig_len);
  222. }
  223.  
  224. if (sec_usbdl_verify_da(da_addr, (da_len - sig_len), sig_addr, sig_len)) {
  225. /* da verify fail */
  226. video_printf(" => Not authenticated tool, download stop...\n");
  227. while (); /* fix me, should not be infinite loop in lk */
  228. }
  229. } else
  230. #endif
  231. {
  232. dprintf(INFO, " DA verification disabled...\n");
  233. }
  234.  
  235. #ifndef MACH_FPGA_NO_DISPLAY
  236. mt_disp_show_boot_logo();
  237. #endif
  238. video_printf(" => Downloading...\n");
  239. dprintf(CRITICAL, "enable backlight after show bootlogo! \n");
  240. mt65xx_backlight_on();
  241.  
  242. mtk_wdt_disable(); //Disable wdt before jump to DA
  243. platform_uninit();
  244. #ifdef HAVE_CACHE_PL310
  245. l2_disable();
  246. #endif
  247. arch_disable_cache(UCACHE);
  248. arch_disable_mmu();
  249. #ifdef ENABLE_L2_SHARING
  250. config_shared_SRAM_size();
  251. #endif
  252.  
  253. jump_da(g_boot_arg->da_info.addr, g_boot_arg->da_info.arg1, g_boot_arg->da_info.arg2);
  254. }
  255.  
  256. #ifdef LK_PROFILING
  257. time_bat_init = get_timer();
  258. #endif
  259. mt65xx_bat_init();
  260. #ifdef LK_PROFILING
  261. dprintf(INFO, "[PROFILE] ------- battery init takes %d ms -------- \n", (int)get_timer(time_bat_init));
  262. #endif
  263.  
  264. #ifndef CFG_POWER_CHARGING
  265. #ifdef LK_PROFILING
  266. time_RTC_boot_Check = get_timer();
  267. #endif
  268. /* NOTE: if define CFG_POWER_CHARGING, will rtc_boot_check() in mt65xx_bat_init() */
  269. rtc_boot_check(false);
  270. #ifdef LK_PROFILING
  271. dprintf(INFO, "[PROFILE] ------- RTC boot check Init takes %d ms -------- \n", (int)get_timer(time_RTC_boot_Check));
  272. #endif
  273. #endif
  274.  
  275. #ifdef LK_PROFILING
  276. time_show_logo = get_timer();
  277. #endif
  278. #ifdef MTK_KERNEL_POWER_OFF_CHARGING
  279. if (kernel_charging_boot() == ) {
  280. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  281. CHARGER_TYPE CHR_Type_num = CHARGER_UNKNOWN;
  282. CHR_Type_num = hw_charging_get_charger_type();
  283. if ((g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) ||
  284. ((CHR_Type_num != STANDARD_HOST) && (CHR_Type_num != NONSTANDARD_CHARGER))) {
  285. #endif
  286. mt_disp_power(TRUE);
  287. mt_disp_show_low_battery();
  288. mt65xx_leds_brightness_set(, );
  289. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  290. }
  291. #endif
  292. } else if (g_boot_mode != KERNEL_POWER_OFF_CHARGING_BOOT && g_boot_mode != LOW_POWER_OFF_CHARGING_BOOT) {
  293. if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) {
  294. #ifndef MACH_FPGA_NO_DISPLAY
  295. mt_disp_show_boot_logo();
  296. #endif
  297. }
  298. }
  299. #else
  300. if (g_boot_mode != ALARM_BOOT && (g_boot_mode != FASTBOOT)) {
  301. #ifndef MACH_FPGA_NO_DISPLAY
  302. mt_disp_show_boot_logo();
  303. #endif
  304. }
  305. #endif
  306. #ifdef LK_PROFILING
  307. time_backlight = get_timer();
  308. #endif
  309.  
  310. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  311. if (!is_low_battery()) {
  312. #endif
  313. mt65xx_backlight_on();
  314. #ifndef MACH_FPGA_NO_DISPLAY
  315. //pwm need display sof
  316. mt_disp_update(, , CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  317. #endif
  318. #ifdef MTK_BATLOWV_NO_PANEL_ON_EARLY
  319. }
  320. #endif
  321.  
  322. #ifdef LK_PROFILING
  323. dprintf(INFO, "[PROFILE] ------- backlight takes %d ms -------- \n", (int)get_timer(time_backlight));
  324. #endif
  325.  
  326. #ifdef LK_PROFILING
  327. dprintf(INFO, "[PROFILE] ------- show logo takes %d ms -------- \n", (int)get_timer(time_show_logo));
  328. #endif
  329.  
  330. #ifndef MACH_FPGA
  331. #ifdef LK_PROFILING
  332. time_sw_env = get_timer();
  333. #endif
  334. sw_env();
  335. #ifdef LK_PROFILING
  336. dprintf(INFO, "[PROFILE] ------- sw_env takes %d ms -------- \n", (int)get_timer(time_sw_env));
  337. #endif
  338. #endif
  339.  
  340. #ifdef LK_PROFILING
  341. dprintf(INFO, "[PROFILE] ------- platform_init takes %d ms -------- \n", (int)get_timer(time_platform_init));
  342. #endif
  343. }

 3. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/mt_disp_drv.c

  1. UINT32 mt_disp_get_vram_size(void)
  2. {
  3. return DISP_GetVRamSize();
  4. }

 4. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/primary_display.c

  1. unsigned int DISP_GetVRamSize(void)
  2. {
  3. static UINT32 vramSize = ;
  4.  
  5. printf("jjh DISP_GetVRamSize\n");
  6.  
  7. if ( == vramSize) {
  8. vramSize = DISP_GetFBRamSize();
  9.  
  10. vramSize += DAL_GetLayerSize();
  11.  
  12. #if 0
  13. if (g_is_64bit_kernel) {
  14. vramSize = ALIGN_TO(vramSize, 0x400000); // both start addr and size needs 2MB align, so size must 4MB align
  15. } else {
  16. vramSize = ALIGN_TO(vramSize, 0x100000); // both start addr and size needs 2MB align, so size must 4MB align
  17. }
  18. #else
  19. vramSize = ALIGN_TO(vramSize, 0x10000); // just align to 64KB is OK
  20. #endif
  21.  
  22. DISPMSG("^^ DISP_GetVRamSize: %u bytes\n", vramSize);
  23. }
  24.  
  25. return vramSize;
  26. }
  1. UINT32 DISP_GetFBRamSize(void)
  2. {
  3. return ALIGN_TO(DISP_GetScreenWidth(), MTK_FB_ALIGNMENT) * DISP_GetScreenHeight() * ((DISP_GetScreenBpp() + ) >> ) * DISP_GetPages();
  4. }
  1. UINT32 DISP_GetScreenWidth(void)
  2. {
  3. return primary_display_get_width();
  4. }
  1. int primary_display_get_width(void)
  2. {
  3. if (pgc->plcm == NULL) {
  4. pgc->plcm = disp_lcm_probe(NULL, LCM_INTERFACE_NOTDEFINED);
  5. DISPMSG("lcm handle is null, after probe:0x%08x\n",pgc->plcm);
  6. if (pgc->plcm == NULL)
  7. return ;
  8. }
  9.  
  10. if (pgc->plcm->params) {
  11. return pgc->plcm->params->width;
  12. } else {
  13. DISPERR("lcm_params is null!\n");
  14. return ;
  15. }
  16. }

 5. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/disp_lcm.c

  1. /* if lcm handle already probed, should return lcm handle directly */
  2. disp_lcm_handle *disp_lcm_probe(char *plcm_name, LCM_INTERFACE_ID lcm_id)
  3. {
  4. DISPFUNC();
  5.  
  6. int ret = ;
  7. bool isLCMFound = false;
  8. bool isLCMConnected = false;
  9.  
  10. LCM_DRIVER *lcm_drv = NULL;
  11. LCM_PARAMS *lcm_param = NULL;
  12. disp_lcm_handle *plcm = NULL;
  13.  
  14. #if defined(MTK_LCM_DEVICE_TREE_SUPPORT)
  15. bool isLCMDtFound = false;
  16.  
  17. if (check_lcm_node_from_DT() == ) {
  18. lcm_drv = &lcm_common_drv;
  19. isLCMFound = true;
  20. isLCMDtFound = true;
  21. } else
  22. #endif
  23. if (_lcm_count() == ) {
  24. DISPERR("no lcm driver defined in linux kernel driver\n");
  25. return NULL;
  26. } else if (_lcm_count() == ) {
  27. lcm_drv = lcm_driver_list[];
  28. isLCMFound = true;
  29. } else {
  30. /* in lk, plcm_name should always be NULL */
  31. if (plcm_name == NULL) {
  32. int i = ;
  33. disp_path_handle handle = NULL;
  34. disp_lcm_handle hlcm;
  35. disp_lcm_handle *plcm = &hlcm;
  36. LCM_PARAMS hlcm_param;
  37.  
  38. for (i=; i<_lcm_count(); i++) {
  39. memset((void*)&hlcm, , sizeof(disp_lcm_handle));
  40. memset((void*)&hlcm_param, , sizeof(LCM_PARAMS));
  41.  
  42. lcm_drv= lcm_driver_list[i];
  43. lcm_drv->get_params(&hlcm_param);
  44. plcm->drv = lcm_drv;
  45. plcm->params = &hlcm_param;
  46. plcm->lcm_if_id = plcm->params->lcm_if;
  47. DISPMSG("we will check lcm: %s\n", lcm_drv->name);
  48. if (lcm_id == LCM_INTERFACE_NOTDEFINED ||(lcm_id != LCM_INTERFACE_NOTDEFINED && plcm->lcm_if_id == lcm_id)) {
  49. handle = _display_interface_path_init(plcm);
  50. if (handle == NULL) {
  51. DISPERR("_display_interface_path_init returns NULL\n");
  52. goto FAIL;
  53. }
  54.  
  55. if (lcm_drv->init_power) {
  56. lcm_drv->init_power();
  57. }
  58.  
  59. if (lcm_drv->compare_id != NULL) {
  60. if (lcm_drv->compare_id() != ) {
  61. isLCMFound = true;
  62. _display_interface_path_deinit(handle);
  63. dprintf(INFO,"we will use lcm: %s\n", lcm_drv->name);
  64. break;
  65. }
  66. }
  67.  
  68. _display_interface_path_deinit(handle);
  69. }
  70. }
  71.  
  72. if (isLCMFound == false) {
  73. DISPERR("we have checked all lcm driver, but no lcm found\n");
  74. lcm_drv = lcm_driver_list[];
  75. isLCMFound = true;
  76. }
  77. } else {
  78. int i = ;
  79. for (i=; i<_lcm_count(); i++) {
  80. lcm_drv = lcm_driver_list[i];
  81. if (!strcmp(lcm_drv->name, plcm_name)) {
  82. isLCMFound = true;
  83. break;
  84. }
  85. }
  86. }
  87. }
  88.  
  89. if (isLCMFound == false) {
  90. DISPERR("FATAL ERROR!!!No LCM Driver defined\n");
  91. return NULL;
  92. }
  93.  
  94. plcm = &_disp_lcm_driver[0];
  95. 95 lcm_param = &_disp_lcm_params;
  96. if (plcm && lcm_param) {
  97. plcm->params = lcm_param;
  98. plcm->drv = lcm_drv;
  99. } else {
  100. DISPERR("FATAL ERROR!!!kzalloc plcm and plcm->params failed\n");
  101. goto FAIL;
  102. }
  103.  
  104. #if defined(MTK_LCM_DEVICE_TREE_SUPPORT)
  105. if (isLCMDtFound == true)
  106. load_lcm_resources_from_DT(plcm->drv);
  107. #endif
  108.  
  109. plcm->drv->get_params(plcm->params);
  110. plcm->lcm_if_id = plcm->params->lcm_if;
  111. /* below code is for lcm driver forward compatible */
  112. if (plcm->params->type == LCM_TYPE_DSI && plcm->params->lcm_if == LCM_INTERFACE_NOTDEFINED)
  113. plcm->lcm_if_id = LCM_INTERFACE_DSI0;
  114. if (plcm->params->type == LCM_TYPE_DPI && plcm->params->lcm_if == LCM_INTERFACE_NOTDEFINED)
  115. plcm->lcm_if_id = LCM_INTERFACE_DPI0;
  116. if (plcm->params->type == LCM_TYPE_DBI && plcm->params->lcm_if == LCM_INTERFACE_NOTDEFINED)
  117. plcm->lcm_if_id = LCM_INTERFACE_DBI0;
  118. #if 1
  119. plcm->is_connected = isLCMConnected;
  120. #endif
  121.  
  122. _dump_lcm_info(plcm);
  123. return plcm;
  124.  
  125. FAIL:
  126.  
  127. return NULL;
  128. }
  1. int _lcm_count(void)
  2. {
  3. return lcm_count;
  4. }

lcm_count在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm/mt65xx_lcm_list.c中定义:

  1. unsigned int lcm_count = sizeof(lcm_driver_list) / sizeof(LCM_DRIVER *);

三、 disp 初始化

vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/platform.c

  1. mt_disp_init((void *)g_fb_base);

 1. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/mt_disp_drv.c

  1. void mt_disp_init(void *lcdbase)
  2. {
  3. unsigned int lcm_fake_width = ;
  4. unsigned int lcm_fake_height = ;
  5. UINT32 boot_mode_addr = ;
  6. /// fb base pa and va
  7. fb_addr_pa_k = arm_mmu_va2pa(lcdbase);
  8.  
  9. fb_addr_pa = fb_addr_pa_k & 0xffffffffull;
  10. fb_addr = lcdbase;
  11.  
  12. dprintf(,"fb_va: 0x%08x, fb_pa: 0x%08x, fb_pa_k: 0x%llx\n", fb_addr, fb_addr_pa, fb_addr_pa_k);
  13.  
  14. fb_size = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT) * CFG_DISPLAY_HEIGHT * CFG_DISPLAY_BPP / ;
  15. // pa;
  16. boot_mode_addr = ((UINT32)fb_addr_pa + fb_size);
  17. logo_db_addr_pa = (void *)((UINT32)fb_addr_pa - * * );
  18.  
  19. // va;
  20. logo_db_addr = (void *)((UINT32)fb_addr - * * );
  21.  
  22. fb_offset_logo = ;
  23.  
  24. primary_display_init(NULL);
  25. memset((void*)lcdbase, 0x0, DISP_GetVRamSize());
  26.  
  27. disp_input_config input;
  28. memset(&input, , sizeof(disp_input_config));
  29. input.layer = BOOT_MENU_LAYER;
  30. input.layer_en = ;
  31. input.fmt = redoffset_32bit ? eBGRA8888 : eRGBA8888;
  32. input.addr = boot_mode_addr;
  33. input.src_x = ;
  34. input.src_y = ;
  35. input.src_w = CFG_DISPLAY_WIDTH;
  36. input.src_h = CFG_DISPLAY_HEIGHT;
  37. input.src_pitch = CFG_DISPLAY_WIDTH*;
  38. input.dst_x = ;
  39. input.dst_y = ;
  40. input.dst_w = CFG_DISPLAY_WIDTH;
  41. input.dst_h = CFG_DISPLAY_HEIGHT;
  42. input.aen = ;
  43. input.alpha = 0xff;
  44.  
  45. primary_display_config_input(&input);
  46.  
  47. memset(&input, , sizeof(disp_input_config));
  48. input.layer = FB_LAYER;
  49. input.layer_en = ;
  50. input.fmt = redoffset_32bit ? eBGRA8888 : eRGBA8888;
  51. input.addr = fb_addr_pa;
  52. input.src_x = ;
  53. input.src_y = ;
  54. input.src_w = CFG_DISPLAY_WIDTH;
  55. input.src_h = CFG_DISPLAY_HEIGHT;
  56. input.src_pitch = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT)*;
  57. input.dst_x = ;
  58. input.dst_y = ;
  59. input.dst_w = CFG_DISPLAY_WIDTH;
  60. input.dst_h = CFG_DISPLAY_HEIGHT;
  61.  
  62. input.aen = ;
  63. input.alpha = 0xff;
  64. primary_display_config_input(&input);
  65.  
  66. //_mtkfb_internal_test(fb_addr, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  67.  
  68. #if 0
  69. mt_disp_parse_dfo_setting();
  70.  
  71. if (( == mt_disp_get_dfo_setting("LCM_FAKE_WIDTH", &lcm_fake_width)) && ( == mt_disp_get_dfo_setting("LCM_FAKE_HEIGHT", &lcm_fake_height))) {
  72. if (DISP_STATUS_OK != DISP_Change_LCM_Resolution(lcm_fake_width, lcm_fake_height)) {
  73. dprintf(INFO,"[DISP_DFO]WARNING!!! Change LCM Resolution FAILED!!!\n");
  74. }
  75. }
  76. #endif
  77.  
  78. }

 2. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/primary_display.c

  1. int primary_display_init(char *lcm_name)
  2. {
  3. DISPFUNC();
  4. DISP_STATUS ret = DISP_STATUS_OK;
  5. DISP_MODULE_ENUM dst_module = ;
  6.  
  7. unsigned int lcm_fake_width = ;
  8. unsigned int lcm_fake_height = ;
  9. LCM_PARAMS *lcm_param = NULL;
  10. LCM_INTERFACE_ID lcm_id = LCM_INTERFACE_NOTDEFINED;
  11.  
  12. dpmgr_init();
  13. #ifndef DDP_LK_BOOT
  14. mutex_init(&(pgc->lock));
  15. #endif
  16. _primary_path_lock();
  17.  
  18. if (pgc->plcm == NULL)
  19. pgc->plcm = disp_lcm_probe( lcm_name, LCM_INTERFACE_NOTDEFINED);
  20. mt_disp_parse_dfo_setting();
  21.  
  22. if (( == mt_disp_get_dfo_setting("LCM_FAKE_WIDTH", &lcm_fake_width)) && ( == mt_disp_get_dfo_setting("LCM_FAKE_HEIGHT", &lcm_fake_height))) {
  23.  
  24. if ( != primary_display_change_lcm_resolution(lcm_fake_width, lcm_fake_height)) {
  25. DISPERR("[DISP_DFO]WARNING!!! Change LCM Resolution FAILED!!!\n");
  26. }
  27. }
  28.  
  29. if (pgc->plcm == NULL) {
  30. DISPCHECK("disp_lcm_probe returns null\n");
  31. ret = DISP_STATUS_ERROR;
  32. goto done;
  33. } else {
  34. DISPCHECK("disp_lcm_probe SUCCESS\n");
  35. }
  36.  
  37. lcm_param = disp_lcm_get_params(pgc->plcm);
  38.  
  39. if (lcm_param == NULL) {
  40. DISPERR("get lcm params FAILED\n");
  41. ret = DISP_STATUS_ERROR;
  42. goto done;
  43. }
  44.  
  45. if (primary_display_mode == DIRECT_LINK_MODE) {
  46. _build_path_direct_link();
  47.  
  48. DISPCHECK("primary display is DIRECT LINK MODE\n");
  49. } else if (primary_display_mode == DECOUPLE_MODE) {
  50. _build_path_decouple();
  51.  
  52. DISPCHECK("primary display is DECOUPLE MODE\n");
  53. } else if (primary_display_mode == SINGLE_LAYER_MODE) {
  54. _build_path_single_layer();
  55.  
  56. DISPCHECK("primary display is SINGLE LAYER MODE\n");
  57. } else if (primary_display_mode == DEBUG_RDMA1_DSI0_MODE) {
  58. _build_path_debug_rdma1_dsi0();
  59.  
  60. DISPCHECK("primary display is DEBUG RDMA1 DSI0 MODE\n");
  61. } else {
  62. DISPCHECK("primary display mode is WRONG\n");
  63. }
  64.  
  65. _build_cmdq_trigger_loop();
  66.  
  67. DISPCHECK("primary display BUILD cmdq trigger loop finished\n");
  68.  
  69. _start_cmdq_trigger_loop();
  70.  
  71. DISPCHECK("primary display START cmdq trigger loop finished\n");
  72.  
  73. dpmgr_path_set_video_mode(pgc->dpmgr_handle, primary_display_is_video_mode());
  74.  
  75. dpmgr_path_init(pgc->dpmgr_handle, CMDQ_DISABLE);
  76.  
  77. #ifdef MACH_FPGA
  78. dpmgr_path_reset(pgc->dpmgr_handle, CMDQ_DISABLE);
  79. #endif
  80.  
  81. disp_ddp_path_config data_config;
  82. memset((void*)&data_config, , sizeof(disp_ddp_path_config));
  83.  
  84. memcpy(&(data_config.dsi_config), &(lcm_param->dsi), sizeof(LCM_DSI_PARAMS));
  85.  
  86. data_config.dst_w = lcm_param->width;
  87. data_config.dst_h = lcm_param->height;
  88. if (lcm_param->type == LCM_TYPE_DSI) {
  89. if (lcm_param->dsi.data_format.format == LCM_DSI_FORMAT_RGB888)
  90. data_config.lcm_bpp = ;
  91. else if (lcm_param->dsi.data_format.format == LCM_DSI_FORMAT_RGB565)
  92. data_config.lcm_bpp = ;
  93. else if (lcm_param->dsi.data_format.format == LCM_DSI_FORMAT_RGB666)
  94. data_config.lcm_bpp = ;
  95. } else if (lcm_param->type == LCM_TYPE_DPI) {
  96. if ( lcm_param->dpi.format == LCM_DPI_FORMAT_RGB888)
  97. data_config.lcm_bpp = ;
  98. else if ( lcm_param->dpi.format == LCM_DPI_FORMAT_RGB565)
  99. data_config.lcm_bpp = ;
  100. if ( lcm_param->dpi.format == LCM_DPI_FORMAT_RGB666)
  101. data_config.lcm_bpp = ;
  102. }
  103. data_config.dst_dirty = ;
  104. #ifdef MACH_FPGA
  105. data_config.ovl_dirty = ;
  106. #endif
  107.  
  108. ret = dpmgr_path_config(pgc->dpmgr_handle, &data_config, CMDQ_DISABLE);
  109. ret = disp_lcm_init(pgc->plcm);
  110.  
  111. if (primary_display_is_video_mode()) {
  112. dpmgr_map_event_to_irq(pgc->dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC, DDP_IRQ_RDMA0_DONE);
  113. } else {
  114.  
  115. }
  116.  
  117. dpmgr_enable_event(pgc->dpmgr_handle, DISP_PATH_EVENT_IF_VSYNC);
  118. dpmgr_enable_event(pgc->dpmgr_handle, DISP_PATH_EVENT_FRAME_DONE);
  119.  
  120. #if ROME_TODO
  121. if (esd_check_enable) {
  122. wakeup(esd_check_task);
  123. }
  124. #endif
  125.  
  126. pgc->state = ;
  127.  
  128. done:
  129.  
  130. _primary_path_unlock();
  131. return ret;
  132. }

 3. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/disp_lcm.c

  1. int disp_lcm_init(disp_lcm_handle *plcm)
  2. {
  3. DISPFUNC();
  4. LCM_DRIVER *lcm_drv = NULL;
  5. bool isLCMConnected = false;
  6.  
  7. if (_is_lcm_inited(plcm)) {
  8. lcm_drv = plcm->drv;
  9.  
  10. if (lcm_drv->init_power) {
  11. lcm_drv->init_power();
  12. }
  13.  
  14. if (lcm_drv->init) {
  15. if (!disp_lcm_is_inited(plcm)) {
  16. lcm_drv->init();
  17. }
  18. } else {
  19. DISPERR("FATAL ERROR, lcm_drv->init is null\n");
  20. return -;
  21. }
  22. #if 1
  23. if (LCM_TYPE_DSI == plcm->params->type) {
  24. int ret = ;
  25. char buffer = ;
  26. unsigned int data_array[];
  27.  
  28. /*
  29. * Some LCD may return fail when reading register 0x0A due to no getting maximum return size.
  30. * Therefore, we add a command here to read maximum return size to avoid this problem.
  31. */
  32. data_array[] = 0x00013700; /* read a byte. */
  33. ret = DSI_set_cmdq(_get_dst_module_by_lcm(plcm), NULL, data_array, , ); /* read maximum return size. */
  34. if (ret == ) {
  35. DISPMSG("read lcm maximum return size failed.\n");
  36. }
  37.  
  38. ret =
  39. DSI_dcs_read_lcm_reg_v2(_get_dst_module_by_lcm(plcm), NULL, 0x0A,
  40. &buffer, );
  41. if (ret == ) {
  42. isLCMConnected = ;
  43. DISPMSG("lcm is not connected\n");
  44. } else {
  45. isLCMConnected = ;
  46. DISPMSG("lcm is connected\n");
  47. }
  48. }
  49. if (plcm->params->dsi.edp_panel == ) {
  50. isLCMConnected = ;
  51. }
  52. plcm->is_connected = isLCMConnected;
  53. #endif
  54. return ;
  55. } else {
  56. DISPERR("plcm is null\n");
  57. return -;
  58. }
  59. }

四、 disp LOGO 初始化

vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/platform.c

  1. /* show black picture fisrtly in case of backlight is on before nothing is drawed*/
  2. mt_disp_fill_rect(, , CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT, 0x0);
  3. mt_disp_update(, , CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);

1. vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6735/mt_logo.c

  1. /*
  2. * Fill rectangle region for with black or other color
  3. *
  4. */
  5. void mt_disp_fill_rect(UINT32 left, UINT32 top,
  6. UINT32 right, UINT32 bottom,
  7. UINT32 color)
  8. {
  9. dprintf(INFO, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
  10. init_fb_screen();
  11. RECT_REGION_T rect = {left, top, right, bottom};
  12.  
  13. fill_rect_with_color(mt_get_fb_addr(), rect, color, phical_screen);
  14. }
  1. /*
  2. * Initliaze charging animation parameters
  3. *
  4. */
  5. void init_fb_screen()
  6. {
  7. dprintf(INFO, "[lk logo: %s %d]\n",__FUNCTION__,__LINE__);
  8. unsigned int fb_size = mt_get_fb_size();
  9. logo_addr = mt_get_logo_db_addr();
  10.  
  11. phical_screen.width = CFG_DISPLAY_WIDTH;
  12. phical_screen.height = CFG_DISPLAY_HEIGHT;
  13. phical_screen.fb_size = fb_size;
  14. phical_screen.fill_dst_bits = CFG_DISPLAY_BPP;
  15. phical_screen.bits_per_pixel = CFG_DISPLAY_BPP;
  16.  
  17. // in JB2.MP need to allign width and height to 32 ,but jb5.mp needn't
  18. phical_screen.needAllign = ;
  19. phical_screen.allignWidth = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT);
  20.  
  21. /* In GB, no need to adjust 180 showing logo ,for fb driver dealing the change */
  22. /* but in JB, need adjust it for screen 180 roration */
  23. phical_screen.need180Adjust = ; // need sync with chip driver
  24.  
  25. dprintf(INFO, "[lk logo: %s %d]MTK_LCM_PHYSICAL_ROTATION = %s\n",__FUNCTION__,__LINE__, MTK_LCM_PHYSICAL_ROTATION);
  26.  
  27. if ( == strncmp(MTK_LCM_PHYSICAL_ROTATION, "", )) {
  28. phical_screen.rotation = ;
  29. } else if ( == strncmp(MTK_LCM_PHYSICAL_ROTATION, "", )) {
  30. phical_screen.rotation = ;
  31. } else if ( == strncmp(MTK_LCM_PHYSICAL_ROTATION, "", ) && (phical_screen.need180Adjust == )) {
  32. phical_screen.rotation = ;
  33. } else {
  34. phical_screen.rotation = ;
  35. }
  36.  
  37. sync_anim_version();
  38. if (show_animationm_ver == ) {
  39. unsigned int logonum;
  40. unsigned int *db_addr = logo_addr;
  41.  
  42. unsigned int *pinfo = (unsigned int*)db_addr;
  43.  
  44. logonum = pinfo[];
  45. dprintf(INFO, "[lk logo: %s %d]pinfo[0]=0x%08x, pinfo[1]=0x%08x, pinfo[2]=%d\n", __FUNCTION__,__LINE__,
  46. pinfo[], pinfo[], pinfo[]);
  47.  
  48. dprintf(INFO, "[lk logo: %s %d]define ANIMATION_NEW:show new animation with capacity num\n",__FUNCTION__,__LINE__);
  49. dprintf(INFO, "[lk logo: %s %d]CAPACITY_LEFT =%d, CAPACITY_TOP =%d \n",__FUNCTION__,__LINE__,(CAPACITY_LEFT) ,(CAPACITY_TOP) );
  50. dprintf(INFO, "[lk logo: %s %d]LCM_HEIGHT=%d, LCM_WIDTH=%d \n",__FUNCTION__,__LINE__,(CAPACITY_RIGHT),(CAPACITY_BOTTOM));
  51. if (logonum < ) {
  52. show_animationm_ver = ;
  53. } else {
  54. show_animationm_ver = ;
  55. }
  56. }
  57.  
  58. }

mtk lk阶段的lcm流程的更多相关文章

  1. MSM8909中LK阶段LCM屏适配与显示流程分析(二)

    1.前言 在前面的文章MSM8909中LK阶段LCM屏适配与显示流程分析(一),链接如下: https://www.cnblogs.com/Cqlismy/p/12019317.html 介绍了如何使 ...

  2. MSM8909中LK阶段LCM屏适配与显示流程分析(一)

    1.前言 在驱动开发中,我们往往需要适配一些新的屏幕或者调试一些屏幕的参数等,对于Qualcomm的MSM8909这款SoC,当启动Android系统时,会有一个LK阶段,该阶段用来启动Linux内核 ...

  3. MTK Android Driver :Lcm

    MTK Android Driver :lcm 1.怎样新建一个LCD驱动 LCD模组主要包括LCD显示屏和驱动IC.比如LF040DNYB16a模组的驱动IC型号为NT35510.要在MTK6577 ...

  4. mtk 的conferrence call建立流程

    (重点看main_log与) 抓mtk log: 1.*#*#82533284#*#*      进入抓log UI 2.*#*#825364#*#*      进入工程模式 3.进入"Lo ...

  5. Android系统之LK启动流程分析(一)

    1.前言 LK是Little Kernel的缩写,在Qualcomm平台的Android系统中普遍采用LK作为bootloader,它是一个开源项目,LK是整个系统的引导部分,所以不是独立存在的,但是 ...

  6. MTK Android Driver知识大全

    一.Display 1.lcm 相关概念1.1) MIPI接口:一共有三种接口:DBI(也做CPU或MCU接口).DPI(也叫RGB接口).DSI.在使用DSI接口时,目前75/77都只支持到2条da ...

  7. 【转】MTK Android Driver知识大全

    原文网址:http://www.cnblogs.com/biglucky/p/4413797.html 一.Display 1.lcm 相关概念1.1) MIPI接口:一共有三种接口:DBI(也做CP ...

  8. LCM在Kernel中的代码分析

    lcm的分析首先是mtkfb.c 1.mtk_init中platform_driver_register(&mtkfb_driver)注册平台驱动 panelmaster_init(); DB ...

  9. 高通spi 屏幕 -lk代码分析

    lk SPI驱动 1. 初始化时钟 在lk中,我们是从kmain开始执行下来的,而执行顺序则是先初始化时钟,也就是在platform_early_init函数中开始执行的: 在这里我们需要修改这个函数 ...

随机推荐

  1. ARC forbids Objective-C objects in structs or unions

    解决方法有二种: 1.在出错的地方加入__unsafe_unretained 2.关闭系统ARC.1.点击project   2.点击Build Setting    3.找到其以下的Objetive ...

  2. Django的安装使用,以及建立本地网站

    一.安装Django pip install django 完成后即可 二.pycharm 建立django 点击file ——>new project 选择django项目——>more ...

  3. project管理之makefile与自己主动创建makefile文件过程

    (风雪之隅 http://www.laruence.com/2009/11/18/1154.html) Linux Makefile自己主动编译和链接使用的环境 想知道到Linux Makefile系 ...

  4. ASP.Net MVC开发基础学习笔记(8):新建数据页面

     前言 前面解说了怎样创建一个查询页面并给查询页面加入排序.搜索及分页功能.今天我们来讲讲怎样向这个列表加入数据. 解说的顺序将依照加入数据的步骤的时间顺序来进行,方便大家理清逻辑关系. 本节将涉 ...

  5. Cocos2d-x初识

    cocos2d-x引擎是什么 在学习游戏的时候就有意的搜索这方面的知识,知道游戏须要游戏引擎,引擎听着非常厉害,只是就是一个游戏框架. 或许某一个游戏框架火起来了,就非常流行了,只是我觉得不论什么游戏 ...

  6. 面试之SQL(1)--选出选课数量&gt;=2的学号

    ID      Course 1 AA 1 BB 2 AA 2 BB 2 CC 3 AA 3 BB 3 CC 3 DD 4 AA NULL NULL 选出选课数量>=2的学号 select di ...

  7. 每天进步一点点——Linux中的线程局部存储(二)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/26876231     在Linux中另一种更为高效的线程局部存储方法,就是使用keyword ...

  8. Android的logger机制分析

    分析安卓的Logger机制 一.概述 Logger机制是在Android系统中提供的一个轻量级的日志系统,这个日志系统是以驱动程序的形式在内核空间实现的,在用户空间分别提供了Java接口和C/C++接 ...

  9. javascript点滴积累

    1. javascript中的array, set, map 均为数据容器,使用iterable内置的forEach方法 var a = ['A', 'B', 'C'];a.forEach(funct ...

  10. Angularv4入门篇1

    国庆时按照官网的tutorial写了遍官方示例,一知半解,不明白angular的服务的服务为何要单独抽离出来.angular应用是如何启用的.近期打算看下angular的文档部分,然后梳理遍以理解an ...