⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 offb.c

📁 S3C44B0X下的LCD (framebuffer)驱动资料与相关代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    var->xres = var->xres_virtual = width;    var->yres = var->yres_virtual = height;    fix->line_length = pitch;    fix->smem_start = address;    fix->smem_len = pitch * height;    fix->type = FB_TYPE_PACKED_PIXELS;    fix->type_aux = 0;    info->cmap_type = cmap_unknown;    if (depth == 8)    {    	/* XXX kludge for ati's */	if (dp && !strncmp(name, "ATY,Rage128", 11)) {		unsigned long regbase = dp->addrs[2].address;		info->cmap_adr = ioremap(regbase, 0x1FFF);		info->cmap_type = cmap_r128;	} else if (dp && (!strncmp(name, "ATY,RageM3pA", 12)		|| !strncmp(name, "ATY,RageM3p12A", 14))) {		unsigned long regbase = dp->parent->addrs[2].address;		info->cmap_adr = ioremap(regbase, 0x1FFF);		info->cmap_type = cmap_M3A;	} else if (dp && !strncmp(name, "ATY,RageM3pB", 12)) {		unsigned long regbase = dp->parent->addrs[2].address;		info->cmap_adr = ioremap(regbase, 0x1FFF);		info->cmap_type = cmap_M3B;	} else if (dp && !strncmp(name, "ATY,Rage6", 9)) {		unsigned long regbase = dp->addrs[1].address;		info->cmap_adr = ioremap(regbase, 0x1FFF);		info->cmap_type = cmap_radeon;	} else if (!strncmp(name, "ATY,", 4)) {		/* Hrm... this is bad... any recent ATI not covered		 * by the previous cases will get there, while this		 * cose is only good for mach64's. Gotta figure out		 * a proper fix... --BenH.		 */		unsigned long base = address & 0xff000000UL;		info->cmap_adr = ioremap(base + 0x7ff000, 0x1000) + 0xcc0;		info->cmap_data = info->cmap_adr + 1;		info->cmap_type = cmap_m64;	} else if (dp && device_is_compatible(dp, "pci1014,b7")) {		unsigned long regbase = dp->addrs[0].address;		info->cmap_adr = ioremap(regbase + 0x6000, 0x1000);		info->cmap_type = cmap_gxt2000;	}        fix->visual = info->cmap_adr ? FB_VISUAL_PSEUDOCOLOR				     : FB_VISUAL_STATIC_PSEUDOCOLOR;    }    else	fix->visual = /*info->cmap_adr ? FB_VISUAL_DIRECTCOLOR				     : */FB_VISUAL_TRUECOLOR;    var->xoffset = var->yoffset = 0;    var->bits_per_pixel = depth;    switch (depth) {	case 8:	    var->bits_per_pixel = 8;	    var->red.offset = 0;	    var->red.length = 8;	    var->green.offset = 0;	    var->green.length = 8;	    var->blue.offset = 0;	    var->blue.length = 8;	    var->transp.offset = 0;	    var->transp.length = 0;	    break;	case 16:	/* RGB 555 */	    var->bits_per_pixel = 16;	    var->red.offset = 10;	    var->red.length = 5;	    var->green.offset = 5;	    var->green.length = 5;	    var->blue.offset = 0;	    var->blue.length = 5;	    var->transp.offset = 0;	    var->transp.length = 0;	    break;	case 32:	/* RGB 888 */	    var->bits_per_pixel = 32;	    var->red.offset = 16;	    var->red.length = 8;	    var->green.offset = 8;	    var->green.length = 8;	    var->blue.offset = 0;	    var->blue.length = 8;	    var->transp.offset = 24;	    var->transp.length = 8;	    break;    }    var->red.msb_right = var->green.msb_right = var->blue.msb_right = var->transp.msb_right = 0;    var->grayscale = 0;    var->nonstd = 0;    var->activate = 0;    var->height = var->width = -1;    var->pixclock = 10000;    var->left_margin = var->right_margin = 16;    var->upper_margin = var->lower_margin = 16;    var->hsync_len = var->vsync_len = 8;    var->sync = 0;    var->vmode = FB_VMODE_NONINTERLACED;    disp->var = *var;    disp->cmap.start = 0;    disp->cmap.len = 0;    disp->cmap.red = NULL;    disp->cmap.green = NULL;    disp->cmap.blue = NULL;    disp->cmap.transp = NULL;    disp->screen_base = ioremap(address, fix->smem_len);    disp->visual = fix->visual;    disp->type = fix->type;    disp->type_aux = fix->type_aux;    disp->ypanstep = 0;    disp->ywrapstep = 0;    disp->line_length = fix->line_length;    disp->can_soft_blank = info->cmap_adr ? 1 : 0;    disp->inverse = 0;    switch (depth) {#ifdef FBCON_HAS_CFB8        case 8:            disp->dispsw = &fbcon_cfb8;            break;#endif#ifdef FBCON_HAS_CFB16        case 16:            disp->dispsw = &fbcon_cfb16;            disp->dispsw_data = info->fbcon_cmap.cfb16;            for (i = 0; i < 16; i++)            	if (fix->visual == FB_VISUAL_TRUECOLOR)		    info->fbcon_cmap.cfb16[i] =			    (((default_blu[i] >> 3) & 0x1f) << 10) |			    (((default_grn[i] >> 3) & 0x1f) << 5) |			    ((default_red[i] >> 3) & 0x1f);		else		    info->fbcon_cmap.cfb16[i] =			    (i << 10) | (i << 5) | i;            break;#endif#ifdef FBCON_HAS_CFB32        case 32:            disp->dispsw = &fbcon_cfb32;            disp->dispsw_data = info->fbcon_cmap.cfb32;            for (i = 0; i < 16; i++)            	if (fix->visual == FB_VISUAL_TRUECOLOR)		    info->fbcon_cmap.cfb32[i] =			(default_blu[i] << 16) |			(default_grn[i] << 8) |			default_red[i];		else		    info->fbcon_cmap.cfb32[i] =			    (i << 16) | (i << 8) | i;            break;#endif        default:            disp->dispsw = &fbcon_dummy;    }    disp->scrollmode = SCROLL_YREDRAW;    strcpy(info->info.modename, "OFfb ");    strncat(info->info.modename, full_name, sizeof(info->info.modename));    info->info.node = -1;    info->info.fbops = &offb_ops;    info->info.disp = disp;    info->info.fontname[0] = '\0';    info->info.changevar = NULL;    info->info.switch_con = &offbcon_switch;    info->info.updatevar = &offbcon_updatevar;    info->info.blank = &offbcon_blank;    info->info.flags = FBINFO_FLAG_DEFAULT;    for (i = 0; i < 16; i++) {	int j = color_table[i];	info->palette[i].red = default_red[j];	info->palette[i].green = default_grn[j];	info->palette[i].blue = default_blu[j];    }    offb_set_var(var, -1, &info->info);    if (register_framebuffer(&info->info) < 0) {	kfree(info);	release_mem_region(res_start, res_size);	return;    }    printk(KERN_INFO "fb%d: Open Firmware frame buffer device on %s\n",	   GET_FB_IDX(info->info.node), full_name);#ifdef CONFIG_FB_COMPAT_XPMAC    if (!console_fb_info) {	display_info.height = var->yres;	display_info.width = var->xres;	display_info.depth = depth;	display_info.pitch = fix->line_length;	display_info.mode = 0;	strncpy(display_info.name, name, sizeof(display_info.name));	display_info.fb_address = address;	display_info.cmap_adr_address = 0;	display_info.cmap_data_address = 0;	display_info.disp_reg_address = 0;	/* XXX kludge for ati */	if (info->cmap_type == cmap_m64) {	    unsigned long base = address & 0xff000000UL;	    display_info.disp_reg_address = base + 0x7ffc00;	    display_info.cmap_adr_address = base + 0x7ffcc0;	    display_info.cmap_data_address = base + 0x7ffcc1;	}	console_fb_info = &info->info;    }#endif /* CONFIG_FB_COMPAT_XPMAC) */}static int offbcon_switch(int con, struct fb_info *info){    struct fb_info_offb *info2 = (struct fb_info_offb *)info;    /* Do we have to save the colormap? */    if (fb_display[currcon].cmap.len && !info2->blanked)	fb_get_cmap(&fb_display[currcon].cmap, 1, offb_getcolreg, info);    currcon = con;    /* Install new colormap */    do_install_cmap(con, info);    return 0;}    /*     *  Update the `var' structure (called by fbcon.c)     */static int offbcon_updatevar(int con, struct fb_info *info){    /* Nothing */    return 0;}    /*     *  Blank the display.     */static void offbcon_blank(int blank, struct fb_info *info){    struct fb_info_offb *info2 = (struct fb_info_offb *)info;    int i, j;    if (!info2->cmap_adr)	return;    if (!info2->blanked) {	if (!blank)	    return;	if (fb_display[currcon].cmap.len)	    fb_get_cmap(&fb_display[currcon].cmap, 1, offb_getcolreg, info);    }    info2->blanked = blank;    if (blank)	for (i = 0; i < 256; i++) {	    switch(info2->cmap_type) {	    case cmap_m64:	        *info2->cmap_adr = i;	  	mach_eieio();	  	for (j = 0; j < 3; j++) {		    *info2->cmap_data = 0;		    mach_eieio();	    	}	    	break;	    case cmap_M3A:		/* Clear PALETTE_ACCESS_CNTL in DAC_CNTL */		out_le32((unsigned *)(info2->cmap_adr + 0x58),			in_le32((unsigned *)(info2->cmap_adr + 0x58)) & ~0x20);	    case cmap_r128:		/* Set palette index & data */		out_8(info2->cmap_adr + 0xb0, i);		out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);		break;	    case cmap_M3B:		/* Set PALETTE_ACCESS_CNTL in DAC_CNTL */		out_le32((unsigned *)(info2->cmap_adr + 0x58),			in_le32((unsigned *)(info2->cmap_adr + 0x58)) | 0x20);		/* Set palette index & data */		out_8(info2->cmap_adr + 0xb0, i);		out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);		break;	    case cmap_radeon:		out_8(info2->cmap_adr + 0xb0, i);		out_le32((unsigned *)(info2->cmap_adr + 0xb4), 0);		break;	    case cmap_gxt2000:		out_le32((unsigned *)info2->cmap_adr + i, 0);		break;	    }	}    else	do_install_cmap(currcon, info);}    /*     *  Read a single color register and split it into     *  colors/transparent. Return != 0 for invalid regno.     */static int offb_getcolreg(u_int regno, u_int *red, u_int *green, u_int *blue,			  u_int *transp, struct fb_info *info){    struct fb_info_offb *info2 = (struct fb_info_offb *)info;    if (!info2->cmap_adr || regno > 255)	return 1;        *red = (info2->palette[regno].red<<8) | info2->palette[regno].red;    *green = (info2->palette[regno].green<<8) | info2->palette[regno].green;    *blue = (info2->palette[regno].blue<<8) | info2->palette[regno].blue;    *transp = 0;    return 0;}    /*     *  Set a single color register. The values supplied are already     *  rounded down to the hardware's capabilities (according to the     *  entries in the var structure). Return != 0 for invalid regno.     */static int offb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,			 u_int transp, struct fb_info *info){    struct fb_info_offb *info2 = (struct fb_info_offb *)info;	    if (!info2->cmap_adr || regno > 255)	return 1;    red >>= 8;    green >>= 8;    blue >>= 8;    info2->palette[regno].red = red;    info2->palette[regno].green = green;    info2->palette[regno].blue = blue;    switch(info2->cmap_type) {    case cmap_m64:        *info2->cmap_adr = regno;	mach_eieio();	*info2->cmap_data = red;	mach_eieio();	*info2->cmap_data = green;	mach_eieio();	*info2->cmap_data = blue;	mach_eieio();	break;    case cmap_M3A:	/* Clear PALETTE_ACCESS_CNTL in DAC_CNTL */	out_le32((unsigned *)(info2->cmap_adr + 0x58),		in_le32((unsigned *)(info2->cmap_adr + 0x58)) & ~0x20);    case cmap_r128:	/* Set palette index & data */	out_8(info2->cmap_adr + 0xb0, regno);	out_le32((unsigned *)(info2->cmap_adr + 0xb4),		(red << 16 | green << 8 | blue));	break;    case cmap_M3B:        /* Set PALETTE_ACCESS_CNTL in DAC_CNTL */    	out_le32((unsigned *)(info2->cmap_adr + 0x58),    		in_le32((unsigned *)(info2->cmap_adr + 0x58)) | 0x20);    	/* Set palette index & data */    	out_8(info2->cmap_adr + 0xb0, regno);  	out_le32((unsigned *)(info2->cmap_adr + 0xb4),    		(red << 16 | green << 8 | blue));    	break;    case cmap_radeon:	/* Set palette index & data (could be smarter) */	out_8(info2->cmap_adr + 0xb0, regno);  	out_le32((unsigned *)(info2->cmap_adr + 0xb4),    		(red << 16 | green << 8 | blue));	break;    case cmap_gxt2000:	out_le32((unsigned *)info2->cmap_adr + regno,		 (red << 16 | green << 8 | blue));	break;    }    if (regno < 16)	switch (info2->var.bits_per_pixel) {#ifdef FBCON_HAS_CFB16	    case 16:		info2->fbcon_cmap.cfb16[regno] = (regno << 10) | (regno << 5) | regno;		break;#endif#ifdef FBCON_HAS_CFB32	    case 32:	    {		int i = (regno << 8) | regno;		info2->fbcon_cmap.cfb32[regno] = (i << 16) | i;		break;	    }#endif       }    return 0;}static void do_install_cmap(int con, struct fb_info *info){    if (con != currcon)	return;    if (fb_display[con].cmap.len)	fb_set_cmap(&fb_display[con].cmap, 1, offb_setcolreg, info);    else    {	int size = fb_display[con].var.bits_per_pixel == 16 ? 32 : 256;	fb_set_cmap(fb_default_cmap(size), 1, offb_setcolreg, info);    }}MODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -