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

📄 fsl_diu_fb.c

📁 U-BOOT,著名的Bootloader程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		(unsigned int)gamma_table_base);	/* Prep for DIU init  - gamma table */	for (i = 0; i <= 2; i++)		for (j = 0; j <= 255; j++)			*gamma_table_base++ = j;	if (gamma_fix == 1) {	/* fix the gamma */		debug("Fix gamma table\n");		gamma_table_base = gamma.paddr;		for (i = 0; i < 256*3; i++) {			gamma_table_base[i] = (gamma_table_base[i] << 2)				| ((gamma_table_base[i] >> 6) & 0x03);		}	}	debug("update-lcdc: HW - %p\n Disabling DIU\n", hw);	/* Program DIU registers */	hw->gamma = (unsigned int) gamma.paddr;	hw->cursor= (unsigned int) cursor.paddr;	hw->bgnd = 0x007F7F7F;				/* BGND */	hw->bgnd_wb = 0;				/* BGND_WB */	hw->disp_size = var->yres << 16 | var->xres;	/* DISP SIZE */	hw->wb_size = 0;				/* WB SIZE */	hw->wb_mem_addr = 0;				/* WB MEM ADDR */	hw->hsyn_para = var->left_margin << 22 |	/* BP_H */			var->hsync_len << 11   |	/* PW_H */			var->right_margin;		/* FP_H */	hw->vsyn_para = var->upper_margin << 22 |	/* BP_V */			var->vsync_len << 11    |	/* PW_V  */			var->lower_margin;		/* FP_V  */	hw->syn_pol = 0;			/* SYNC SIGNALS POLARITY */	hw->thresholds = 0x00037800;		/* The Thresholds */	hw->int_status = 0;			/* INTERRUPT STATUS */	hw->int_mask = 0;			/* INT MASK */	hw->plut = 0x01F5F666;	/* Pixel Clock configuration */	debug("DIU pixclock in ps - %d\n", var->pixclock);	diu_set_pixel_clock(var->pixclock);	fb_initialized = 1;	if (splash_bmp) {		info->logo_height = fsl_diu_display_bmp(splash_bmp, 0, 0, 0);		info->logo_size = info->logo_height * info->line_length;		debug("logo height %d, logo_size 0x%x\n",			info->logo_height,info->logo_size);	}	/* Enable the DIU */	fsl_diu_enable_panel(info);	enable_lcdc();	return 0;}char *fsl_fb_open(struct fb_info **info){	*info = &fsl_fb_info;	return (char *) ((unsigned int)(*info)->screen_base			 + (*info)->logo_size);}void fsl_diu_close(void){	struct fb_info *info = &fsl_fb_info;	fsl_diu_disable_panel(info);}static int fsl_diu_enable_panel(struct fb_info *info){	struct diu *hw = dr.diu_reg;	struct diu_ad *ad = &fsl_diu_fb_ad;	debug("Entered: enable_panel\n");	if (hw->desc[0] != (unsigned int)ad)		hw->desc[0] = (unsigned int)ad;	debug("desc[0] = 0x%x\n", hw->desc[0]);	return 0;}static int fsl_diu_disable_panel(struct fb_info *info){	struct diu *hw = dr.diu_reg;	debug("Entered: disable_panel\n");	if (hw->desc[0] != (unsigned int)&dummy_ad)		hw->desc[0] = (unsigned int)&dummy_ad;	return 0;}static int map_video_memory(struct fb_info *info, unsigned long bytes_align){	unsigned long offset;	unsigned long mask;	debug("Entered: map_video_memory\n");	/* allocate maximum 1280*1024 with 32bpp */	info->smem_len = 1280 * 4 *1024 + bytes_align;	debug("MAP_VIDEO_MEMORY: smem_len = %d\n", info->smem_len);	info->screen_base = malloc(info->smem_len);	if (info->screen_base == NULL) {		printf("Unable to allocate fb memory\n");		return -1;	}	info->smem_start = (unsigned int) info->screen_base;	mask = bytes_align - 1;	offset = (unsigned long)info->screen_base & mask;	if (offset) {		info->screen_base += offset;		info->smem_len = info->smem_len - (bytes_align - offset);	} else		info->smem_len = info->smem_len - bytes_align;	info->screen_size = info->smem_len;	debug("Allocated fb @ 0x%08lx, size=%d.\n",		info->smem_start, info->smem_len);	return 0;}static void enable_lcdc(void){	struct diu *hw = dr.diu_reg;	debug("Entered: enable_lcdc, fb_enabled = %d\n", fb_enabled);	if (!fb_enabled) {		hw->diu_mode = dr.mode;		fb_enabled++;	}	debug("diu_mode = %d\n", hw->diu_mode);}static void disable_lcdc(void){	struct diu *hw = dr.diu_reg;	debug("Entered: disable_lcdc, fb_enabled = %d\n", fb_enabled);	if (fb_enabled) {		hw->diu_mode = 0;		fb_enabled = 0;	}}/* * Align to 64-bit(8-byte), 32-byte, etc. */static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align){	u32 offset, ssize;	u32 mask;	debug("Entered: allocate_buf\n");	ssize = size + bytes_align;	buf->paddr = malloc(ssize);	if (!buf->paddr)		return -1;	memset(buf->paddr, 0, ssize);	mask = bytes_align - 1;	offset = (u32)buf->paddr & mask;	if (offset) {		buf->offset = bytes_align - offset;		buf->paddr = (unsigned char *) ((u32)buf->paddr + offset);	} else		buf->offset = 0;	return 0;}int fsl_diu_display_bmp(unsigned char *bmp,			int xoffset,			int yoffset,			int transpar){	struct fb_info *info = &fsl_fb_info;	unsigned char r, g, b;	unsigned int *fb_t, val;	unsigned char *bitmap;	unsigned int palette[256];	int width, height, bpp, ncolors, raster, offset, x, y, i, k, cpp;	if (!bmp) {		printf("Must supply a bitmap address\n");		return 0;	}	raster = bmp[10] + (bmp[11] << 8) + (bmp[12] << 16) + (bmp[13] << 24);	width  = (bmp[21] << 24) | (bmp[20] << 16) | (bmp[19] << 8) | bmp[18];	height = (bmp[25] << 24) | (bmp[24] << 16) | (bmp[23] << 8) | bmp[22];	bpp  = (bmp[29] <<  8) | (bmp[28]);	ncolors = bmp[46] + (bmp[47] << 8) + (bmp[48] << 16) + (bmp[49] << 24);	bitmap   = bmp + raster;	cpp = info->var.bits_per_pixel / 8;	debug("bmp = 0x%08x\n", (unsigned int)bmp);	debug("bitmap = 0x%08x\n", (unsigned int)bitmap);	debug("width = %d\n", width);	debug("height = %d\n", height);	debug("bpp = %d\n", bpp);	debug("ncolors = %d\n", ncolors);	debug("xres = %d\n", info->var.xres);	debug("yres = %d\n", info->var.yres);	debug("Screen_base = 0x%x\n", (unsigned int)info->screen_base);	if (((width+xoffset) > info->var.xres) ||	    ((height+yoffset) > info->var.yres)) {		printf("bitmap is out of range, image too large or too much offset\n");		return 0;	}	if (bpp < 24) {		for (i = 0, offset = 54; i < ncolors; i++, offset += 4)			palette[i] = (bmp[offset+2] << 16)				+ (bmp[offset+1] << 8) + bmp[offset];	}	switch (bpp) {	case 1:		for (y = height - 1; y >= 0; y--) {			fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp);			for (x = 0; x < width; x += 8) {				b = *bitmap++;				for (k = 0; k < 8; k++) {					if (b & 0x80)						*fb_t = palette[1];					else						*fb_t = palette[0];					b = b << 1;				}			}			for (i = (width / 2) % 4; i > 0; i--)				bitmap++;		}		break;	case 4:		for (y = height - 1; y >= 0; y--) {			fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp);			for (x = 0; x < width; x += 2) {				b = *bitmap++;				r = (b >> 4) & 0x0F;				g =  b & 0x0F;				*fb_t++ = palette[r];				*fb_t++ = palette[g];			}			for (i = (width / 2) % 4; i > 0; i--)				bitmap++;		}		break;	case 8:		for (y = height - 1; y >= 0; y--) {			fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp);			for (x = 0; x < width; x++) {				*fb_t++ = palette[ *bitmap++ ];			}			for (i = (width / 2) % 4; i > 0; i--)				bitmap++;		}		break;	case 24:		for (y = height - 1; y >= 0; y--) {			fb_t = (unsigned int *) ((unsigned int)info->screen_base + (((y+yoffset) * info->var.xres) + xoffset)*cpp);			for (x = 0; x < width; x++) {				b = *bitmap++;				g = *bitmap++;				r = *bitmap++;				val = (r << 16) + (g << 8) + b;				*fb_t++ = val;			}			for (; (x % 4) != 0; x++)	/* 4-byte alignment */				bitmap++;		}		break;	}	return height;}void fsl_diu_clear_screen(void){	struct fb_info *info = &fsl_fb_info;	memset(info->screen_base, 0, info->smem_len);}

⌨️ 快捷键说明

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