8610: Add 8610 DIU display driver
1280x1024 and 1024x768 @ 32 bpp are supported now.
DVI, Single-link LVDS, Double-link LVDS are all supported.
Environmental variable "monitor" is used to specify monitor port.
A new command "diufb" is introduced to reinitialize monitor
and display a BMP file in the memory. So far, 1-bit, 4-bit,
8-bit and 24-bit BMP formats are supported.
    diufb init
        - initialize the diu driver
    Enable the port specified in the environmental variable "monitor"
    diufb addr
        - display bmp file in memory.
    The bmp image should be no bigger than the resolution, 1280x1024
    for DVI and double-link LVDS, 1024x768 for single-link LVDS.
Note, this driver allocate memory but doesn't free it after use
It is written on purpose -- to avoid a failure of reallocation
due to memory fragement.
ECC of DDR is disabled for DIU performance. L2 data cache is also disabled.
Signed-off-by: York Sun <yorksun@freescale.com>
Signed-off-by: Jon loeliger <jdl@freescale.com>
			
			
This commit is contained in:
		
							parent
							
								
									52e5ddfecd
								
							
						
					
					
						commit
						a877880c69
					
				|  | @ -31,7 +31,9 @@ LIB	= $(obj)lib$(VENDOR).a | ||||||
| 
 | 
 | ||||||
| COBJS	:= sys_eeprom.o	\
 | COBJS	:= sys_eeprom.o	\
 | ||||||
| 	   pixis.o	\
 | 	   pixis.o	\
 | ||||||
| 	   pq-mds-pib.o | 	   pq-mds-pib.o \
 | ||||||
|  | 	   fsl_logo_bmp.o \
 | ||||||
|  | 	   fsl_diu_fb.o | ||||||
| 
 | 
 | ||||||
| SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) | ||||||
| OBJS	:= $(addprefix $(obj),$(COBJS)) | OBJS	:= $(addprefix $(obj),$(COBJS)) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,656 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright 2007 Freescale Semiconductor, Inc. | ||||||
|  |  * York Sun <yorksun@freescale.com> | ||||||
|  |  * | ||||||
|  |  * FSL DIU Framebuffer driver | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <i2c.h> | ||||||
|  | #include <malloc.h> | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_FSL_DIU_FB | ||||||
|  | 
 | ||||||
|  | #include "fsl_diu_fb.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #ifdef DEBUG | ||||||
|  | #define DPRINTF(fmt, args...) printf("%s: " fmt,__FUNCTION__,## args) | ||||||
|  | #else | ||||||
|  | #define DPRINTF(fmt, args...) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | struct fb_var_screeninfo { | ||||||
|  | 	unsigned int xres;		/* visible resolution		*/ | ||||||
|  | 	unsigned int yres; | ||||||
|  | 
 | ||||||
|  | 	unsigned int bits_per_pixel;	/* guess what			*/ | ||||||
|  | 
 | ||||||
|  | 	/* Timing: All values in pixclocks, except pixclock (of course) */ | ||||||
|  | 	unsigned int pixclock;		/* pixel clock in ps (pico seconds) */ | ||||||
|  | 	unsigned int left_margin;	/* time from sync to picture	*/ | ||||||
|  | 	unsigned int right_margin;	/* time from picture to sync	*/ | ||||||
|  | 	unsigned int upper_margin;	/* time from sync to picture	*/ | ||||||
|  | 	unsigned int lower_margin; | ||||||
|  | 	unsigned int hsync_len;		/* length of horizontal sync	*/ | ||||||
|  | 	unsigned int vsync_len;		/* length of vertical sync	*/ | ||||||
|  | 	unsigned int sync;		/* see FB_SYNC_*		*/ | ||||||
|  | 	unsigned int vmode;		/* see FB_VMODE_*		*/ | ||||||
|  | 	unsigned int rotate;		/* angle we rotate counter clockwise */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct fb_info { | ||||||
|  | 	struct fb_var_screeninfo var;	/* Current var */ | ||||||
|  | 	unsigned long smem_start;	/* Start of frame buffer mem */ | ||||||
|  | 					/* (physical address) */ | ||||||
|  | 	unsigned int smem_len;		/* Length of frame buffer mem */ | ||||||
|  | 	unsigned int type;		/* see FB_TYPE_*		*/ | ||||||
|  | 	unsigned int line_length;	/* length of a line in bytes    */ | ||||||
|  | 
 | ||||||
|  | 	char *screen_base; | ||||||
|  | 	unsigned long screen_size; | ||||||
|  | 	int logo_height; | ||||||
|  | 	unsigned int logo_size; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct fb_videomode { | ||||||
|  | 	const char *name;	/* optional */ | ||||||
|  | 	unsigned int refresh;		/* optional */ | ||||||
|  | 	unsigned int xres; | ||||||
|  | 	unsigned int yres; | ||||||
|  | 	unsigned int pixclock; | ||||||
|  | 	unsigned int left_margin; | ||||||
|  | 	unsigned int right_margin; | ||||||
|  | 	unsigned int upper_margin; | ||||||
|  | 	unsigned int lower_margin; | ||||||
|  | 	unsigned int hsync_len; | ||||||
|  | 	unsigned int vsync_len; | ||||||
|  | 	unsigned int sync; | ||||||
|  | 	unsigned int vmode; | ||||||
|  | 	unsigned int flag; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define FB_SYNC_VERT_HIGH_ACT	2	/* vertical sync high active	*/ | ||||||
|  | #define FB_SYNC_COMP_HIGH_ACT	8	/* composite sync high active   */ | ||||||
|  | #define FB_VMODE_NONINTERLACED  0	/* non interlaced */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * These parameters give default parameters | ||||||
|  |  * for video output 1024x768, | ||||||
|  |  * FIXME - change timing to proper amounts | ||||||
|  |  * hsync 31.5kHz, vsync 60Hz | ||||||
|  |  */ | ||||||
|  | static struct fb_videomode fsl_diu_mode_1024 = { | ||||||
|  | 	.refresh	= 60, | ||||||
|  | 	.xres		= 1024, | ||||||
|  | 	.yres		= 768, | ||||||
|  | 	.pixclock	= 15385, | ||||||
|  | 	.left_margin	= 160, | ||||||
|  | 	.right_margin	= 24, | ||||||
|  | 	.upper_margin	= 29, | ||||||
|  | 	.lower_margin	= 3, | ||||||
|  | 	.hsync_len	= 136, | ||||||
|  | 	.vsync_len	= 6, | ||||||
|  | 	.sync		= FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||||||
|  | 	.vmode		= FB_VMODE_NONINTERLACED | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static struct fb_videomode fsl_diu_mode_1280 = { | ||||||
|  | 	.name		= "1280x1024-60", | ||||||
|  | 	.refresh	= 60, | ||||||
|  | 	.xres		= 1280, | ||||||
|  | 	.yres		= 1024, | ||||||
|  | 	.pixclock	= 9375, | ||||||
|  | 	.left_margin	= 38, | ||||||
|  | 	.right_margin	= 128, | ||||||
|  | 	.upper_margin	= 2, | ||||||
|  | 	.lower_margin	= 7, | ||||||
|  | 	.hsync_len	= 216, | ||||||
|  | 	.vsync_len	= 37, | ||||||
|  | 	.sync		= FB_SYNC_COMP_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||||||
|  | 	.vmode		= FB_VMODE_NONINTERLACED | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * These are the fields of area descriptor(in DDR memory) for every plane | ||||||
|  |  */ | ||||||
|  | struct diu_ad { | ||||||
|  | 	/* Word 0(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int pix_fmt; /* hard coding pixel format */ | ||||||
|  | 	/* Word 1(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int addr; | ||||||
|  | 	/* Word 2(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int src_size_g_alpha; | ||||||
|  | 	/* Word 3(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int aoi_size; | ||||||
|  | 	/* Word 4(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int offset_xyi; | ||||||
|  | 	/* Word 5(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int offset_xyd; | ||||||
|  | 	/* Word 6(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int ckmax_r:8; | ||||||
|  | 	unsigned int ckmax_g:8; | ||||||
|  | 	unsigned int ckmax_b:8; | ||||||
|  | 	unsigned int res9:8; | ||||||
|  | 	/* Word 7(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int ckmin_r:8; | ||||||
|  | 	unsigned int ckmin_g:8; | ||||||
|  | 	unsigned int ckmin_b:8; | ||||||
|  | 	unsigned int res10:8; | ||||||
|  | 	/* Word 8(32-bit) in DDR memory */ | ||||||
|  | 	unsigned int next_ad; | ||||||
|  | 	/* Word 9(32-bit) in DDR memory, just for 64-bit aligned */ | ||||||
|  | 	unsigned int res1; | ||||||
|  | 	unsigned int res2; | ||||||
|  | 	unsigned int res3; | ||||||
|  | }__attribute__ ((packed)); | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * DIU register map | ||||||
|  |  */ | ||||||
|  | struct diu { | ||||||
|  | 	unsigned int desc[3]; | ||||||
|  | 	unsigned int gamma; | ||||||
|  | 	unsigned int pallete; | ||||||
|  | 	unsigned int cursor; | ||||||
|  | 	unsigned int curs_pos; | ||||||
|  | 	unsigned int diu_mode; | ||||||
|  | 	unsigned int bgnd; | ||||||
|  | 	unsigned int bgnd_wb; | ||||||
|  | 	unsigned int disp_size; | ||||||
|  | 	unsigned int wb_size; | ||||||
|  | 	unsigned int wb_mem_addr; | ||||||
|  | 	unsigned int hsyn_para; | ||||||
|  | 	unsigned int vsyn_para; | ||||||
|  | 	unsigned int syn_pol; | ||||||
|  | 	unsigned int thresholds; | ||||||
|  | 	unsigned int int_status; | ||||||
|  | 	unsigned int int_mask; | ||||||
|  | 	unsigned int colorbar[8]; | ||||||
|  | 	unsigned int filling; | ||||||
|  | 	unsigned int plut; | ||||||
|  | } __attribute__ ((packed)); | ||||||
|  | 
 | ||||||
|  | struct diu_hw { | ||||||
|  | 	struct diu *diu_reg; | ||||||
|  | 	volatile unsigned int mode;		/* DIU operation mode */ | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct diu_addr { | ||||||
|  | 	unsigned char  *  paddr;	/* Virtual address */ | ||||||
|  | 	unsigned int 	   offset; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #define FSL_DIU_BASE_OFFSET	0x2C000	/* Offset of Display Interface Unit */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Modes of operation of DIU | ||||||
|  |  */ | ||||||
|  | #define MFB_MODE0	0	/* DIU off */ | ||||||
|  | #define MFB_MODE1	1	/* All three planes output to display */ | ||||||
|  | #define MFB_MODE2	2	/* Plane 1 to display, | ||||||
|  | 				 * planes 2+3 written back to memory */ | ||||||
|  | #define MFB_MODE3	3	/* All three planes written back to memory */ | ||||||
|  | #define MFB_MODE4	4	/* Color bar generation */ | ||||||
|  | 
 | ||||||
|  | #define MAX_CURS		32 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | static struct fb_info fsl_fb_info; | ||||||
|  | static struct diu_addr gamma, cursor; | ||||||
|  | static struct diu_ad fsl_diu_fb_ad __attribute__ ((aligned(32))); | ||||||
|  | static struct diu_ad dummy_ad __attribute__ ((aligned(32))); | ||||||
|  | static unsigned char *dummy_fb; | ||||||
|  | static struct diu_hw dr = { | ||||||
|  | 	.mode = MFB_MODE1, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | int fb_enabled = 0; | ||||||
|  | int fb_initialized = 0; | ||||||
|  | const int default_xres = 1280; | ||||||
|  | const int default_pixel_format = 0x88882317; | ||||||
|  | 
 | ||||||
|  | static int map_video_memory(struct fb_info *info, unsigned long bytes_align); | ||||||
|  | static void enable_lcdc(void); | ||||||
|  | static void disable_lcdc(void); | ||||||
|  | static int fsl_diu_enable_panel(struct fb_info *info); | ||||||
|  | static int fsl_diu_disable_panel(struct fb_info *info); | ||||||
|  | static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align); | ||||||
|  | static u32 get_busfreq(void); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | int fsl_diu_init(int xres, | ||||||
|  | 		 unsigned int pixel_format, | ||||||
|  | 		 int gamma_fix, | ||||||
|  | 		 unsigned char *splash_bmp) | ||||||
|  | { | ||||||
|  | 	struct fb_videomode *fsl_diu_mode_db; | ||||||
|  | 	struct diu_ad *ad = &fsl_diu_fb_ad; | ||||||
|  | 	struct diu *hw; | ||||||
|  | 	struct fb_info *info = &fsl_fb_info; | ||||||
|  | 	struct fb_var_screeninfo *var = &info->var; | ||||||
|  | 	volatile immap_t *immap = (immap_t *)CFG_IMMR; | ||||||
|  | 	volatile ccsr_gur_t *gur = &immap->im_gur; | ||||||
|  | 	volatile unsigned int *guts_clkdvdr = &gur->clkdvdr; | ||||||
|  | 	unsigned char *gamma_table_base; | ||||||
|  | 	unsigned int i, j; | ||||||
|  | 	unsigned long speed_ccb, temp, pixval; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("Enter fsl_diu_init\n"); | ||||||
|  | 	dr.diu_reg = (struct diu *) (CFG_IMMR + FSL_DIU_BASE_OFFSET); | ||||||
|  | 	hw = (struct diu *) dr.diu_reg; | ||||||
|  | 
 | ||||||
|  | 	disable_lcdc(); | ||||||
|  | 
 | ||||||
|  | 	if (xres == 1280) { | ||||||
|  | 		fsl_diu_mode_db = &fsl_diu_mode_1280; | ||||||
|  | 	} else { | ||||||
|  | 		fsl_diu_mode_db = &fsl_diu_mode_1024; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (0 == fb_initialized) { | ||||||
|  | 		allocate_buf(&gamma, 768, 32); | ||||||
|  | 		DPRINTF("gamma is allocated @ 0x%x\n", | ||||||
|  | 			(unsigned int)gamma.paddr); | ||||||
|  | 		allocate_buf(&cursor, MAX_CURS * MAX_CURS * 2, 32); | ||||||
|  | 		DPRINTF("curosr is allocated @ 0x%x\n", | ||||||
|  | 			(unsigned int)cursor.paddr); | ||||||
|  | 
 | ||||||
|  | 		/* create a dummy fb and dummy ad */ | ||||||
|  | 		dummy_fb = malloc(64); | ||||||
|  | 		if (NULL == dummy_fb) { | ||||||
|  | 			printf("Cannot allocate dummy fb\n"); | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  | 		dummy_ad.addr = cpu_to_le32((unsigned int)dummy_fb); | ||||||
|  | 		dummy_ad.pix_fmt = 0x88882317; | ||||||
|  | 		dummy_ad.src_size_g_alpha = 0x04400000;	/* alpha = 0 */ | ||||||
|  | 		dummy_ad.aoi_size = 0x02000400; | ||||||
|  | 		dummy_ad.offset_xyi = 0; | ||||||
|  | 		dummy_ad.offset_xyd = 0; | ||||||
|  | 		dummy_ad.next_ad = 0; | ||||||
|  | 		/* Memory allocation for framebuffer */ | ||||||
|  | 		if (map_video_memory(info, 32)) { | ||||||
|  | 			printf("Unable to allocate fb memory 1\n"); | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		memset(info->screen_base, 0, info->smem_len); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dr.diu_reg->desc[0] = (unsigned int) &dummy_ad; | ||||||
|  | 	dr.diu_reg->desc[1] = (unsigned int) &dummy_ad; | ||||||
|  | 	dr.diu_reg->desc[2] = (unsigned int) &dummy_ad; | ||||||
|  | 	DPRINTF("dummy dr.diu_reg->desc[0] = 0x%x\n", dr.diu_reg->desc[0]); | ||||||
|  | 	DPRINTF("dummy desc[0] = 0x%x\n", hw->desc[0]); | ||||||
|  | 
 | ||||||
|  | 	/* read mode info */ | ||||||
|  | 	var->xres = fsl_diu_mode_db->xres; | ||||||
|  | 	var->yres = fsl_diu_mode_db->yres; | ||||||
|  | 	var->bits_per_pixel = 32; | ||||||
|  | 	var->pixclock = fsl_diu_mode_db->pixclock; | ||||||
|  | 	var->left_margin = fsl_diu_mode_db->left_margin; | ||||||
|  | 	var->right_margin = fsl_diu_mode_db->right_margin; | ||||||
|  | 	var->upper_margin = fsl_diu_mode_db->upper_margin; | ||||||
|  | 	var->lower_margin = fsl_diu_mode_db->lower_margin; | ||||||
|  | 	var->hsync_len = fsl_diu_mode_db->hsync_len; | ||||||
|  | 	var->vsync_len = fsl_diu_mode_db->vsync_len; | ||||||
|  | 	var->sync = fsl_diu_mode_db->sync; | ||||||
|  | 	var->vmode = fsl_diu_mode_db->vmode; | ||||||
|  | 	info->line_length = var->xres * var->bits_per_pixel / 8; | ||||||
|  | 	info->logo_size = 0; | ||||||
|  | 	info->logo_height = 0; | ||||||
|  | 
 | ||||||
|  | 	ad->pix_fmt = pixel_format; | ||||||
|  | 	ad->addr    = cpu_to_le32((unsigned int)info->screen_base); | ||||||
|  | 	ad->src_size_g_alpha | ||||||
|  | 			= cpu_to_le32((var->yres << 12) | var->xres); | ||||||
|  | 	/* fix me. AOI should not be greater than display size */ | ||||||
|  | 	ad->aoi_size 	= cpu_to_le32(( var->yres << 16) |  var->xres); | ||||||
|  | 	ad->offset_xyi = 0; | ||||||
|  | 	ad->offset_xyd = 0; | ||||||
|  | 
 | ||||||
|  | 	/* Disable chroma keying function */ | ||||||
|  | 	ad->ckmax_r = 0; | ||||||
|  | 	ad->ckmax_g = 0; | ||||||
|  | 	ad->ckmax_b = 0; | ||||||
|  | 
 | ||||||
|  | 	ad->ckmin_r = 255; | ||||||
|  | 	ad->ckmin_g = 255; | ||||||
|  | 	ad->ckmin_b = 255; | ||||||
|  | 
 | ||||||
|  | 	gamma_table_base = gamma.paddr; | ||||||
|  | 	DPRINTF("gamma_table_base is allocated @ 0x%x\n", | ||||||
|  | 		(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 */ | ||||||
|  | 		DPRINTF("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); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("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  */ | ||||||
|  | 
 | ||||||
|  | 	/* Pixel Clock configuration */ | ||||||
|  | 	DPRINTF("DIU: Bus Frequency = %d\n", get_busfreq()); | ||||||
|  | 	speed_ccb = get_busfreq(); | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("DIU pixclock in ps - %d\n", var->pixclock); | ||||||
|  | 	temp = 1; | ||||||
|  | 	temp *= 1000000000; | ||||||
|  | 	temp /= var->pixclock; | ||||||
|  | 	temp *= 1000; | ||||||
|  | 	pixval = speed_ccb / temp; | ||||||
|  | 	DPRINTF("DIU pixval = %lu\n", pixval); | ||||||
|  | 
 | ||||||
|  | 	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; | ||||||
|  | 
 | ||||||
|  | 	/* Modify PXCLK in GUTS CLKDVDR */ | ||||||
|  | 	DPRINTF("DIU: Current value of CLKDVDR = 0x%08x\n", *guts_clkdvdr); | ||||||
|  | 	temp = *guts_clkdvdr & 0x2000FFFF; | ||||||
|  | 	*guts_clkdvdr = temp;				/* turn off clock */ | ||||||
|  | 	*guts_clkdvdr = temp | 0x80000000 | ((pixval & 0x1F) << 16); | ||||||
|  | 	DPRINTF("DIU: Modified value of CLKDVDR = 0x%08x\n", *guts_clkdvdr); | ||||||
|  | 
 | ||||||
|  | 	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; | ||||||
|  | 		DPRINTF("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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("Entered: enable_panel\n"); | ||||||
|  | 	if (hw->desc[0] != (unsigned int)ad) | ||||||
|  | 		hw->desc[0] = (unsigned int)ad; | ||||||
|  | 	DPRINTF("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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("Entered: map_video_memory\n"); | ||||||
|  | 	/* allocate maximum 1280*1024 with 32bpp */ | ||||||
|  | 	info->smem_len = 1280 * 4 *1024 + bytes_align; | ||||||
|  | 	DPRINTF("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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("Entered: enable_lcdc, fb_enabled = %d\n", fb_enabled); | ||||||
|  | 	if (!fb_enabled) { | ||||||
|  | 		hw->diu_mode = dr.mode; | ||||||
|  | 		fb_enabled++; | ||||||
|  | 	} | ||||||
|  | 	DPRINTF("diu_mode = %d\n", hw->diu_mode); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void disable_lcdc(void) | ||||||
|  | { | ||||||
|  | 	struct diu *hw = dr.diu_reg; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("Entered: disable_lcdc, fb_enabled = %d\n", fb_enabled); | ||||||
|  | 	if (fb_enabled) { | ||||||
|  | 		hw->diu_mode = 0; | ||||||
|  | 		fb_enabled = 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static u32 get_busfreq(void) | ||||||
|  | { | ||||||
|  | 	u32 fs_busfreq = 0; | ||||||
|  | 
 | ||||||
|  | 	fs_busfreq = get_bus_freq(0); | ||||||
|  | 	return fs_busfreq; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * 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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("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; | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("bmp = 0x%08x\n", (unsigned int)bmp); | ||||||
|  | 	DPRINTF("bitmap = 0x%08x\n", (unsigned int)bitmap); | ||||||
|  | 	DPRINTF("width = %d\n", width); | ||||||
|  | 	DPRINTF("height = %d\n", height); | ||||||
|  | 	DPRINTF("bpp = %d\n", bpp); | ||||||
|  | 	DPRINTF("ncolors = %d\n", ncolors); | ||||||
|  | 
 | ||||||
|  | 	DPRINTF("xres = %d\n", info->var.xres); | ||||||
|  | 	DPRINTF("yres = %d\n", info->var.yres); | ||||||
|  | 	DPRINTF("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); | ||||||
|  | } | ||||||
|  | #endif /* CONFIG_FSL_DIU_FB */ | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright 2007 Freescale Semiconductor, Inc. | ||||||
|  |  * York Sun <yorksun@freescale.com> | ||||||
|  |  * | ||||||
|  |  * FSL DIU Framebuffer driver | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | extern int fsl_diu_init(int xres, | ||||||
|  | 			unsigned int pixel_format, | ||||||
|  | 			int gamma_fix, | ||||||
|  | 			unsigned char *splash_bmp); | ||||||
|  | extern void fsl_diu_clear_screen(void); | ||||||
|  | extern int fsl_diu_display_bmp(unsigned char *bmp, | ||||||
|  | 			       int xoffset, | ||||||
|  | 			       int yoffset, | ||||||
|  | 			       int transpar); | ||||||
|  | @ -29,7 +29,9 @@ LIB	= $(obj)lib$(BOARD).a | ||||||
| 
 | 
 | ||||||
| COBJS	:= $(BOARD).o \
 | COBJS	:= $(BOARD).o \
 | ||||||
| 	../common/sys_eeprom.o \
 | 	../common/sys_eeprom.o \
 | ||||||
| 	../common/pixis.o | 	../common/pixis.o \
 | ||||||
|  | 	mpc8610hpcd_diu.o \
 | ||||||
|  | 	../common/fsl_diu_fb.o | ||||||
| 
 | 
 | ||||||
| SOBJS	:= init.o | SOBJS	:= init.o | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -54,7 +54,47 @@ int board_early_init_f(void) | ||||||
| 	volatile immap_t *immap = (immap_t *)CFG_IMMR; | 	volatile immap_t *immap = (immap_t *)CFG_IMMR; | ||||||
| 	volatile ccsr_gur_t *gur = &immap->im_gur; | 	volatile ccsr_gur_t *gur = &immap->im_gur; | ||||||
| 
 | 
 | ||||||
| 	gur->gpiocr |= 0x888a5500; /* DIU16, IR1, UART0, UART2 */ | 	gur->gpiocr |= 0x88aa5500; /* DIU16, IR1, UART0, UART2 */ | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int misc_init_r(void) | ||||||
|  | { | ||||||
|  | 	u8 tmp_val, version; | ||||||
|  | 
 | ||||||
|  | 	/*Do not use 8259PIC*/ | ||||||
|  | 	tmp_val = in8(PIXIS_BASE + PIXIS_BRDCFG0); | ||||||
|  | 	out8(PIXIS_BASE + PIXIS_BRDCFG0, tmp_val | 0x80); | ||||||
|  | 
 | ||||||
|  | 	/*For FPGA V7 or higher, set the IRQMAPSEL to 0 to use MAP0 interrupt*/ | ||||||
|  | 	version = in8(PIXIS_BASE + PIXIS_PVER); | ||||||
|  | 	if(version >= 0x07) { | ||||||
|  | 		tmp_val = in8(PIXIS_BASE + PIXIS_BRDCFG0); | ||||||
|  | 		out8(PIXIS_BASE + PIXIS_BRDCFG0, tmp_val & 0xbf); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Using this for DIU init before the driver in linux takes over
 | ||||||
|  | 	 *  Enable the TFP410 Encoder (I2C address 0x38) | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	tmp_val = 0xBF; | ||||||
|  | 	i2c_write(0x38, 0x08, 1, &tmp_val, sizeof(tmp_val)); | ||||||
|  | 	/* Verify if enabled */ | ||||||
|  | 	tmp_val = 0; | ||||||
|  | 	i2c_read(0x38, 0x08, 1, &tmp_val, sizeof(tmp_val)); | ||||||
|  | 	debug("DVI Encoder Read: 0x%02lx\n",tmp_val); | ||||||
|  | 
 | ||||||
|  | 	tmp_val = 0x10; | ||||||
|  | 	i2c_write(0x38, 0x0A, 1, &tmp_val, sizeof(tmp_val)); | ||||||
|  | 	/* Verify if enabled */ | ||||||
|  | 	tmp_val = 0; | ||||||
|  | 	i2c_read(0x38, 0x0A, 1, &tmp_val, sizeof(tmp_val)); | ||||||
|  | 	debug("DVI Encoder Read: 0x%02lx\n",tmp_val); | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_FSL_DIU_FB | ||||||
|  | 	mpc8610hpcd_diu_init(); | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -62,7 +102,6 @@ int board_early_init_f(void) | ||||||
| int checkboard(void) | int checkboard(void) | ||||||
| { | { | ||||||
| 	volatile immap_t *immap = (immap_t *)CFG_IMMR; | 	volatile immap_t *immap = (immap_t *)CFG_IMMR; | ||||||
| 	volatile ccsr_lbc_t *memctl = &immap->im_lbc; |  | ||||||
| 	volatile ccsr_local_mcm_t *mcm = &immap->im_local_mcm; | 	volatile ccsr_local_mcm_t *mcm = &immap->im_local_mcm; | ||||||
| 
 | 
 | ||||||
| 	puts("Board: MPC8610HPCD\n"); | 	puts("Board: MPC8610HPCD\n"); | ||||||
|  | @ -468,7 +507,7 @@ ft_board_setup(void *blob, bd_t *bd) | ||||||
| unsigned long | unsigned long | ||||||
| get_board_sys_clk(ulong dummy) | get_board_sys_clk(ulong dummy) | ||||||
| { | { | ||||||
| 	u8 i, go_bit, rd_clks; | 	u8 i; | ||||||
| 	ulong val = 0; | 	ulong val = 0; | ||||||
| 	ulong a; | 	ulong a; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,105 @@ | ||||||
|  | /*
 | ||||||
|  |  * Copyright 2007 Freescale Semiconductor, Inc. | ||||||
|  |  * York Sun <yorksun@freescale.com> | ||||||
|  |  * | ||||||
|  |  * FSL DIU Framebuffer driver | ||||||
|  |  * | ||||||
|  |  * See file CREDITS for list of people who contributed to this | ||||||
|  |  * project. | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||||||
|  |  * MA 02111-1307 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <command.h> | ||||||
|  | #include <asm/io.h> | ||||||
|  | 
 | ||||||
|  | #ifdef CONFIG_FSL_DIU_FB | ||||||
|  | 
 | ||||||
|  | #include "../common/pixis.h" | ||||||
|  | #include "../common/fsl_diu_fb.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | extern unsigned int FSL_Logo_BMP[]; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void mpc8610hpcd_diu_init(void) | ||||||
|  | { | ||||||
|  | 	char *monitor_port; | ||||||
|  | 	int xres, gamma_fix; | ||||||
|  | 	unsigned int pixel_format; | ||||||
|  | 	unsigned char tmp_val; | ||||||
|  | 
 | ||||||
|  | 	tmp_val = in8(PIXIS_BASE + PIXIS_BRDCFG0); | ||||||
|  | 	monitor_port = getenv ("monitor"); | ||||||
|  | 
 | ||||||
|  | 	if (!strncmp(monitor_port, "0", 1)) {	/* 0 - DVI */ | ||||||
|  | 		xres = 1280; | ||||||
|  | 		pixel_format = 0x88882317; | ||||||
|  | 		gamma_fix = 0; | ||||||
|  | 		out8(PIXIS_BASE + PIXIS_BRDCFG0, tmp_val | 0x08); | ||||||
|  | 
 | ||||||
|  | 	} else if (!strncmp(monitor_port, "1", 1)) { /* 1 - Single link LVDS */ | ||||||
|  | 		xres = 1024; | ||||||
|  | 		pixel_format = 0x88883316; | ||||||
|  | 		gamma_fix = 0; | ||||||
|  | 		out8(PIXIS_BASE + PIXIS_BRDCFG0, (tmp_val & 0xf7) | 0x10); | ||||||
|  | 
 | ||||||
|  | 	} else if (!strncmp(monitor_port, "2", 1)) { /* 2 - Double link LVDS */ | ||||||
|  | 		xres = 1280; | ||||||
|  | 		pixel_format = 0x88883316; | ||||||
|  | 		gamma_fix = 1; | ||||||
|  | 		out8(PIXIS_BASE + PIXIS_BRDCFG0, tmp_val & 0xe7); | ||||||
|  | 
 | ||||||
|  | 	} else {	/* DVI */ | ||||||
|  | 		xres = 1280; | ||||||
|  | 		pixel_format = 0x88882317; | ||||||
|  | 		gamma_fix = 0; | ||||||
|  | 		out8(PIXIS_BASE + PIXIS_BRDCFG0, tmp_val | 0x08); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fsl_diu_init(xres, pixel_format, gamma_fix, | ||||||
|  | 		     (unsigned char *)FSL_Logo_BMP); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int mpc8610diu_init_show_bmp(cmd_tbl_t *cmdtp, | ||||||
|  | 			     int flag, int argc, char *argv[]) | ||||||
|  | { | ||||||
|  | 	unsigned int addr; | ||||||
|  | 
 | ||||||
|  | 	if (argc < 2) { | ||||||
|  | 		printf ("Usage:\n%s\n", cmdtp->usage); | ||||||
|  | 		return 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!strncmp(argv[1],"init",4)) { | ||||||
|  | 		mpc8610hpcd_diu_init(); | ||||||
|  | 	} else { | ||||||
|  | 		addr = simple_strtoul(argv[1], NULL, 16); | ||||||
|  | 		fsl_diu_clear_screen(); | ||||||
|  | 		fsl_diu_display_bmp((unsigned char *)addr, 0, 0, 0); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | U_BOOT_CMD( | ||||||
|  | 	diufb, CFG_MAXARGS, 1, mpc8610diu_init_show_bmp, | ||||||
|  | 	"diufb init | addr - Init or Display BMP file\n", | ||||||
|  | 	"init\n    - initialize DIU\n" | ||||||
|  | 	"addr\n    - display bmp at address 'addr'\n" | ||||||
|  | 	); | ||||||
|  | #endif /* CONFIG_FSL_DIU_FB */ | ||||||
|  | @ -21,6 +21,7 @@ | ||||||
| #define CONFIG_NUM_CPUS		1	/* Number of CPUs in the system */ | #define CONFIG_NUM_CPUS		1	/* Number of CPUs in the system */ | ||||||
| #define CONFIG_LINUX_RESET_VEC	0x100	/* Reset vector used by Linux */ | #define CONFIG_LINUX_RESET_VEC	0x100	/* Reset vector used by Linux */ | ||||||
| 
 | 
 | ||||||
|  | #define CONFIG_FSL_DIU_FB	1	/* FSL DIU */ | ||||||
| #ifdef RUN_DIAG | #ifdef RUN_DIAG | ||||||
| #define CFG_DIAG_ADDR		0xff800000 | #define CFG_DIAG_ADDR		0xff800000 | ||||||
| #endif | #endif | ||||||
|  | @ -38,7 +39,7 @@ | ||||||
| #define CONFIG_SPD_EEPROM		/* Use SPD for DDR */ | #define CONFIG_SPD_EEPROM		/* Use SPD for DDR */ | ||||||
| #undef CONFIG_DDR_DLL			/* possible DLL fix needed */ | #undef CONFIG_DDR_DLL			/* possible DLL fix needed */ | ||||||
| #define CONFIG_DDR_2T_TIMING		/* Sets the 2T timing bit */ | #define CONFIG_DDR_2T_TIMING		/* Sets the 2T timing bit */ | ||||||
| #define CONFIG_DDR_ECC			/* only for ECC DDR module */ | #undef  CONFIG_DDR_ECC			/* only for ECC DDR module */ | ||||||
| #define CONFIG_ECC_INIT_VIA_DDRCONTROLLER	/* DDR controller or DMA? */ | #define CONFIG_ECC_INIT_VIA_DDRCONTROLLER	/* DDR controller or DMA? */ | ||||||
| #define CONFIG_MEM_INIT_VALUE		0xDeadBeef | #define CONFIG_MEM_INIT_VALUE		0xDeadBeef | ||||||
| #define CONFIG_NUM_DDR_CONTROLLERS	1 | #define CONFIG_NUM_DDR_CONTROLLERS	1 | ||||||
|  | @ -51,13 +52,14 @@ | ||||||
|  */ |  */ | ||||||
| #define CFG_L2 | #define CFG_L2 | ||||||
| #define L2_INIT		0 | #define L2_INIT		0 | ||||||
| #define L2_ENABLE	(L2CR_L2E) | #define L2_ENABLE	(L2CR_L2E |0x00100000 ) | ||||||
| 
 | 
 | ||||||
| #ifndef CONFIG_SYS_CLK_FREQ | #ifndef CONFIG_SYS_CLK_FREQ | ||||||
| #define CONFIG_SYS_CLK_FREQ	get_board_sys_clk(0) | #define CONFIG_SYS_CLK_FREQ	get_board_sys_clk(0) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define CONFIG_BOARD_EARLY_INIT_F	1	/* Call board_pre_init */ | #define CONFIG_BOARD_EARLY_INIT_F	1	/* Call board_pre_init */ | ||||||
|  | #define CONFIG_MISC_INIT_R		1 | ||||||
| 
 | 
 | ||||||
| #undef	CFG_DRAM_TEST			/* memory test, takes time */ | #undef	CFG_DRAM_TEST			/* memory test, takes time */ | ||||||
| #define CFG_MEMTEST_START	0x00200000	/* memtest region */ | #define CFG_MEMTEST_START	0x00200000	/* memtest region */ | ||||||
|  | @ -159,6 +161,7 @@ | ||||||
| #define PIXIS_RST		0x4	/* PIXIS Reset Control register */ | #define PIXIS_RST		0x4	/* PIXIS Reset Control register */ | ||||||
| #define PIXIS_AUX		0x6	/* PIXIS Auxiliary register; Scratch */ | #define PIXIS_AUX		0x6	/* PIXIS Auxiliary register; Scratch */ | ||||||
| #define PIXIS_SPD		0x7	/* Register for SYSCLK speed */ | #define PIXIS_SPD		0x7	/* Register for SYSCLK speed */ | ||||||
|  | #define PIXIS_BRDCFG0		0x8	/* PIXIS Board Configuration Register0*/ | ||||||
| #define PIXIS_VCTL		0x10	/* VELA Control Register */ | #define PIXIS_VCTL		0x10	/* VELA Control Register */ | ||||||
| #define PIXIS_VCFGEN0		0x12	/* VELA Config Enable 0 */ | #define PIXIS_VCFGEN0		0x12	/* VELA Config Enable 0 */ | ||||||
| #define PIXIS_VCFGEN1		0x13	/* VELA Config Enable 1 */ | #define PIXIS_VCFGEN1		0x13	/* VELA Config Enable 1 */ | ||||||
|  | @ -208,7 +211,7 @@ | ||||||
| #define CFG_INIT_SP_OFFSET	CFG_GBL_DATA_OFFSET | #define CFG_INIT_SP_OFFSET	CFG_GBL_DATA_OFFSET | ||||||
| 
 | 
 | ||||||
| #define CFG_MONITOR_LEN		(512 * 1024)	/* Reserve 512 KB for Mon */ | #define CFG_MONITOR_LEN		(512 * 1024)	/* Reserve 512 KB for Mon */ | ||||||
| #define CFG_MALLOC_LEN		(128 * 1024)	/* Reserved for malloc */ | #define CFG_MALLOC_LEN		(6 * 1024 * 1024)	/* Reserved for malloc */ | ||||||
| 
 | 
 | ||||||
| /* Serial Port */ | /* Serial Port */ | ||||||
| #define CONFIG_CONS_INDEX	1 | #define CONFIG_CONS_INDEX	1 | ||||||
|  | @ -474,6 +477,9 @@ | ||||||
| 
 | 
 | ||||||
| #undef CONFIG_WATCHDOG			/* watchdog disabled */ | #undef CONFIG_WATCHDOG			/* watchdog disabled */ | ||||||
| 
 | 
 | ||||||
|  | /*DIU Configuration*/ | ||||||
|  | #define DIU_CONNECT_TO_DVI		/* DIU controller connects to DVI encoder*/ | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Miscellaneous configurable options |  * Miscellaneous configurable options | ||||||
|  */ |  */ | ||||||
|  | @ -621,7 +627,8 @@ | ||||||
|  "diuregs=md e002c000 1d\0" \ |  "diuregs=md e002c000 1d\0" \ | ||||||
|  "dium=mw e002c01c\0" \ |  "dium=mw e002c01c\0" \ | ||||||
|  "diuerr=md e002c014 1\0" \ |  "diuerr=md e002c014 1\0" \ | ||||||
|  "othbootargs=debug\0" \ |  "othbootargs=diufb=15M video=fslfb:1280x1024-32@60,monitor=0 debug\0" \ | ||||||
|  |  "monitor=0-DVI\0" \ | ||||||
|  "pmregs=md e00e1000 2b\0" \ |  "pmregs=md e00e1000 2b\0" \ | ||||||
|  "lawregs=md e0000c08 4b\0" \ |  "lawregs=md e0000c08 4b\0" \ | ||||||
|  "lbcregs=md e0005000 36\0" \ |  "lbcregs=md e0005000 36\0" \ | ||||||
|  | @ -641,7 +648,9 @@ | ||||||
|  "ramdiskfile=8610hpcd/ramdisk.uboot\0"                         \ |  "ramdiskfile=8610hpcd/ramdisk.uboot\0"                         \ | ||||||
|  "dtbaddr=c00000\0"                                             \ |  "dtbaddr=c00000\0"                                             \ | ||||||
|  "dtbfile=8610hpcd/mpc8610_hpcd.dtb\0"                          \ |  "dtbfile=8610hpcd/mpc8610_hpcd.dtb\0"                          \ | ||||||
|  "bdev=sda3\0" |  "bdev=sda3\0"							\ | ||||||
|  |  "othbootargs=diufb=15M video=fslfb:1280x1024-32@60,monitor=0\0"\ | ||||||
|  |  "monitor=0-DVI\0" | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define CONFIG_NFSBOOTCOMMAND					\ | #define CONFIG_NFSBOOTCOMMAND					\ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue