Skip to contentSkip to conversation

Adding DIU support for FSL MPC5121ADS board

U-Boot-Users New York Sun 2 participants 6 messages May 5, 2008 – May 9, 2008

lore
Share & tools
lore

York Sun

author
#0 lore raw

Wolfgang,

Please review the following patchset. It adds DIU support to 5121ADS board, using the existing DIU driver.

Regards,

York

author
#1 lore raw

PATCH v2 1/3 Move pixel clock setting to board file

The clock divider has different format in 5121 and 8610. This patch moves it to board specific code.

---
 board/freescale/common/fsl_diu_fb.c           |   39 +++---------------------
 board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c |   20 +++++++++++++
 2 files changed, 25 insertions(+), 34 deletions(-)
board/freescale/common/fsl_diu_fb.c +5 -34
index 2336f6b..9bdd4b9 100644
@@ -163,8 +163,6 @@ struct diu_addr {
 	unsigned int 	   offset;
 };
 
-#define FSL_DIU_BASE_OFFSET	0x2C000	/* Offset of Display Interface Unit */
-
 /*
  * Modes of operation of DIU
  */
@@ -197,7 +195,7 @@ 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);
+void diu_set_pixel_clock(unsigned int pixclock);
 
 int fsl_diu_init(int xres,
 		 unsigned int pixel_format,
@@ -209,15 +207,11 @@ int fsl_diu_init(int xres,
 	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);
+	dr.diu_reg = (struct diu *) (CFG_DIU_ADDR);
 	hw = (struct diu *) dr.diu_reg;
 
 	disable_lcdc();
@@ -336,30 +330,15 @@ int fsl_diu_init(int xres,
 			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);
+	/* Pixel Clock configuration */
+	DPRINTF("DIU pixclock in ps - %d\n", var->pixclock);
+	diu_set_pixel_clock(var->pixclock);
 
 	fb_initialized = 1;
 
@@ -466,14 +445,6 @@ static void disable_lcdc(void)
 	}
 }
 
-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.
  */
board/freescale/mpc8610hpcd/mpc8610hpcd_diu.c +20 -0
index b70637f..4db941c 100644
@@ -41,6 +41,26 @@ extern unsigned int FSL_Logo_BMP[];
 
 static int xres, yres;
 
+void diu_set_pixel_clock(unsigned int pixclock)
+{
+	volatile immap_t *immap = (immap_t *)CFG_IMMR;
+	volatile ccsr_gur_t *gur = &immap->im_gur;
+	volatile unsigned int *guts_clkdvdr = &gur->clkdvdr;
+	unsigned long speed_ccb, temp, pixval;
+
+	speed_ccb = get_bus_freq(0);
+	temp = 1000000000/pixclock;
+	temp *= 1000;
+	pixval = speed_ccb / temp;
+	debug("DIU pixval = %lu\n", pixval);
+
+	/* Modify PXCLK in GUTS CLKDVDR */
+	debug("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);
+	debug("DIU: Modified value of CLKDVDR = 0x%08x\n", *guts_clkdvdr);
+}
 
 void mpc8610hpcd_diu_init(void)
 {
Signature · 1 line
1.5.2.2
author
#2 lore raw

PATCH 2/3 Replace DPRINTF with debug

Remove DPRINTF macro and replace it with generic debug macro.

---
 board/freescale/common/fsl_diu_fb.c |   64 ++++++++++++++++-------------------
 1 files changed, 29 insertions(+), 35 deletions(-)
board/freescale/common/fsl_diu_fb.c +29 -35
index 9bdd4b9..2e0075a 100644
@@ -29,12 +29,6 @@
 
 #include "fsl_diu_fb.h"
 
-#ifdef DEBUG
-#define DPRINTF(fmt, args...) printf("%s: " fmt,__FUNCTION__,## args)
-#else
-#define DPRINTF(fmt, args...)
-#endif
-
 struct fb_videomode {
 	const char *name;	/* optional */
 	unsigned int refresh;		/* optional */
@@ -210,7 +204,7 @@ int fsl_diu_init(int xres,
 	unsigned char *gamma_table_base;
 	unsigned int i, j;
 
-	DPRINTF("Enter fsl_diu_init\n");
+	debug("Enter fsl_diu_init\n");
 	dr.diu_reg = (struct diu *) (CFG_DIU_ADDR);
 	hw = (struct diu *) dr.diu_reg;
 
@@ -224,10 +218,10 @@ int fsl_diu_init(int xres,
 
 	if (0 == fb_initialized) {
 		allocate_buf(&gamma, 768, 32);
-		DPRINTF("gamma is allocated @ 0x%x\n",
+		debug("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",
+		debug("curosr is allocated @ 0x%x\n",
 			(unsigned int)cursor.paddr);
 
 		/* create a dummy fb and dummy ad */
@@ -255,8 +249,8 @@ int fsl_diu_init(int xres,
 	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]);
+	debug("dummy dr.diu_reg->desc[0] = 0x%x\n", dr.diu_reg->desc[0]);
+	debug("dummy desc[0] = 0x%x\n", hw->desc[0]);
 
 	/* read mode info */
 	var->xres = fsl_diu_mode_db->xres;
@@ -294,7 +288,7 @@ int fsl_diu_init(int xres,
 	ad->ckmin_b = 255;
 
 	gamma_table_base = gamma.paddr;
-	DPRINTF("gamma_table_base is allocated @ 0x%x\n",
+	debug("gamma_table_base is allocated @ 0x%x\n",
 		(unsigned int)gamma_table_base);
 
 	/* Prep for DIU init  - gamma table */
@@ -304,7 +298,7 @@ int fsl_diu_init(int xres,
 			*gamma_table_base++ = j;
 
 	if (gamma_fix == 1) {	/* fix the gamma */
-		DPRINTF("Fix gamma table\n");
+		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)
@@ -312,7 +306,7 @@ int fsl_diu_init(int xres,
 		}
 	}
 
-	DPRINTF("update-lcdc: HW - %p\n Disabling DIU\n", hw);
+	debug("update-lcdc: HW - %p\n Disabling DIU\n", hw);
 
 	/* Program DIU registers */
 
@@ -337,7 +331,7 @@ int fsl_diu_init(int xres,
 	hw->plut = 0x01F5F666;
 
 	/* Pixel Clock configuration */
-	DPRINTF("DIU pixclock in ps - %d\n", var->pixclock);
+	debug("DIU pixclock in ps - %d\n", var->pixclock);
 	diu_set_pixel_clock(var->pixclock);
 
 	fb_initialized = 1;
@@ -345,7 +339,7 @@ int fsl_diu_init(int xres,
 	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",
+		debug("logo height %d, logo_size 0x%x\n",
 			info->logo_height,info->logo_size);
 	}
 
@@ -374,10 +368,10 @@ 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");
+	debug("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]);
+	debug("desc[0] = 0x%x\n", hw->desc[0]);
 	return 0;
 }
 
@@ -385,7 +379,7 @@ static int fsl_diu_disable_panel(struct fb_info *info)
 {
 	struct diu *hw = dr.diu_reg;
 
-	DPRINTF("Entered: disable_panel\n");
+	debug("Entered: disable_panel\n");
 	if (hw->desc[0] != (unsigned int)&dummy_ad)
 		hw->desc[0] = (unsigned int)&dummy_ad;
 	return 0;
@@ -396,10 +390,10 @@ 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");
+	debug("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);
+	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");
@@ -416,7 +410,7 @@ static int map_video_memory(struct fb_info *info, unsigned long bytes_align)
 
 	info->screen_size = info->smem_len;
 
-	DPRINTF("Allocated fb @ 0x%08lx, size=%d.\n",
+	debug("Allocated fb @ 0x%08lx, size=%d.\n",
 		info->smem_start, info->smem_len);
 
 	return 0;
@@ -426,19 +420,19 @@ static void enable_lcdc(void)
 {
 	struct diu *hw = dr.diu_reg;
 
-	DPRINTF("Entered: enable_lcdc, fb_enabled = %d\n", fb_enabled);
+	debug("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);
+	debug("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);
+	debug("Entered: disable_lcdc, fb_enabled = %d\n", fb_enabled);
 	if (fb_enabled) {
 		hw->diu_mode = 0;
 		fb_enabled = 0;
@@ -453,7 +447,7 @@ static int allocate_buf(struct diu_addr *buf, u32 size, u32 bytes_align)
 	u32 offset, ssize;
 	u32 mask;
 
-	DPRINTF("Entered: allocate_buf\n");
+	debug("Entered: allocate_buf\n");
 	ssize = size + bytes_align;
 	buf->paddr = malloc(ssize);
 	if (!buf->paddr)
@@ -495,16 +489,16 @@ int fsl_diu_display_bmp(unsigned char *bmp,
 	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);
+	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);
 
-	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);
+	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)) {
Signature · 1 line
1.5.2.2
author
#3 lore raw

PATCH 3/3 Adding DIU support for Freescale 5121ADS

Add DIU and cfb console support to FSL 5121ADS board.

Use #define CONFIG_VIDEO in config file to enable fb console.

---
 board/ads5121/Makefile      |    2 +-
 board/ads5121/ads5121.c     |   62 ++++++++++++++++-
 board/ads5121/ads5121_diu.c |  165 +++++++++++++++++++++++++++++++++++++++++++
 include/configs/ads5121.h   |   53 +++++++++-----
 4 files changed, 261 insertions(+), 21 deletions(-)
 create mode 100644 board/ads5121/ads5121_diu.c
board/ads5121/Makefile +1 -1
index b93bee1..8ace8a1 100644
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).a
 
-COBJS-y	:= $(BOARD).o
+COBJS-y	:= $(BOARD).o ads5121_diu.o ../freescale/common/fsl_diu_fb.o ../freescale/common/fsl_logo_bmp.o
 COBJS-$(CONFIG_PCI) += pci.o
 
 COBJS	:= $(COBJS-y)
board/ads5121/ads5121.c +61 -1

90 lines not on this page · raw message

board/ads5121/ads5121_diu.c new file +165 -0

165 lines not on this page · raw message

include/configs/ads5121.h +34 -19

83 lines not on this page · raw message

Signature · 1 line
1.5.2.2
#4 lore raw

PATCH 3/3 Adding DIU support for Freescale 5121ADS

Quoted 18 lines · In message <[email protected]> you wrote:

Add DIU and cfb console support to FSL 5121ADS board.

Use #define CONFIG_VIDEO in config file to enable fb console.

---
 board/ads5121/Makefile      |    2 +-
 board/ads5121/ads5121.c     |   62 ++++++++++++++++-
 board/ads5121/ads5121_diu.c |  165 +++++++++++++++++++++++++++++++++++++++++++
 include/configs/ads5121.h   |   53 +++++++++-----
 4 files changed, 261 insertions(+), 21 deletions(-)
 create mode 100644 board/ads5121/ads5121_diu.c
board/ads5121/Makefile +0 -0
index b93bee1..8ace8a1 100644

board/ads5121/Makefile include $(TOPDIR)/config.mk · line 28

Quoted 5 lines
board/ads5121/Makefile +1 -1
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
 
 LIB	= $(obj)lib$(BOARD).a
 
-COBJS-y	:= $(BOARD).o
+COBJS-y	:= $(BOARD).o ads5121_diu.o ../freescale/common/fsl_diu_fb.o ../freescale/common/fsl_logo_bmp.o

This line is way too long, and it doesn't work with out-of-tree builds.

Try something like:

	make O=/tmp/ads5121 ads5121_config
	make O=/tmp/ads5121 all

and you will get:

make[1]: Entering directory `/home/wd/git/u-boot/testing/board/ads5121'
ppc_6xx-gcc -g -Os -fPIC -ffixed-r14 -meabi -D__KERNEL__ -DTEXT_BASE=0xFFF00000 -I/tmp/ads5121/include2 -I/tmp/ads5121/include -I/home/wd/git/u-boot/testing/include -fno-builtin -ffreestanding -nostdinc -isystem /opt/eldk-4.2-2008-03-27/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include -pipe -DCONFIG_PPC -D__powerpc__ -DCONFIG_MPC512X -DCONFIG_E300 -ffixed-r2 -msoft-float -mcpu=603e -Wall -Wstrict-prototypes -c -o /tmp/ads5121/board/ads5121/ads5121.o ads5121.c
ads5121.c: In function 'misc_init_r':
ads5121.c:225: warning: implicit declaration of function 'i2c_set_bus_num'
ads5121.c:227: warning: implicit declaration of function 'i2c_write'
ads5121.c:230: warning: implicit declaration of function 'i2c_read'
ppc_6xx-gcc -g -Os -fPIC -ffixed-r14 -meabi -D__KERNEL__ -DTEXT_BASE=0xFFF00000 -I/tmp/ads5121/include2 -I/tmp/ads5121/include -I/home/wd/git/u-boot/testing/include -fno-builtin -ffreestanding -nostdinc -isystem /opt/eldk-4.2-2008-03-27/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include -pipe -DCONFIG_PPC -D__powerpc__ -DCONFIG_MPC512X -DCONFIG_E300 -ffixed-r2 -msoft-float -mcpu=603e -Wall -Wstrict-prototypes -c -o /tmp/ads5121/board/ads5121/ads5121_diu.o ads5121_diu.c
ads5121_diu.c: In function 'video_hw_init':
ads5121_diu.c:122: warning: 'return' with no value, in function returning non-void
ppc_6xx-gcc -g -Os -fPIC -ffixed-r14 -meabi -D__KERNEL__ -DTEXT_BASE=0xFFF00000 -I/tmp/ads5121/include2 -I/tmp/ads5121/include -I/home/wd/git/u-boot/testing/include -fno-builtin -ffreestanding -nostdinc -isystem /opt/eldk-4.2-2008-03-27/usr/bin/../lib/gcc/powerpc-linux/4.2.2/include -pipe -DCONFIG_PPC -D__powerpc__ -DCONFIG_MPC512X -DCONFIG_E300 -ffixed-r2 -msoft-float -mcpu=603e -Wall -Wstrict-prototypes -c -o /tmp/ads5121/board/ads5121/../freescale/common/fsl_diu_fb.o ../freescale/common/fsl_diu_fb.c
Assembler messages:
Fatal error: can't create /tmp/ads5121/board/ads5121/../freescale/common/fsl_diu_fb.o: No such file or directory make[1]: *** [/tmp/ads5121/board/ads5121/../freescale/common/fsl_diu_fb.o] Error 2
make[1]: Leaving directory `/home/wd/git/u-boot/testing/board/ads5121'
make: *** [/tmp/ads5121/board/ads5121/libads5121.a] Error 2

Please also fix the warnings, when you are at it...

Best regards,

Wolfgang Denk

Signature · 5 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
"I think trash is the most important manifestation of culture we have
in my lifetime."                                      - Johnny Legend
#5 lore raw
In reply to York Sun

Dear York,

Quoted 3 lines · in message <[email protected]> you wrote:

Please review the following patchset. It adds DIU support to 5121ADS board, using the existing DIU driver.

I really appreciate these patches.

With a little cleanup they will go into the next release.

There is just a Makefile issue with patch #3 (breaks out-of-tree builds, see next message).

It will be sufficient to submit an incremental patch, though.

Note: I added the code (as is) to the "ads5121" branch of the u-boot-testing repository, see
http://git.denx.de/?p=u-boot/u-boot-testing.git;a=shortlog;h=refs/heads/ads5121

Best regards,

Wolfgang Denk

Signature · 7 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
On my planet, to rest is to rest -- to cease using energy. To me,  it
is  quite  illogical to run up and down on green grass, using energy,
instead of saving it.
	-- Spock, "Shore Leave", stardate 3025.2