下面从入口函数开始分析
下面从入口函数开始分析 linux-XX/driver/video/mxc/mx2fb.c
/*****************************************************************/ 该函数是当系统运行驱动时自动调用的,主要完成的工作就是填充FB_INFO结构并注册进内核。参数 1: struct platform_device *pdev 是注册平台设备时写入的,在这里又系统填写调用本函数。相关这个参数的产生过程看我的另一个平台设备文章。
/******************************************************************/ static int mx2fb_probe(struct platform_device *pdev)
{
int ret, i; u32 pcd;
/*获得LCDC的时钟,具体用处不明 好像是要计算LCD刷新频率用*/
lcdc_clk = clk_get(&pdev->dev, "lcdc_clk");
/*将mx2fb_info结构中的所有设备轮询,本驱动中有2个设*/
/******************************************************/
static struct fb_info mx2fb_info[] = {
{.par = &mx2fbi_bg},
{.par = &mx2fbi_gw}, };
/******************************************************/
for (i = 0; i < sizeof(mx2fb_info) / sizeof(struct fb_info); i++)
{
/*安装驱动,就是填充FB_INFO和设备绑定的过程*/
if ((ret = _install_fb(&mx2fb_info[i], pdev))) { dev_err(&pdev->dev, "Failed to register framebuffer %d\n", i); return ret; } }
/*申请中断*/
_request_irq();
return 0;
}
|
/******************************************************************/
参数1:
/******************************************************************/
static int __init _install_fb(struct fb_info *info,
struct platform_device *pdev)
{
struct mx2fb_info *mx2fbi = (struct mx2fb_info *)info->par;
printk("%s\n",__FUNCTION__);
if (_init_fbinfo(info, pdev))
return -EINVAL;
if (fb_mode == 0)
fb_mode = pdev->dev.platform_data;
if (!fb_find_mode(&info->var, info, fb_mode, mxcfb_modedb,
mxcfb_modedb_sz, NULL, default_bpp)) {
fb_dealloc_cmap(&info->cmap);
return -EBUSY;
}
/* Default Y virtual size is 2x panel size */
/* info->var.yres_virtual = info->var.yres << 1; */
if (mx2fbi->type == MX2FB_TYPE_GW)
mx2fbi->blank = FB_BLANK_NORMAL;
else
mx2fbi->blank = FB_BLANK_UNBLANK;
if (mx2fb_set_par(info)) {
fb_dealloc_cmap(&info->cmap);
return -EINVAL;
}
if (register_framebuffer(info) < 0) {
_unmap_video_memory(info);
fb_dealloc_cmap(&info->cmap);
return -EINVAL;
}
mx2fbi->registered = 1;
dev_info(info->device, "fb%d: %s fb device registered successfully.\n",
info->node, info->fix.id);
return 0;
}
阅读(2606) | 评论(0) | 转发(0) |