Chinaunix首页 | 论坛 | 博客
  • 博客访问: 230636
  • 博文数量: 48
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 548
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-28 19:18
文章分类

全部博文(48)

文章存档

2010年(6)

2009年(6)

2008年(36)

我的朋友

分类: 嵌入式

2010-03-31 15:28:47

下面从入口函数开始分析

下面从入口函数开始分析 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;
}
阅读(2568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~