4140|3

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440 启动代码 call_linux 参数分析 [复制链接]

call_linux(0, 193, buf);
默认的是193! 在网上查了下说是这个参数跟内核有关! 我还以为是和分区有关


        {0,                             0x00030000, "boot"},                //192K           {0x00030000, 0x001d0000, "kernel"},             //
        {0x00200000, 0x01e00000, "rootfs"},                //30M
        {0x02000000, 0x02000000, "ext-fs2"},        //32M
        {0,                         0         , 0}

我改了分区的设置:
        {0,                  0x00064000, "bootloader"},                //400K   
        {0x00064000, 0x03F9C000, "wince"},            //63.61M
        {0,                         0         , 0}
       

在启动代码里面是先进行读操作,然后调用
call_linux(0, 193, buf);  //buf= 0x30200000;


call_linux代码如下:
   
  1. void call_linux(U32 a0, U32 a1, U32 a2)
  2. {
  3.         void (*goto_start)(U32, U32);
  4.         cache_clean_invalidate();
  5.         tlb_invalidate();       

  6.         __asm{
  7. //                mov        r0, a0//%0
  8. //                mov        r1, a1//%1
  9. //                mov        r2, a2//%2
  10.                 mov        ip, #0
  11.                 mcr        p15, 0, ip, c13, c0, 0        /* zero PID */
  12.                 mcr        p15, 0, ip, c7, c7, 0        /* invalidate I,D caches */
  13.                 mcr        p15, 0, ip, c7, c10, 4        /* drain write buffer */
  14.                 mcr        p15, 0, ip, c8, c7, 0        /* invalidate I,D TLBs */
  15.                 mrc        p15, 0, ip, c1, c0, 0        /* get control register */
  16.                 bic        ip, ip, #0x0001                        /* disable MMU */
  17.                 mcr        p15, 0, ip, c1, c0, 0        /* write control register */
  18.                 //mov        pc, r2
  19.                 //nop
  20.                 //nop
  21.                 /* no outpus */
  22.                 //: "r" (a0), "r" (a1), "r" (a2)
  23.         }
  24.         //SetClockDivider(1, 1);
  25.         //SetSysFclk(FCLK_200M);                //start kernel, use 200M
  26.         Delay(1000);
  27. //        disable_irq();
  28.         goto_start = (void (*)(U32, U32))a2;
  29.         [color=#FF0000](*goto_start)(a0, a1);        [/color]  
  30. [color=#FF0000]//这个参数a1 怎么设置? [/color]
  31. }
复制代码


引导程序时双系统的,所以又linux的痕迹!

最新回复

自己搜到自己的帖子!    那个可以解释下下面的代码是什么意思 void call_linux(U32 a0, U32 a1, U32 a2) {     void (*goto_start)(U32, U32);     cache_clean_invalidate();     tlb_invalidate();        __asm{ //        mov    r0, a0//%0 //        mov    r1, a1//%1 //        mov    r2, a2//%2         mov    ip, #0         mcr    p15, 0, ip, c13, c0, 0    /* zero PID */         mcr    p15, 0, ip, c7, c7, 0    /* invalidate I,D caches */         mcr    p15, 0, ip, c7, c10, 4    /* drain write buffer */         mcr    p15, 0, ip, c8, c7, 0    /* invalidate I,D TLBs */         mrc    p15, 0, ip, c1, c0, 0    /* get control register */         bic    ip, ip, #0x0001            /* disable MMU */         mcr    p15, 0, ip, c1, c0, 0    /* write control register */         //mov    pc, r2         //nop         //nop         /* no outpus */         //: "r" (a0), "r" (a1), "r" (a2)     }     //SetClockDivider(1, 1);     //SetSysFclk(FCLK_200M);        //start kernel, use 200M     Delay(1000); //    disable_irq();     goto_start = (void (*)(U32, U32))a2; //这里应该是跳转到要执行的RAM的起始地址     (*goto_start)(a0, a1);    } 复制代码 主要是汇编部分  详情 回复 发表于 2009-8-19 18:03
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我看上面代码,没有关系吧。
因为根本没有传递进来做什么。
这是优龙的bootloader吧。
你可以改成别的数试试,我是没有看出来有什么作用哦。
————————————————
和eboot原理一样,只是因为MMU映射不太一样,所以稍有差异。
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
广嵌的 !不过里面基本上都是优龙的代码注释!
------------------------------
我用之前的分区设置,也就是
        {0,                             0x00030000, "boot"},                //256K   
        {0x00030000, 0x001d0000, "kernel"},             //
        {0x00200000, 0x01e00000, "rootfs"},                //30M
        {0x02000000, 0x02000000, "ext-fs2"},        //32M
        {0,                         0         , 0}
启动都是很正常的!
但换了 分区设置后!就问题比较多了

  1. [color=#339966]//这个就是nandflash启动的主程序代码[/color]:
  2. static void LoadRun(int part_sel)
  3. {
  4.         U32 i, ram_addr, buf = 0x30200000;
  5.         struct param_struct *params = (struct param_struct *)0x30000100;
  6.         int Part_size;
  7.         int NK_size;
  8.         //if(part_sel == 1)
  9.           //  buf = 0x30008000;                 
  10.         char *linux_params = "root=/dev/mtdblock2  load_ramdisk=0 init=/linuxrc console=ttySAC0 display=sam320 mem=64M devfs=mount";
  11.        
  12.         StartPage = NandPart[part_sel].offset>>9;
  13.         Part_size = NandPart[part_sel].size;
  14.         ram_addr = buf;       
  15.         printf("buf address :0x%x\n", buf);       
  16.         NK_size=(Part_size/3);
  17.         for(i=0; NK_size>0; ) {
  18.                 if(!(i&0x1f)) {
  19.                         if(CheckBadBlk(i+StartPage)) {
  20.                                 printf("Skipped bad block at 0x%x\n", i+StartPage);
  21.                                 i += 32;
  22.                                 NK_size -= 32<<9;
  23.                                 continue;
  24.                         }
  25.                 }
  26.                 ReadPage((i+StartPage), (U8 *)ram_addr);
  27.                 i++;
  28.                 NK_size -= 512;
  29.                 ram_addr += 512;
  30.                 if(NK_size==0)
  31.                 printf("ram_addr_of_os :0x%x Bytes\n",ram_addr);
  32. //这里有打印信息! 说明是读完了的!
  33.         }
  34.        
  35.         for(i=0; i<(sizeof(struct param_struct)>>2); i++)
  36.                 ((U32 *)params)[i] = 0;
  37.         params->u1.s.page_size = LINUX_PAGE_SIZE;
  38.         params->u1.s.nr_pages = (0x04000000 >> LINUX_PAGE_SHIFT);
  39.         for(i=0; linux_params[i]; i++)
  40.                 params->commandline[i] = linux_params[i];
  41.        
  42.         puts("Set boot params = ");
  43.         puts(linux_params);
  44.         putch('\n');
  45.         call_linux(0, 193, buf);
  46.         puts("call_linux  ");
  47.         //call_linux(0,401, buf);       
  48. }
复制代码


call_linux(0,401, buf); USB下载后 直接运行也要调用这个函数,当时默认是二参是193,  一直都不可以,  我以为是第一分区的大小 ,所以把它改成401  ,结果可以了 !
所以把两处的都改了!  启动成功两次后! 又不行了!!
晕的很
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
自己搜到自己的帖子!
   那个可以解释下下面的代码是什么意思

  1. void call_linux(U32 a0, U32 a1, U32 a2)
  2. {
  3.     void (*goto_start)(U32, U32);
  4.     cache_clean_invalidate();
  5.     tlb_invalidate();   

  6.     __asm{
  7. //        mov    r0, a0//%0
  8. //        mov    r1, a1//%1
  9. //        mov    r2, a2//%2
  10.         mov    ip, #0
  11.         mcr    p15, 0, ip, c13, c0, 0    /* zero PID */
  12.         mcr    p15, 0, ip, c7, c7, 0    /* invalidate I,D caches */
  13.         mcr    p15, 0, ip, c7, c10, 4    /* drain write buffer */
  14.         mcr    p15, 0, ip, c8, c7, 0    /* invalidate I,D TLBs */
  15.         mrc    p15, 0, ip, c1, c0, 0    /* get control register */
  16.         bic    ip, ip, #0x0001            /* disable MMU */
  17.         mcr    p15, 0, ip, c1, c0, 0    /* write control register */
  18.         //mov    pc, r2
  19.         //nop
  20.         //nop
  21.         /* no outpus */
  22.         //: "r" (a0), "r" (a1), "r" (a2)
  23.     }
  24.     //SetClockDivider(1, 1);
  25.     //SetSysFclk(FCLK_200M);        //start kernel, use 200M
  26.     Delay(1000);
  27. //    disable_irq();
  28.     goto_start = (void (*)(U32, U32))a2; //这里应该是跳转到要执行的RAM的起始地址
  29.     (*goto_start)(a0, a1);   

  30. }

复制代码


主要是汇编部分
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表