Adding DIU support for FSL MPC5121ADS board
Wolfgang,
Please review the following patchset. It adds DIU support to 5121ADS board, using the existing DIU driver.
Regards,
York
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
@@ -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
@@ -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
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
@@ -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
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
@@ -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
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_VIDEOin config file to enable fb console.Signed-off-by York Sun <[email protected]>--- 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.cboard/ads5121/Makefile +0
-0
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.cads5121.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.cads5121_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
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