[U-Boot] PATCH kup4-boards: minor configuration changes

Wolfgang Denk wd at denx.de
Wed Feb 17 21:25:26 CET 2010


Dear Heydeck, Klaus-Jürgen,

In message <DC2C564DA65CFA4AACC2C8CBF9129CCC0441403195 at EXMBX1.kiebackpeter.kup> you wrote:
> also preparation for using hwconfig and device tree support
> 
> Signed-off-by: Klaus Heydeck <heydeck at kieback-peter.de>

Please consider using git-format-patch / git-send-email for submitting
patches.

> diff -purN u-boot.git/board/kup/common/kup.c u-boot/board/kup/common/kup.c
> --- u-boot.git/board/kup/common/kup.c   2010-02-16 09:02:08.000000000 +0100
> +++ u-boot/board/kup/common/kup.c       2010-02-17 13:03:51.000000000 +0100
> @@ -24,6 +24,24 @@
>  #include <common.h>
>  #include <mpc8xx.h>
>  #include "kup.h"
> +#ifdef CONFIG_KUP4_LOGO
> +   #include "s1d13706.h"
> +#endif
> +
> +#undef DEBUG
> +#ifdef  DEBUG
> +# define debugk(fmt,args...)    printf(fmt ,##args)
> +#else
> +# define debugk(fmt,args...)
> +#endif

Please drop this. Use the standard debug() macro instead which does
the same.

> +#define PRINTF(fmt,args...)    printf(fmt ,##args)

This seems bogus to me. Please drop it.

> @@ -31,7 +49,7 @@ int misc_init_f (void)
>         volatile sysconf8xx_t *siu = &immap->im_siu_conf;
>
>         while (siu->sc_sipend & 0x20000000) {
> -               /* printf("waiting for 5V VCC\n"); */
> +                debugk("waiting for 5V VCC\n");

Please use TABs only for indentation.

> @@ -40,6 +58,14 @@ int misc_init_f (void)
>         immap->im_ioport.iop_papar &= ~(PA_RS485);
>         immap->im_ioport.iop_paodr &= ~(PA_RS485);
>         immap->im_ioport.iop_padir |= (PA_RS485);
> +
> +       /* IO Reset min 1 msec */
> +       immap->im_ioport.iop_padat |= (PA_RESET_IO_01 | PA_RESET_IO_02);
> +       immap->im_ioport.iop_papar &= ~(PA_RESET_IO_01 | PA_RESET_IO_02);
> +       immap->im_ioport.iop_paodr &= ~(PA_RESET_IO_01 | PA_RESET_IO_02);
> +       immap->im_ioport.iop_padir |= (PA_RESET_IO_01 | PA_RESET_IO_02);
> +       udelay(1000);
> +       immap->im_ioport.iop_padat &= ~(PA_RESET_IO_01 | PA_RESET_IO_02);

I am aware that the rest of the existing code is not any better, but we
should consider changing all this to using proper I/O accessors.

> +unsigned char swapbyte(unsigned char c)
> +{
> +       unsigned char result=0;
> +       int i=0;
> +       for(i=0;i<8;++i){
> +               result=result<<1;
> +               result|=(c&1);
> +               c=c>>1;
> +       }
> +       return result;
> +}

Please make this and similar functions "static".

> +/*------------------------------------------------------------------------> ----- */
> +/* Initialize the chip and the frame buffer driver. */
> +/*------------------------------------------------------------------------> ----- */

Incorrect multiline comment style.

> +       /*
> +        * Init ChipSelect #5 (S1D13768)
> +        */
> +       memctl->memc_or5 = CONFIG_SYS_OR5;
> +       memctl->memc_br5 = CONFIG_SYS_BR5;
> +       __asm__ ("eieio");

Please use I/O accessors instead.

> +       fb_info.VmemAddr = (unsigned char *) (S1D_PHYSICAL_VMEM_ADDR);
> +       fb_info.RegAddr = (unsigned char *) (S1D_PHYSICAL_REG_ADDR);
> +
> +       if ((((S1D_VALUE *) fb_info.RegAddr)[0] != 0x28)
> +           || (((S1D_VALUE *) fb_info.RegAddr)[1] != 0x14)) {

Please use I/O accessors instead. Please fix globally.

> +       ((S1D_VALUE*)fb_info.RegAddr)[0xA8] = 0x00;
> +       ((S1D_VALUE*)fb_info.RegAddr)[0xA9] = 0x80;
> +       unsigned char s1d1gpio = ((S1D_VALUE*)fb_info.RegAddr)[0xAC];

Please do not declare variables in the middle of the code.

> +       /* printf("s1d1gpio:0x%02X\n",s1d1gpio); */

Please do not add dead code. Drop this.

> +       switch (s1d1gpio){
> +
> +       case 0x02: /* STN */
> +               for (i = 0; i < sizeof (aS1DRegs_stn) / sizeof (aS1DRegs_> stn[0]); i++)
> +               {
> +                       s1dReg = aS1DRegs_stn[i].Index;
> +                       s1dValue = aS1DRegs_stn[i].Value;
> +                       ((S1D_VALUE *) fb_info.RegAddr)[s1dReg / sizeof (S1> D_VALUE)] = s1dValue;
> +               }

Incorrect brace style / indentation. Please fix globally.

Lines too long. Please fix globally.

> +               switch (bd->bi_busfreq){
> +               case 40000000:
> +                       ((S1D_VALUE *) fb_info.RegAddr)[0x05] = 0x32;
> +                       ((S1D_VALUE *) fb_info.RegAddr)[0x12] = 0x41;
> +                       break;
> +               case 48000000:
> +                       ((S1D_VALUE *) fb_info.RegAddr)[0x05] = 0x22;
> +                       ((S1D_VALUE *) fb_info.RegAddr)[0x12] = 0x34;
> +                       break;

What happens in case of rounding errors or the like?

> +               default:
> +                       printf ("KUP4 S1D1: unknown busfrequency: %ld assum> ing 64 MHz\n", bd->bi_busfreq);
> +               case 64000000:
> +                       ((S1D_VALUE *) fb_info.RegAddr)[0x05] = 0x32;
> +                       ((S1D_VALUE *) fb_info.RegAddr)[0x12] = 0x66;

For conistency, please move the default case down.

All these magic indexes and values make not much sense to me.

Please convert the code to use a proper C struct to describe the LCD
controller, use I/O accessors to access it, and define some symbolic
values for these constants.

> +       /* create and set colormap */
> +       rs = 256 / (r - 1);
> +       gs = 256 / (g - 1);
> +       bs = 256 / (b - 1);
> +       for (i = 0; i < 256; i++) {
> +               r1 = (rs * ((i / (g * b)) % r)) * 255;
> +               g1 = (gs * ((i / b) % g)) * 255;
> +               b1 = (bs * ((i) % b)) * 255;
> +               debugk ("%d %04x %04x %04x\n", i, r1 >> 4, g1 >> 4, b1 >> 4> );
> +               S1D_WRITE_PALETTE (fb_info.RegAddr, i, (r1 >> 4), (g1 >> 4),
> +                                  (b1 >> 4));

Reads a bit like black mgic to me. Please add some comments to explain
what you are doing.

> diff -purN u-boot.git/board/kup/common/s1d13706.h u-boot/board/kup/common/s> 1d13706.h
> --- u-boot.git/board/kup/common/s1d13706.h      1970-01-01 01:00:00.0000000> 00 +0100
> +++ u-boot/board/kup/common/s1d13706.h  2010-02-17 13:03:51.000000000 +0100
> @@ -0,0 +1,237 @@
> +/*------------------------------------------------------------------------> ---- */
> +/* */
> +/*  File generated by S1D13706CFG.EXE */
> +/* */
> +/*  Copyright (c) 2000,2001 Epson Research and Development, Inc. */
> +/*  All rights reserved. */

This license is not compatible with GPL. We cannot accept this file.


> +#define S1D_WRITE_PALETTE(p,i,r,g,b)  \
> +{  \
> +    ((volatile S1D_VALUE*)(p))[0x0A/sizeof(S1D_VALUE)] = (S1D_VALUE)((r)> >>4);  \
> +    ((volatile S1D_VALUE*)(p))[0x09/sizeof(S1D_VALUE)] = (S1D_VALUE)((g)> >>4);  \
> +    ((volatile S1D_VALUE*)(p))[0x08/sizeof(S1D_VALUE)] = (S1D_VALUE)((b)> >>4);  \
> +    ((volatile S1D_VALUE*)(p))[0x0B/sizeof(S1D_VALUE)] = (S1D_VALUE)(i);>   \
> +}
> +
> +#define S1D_READ_PALETTE(p,i,r,g,b)  \
> +{  \
> +    ((volatile S1D_VALUE*)(p))[0x0F/sizeof(S1D_VALUE)] = (S1D_VALUE)(i);>   \
> +    r = ((volatile S1D_VALUE*)(p))[0x0E/sizeof(S1D_VALUE)];  \
> +    g = ((volatile S1D_VALUE*)(p))[0x0D/sizeof(S1D_VALUE)];  \
> +    b = ((volatile S1D_VALUE*)(p))[0x0C/sizeof(S1D_VALUE)];  \
> +}

Please use I/O accessors instead.

> +typedef struct
> +{
> +    S1D_INDEX Index;
> +    S1D_VALUE Value;
> +} S1D_REGS;
> +
> +
> +static S1D_REGS aS1DRegs_stn[] =
> +{
> +    {0x04,0x10},   /* BUSCLK MEMCLK Config Register */
> +    {0x10,0xD0},   /* PANEL Type Register */
> +    {0x11,0x00},   /* MOD Rate Register */
> +    {0x14,0x27},   /* Horizontal Display Period Register */


NAK. Please use a proper C struct to describe the register layout.

> diff -purN u-boot.git/board/kup/kup4k/kup4k.c u-boot/board/kup/kup4k/kup4k.c
> --- u-boot.git/board/kup/kup4k/kup4k.c  2010-02-16 09:02:08.000000000 +0100
> +++ u-boot/board/kup/kup4k/kup4k.c      2010-02-17 13:03:51.000000000 +0100
...
> +        immap->im_memctl.memc_or4 = CONFIG_SYS_OR4;
> +        immap->im_memctl.memc_br4 = CONFIG_SYS_BR4;
> +        __asm__ ("eieio");
> +        latch = (uchar *)0x90000200;
> +        tmp = swapbyte (*latch);
> +        rev = (tmp & 0xF8) >> 3;
> +        mod = (tmp & 0x07);
> +
> +        i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
> +
> +       if (read_diag())
> +               gd->flags &= ~GD_FLG_SILENT;
> +
> +        printf ("Board: KUP4K Rev %d.%d AK:",rev,mod);
> +
> +       /* TI Application report: Before using the IO as an input,
> +       * a high must be written to the IO first
> +       */
> +       pcf = 0xFF;
> +       i2c_write (0x21, 0, 0 , &pcf, 1);
> +        if (i2c_read (0x21, 0, 0, &pcf, 1)) {
> +                puts ("n/a\n");
> +        }
> +        else {

Style issues: indentation not by TAB, incorrect brace style,
incorrect multiline comment style.  Please fix globally.

> +       if(rev >= 7){
> +               char* arguments[3]={"memtest","0x00000000","0x05FFFFFF"};
> +               char *s;
> +               size = 32 * 3 * 1024 * 1024;
> +               memctl->memc_or1 = CONFIG_SYS_OR1_9COL;
> +               memctl->memc_br1 = CONFIG_SYS_BR1_9COL;
> +               memctl->memc_or2 = CONFIG_SYS_OR2_9COL;
> +               memctl->memc_br2 = CONFIG_SYS_BR2_9COL;
> +               memctl->memc_or3 = CONFIG_SYS_OR3_9COL;
> +               memctl->memc_br3 = CONFIG_SYS_BR3_9COL;
> +               s = getenv ("memtest");
> +               if(s)
> +                       do_mem_mtest(0,0,3,arguments);
> +       }
> +       else{
> +               char* arguments[3]={"memtest","0x00000000","0x02FFFFFF"};
> +               char *s;
> +               size = 16 * 3 * 1024 * 1024;
> +               memctl->memc_or1 = CONFIG_SYS_OR1_8COL;
> +               memctl->memc_br1 = CONFIG_SYS_BR1_8COL;
> +               memctl->memc_or2 = CONFIG_SYS_OR2_8COL;
> +               memctl->memc_br2 = CONFIG_SYS_BR2_8COL;
> +               memctl->memc_or3 = CONFIG_SYS_OR3_8COL;
> +               memctl->memc_br3 = CONFIG_SYS_BR3_8COL;
> +               s = getenv ("memtest");
> +               if(s)
> +                       do_mem_mtest(0,0,3,arguments);
> +       }

This is mostly repeated code with a single parameter actually. Please
consider factoring out into a function.

>  int misc_init_r (void)
>  {
> -#ifdef CONFIG_STATUS_LED
> +       DECLARE_GLOBAL_DATA_PTR;

This does not work. DECLARE_GLOBAL_DATA_PTR must be done on file
level, not function level.

> +#if 0
> +       if ((char *p = getenv ("contrast")) != NULL) {
> +               char buffer[64];
> +               unsigned long contrast = simple_strtoul (p, NULL, 10) * 1> 27 / 100;
> +               sprintf(buffer,"%x",contrast);
> +               char* arguments[4]={"imw","2E","0.0",buffer};
> +               do_i2c_mw(0,0,4,arguments);
> +       }
> +#endif

Please do not add dead code.

> +       #define PC4 0x0800
> +       #define PC5 0x0400

Please unindent. And please consider moving thse defines into your
header file.

> +       int diag;
> +

Drop this blank line.

> +       immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;

And add one here (i. e. after the declarations, before the code).

> +       if(immr->im_ioport.iop_pcdat & PC4){

	if (...) {

Please mind spacing.

> +/*
> + * Device Tree Support
> + */
> +#if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
> +int fdt_set_node_and_value (void *blob,

Copied from board/keymile/common/common.c ?

> +int fdt_del_node_name (void *blob, char *nodename) {
...
> +int fdt_del_prop_name (void *blob, char *nodename, char *propname) {
...

These fdt_* functions should be factored out and added to libfdt
instead.

> diff -purN u-boot.git/include/configs/KUP4K.h u-boot/include/configs/KUP4K.h
> --- u-boot.git/include/configs/KUP4K.h  2010-02-16 09:02:08.000000000 +0100
> +++ u-boot/include/configs/KUP4K.h      2010-02-17 13:03:51.000000000 +0100
...
>  #ifdef CONFIG_POST
>      #define CONFIG_CMD_DIAG
>  #endif
>
> +
> +
> +

Excessive white space. Please fix globally.

> @@ -197,8 +192,10 @@
>  #define CONFIG_SYS_MAXARGS     16              /* max number of command args   */
>  #define CONFIG_SYS_BARGSIZE    CONFIG_SYS_CBSIZE       /* Boot Argument Buffer Size    */
>
> -#define CONFIG_SYS_MEMTEST_START       0x000400000     /* memtest works on     */
> -#define CONFIG_SYS_MEMTEST_END         0x002C00000     /* 4 ... 44 MB in DRAM  */
> +#define CONFIG_SYS_MEMTEST_START       0x000400000     /* memtest works on     */
> +#define CONFIG_SYS_MEMTEST_END         0x005C00000     /* 4 ... 92 MB in DRAM  */

Hm... this is inconsistent with your do_mem_mtest() calls above!


Best regards,

Wolfgang Denk

-- 
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
It is impractical for  the  standard  to  attempt  to  constrain  the
behavior  of code that does not obey the constraints of the standard.
                                                          - Doug Gwyn


More information about the U-Boot mailing list