mt_disp_drv.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. /*
  2. * (C) Copyright 2008
  3. * MediaTek <www.mediatek.com>
  4. * Infinity Chen <infinity.chen@mediatek.com>
  5. *
  6. * See file CREDITS for list of people who contributed to this
  7. * project.
  8. */
  9. /*=======================================================================*/
  10. /* HEADER FILES */
  11. /*=======================================================================*/
  12. #include <video_fb.h>
  13. #include <platform/disp_drv_platform.h>
  14. #include <target/board.h>
  15. #include <env.h>
  16. #include "lcm_drv.h"
  17. #include <string.h>
  18. #include <stdlib.h>
  19. #include <platform/mt_gpt.h>
  20. #include <platform/primary_display.h>
  21. #include <arch/arm/mmu.h>
  22. #include "memory_layout.h"
  23. #include <platform/boot_mode.h>
  24. #include <pal_log.h>
  25. // ---------------------------------------------------------------------------
  26. // Export Functions - Display
  27. // ---------------------------------------------------------------------------
  28. unsigned long long fb_addr_pa_k = 0;
  29. static void *fb_addr_pa = NULL;
  30. static void *fb_addr = NULL;
  31. static void *tempfb_addr = NULL;
  32. static void *logo_db_addr = NULL;
  33. static void *logo_db_addr_pa = NULL;
  34. static UINT32 fb_size = 0;
  35. static UINT32 fb_offset_logo = 0; // counter of fb_size
  36. static UINT32 fb_isdirty = 0;
  37. static UINT32 redoffset_32bit = 1; // ABGR
  38. // ---------------------------------------------------------------------------
  39. // Local Variables
  40. // ---------------------------------------------------------------------------
  41. extern LCM_PARAMS *lcm_params;
  42. UINT32 mt_disp_get_vram_size(void)
  43. {
  44. return DISP_GetVRamSize();
  45. }
  46. extern void disp_log_enable(int enable);
  47. extern void dbi_log_enable(int enable);
  48. extern void * memset(void *,int,unsigned int);
  49. #if 0
  50. static disp_dfo_item_t disp_dfo_setting[] = {
  51. {"LCM_FAKE_WIDTH", 0},
  52. {"LCM_FAKE_HEIGHT", 0},
  53. {"DISP_DEBUG_SWITCH", 0}
  54. };
  55. #define MT_DISP_DFO_DEBUG
  56. #ifdef MT_DISP_DFO_DEBUG
  57. #define disp_dfo_printf(string, args...) dprintf(INFO,"[DISP_DFO]"string, ##args)
  58. #else
  59. #define disp_dfo_printf(string, args...) ()
  60. #endif
  61. unsigned int mt_disp_parse_dfo_setting(void)
  62. {
  63. unsigned int i, j=0 ;
  64. char tmp[11];
  65. char *buffer = NULL;
  66. char *ptr = NULL;
  67. buffer = (char *)get_env("DFO");
  68. disp_dfo_printf("env buffer = %s\n", buffer);
  69. if (buffer != NULL) {
  70. for (i = 0; i< (sizeof(disp_dfo_setting)/sizeof(disp_dfo_item_t)); i++) {
  71. j = 0;
  72. memset((void*)tmp, 0, sizeof(tmp)/sizeof(tmp[0]));
  73. ptr = strstr(buffer, disp_dfo_setting[i].name);
  74. if (ptr == NULL) continue;
  75. disp_dfo_printf("disp_dfo_setting[%d].name = [%s]\n", i, ptr);
  76. do {} while ((*ptr++) != ',');
  77. do {tmp[j++] = *ptr++;}
  78. while (*ptr != ',' && j < sizeof(tmp)/sizeof(tmp[0]));
  79. disp_dfo_setting[i].value = atoi((const char*)tmp);
  80. disp_dfo_printf("disp_dfo_setting[%d].name = [%s|%d]\n", i, tmp, disp_dfo_setting[i].value);
  81. }
  82. } else {
  83. disp_dfo_printf("env buffer = NULL\n");
  84. }
  85. return 0;
  86. }
  87. int mt_disp_get_dfo_setting(const char *string, unsigned int *value)
  88. {
  89. char *disp_name;
  90. int disp_value;
  91. unsigned int i = 0;
  92. if (string == NULL)
  93. return -1;
  94. for (i=0; i<(sizeof(disp_dfo_setting)/sizeof(disp_dfo_item_t)); i++) {
  95. disp_name = disp_dfo_setting[i].name;
  96. disp_value = disp_dfo_setting[i].value;
  97. if (!strcmp(disp_name, string)) {
  98. *value = disp_value;
  99. disp_dfo_printf("%s = [DEC]%d [HEX]0x%08x\n", disp_name, disp_value, disp_value);
  100. return 0;
  101. }
  102. }
  103. return 0;
  104. }
  105. #endif
  106. #define FB_LAYER 0
  107. #ifndef MTK_ROUND_CORNER_SUPPORT
  108. #define BOOT_MENU_LAYER 3
  109. #else
  110. #define ROUND_CORNER_LAYER 2
  111. #define BOOT_MENU_LAYER 1
  112. #endif
  113. static void _mtkfb_draw_block(unsigned int addr, unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned int color)
  114. {
  115. int i = 0;
  116. int j = 0;
  117. unsigned int start_addr = addr+ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT)*4*y+x*4;
  118. for (j=0; j<h; j++) {
  119. for (i = 0; i<w; i++) {
  120. *(unsigned int*)(start_addr + i*4 + j*ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT)*4) = color;
  121. }
  122. }
  123. }
  124. static int _mtkfb_internal_test(unsigned int va, unsigned int w, unsigned int h)
  125. {
  126. // this is for debug, used in bring up day
  127. unsigned int i = 0;
  128. unsigned int color = 0;
  129. int _internal_test_block_size =240;
  130. for (i=0; i<w*h/_internal_test_block_size/_internal_test_block_size; i++) {
  131. color = (i&0x1)*0xff;
  132. //color += ((i&0x2)>>1)*0xff00;
  133. //color += ((i&0x4)>>2)*0xff0000;
  134. color += 0xff000000U;
  135. _mtkfb_draw_block(va,
  136. i%(w/_internal_test_block_size)*_internal_test_block_size,
  137. i/(w/_internal_test_block_size)*_internal_test_block_size,
  138. _internal_test_block_size,
  139. _internal_test_block_size,
  140. color);
  141. }
  142. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  143. mdelay(100);
  144. primary_display_diagnose();
  145. return 0;
  146. #if 0
  147. _internal_test_block_size = 20;
  148. for (i=0; i<w*h/_internal_test_block_size/_internal_test_block_size; i++) {
  149. color = (i&0x1)*0xff;
  150. color += ((i&0x2)>>1)*0xff00;
  151. color += ((i&0x4)>>2)*0xff0000;
  152. color += 0xff000000U;
  153. _mtkfb_draw_block(va,
  154. i%(w/_internal_test_block_size)*_internal_test_block_size,
  155. i/(w/_internal_test_block_size)*_internal_test_block_size,
  156. _internal_test_block_size,
  157. _internal_test_block_size,
  158. color);
  159. }
  160. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  161. mdelay(100);
  162. primary_display_diagnose();
  163. return 0;
  164. #endif
  165. }
  166. #ifdef MTK_ROUND_CORNER_SUPPORT
  167. int round_corner_init(unsigned int *round_corner_mask_pa, LCM_ROUND_CORNER *rc_params)
  168. {
  169. unsigned int i = 0;
  170. static void *round_corner_mask_va = NULL;
  171. unsigned char *lt = rc_params->lt_addr;
  172. unsigned char *lb = rc_params->lb_addr;
  173. unsigned char *rt = rc_params->rt_addr;
  174. unsigned char *rb = rc_params->rb_addr;
  175. unsigned int w = rc_params->w;
  176. unsigned int h = rc_params->h;
  177. unsigned Bpp = 4;
  178. unsigned int width = DISP_GetScreenWidth();
  179. unsigned int height = DISP_GetScreenHeight();
  180. unsigned int buf_size = width * height * Bpp;
  181. *round_corner_mask_pa = (unsigned int)(fb_addr_pa + DISP_GetVRamSize() - buf_size);
  182. round_corner_mask_va = fb_addr + DISP_GetVRamSize() - buf_size;
  183. dprintf(0,"round_corner_mask_va: 0x%08x, round_corner_mask_pa: 0x%08x\n", (unsigned int)round_corner_mask_va, *round_corner_mask_pa);
  184. if (rc_params->is_notch) {
  185. if (h == 0 || w == 0 || lt == NULL || lb == NULL) {
  186. dprintf(CRITICAL, "the round corner params is invalid, please check the lcm config\n");
  187. return -1;
  188. }
  189. /* assemble image */
  190. for (i=0; i<h; i++) {
  191. memcpy(round_corner_mask_va+width*i*Bpp, lt+Bpp*width*i, width*Bpp);
  192. memcpy(round_corner_mask_va+width*(height-h+i)*Bpp, lb+Bpp*width*i, width*Bpp);
  193. }
  194. } else {
  195. if (h == 0 || w == 0 || lt == NULL || lb == NULL) {
  196. dprintf(0,"the round corner params is invalid, please check the lcm config\n");
  197. return -1;
  198. }
  199. dprintf(0,"assemble round corner image begin\n");
  200. /* assemble image */
  201. for (i=0; i<h; i++) {
  202. memcpy(round_corner_mask_va+width*i*Bpp, lt+Bpp*w*i, w*Bpp);
  203. memcpy(round_corner_mask_va+(width*(i+1)-w)*Bpp, rt+Bpp*w*i, w*Bpp);
  204. memcpy(round_corner_mask_va+width*(height-h+i)*Bpp, lb+Bpp*w*i, w*Bpp);
  205. memcpy(round_corner_mask_va+(width*(height-h+i+1)-w)*Bpp, rb+Bpp*w*i, w*Bpp);
  206. }
  207. }
  208. return 0;
  209. }
  210. #endif
  211. void mt_disp_init(void *lcdbase)
  212. {
  213. unsigned int lcm_fake_width = 0;
  214. unsigned int lcm_fake_height = 0;
  215. UINT32 boot_mode_addr = 0;
  216. #ifdef MTK_ROUND_CORNER_SUPPORT
  217. int ret = -1;
  218. unsigned int round_corner_mask_pa = 0;
  219. LCM_ROUND_CORNER *round_corner = primary_display_get_corner_params();
  220. #endif
  221. /// fb base pa and va
  222. fb_addr_pa_k = arm_mmu_va2pa(lcdbase);
  223. fb_addr_pa = fb_addr_pa_k & 0xffffffffull;
  224. fb_addr = lcdbase;
  225. dprintf(0,"fb_va: 0x%08x, fb_pa: 0x%08x, fb_pa_k: 0x%llx\n", (unsigned int)fb_addr, (unsigned int)fb_addr_pa, (unsigned long long int)fb_addr_pa_k);
  226. fb_size = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT) * ALIGN_TO(CFG_DISPLAY_HEIGHT, MTK_FB_ALIGNMENT) * CFG_DISPLAY_BPP / 8;
  227. // pa;
  228. boot_mode_addr = ((UINT32)fb_addr_pa + fb_size);
  229. logo_db_addr_pa = (void *)(u32)mblock_reserve_ext(&g_boot_arg->mblock_info,
  230. LK_LOGO_MAX_SIZE, 0x10000, 0x100000000, 0, "logo_db_addr_pa");
  231. if (!logo_db_addr_pa) {
  232. pal_log_err("Warning! logo_db_addr_pa is not taken from mb\n");
  233. assert(0);
  234. }
  235. // va;
  236. logo_db_addr = logo_db_addr_pa;
  237. tempfb_addr = (void *)(u32)mblock_reserve_ext(&g_boot_arg->mblock_info, (DISP_GetFBRamSize()/DISP_GetPages()),
  238. 0x10000, 0x100000000, 0, "tempfb_addr");
  239. if (!tempfb_addr) {
  240. pal_log_err("Warning! tempfb_addr is not taken from mb\n");
  241. assert(0);
  242. }
  243. fb_offset_logo = 2;
  244. primary_display_init(NULL);
  245. memset((void*)lcdbase, 0x0, DISP_GetVRamSize());
  246. disp_input_config input;
  247. memset(&input, 0, sizeof(disp_input_config));
  248. input.layer = BOOT_MENU_LAYER;
  249. input.layer_en = 1;
  250. input.fmt = redoffset_32bit ? eBGRA8888 : eRGBA8888;
  251. input.addr = boot_mode_addr;
  252. input.src_x = 0;
  253. input.src_y = 0;
  254. input.src_w = CFG_DISPLAY_WIDTH;
  255. input.src_h = CFG_DISPLAY_HEIGHT;
  256. input.src_pitch = CFG_DISPLAY_WIDTH*4;
  257. input.dst_x = 0;
  258. input.dst_y = 0;
  259. input.dst_w = CFG_DISPLAY_WIDTH;
  260. input.dst_h = CFG_DISPLAY_HEIGHT;
  261. input.aen = 1;
  262. input.alpha = 0xff;
  263. primary_display_config_input(&input);
  264. memset(&input, 0, sizeof(disp_input_config));
  265. input.layer = FB_LAYER;
  266. input.layer_en = 1;
  267. input.fmt = redoffset_32bit ? eBGRA8888 : eRGBA8888;
  268. input.addr = fb_addr_pa + fb_offset_logo * fb_size;
  269. input.src_x = 0;
  270. input.src_y = 0;
  271. input.src_w = CFG_DISPLAY_WIDTH;
  272. input.src_h = CFG_DISPLAY_HEIGHT;
  273. input.src_pitch = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT)*4;
  274. input.dst_x = 0;
  275. input.dst_y = 0;
  276. input.dst_w = CFG_DISPLAY_WIDTH;
  277. input.dst_h = CFG_DISPLAY_HEIGHT;
  278. input.aen = 1;
  279. input.alpha = 0xff;
  280. primary_display_config_input(&input);
  281. #ifdef MTK_ROUND_CORNER_SUPPORT
  282. if (round_corner != NULL)
  283. ret = round_corner_init(&round_corner_mask_pa, round_corner);
  284. if (ret == 0) {
  285. memset(&input, 0, sizeof(input));
  286. input.layer = ROUND_CORNER_LAYER;
  287. input.layer_en = 1;
  288. input.fmt = eRGBA8888;
  289. input.addr = round_corner_mask_pa;
  290. input.src_x = 0;
  291. input.src_y = 0;
  292. input.src_w = CFG_DISPLAY_WIDTH;
  293. input.src_h = CFG_DISPLAY_HEIGHT;
  294. input.src_pitch = CFG_DISPLAY_WIDTH*4;
  295. input.dst_x = 0;
  296. input.dst_y = 0;
  297. input.dst_w = CFG_DISPLAY_WIDTH;
  298. input.dst_h = CFG_DISPLAY_HEIGHT;
  299. input.aen = 1;
  300. input.alpha = 0xff;
  301. primary_display_config_input(&input);
  302. }
  303. #endif
  304. //_mtkfb_internal_test(fb_addr, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  305. #if 0
  306. mt_disp_parse_dfo_setting();
  307. if ((0 == mt_disp_get_dfo_setting("LCM_FAKE_WIDTH", &lcm_fake_width)) && (0 == mt_disp_get_dfo_setting("LCM_FAKE_HEIGHT", &lcm_fake_height))) {
  308. if (DISP_STATUS_OK != DISP_Change_LCM_Resolution(lcm_fake_width, lcm_fake_height)) {
  309. dprintf(INFO,"[DISP_DFO]WARNING!!! Change LCM Resolution FAILED!!!\n");
  310. }
  311. }
  312. #endif
  313. }
  314. void mt_disp_power(BOOL on)
  315. {
  316. return;
  317. #ifndef CFG_MT6577_FPGA
  318. if (on) {
  319. // disp_path_ddp_clock_on();
  320. DISP_PowerEnable(TRUE);
  321. DISP_PanelEnable(TRUE);
  322. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  323. } else {
  324. DISP_PanelEnable(FALSE);
  325. DISP_PowerEnable(FALSE);
  326. // disp_path_ddp_clock_off();
  327. }
  328. #endif
  329. }
  330. void mt_free_logo_from_mblock(void)
  331. {
  332. dprintf(0, "mt_free_logo_from_mblock: %d\n", fb_offset_logo);
  333. if(fb_offset_logo){
  334. memcpy(fb_addr, (void *)((UINT32)fb_addr + 2 * fb_size), fb_size);
  335. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  336. fb_offset_logo = 0;
  337. }
  338. if (logo_db_addr_pa) {
  339. mblock_create(&g_boot_arg->mblock_info,
  340. &g_boot_arg->orig_dram_info,
  341. (u64)(unsigned long)logo_db_addr_pa, (u64)(LK_LOGO_MAX_SIZE));
  342. logo_db_addr_pa = NULL;
  343. logo_db_addr = NULL;
  344. }
  345. if (tempfb_addr) {
  346. mblock_create(&g_boot_arg->mblock_info,
  347. &g_boot_arg->orig_dram_info,
  348. (u64)(unsigned long)tempfb_addr, (u64)(DISP_GetFBRamSize()/DISP_GetPages()));
  349. tempfb_addr = NULL;
  350. }
  351. }
  352. void* mt_get_logo_db_addr(void)
  353. {
  354. dprintf(0,"mt_get_logo_db_addr: 0x%08x\n", (unsigned int)logo_db_addr);
  355. return logo_db_addr;
  356. }
  357. void* mt_get_logo_db_addr_pa(void)
  358. {
  359. dprintf(0,"mt_get_logo_db_addr_pa: 0x%08x\n", (unsigned int)logo_db_addr_pa);
  360. return logo_db_addr_pa;
  361. }
  362. void* mt_get_fb_addr(void)
  363. {
  364. //fb_isdirty = 1;
  365. return (void*)((UINT32)fb_addr + fb_offset_logo * fb_size);
  366. }
  367. void* mt_get_fb_buf(void)
  368. {
  369. fb_isdirty = 1;
  370. if (fb_offset_logo == 0)
  371. return (void*)((UINT32)fb_addr + 2 * fb_size);
  372. else
  373. return (void*)((UINT32)fb_addr);
  374. }
  375. void* mt_get_tempfb_addr(void)
  376. {
  377. //use offset = 2 as tempfb for decompress logo
  378. dprintf(0,"mt_get_tempfb_addr: 0x%08x\n",(unsigned int)tempfb_addr);
  379. return tempfb_addr;
  380. }
  381. UINT32 mt_get_fb_size(void)
  382. {
  383. return fb_size;
  384. }
  385. extern void arch_clean_cache_range(addr_t start, size_t len);
  386. void mt_disp_update(UINT32 x, UINT32 y, UINT32 width, UINT32 height)
  387. {
  388. unsigned int va = 0;
  389. unsigned int pa = 0;
  390. if (fb_isdirty) {
  391. if (fb_offset_logo == 0)
  392. fb_offset_logo = 2;
  393. else
  394. fb_offset_logo = 0;
  395. pa = fb_addr_pa + fb_offset_logo * fb_size;
  396. mt_disp_config_fb_layer(pa, TRUE);
  397. fb_isdirty = 0;
  398. }
  399. va = (unsigned int)mt_get_fb_addr();
  400. dprintf(0, "mt_disp_update: 0x%08x, 0x%08x\n", va, pa);
  401. dprintf(CRITICAL,"fb dump: 0x%08x, 0x%08x, 0x%08x, 0x%08x\n",
  402. *(unsigned int*)va, *(unsigned int*)(va+4), *(unsigned int*)(va+8), *(unsigned int*)(va+0xC));
  403. arch_clean_cache_range((unsigned int)fb_addr, DISP_GetFBRamSize());
  404. primary_display_trigger(TRUE);
  405. if (!primary_display_is_video_mode()) {
  406. /*video mode no need to wait*/
  407. mdelay(30);
  408. }
  409. /*
  410. // TODO: Fixit!!!!!
  411. if(fb_isdirty)
  412. {
  413. fb_isdirty = 0;
  414. MASKREG32(0x1400E000, 0x1, 0x1); //Enable DISP MUTEX0
  415. MASKREG32(0x1400E004, 0x1, 0x0);
  416. LCD_CHECK_RET(LCD_LayerSetAddress(FB_LAYER - 1, (UINT32)fb_addr + fb_offset_logo * fb_size));
  417. printk("[wwy] hardware address = %x, fb_offset_logo = %d\n",(UINT32)fb_addr + fb_offset_logo * fb_size,fb_offset_logo);
  418. arch_clean_cache_range((unsigned int)fb_addr, DISP_GetFBRamSize());
  419. DISP_CHECK_RET(DISP_UpdateScreen(x, y, width, height));
  420. //wait reg update to set fb_offset_logo
  421. DISP_WaitRegUpdate();
  422. fb_offset_logo = fb_offset_logo ? 0 : 3;
  423. }
  424. else
  425. {
  426. arch_clean_cache_range((unsigned int)fb_addr, DISP_GetFBRamSize());
  427. DISP_CHECK_RET(DISP_UpdateScreen(x, y, width, height));
  428. }
  429. */
  430. }
  431. void mt_disp_wait_idle(void)
  432. {
  433. if (lcm_params->type==LCM_TYPE_DPI) {
  434. DPI_WaitVsync();
  435. } else if (lcm_params->type==LCM_TYPE_DBI) {
  436. LCD_WaitForNotBusy();
  437. } else if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode!=CMD_MODE) {
  438. DSI_WaitVsync();
  439. DSI_WaitVsync();
  440. } else if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode ==CMD_MODE) {
  441. DSI_WaitForNotBusy();
  442. }
  443. }
  444. static void mt_disp_adjusting_hardware_addr(void)
  445. {
  446. dprintf(0,"[wwy] mt_disp_adjusting_hardware_addr fb_offset_logo = %d\n",fb_offset_logo);
  447. if (fb_offset_logo == 0) {
  448. memcpy(fb_addr,(void *)((UINT32)fb_addr + 3 * fb_size),fb_size);
  449. mt_disp_update(0, 0, CFG_DISPLAY_WIDTH, CFG_DISPLAY_HEIGHT);
  450. }
  451. }
  452. UINT32 mt_disp_get_lcd_time(void)
  453. {
  454. unsigned int fps = 0;
  455. // TODO: will enable after te enabled
  456. fps = primary_display_get_vsync_interval();
  457. dprintf(CRITICAL, "%s, fps=%d\n", __func__, fps);
  458. if (fps)
  459. return fps;
  460. else
  461. return 6000;
  462. }
  463. void mt_disp_config_fb_layer(UINT32 addr, bool en)
  464. {
  465. disp_input_config input;
  466. dprintf(INFO, "[lk logo: %s, addr = 0x%08x\n", __FUNCTION__, addr);
  467. memset(&input, 0, sizeof(disp_input_config));
  468. input.layer = FB_LAYER;
  469. input.layer_en = en;
  470. input.fmt = redoffset_32bit ? eBGRA8888 : eRGBA8888;
  471. input.addr = addr;
  472. input.src_x = 0;
  473. input.src_y = 0;
  474. input.src_w = CFG_DISPLAY_WIDTH;
  475. input.src_h = CFG_DISPLAY_HEIGHT;
  476. input.src_pitch = ALIGN_TO(CFG_DISPLAY_WIDTH, MTK_FB_ALIGNMENT)*4;
  477. input.dst_x = 0;
  478. input.dst_y = 0;
  479. input.dst_w = CFG_DISPLAY_WIDTH;
  480. input.dst_h = CFG_DISPLAY_HEIGHT;
  481. input.aen = 1;
  482. input.alpha = 0xff;
  483. primary_display_config_input(&input);
  484. }
  485. // Attention: this api indicates whether the lcm is connected
  486. int DISP_IsLcmFound(void)
  487. {
  488. return primary_display_is_lcm_connected();
  489. }
  490. const char* mt_disp_get_lcm_id(void)
  491. {
  492. return primary_display_get_lcm_name();
  493. }
  494. void disp_get_fb_address(UINT32 *fbVirAddr, UINT32 *fbPhysAddr)
  495. {
  496. *fbVirAddr = (UINT32)fb_addr;
  497. *fbPhysAddr = (UINT32)fb_addr;
  498. }
  499. UINT32 mt_disp_get_redoffset_32bit(void)
  500. {
  501. return redoffset_32bit;
  502. }
  503. // ---------------------------------------------------------------------------
  504. // Export Functions - Console
  505. // ---------------------------------------------------------------------------
  506. #ifdef CONFIG_CFB_CONSOLE
  507. // video_hw_init -- called by drv_video_init() for framebuffer console
  508. extern UINT32 memory_size(void);
  509. void *video_hw_init (void)
  510. {
  511. static GraphicDevice s_mt65xx_gd;
  512. memset(&s_mt65xx_gd, 0, sizeof(GraphicDevice));
  513. //xuecheng, use new calculate formula;
  514. s_mt65xx_gd.frameAdrs = (UINT32)fb_addr+fb_size;//CFG_DISPLAY_WIDTH*2*(CFG_DISPLAY_HEIGHT-80);//fb_size;//memory_size() - mt_disp_get_vram_size() + fb_size;
  515. s_mt65xx_gd.winSizeX = CFG_DISPLAY_WIDTH;
  516. s_mt65xx_gd.winSizeY = CFG_DISPLAY_HEIGHT;
  517. s_mt65xx_gd.gdfIndex = GDF_32BIT_X888RGB;
  518. dprintf(0, "s_mt65xx_gd.gdfIndex=%d", s_mt65xx_gd.gdfIndex);
  519. s_mt65xx_gd.gdfBytesPP = CFG_DISPLAY_BPP / 8;
  520. s_mt65xx_gd.memSize = s_mt65xx_gd.winSizeX * s_mt65xx_gd.winSizeY * s_mt65xx_gd.gdfBytesPP;
  521. return &s_mt65xx_gd;
  522. }
  523. void video_set_lut(unsigned int index, /* color number */
  524. unsigned char r, /* red */
  525. unsigned char g, /* green */
  526. unsigned char b) /* blue */
  527. {
  528. }
  529. #endif // CONFIG_CFB_CONSOLE