MTK LCM显示驱动源码分析(二)

来源:互联网 发布:宣传海报设计app软件 编辑:程序博客网 时间:2024/05/20 14:19
三. 分析mtkfb_probe

1. mtkfb_probe 的函数调用关系

static int mtkfb_probe(struct device *dev){struct mtkfb_device *fbdev = NULL;struct fb_info *fbi;_parse_tag_videolfb(); /* 获取从lk传递过来的video参数*/fbi = framebuffer_alloc(sizeof(struct mtkfb_device), dev);      /* 分配内存,大小为 sizeof(struct mtkfb_device)+sizeof(struct fb_info) */disp_hal_allocate_framebuffer(fb_base, (fb_base + vramsize - 1), (unsigned long *)&fbdev->fb_va_base, &fb_pa);primary_display_set_frame_buffer_address((unsigned long)fbdev->fb_va_base, fb_pa);primary_display_init(mtkfb_find_lcm_driver(), lcd_fps, is_lcm_inited);  /* 初始化显示驱动*/mtkfb_fbinfo_init(fbi);  /* 初始化 fb_info */mtkfb_fbi = fbi;register_framebuffer(fbi);  /* 注册 fb_info */}

2. 分析 _parse_tag_videolfb
(1) _parse_tag_videolfb 的定义为:

/* Retrun value,  0: success, 1: fail */int _parse_tag_videolfb(void){int ret;unsigned long node = 0;if (of_scan_flat_dt(fb_early_init_dt_get_chosen, &node) > 0) {ret = __parse_tag_videolfb(node);return 0;}}
(2) __parse_tag_videolfb 的定义如下

static int __parse_tag_videolfb(unsigned long node){struct tag_videolfb *videolfb_tag = NULL;unsigned long size = 0;videolfb_tag = (struct tag_videolfb *)of_get_flat_dt_prop(node, "atag,videolfb", (int *)&size);if (videolfb_tag) {memset((void *)mtkfb_lcm_name, 0, sizeof(mtkfb_lcm_name));strcpy((char *)mtkfb_lcm_name, videolfb_tag->lcmname);mtkfb_lcm_name[strlen(videolfb_tag->lcmname)] = '\0';lcd_fps = videolfb_tag->fps;islcmconnected = videolfb_tag->islcmfound;vramsize = videolfb_tag->vram;fb_base = videolfb_tag->fb_base;lcm_hwinfo_cfg = videolfb_tag->lcdid; /* lk没有传递lcdid,lcm_hwinfo_cfg为0*/is_lcm_inited = 1;return 0;}}
(3) 事实上,在串口抓到的开机log中,可以发现以下代码:

videolfb - fb_base    = 0x9f370000videolfb - islcmfound = 1mt_disp_get_lcd_time, fps=6335videolfb - fps        = 6335videolfb - vram       = 13172736videolfb - lcm_hwinfo_cfg       = 0videolfb - lcmname    = lcm_common_drv