
Graeme Russ wrote:
Hi All,
So far I have my sc520 board booting into main_loop (), DRAM configured and serial ports working. Now I seem to be stuck on getting commands to execute (even help). Using printf() I have traced my problem into find_cmd (). I added the following into find_cmd() just before the for loop:
printf ("Searching for Command '%s'\n", cmd); printf ("Command Table Start : %08lx\n", (ulong)&__u_boot_cmd_start); printf ("Command Table End : %08lx\n", (ulong)&__u_boot_cmd_end); printf ("sizeof(int) : %x\n", sizeof(int)); printf ("sizeof(cmd_tbl_t) : %x\n", sizeof(cmd_tbl_t));
Aaargh, you printed %x, not 0x%x. That really threw me on the printout of sizeof(cmd_tbl_t).
[snip]
The output is (there are a few other printf()'s leadinf up to find_cmd () as well):
boot > help
[RUN_COMMAND] cmd[00400ccc]="help" [PROCESS_SEPARATORS] help token: "help"
Processing Macros... [PROCESS_MACROS] INPUT len 4: "help" [PROCESS_MACROS] OUTPUT len 4: "help" Extracting Arguments... parse_line: "help"
parse_line: nargs=1 Looking up Command... Searching for Command 'help' Command Table Start : 0000053e Command Table End : 00000870
0x870 - 0x53e = 0x332 = 818. 818 / 24 = 34 with a remainder of 2. I believe this is your problem. I bet you need to word-align the start of your table... the end label is getting word aligned which is padding out your end so your loop doesn't end.
I suspect this is the problem with not recognizing the commands as well? Perhaps the processor/compiler doesn't like having the table poorly aligned so one of the pointers is getting messed up?
sizeof(int) : 4 sizeof(cmd_tbl_t) : 18
0x18 == 24
Checking : 0000053e Checking : 00000556
0x56 - 0x3e == 0x18 == 24 (check)
Checking : 0000056e . . . Checking : 00000856 Checking : 0000086e
0x86e is the proper table end given 34 commands and 24 bytes per table entry.
Checking : 00000886 Checking : 0000089e Checking : 000008b6
There are a few weird things going on...
a) sizeof(cmd_tbl_t) is 18, but the loop is incrementing by 24 (I would have thought a 4 byte alignment would push it to 20 maybe)
Nope, just radix issues (see above).
b) The loop never completes since cmdtp never actually equals &__u_boot_cmd_end
Alignment padding problems are preventing it (see above).
[snip]
Can anyone point me an a rough direction to look? Any help at all would be greatly appreciated
I think you need a 4 byte alignment before the command table in the linker control file (below)
Regards,
Graeme
u-boot.lds:
[snip]
/* 16bit BIOS emulation code (just enough to boot Linux) */ .bios 0 : AT ( LOADADDR(.realmode) + SIZEOF(.realmode) ) { *(.bios) }
_i386boot_bios = LOADADDR(.bios); _i386boot_bios_size = SIZEOF(.bios);
. = .;
I think you need to add . = ALIGN(2); here
(ALIGN(4)? IIRC, the ALIGN is 2^n so ALIGN(2) is 4-byte alignment)
__u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .;
[snip]
HTH, gvb