- 论坛徽章:
- 0
|
5楼
发表于 2011-10-25 16:04
本帖最后由 luoxb 于 2011-10-25 16:10 编辑
回复 3# npuazm
板子都是基于s3c2410应该都一样,只是我怀疑烧到板子里面的uboot其中do_go函数被改动以便于传递参数给内核启动时用但不适用于调用一般函数,有对uboot研究深入的大侠出来讲解吧,恭候~
在网站上搜到这样一个更改,与我的打印很像,怀疑对uboot做了相同更改。不清楚红色部分的更改,是不是会影响除内核调用外的调用
1:例子一:通过param_struct让uboot中的go命令可以传递参数
分析:go的代码在common/cmd_boot.c中,里面并没有拷贝启动参数的代码,转向内核的时候也没有传送
启动参数所在的地址,因此添加如下代码用于拷贝参数,可以看到,对于param_struct只需要设置cmmandline
u1.s.page_size,u1.s.nr_pages三个域
char *commandline = getenv("bootargs");
struct param_struct *lxy_params=(struct param_struct *)0x80000100;
printf("setup linux parameters at 0x80000100\n");
memset(lxy_params,0,sizeof(struct param_struct));
lxy_params->u1.s.page_size=(0x1<<12); //4K 这个是必须有的,否则无法启动
lxy_params->u1.s.nr_pages=(0x4000000)>>12; //64M 这个是必须有的,否则无法启动
memcpy(lxy_params->commandline,commandline,strlen(commandline)+1);
printf("linux command line is: \"%s\"\n",lxy_params->commandline);
然后还要向内核传递参数地址,将下面一行代码修改:
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); //需要被修改的代码
rc = ((ulong(*)(int,int,uint))addr) (0, gd->bd->bi_arch_number,gd->bd->bi_boot_params);//修改之后的代码
上面文字引自:http://liuyue18301.blog.163.com/ ... 282009930102916727/ |
|