memcpy(&info->regs, &mach_info->regs, sizeof(info->regs));
/* Stop the video and unset ENVID if set */
info->regs.lcdcon1 &= ~S3C2410_LCDCON1_ENVID;
lcdcon1 = readl(S3C2410_LCDCON1);
writel(lcdcon1 & ~S3C2410_LCDCON1_ENVID, S3C2410_LCDCON1);
// add by thisway.diy@163.com, for eBlocks
s3c2410_gpio_setpin(S3C2410_GPB0, 0); // back light control
info->mach_info = pdev->dev.platform_data;
fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
fbinfo->fix.type_aux = 0;
fbinfo->fix.xpanstep = 0;
fbinfo->fix.ypanstep = 0;
fbinfo->fix.ywrapstep = 0;
fbinfo->fix.accel = FB_ACCEL_NONE;
fbinfo->var.nonstd = 0;
fbinfo->var.activate = FB_ACTIVATE_NOW;
fbinfo->var.height = mach_info->height;
fbinfo->var.width = mach_info->width;
fbinfo->var.accel_flags = 0;
fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
fbinfo->fbops = &s3c2410fb_ops;
fbinfo->flags = FBINFO_FLAG_DEFAULT;
fbinfo->pseudo_palette = &info->pseudo_pal;
fbinfo->var.xres = mach_info->xres.defval;
fbinfo->var.xres_virtual = mach_info->xres.defval;
fbinfo->var.yres = mach_info->yres.defval;
fbinfo->var.yres_virtual = mach_info->yres.defval;
fbinfo->var.bits_per_pixel = mach_info->bpp.defval;
fbinfo->var.upper_margin = S3C2410_LCDCON2_GET_VBPD(mregs->lcdcon2) + 1;
fbinfo->var.lower_margin = S3C2410_LCDCON2_GET_VFPD(mregs->lcdcon2) + 1;
fbinfo->var.vsync_len = S3C2410_LCDCON2_GET_VSPW(mregs->lcdcon2) + 1;
fbinfo->var.left_margin = S3C2410_LCDCON3_GET_HFPD(mregs->lcdcon3) + 1;
fbinfo->var.right_margin = S3C2410_LCDCON3_GET_HBPD(mregs->lcdcon3) + 1;
fbinfo->var.hsync_len = S3C2410_LCDCON4_GET_HSPW(mregs->lcdcon4) + 1;
fbinfo->var.red.offset = 11;
fbinfo->var.green.offset = 5;
fbinfo->var.blue.offset = 0;
fbinfo->var.transp.offset = 0;
fbinfo->var.red.length = 5;
fbinfo->var.green.length = 6;
fbinfo->var.blue.length = 5;
fbinfo->var.transp.length = 0;
fbinfo->fix.smem_len = mach_info->xres.max *
mach_info->yres.max *
mach_info->bpp.max / 8;//
for (i = 0; i < 256; i++)
info->palette_buffer[i] = PALETTE_BUFF_CLEAR;
if (!request_mem_region((unsigned long)S3C24XX_VA_LCD, SZ_1M, 's3c2410-lcd')) {
ret = -EBUSY;
goto dealloc_fb;
}
dprintk('got LCD regionn');
ret = request_irq(irq, s3c2410fb_irq, IRQF_DISABLED, pdev->name, info);
if (ret) {
dev_err(&pdev->dev, 'cannot get irq %d - err %dn', irq, ret);
ret = -EBUSY;
goto release_mem;
}
info->clk = clk_get(NULL, 'lcd');
if (!info->clk || IS_ERR(info->clk)) {
printk(KERN_ERR 'failed to get lcd clock sourcen');
ret = -ENOENT;
goto release_irq;
}
clk_enable(info->clk);//使能LCD时钟
dprintk('got and enabled clockn');
msleep(1);
/* Initialize video memory */
ret = s3c2410fb_map_video_memory(info);//分配显存
if (ret) {
printk( KERN_ERR 'Failed to allocate video RAM: %dn', ret);
ret = -ENOMEM;
goto release_clock;
}
dprintk('got video memoryn');
ret = s3c2410fb_init_registers(info);/*3、硬件相关的设备,配置LCD寄存器*/
ret = s3c2410fb_check_var(&fbinfo->var, fbinfo);
ret = register_framebuffer(fbinfo);/*4、注册fbinfo结构到registered_fb数组*/
if (ret < 0) {
printk(KERN_ERR 'Failed to register framebuffer device: %dn', ret);
goto free_video_memory;
}
/* create device files */
device_create_file(&pdev->dev, &dev_attr_debug);
printk(KERN_INFO 'fb%d: %s frame buffer devicen',
fbinfo->node, fbinfo->fix.id);
return 0;
free_video_memory:
s3c2410fb_unmap_video_memory(info);
release_clock:
clk_disable(info->clk);
clk_put(info->clk);
release_irq:
free_irq(irq,info);
release_mem:
release_mem_region((unsigned long)S3C24XX_VA_LCD, S3C24XX_SZ_LCD);
dealloc_fb:
framebuffer_release(fbinfo);
return ret;
}
可以看到这个函数最终是注册了fbinfo结构体到帧缓存驱动的registered_fb数组。
大概总结一下这个函数的功能:
1、分配一个fb_info结构
2、设置fb_info结构
3、硬件相关的操作,配置LCD时钟、配置IO端口、配置LCD寄存器。
4、最终注册fbinfo结构到registered_fb数组
s3c2410fb_remove函数的过程与s3c2410fb_probe函数相反
上一篇:ok6410的madplay配置
下一篇:Linux驱动之LCD驱动编写
推荐阅读最新更新时间:2026-03-21 18:47
- Er3105Di 500Ma宽输入电压同步降压稳压器内部默认参数选择典型应用示意图
- 使用 LTC2377CMS-16、16 位、500ksps、低功耗 SAR ADC 的典型应用
- L7806C负输出电压电路的典型应用
- LT3959 的典型应用 - 具有 6A、40V 开关的宽输入电压范围升压/SEPIC/反相转换器
- LPS33W适配器板,标准DIL24插座
- 使用 Analog Devices 的 LT3470AIDDB 的参考设计
- MC33364通用输入电池充电器典型应用电路
- AM2G-2405SH30Z 5V 2W DC/DC 转换器的典型应用
- 用于电池测试解决方案的 ADP1972 降压或升压、PWM 控制器的典型应用
- LT1121IS8-3.3 5V 低压差稳压器的典型应用电路,用于具有关断的电池供电电源



Linux技术手册
智能机械臂
非常经典的关于LLC的杨波博士论文
XC6406PP60DL






京公网安备 11010802033920号