对 u-boou1.1.6的do_go修改(最好不动)

common/cmd_boot.c

int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
        ulong   addr, rc;
        int     rcode = 0;

        if (argc < 2) {
                printf ("Usage:\n%s\n", cmdtp->usage);
                return 1;
        }

        addr = simple_strtoul(argv[1], NULL, 16);

        printf ("## Starting application at 0x%08lX ...\n", addr);
/**jimmy addd the below 3 lines*/
setup_linux_param(0x30000100);
         call_linux(0,0x0c1,0x30008000);
         printf("ok\n");



在lib_arm/armlinux.c中添加

static inline void cpu_arm920_cache_clean_invalidate_all(void)
{
__asm__(
"mov r1, #0\n"
"mov r1, #7 << 5 \n"  /* 8 segments */
"1:orr r3, r1, #63 << 26 \n"  /* 64 entries */
"2:mcr p15, 0, r3, c7, c14, 2 \n" /* clean & invalidate D index */
"subs r3, r3, #1 << 26 \n"
"bcs 2b \n"  /* entries 64 to 0 */
"subs r1, r1, #1 << 5 \n"
"bcs 1b \n"  /* segments 7 to 0 */
"mcr p15, 0, r1, c7, c5, 0 \n"  /* invalidate I cache */
"mcr p15, 0, r1, c7, c10, 4 \n" /* drain WB */
);
}

static inline void cpu_arm920_tlb_invalidate_all(void)
{
__asm__(
"mov r0, #0 \n"
"mcr p15, 0, r0, c7, c10, 4 \n"/* drain WB */
"mcr p15, 0, r0, c8, c7, 0 \n"/* invalidate I & D TLBs */
);
}

 

void  call_linux(long a0, long a1, long a2)
{
__asm__(
"mov r0, %0 \n"
"mov r1, %1 \n"
"mov r2, %2 \n"
"mov ip, #0 \n"
"mcr p15, 0, ip, c13, c0, 0 \n"/* zero PID */
"mcr p15, 0, ip, c7, c7, 0 \n"/* invalidate I,D caches */
"mcr p15, 0, ip, c7, c10, 4 \n"/* drain write buffer */
"mcr p15, 0, ip, c8, c7, 0 \n"/* invalidate I,D TLBs */
"mrc p15, 0, ip, c1, c0, 0 \n"/* get control register */
"bic ip, ip, #0x0001 \n"/* disable MMU */
"mcr p15, 0, ip, c1, c0, 0 \n"/* write control register */
"mov pc, r2 \n"
"nop \n"
"nop \n"
: /* no outpus */
: "r" (a0), "r" (a1), "r" (a2)
);
}
#define RAMDISK 1
/*static*/ void setup_linux_param(ulong param_base)
{
struct param_struct *params = (struct param_struct *)param_base;
#ifdef RAMDISK
char linux_cmd[] = "initrd=0x30800000,0x440000 mem=64M  root=/dev/ram init=/linuxrc console=ttyS0";
#endif
#ifdef CRAMFS
char linux_cmd[] = "root=/dev/mtdblock/2 rw mem=32M";
#endif
printf("Setup linux parameters at 0x%08lx/n", param_base);
memset(params, 0, sizeof(struct param_struct));

params->u1.s.page_size = 0x00001000;
params->u1.s.nr_pages = (0x04000000 >> 12);
#if 0
params->u1.s.page_size = 0x00001000;
params->u1.s.nr_pages = (0x04000000 >> 12);
params->u1.s.ramdisk_size = 0;
params->u1.s.rootdev = rootdev;
params->u1.s.flags = 0;

#endif
/* If use ramdisk */
params->u1.s.initrd_start = 0xC0800000 ;
params->u1.s.initrd_size = 0x440000;
params->u1.s.rd_start = 0;

/* set linux command line */
if (linux_cmd == NULL) {
printf("Wrong magic: could not found linux command line/n");
} else {
memcpy(params->commandline, linux_cmd, strlen(linux_cmd) + 1);
}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值