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