Author-------Dansen-----xzd2734@163.com
因为每次修改内核添加打印信息需要调试,重新加载内核,不过挺烦的,
需要输入3条命令,为了调试内核方便,所以要在ppcboot中添加一条简单
命令来执行这3条命令,这样调试内核的时候会方便很多了。
先到ppcboot-2.0.0/common/main.c下看看主循环是怎样处理输入的命令的
for (;;)
{
len = readline (CFG_PROMPT); //把输入的命令读到console_buffer中
flag = 0; //并返回所输入的长度
if (len > 0)
strcpy (lastcommand, console_buffer);
else if (len == 0)
flag |= CMD_FLAG_REPEAT;
if (len == -1)
printf ("<INTERRUPT>/n");
else
rc = run_command (lastcommand, flag);
if (rc <= 0) lastcommand[0] = 0;
}
显然是由run_command这个函数去执行输入的命令了,在run_command中对输入的命令行进行参数分解,分解的参数由argv指示。
if ((cmdtp = find_cmd(argv[0])) == NULL) {
printf ("Unknown command '%s' - try 'help'/n", argv[0]);
return -1; /* give up after bad command */
}
通过find_cmd去命令表中,这样我们就需要在命令表中去添加自己的命令
ppcboot-2.0.0/common/command.c中找到了find_cmd函数,还有命令表。
cmd_tbl_t cmd_tbl[] = {
CMD_TBL_ASKENV
CMD_TBL_ASM
....................}
这样我们就可以在其中添加自己的命令了,我就在最上面添加了CMD_TBL_DANSEN,显然这是一个宏,
所以还要找到宏的定义,参考其它的宏定义,把CMD_TBL_DANSEN的定义为
#define CMD_TBL_DANSEN MK_CMD_TBL_ENTRY( /
"dansen", 3, CFG_MAXARGS, 0, do_dansen, /
"dansen - do tftp 30008000 zImage/n" /
" tftp 30800000 ramdisk.image.gz/n" /
" go 30008000/n", /
"enter dansen or more than dan,it is eazy,hehe/n" /
),
为了方便我们可以直接把CMD_TBL_DANSEN定义在command.c中,可以看到,在command.c中也有类似的表项定义的。然后还要添加命令真正的执行函数do_dansen
int do_dansen (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
run_command("tftp 30008000 zImage",0);
run_command("tftp 30800000 ramdisk.image.gz",0);
run_command("go 30008000",0);
return 1;
}
编译以后可以烧到flash中,ok
不过还可以再方便点,我在没入主循环前添加代码,这样只要在启动时判断输入的键就可以了。不输入或输入是y的话从flash启动,输入d的话是从主机tftp启动,其他的话就进入命令行
bootm:
if(c == 'y'||c == 'Y')
{
strcpy(lastcommand , "bootm 30008000 30800000");
flag = 0;
rc = run_command (lastcommand, flag);
if (rc <= 0)
{
lastcommand[0] = 0;
}
}
else
{
printf("/n/n");
}
修改上面的代码为
bootm:
if(c == 'y'||c == 'Y')
{
strcpy(lastcommand , "bootm 30008000 30800000");
flag = 0;
rc = run_command (lastcommand, flag);
if (rc <= 0)
{
lastcommand[0] = 0;
}
}
else if(c == 'd'||c == 'Y')
{
strcpy(lastcommand , "tftp 30008000 zImage");
run_command(lastcommand,0);
strcpy(lastcommand , "tftp 30800000 ramdisk.image.gz");
run_command(lastcommand,0);
strcpy(lastcommand , "go 30008000");
run_command(lastcommand,0);
}
else
{
printf("/n/n");
}
这样调试可以方便好多了,千万别把ppcboot弄坏了,不然又要用JTAG重新烧写,要等好久.用ppcboot自己更新自己方便多了.
ppcboot的一些参数可以在ppcboot-2.0.0/include/configs/smdk2410.h中修改.