飞思卡尔MX51上的FB 分析



1. 注册:
static void mxc_init_fb(void)
{
(void)platform_device_register(&lcd_svga_device);
(void)platform_device_register(&mxc_fb_device[0]);
(void)platform_device_register(&mxc_fb_device[1]);
(void)platform_device_register(&mxc_fb_device[2]);
}
lcd_svga_device:name = "lcd_elite"的具体型号LCD,能理解
mxc_fb_device:name =mxc_fb_device,id分别为0,1,2 ,不能理解!!
疑问(1):为什么这里要注册另外三个?和第一个具体型号有什么关系?

2.接口实现
 (1)mxc_ipuv3_fb.c:module_init(mxcfb_init);->platform_driver_register(&mxcfb_driver);->
  mxcfb_probe()
  在mxcfb_probe中这里和书上讲的差不多,初始化FB,register_framebuffer等,但有对上面ID=0,1,2
  的进行操作,看懂这个可能解答我的第一个疑问:
 if (pdev->id == 0) {
ipu_disp_set_global_alpha(mxcfbi->ipu_ch, true, 0x80);
ipu_disp_set_color_key(mxcfbi->ipu_ch, false, 0);
strcpy(fbi->fix.id, "DISP3 BG");

if (!g_dp_in_use)
if (ipu_request_irq(IPU_IRQ_BG_ALPHA_SYNC_EOF,
mxcfb_alpha_irq_handler, 0,
MXCFB_NAME, fbi) != 0) {
dev_err(&pdev->dev, "Error registering BG "
"alpha irq handler.\n");
ret = -EBUSY;
goto err1;
}
g_dp_in_use = true;
} else if (pdev->id == 1) {
strcpy(fbi->fix.id, "DISP3 BG - DI1");

if (!g_dp_in_use)
if (ipu_request_irq(IPU_IRQ_BG_ALPHA_SYNC_EOF,
mxcfb_alpha_irq_handler, 0,
MXCFB_NAME, fbi) != 0) {
dev_err(&pdev->dev, "Error registering BG "
"alpha irq handler.\n");
ret = -EBUSY;
goto err1;
}
g_dp_in_use = true;
} else if (pdev->id == 2) { /* Overlay */
mxcfbi->ipu_ch_irq = IPU_IRQ_FG_SYNC_EOF;
mxcfbi->ipu_ch = MEM_FG_SYNC;
mxcfbi->ipu_di = -1;
mxcfbi->overlay = true;
mxcfbi->blank = FB_BLANK_POWERDOWN;

strcpy(fbi->fix.id, "DISP3 FG");

if (ipu_request_irq(IPU_IRQ_FG_ALPHA_SYNC_EOF,
mxcfb_alpha_irq_handler, 0,
MXCFB_NAME, fbi) != 0) {
dev_err(&pdev->dev, "Error registering FG alpha irq "
"handler.\n");
ret = -EBUSY;
goto err1;
}
}
  (2)mxcfb_elite_svga.c具体lcd驱动实现:
  module_init(claa_lcd_init);->platform_driver_register(&lcd_driver);->lcd_probe
  lcd_probe这里面并只是对LCD进行硬件初始化,并没有用到register_framebuffer
  static int __devinit lcd_probe(struct platform_device *pdev)
{
int i;
struct mxc_lcd_platform_data *plat = pdev->dev.platform_data;

if (plat) {
if (plat->reset)
plat->reset();

io_reg = regulator_get(&pdev->dev, plat->io_reg);
if (!IS_ERR(io_reg)) {
regulator_set_voltage(io_reg, 2775000, 2775000);
} else {
io_reg = NULL;
}
core_reg = regulator_get(&pdev->dev, plat->core_reg);
if (!IS_ERR(core_reg)) {
regulator_set_voltage(core_reg, 3000000, 3000000);
} else {
core_reg = NULL;
}
}

for (i = 0; i < num_registered_fb; i++) {
if (strcmp(registered_fb[i]->fix.id, "DISP3 BG") == 0) {
lcd_init_fb(registered_fb[i]);
fb_show_logo(registered_fb[i], 0);
lcd_poweron();
msleep(50);
mc13892_bklit_set_dutycycle(LIT_MAIN, 64);
} else if (strcmp(registered_fb[i]->fix.id, "DISP3 FG") == 0) {
lcd_init_fb(registered_fb[i]);
}
}

fb_register_client(&nb);
register_early_suspend(&lcd_early_suspend);

plcd_dev = pdev;

return 0;
}

(3)标准kernel自带的fbmem.c中:
  module_init(fbmem_init);->fbmem_init->register_chrdev(FB_MAJOR,"fb",&fb_fops)
  这里面也注册了一个设备号FB_MAJOR,以及fb_fops
  
 疑问(2):具体在刷屏过程中,三面三个地方驱动是怎样的调用关系?
 疑问(3):fb属于字符设备(fbmem.c中),但有可定义为PLATFORM 设备(mxc_ipuv3_fb.c中),
  那具体用到fb时,是通过哪个设备接口函数来调用?
 疑问(4):书上一般把具体lcd的初始化话等工作放到mxc_ipuv3_fb.c的probe中,这里为什么
  分成两个module注册,有什么好处?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值