Serial console settings nightmare...

Garcia Jérémie GARCIAJ at 3il.fr
Tue May 10 23:45:42 EST 2005


Hi everybody,
I'm trying to get a montavista hardhat pro 3.1 (kernel 2.4.20) running on our hardware. This one uses a ppc 405 EP.
In order to do that, we use a vxWorks bootloader to download via ftp the linux image (zImage.treeboot) in  memory. 
We had to modify some parts of linux code to achieve that. Indeed, linux bootstrap (which relocate & decompress) waits a board info structure from the bootloader;
in our case the vxWorks bootloader was not able to do that so we had this in a static way :

/**********************/
/*   ppc4xx_setup.c   */
/**********************/
void __init
platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
	      unsigned long r6, unsigned long r7)
{
  parse_bootinfo(find_bootinfo());

/* We use VxWorks bootrom, so we have to create ourselves the boot info structure */
  bd_t my_bd_t;
  
  strcpy(my_bd_t.bi_s_version,"v1");                  /*  Version of this structure   */
  strcpy(my_bd_t.bi_r_version,"bootrom linux 1.0") ;  /*  Version of the IBM ROM      */
  my_bd_t.bi_memsize        = 16*1024*1024 ;          /* DRAM installed, in bytes     */
  my_bd_t.bi_intfreq      = 200000000 ;     /* Processor speed, in Hz       */
  my_bd_t.bi_busfreq      = 100000000 ;     /* PLB Bus speed, in Hz         */
  my_bd_t.bi_pllouta_freq = 400000000 ;     /* PLL OUTA speed, in Hz        */
  my_bd_t.bi_opb_busfreq  = 50000000 ;      /* OPB Bus speed, in Hz         */
  my_bd_t.bi_iic_fast[0]  = 0 ;             /* Use fast i2c mode            */        
  
  memcpy((void *) __res, (void *) &my_bd_t,sizeof (bd_t));

...

/**********************/
/*   embed_config.c   */
/**********************/
bd_t * get_board_info(void)
{
  my_strcpy(my_bd_t.bi_s_version,"v1");                   /*  Version of this structure   */
  my_strcpy(my_bd_t.bi_r_version,"bootrom linux 1.0") ;   /*  Version of the IBM ROM      */
  my_bd_t.bi_memsize = 16*1024*1024 ;                     /* DRAM installed, in bytes     */
  my_bd_t.bi_intfreq      = 200000000 ;     /* Processor speed, in Hz       */
  my_bd_t.bi_busfreq      = 100000000 ;     /* PLB Bus speed, in Hz         */
  my_bd_t.bi_pllouta_freq = 400000000 ;     /* PLL OUTA speed, in Hz        */
  /*my_bd_t.bi_opb_busfreq  = 50000000 ;    /* OPB Bus speed, in Hz         */
  /*my_bd_t.bi_iic_fast[0]  = 0 ;           /* Use fast i2c mode            */

  /* We return the address of our global structure */                  
  return &my_bd_t;
}  


After that modifications the kernel boot process seemed to begin properly. But I can't see it properly on my serial console after
the linux bootstrap give the control to the kernel execution entry point (head_4xx.S). 
Here is what I see on it:

loaded at:     00C7B250 00D374C4
relocated to:  00400000 004BC274
board data at: 004B913C 004B9190
relocated to:  0040547C 004054D0
zimage at:     00405AFF 004B8B22
avail ram:     004BD000 01000000

Linux/PPC load: console=ttyS0,38400 root=/dev/nfs rw ip=on
Uncompressing Linux...done.
Now booting the kernel
.?w..tg?..*/)1j..-b?./?...V..?..-..W..E..?..4.)-W.?.-CV....i\Q!n.?v.-....;rs5k.5%.?i-.?-.-..V.....?!.-.?.Cn..?-.Fh-..g-.?wH.k...                          .[1;156H.[1;156H.

As you can see, I'd like my linux to have a serial setting of 38400 8n1. To achieve that, I modified the following things:

- in "ns16550.c":  #define SERIAL_BAUD 38400       //(instead of 9600)
- in "tty_io.c" (console_init() function ):  
        tty_std_termios.c_iflag = ICRNL | IXON;
	tty_std_termios.c_oflag = OPOST | ONLCR;
        tty_std_termios.c_cflag = B38400 | CS8 | CREAD | HUPCL;   //(instead of 9600)
	tty_std_termios.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |ECHOCTL | ECHOKE | IEXTEN;
- in "arch/ppc/platforms/myplatform.h" :  #define BASE_BAUD xxxxxx

As you can see I haven't given a value for the BASE_BAUD value. Indeed, I can not find the right method to calculate it.
Could someone give me the formula please given the following infos:
  - UART_DIV = 0x15  (so 21 in decimal)
  - all other clocking info are given above in the "get_board_info"


Do you see sometrhing wrong there cause without any "readable" console I'm totally blind and I can't debug anything.
Please help me cause I've read so many forums,docs, and others that I'm really desperate... HELP!!!

Jérémie



More information about the Linuxppc-dev mailing list