1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      實例解析:Uboot對非Linux kernel的引導

      更新時間: 2008-05-29 14:28:20來源: 粵嵌教育瀏覽量:805

        實現了uboot對非linux kernel的引導。雖然有一個IH_TYPE_STANDALONE,但是沒有實現。nnd。只能自己想辦法。實現詳細見下面。

        1、兩個命令

        set bootcmd tftp 84000000 uImage\;bootm 84000000

        set bootdelay 1

        2、非linux kernel的引導實現方法:

        一共三個函數: jump,selectboot 和 system_boot

        把jump放在需要跳轉的地方,參數就是要跳轉的地址。然后返回,重啟系統。select放在main的開頭。通過判斷ram的特定地址的特定信息實現跳轉。

        system_boot實現系統的重新啟動

      #define FDMA_SRAM_TOP_ADDRESS 0xB9229800
                  #define MAGIC_NUM 0x71097100
                  #define DEAD_PATTERN 0xBAD0BADF
                  #define ST40_CPG_REGS_BASE 0xFFC00000#define
                  ST40_CPG_WTCNT (ST40_CPG_REGS_BASE + 0x08)
                  #define ST40_CPG_WTCSR (ST40_CPG_REGS_BASE + 0x0C)
                  #define ST40_CPG_WTCSR2 (ST40_CPG_REGS_BASE + 0x1C)
                  void Jump(unsigned int address)
                  {
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*1, MAGIC_NUM);
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*2, address);
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*3, ~address);
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*4, ~MAGIC_NUM);
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCNT, 0x5AF0); /*Watchdog counter*/
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA547); /*Watchdog control*/
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCSR2, 0xAA00); /*Watchdog control2*/
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA5C7); /*Start watchdog counter*/ for(;;);
                  }
                  void SelectBoot(void)
                  {
                  unsigned int MagicNum = 0;
                  unsigned int NotMagicNum = 0;
                  unsigned int JumpAddress = 0;
                  unsigned int NotJumpAddress = 0; void (*entry)(void);
                  /* entry=0xa0100000;
                  entry();*/ //if((STSYS_ReadRegDev16LE(ST40_CPG_WTCSR2) & 0xFF) != 0x0)
                  {
                  MagicNum = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*1);
                  JumpAddress = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*2);
                  NotJumpAddress = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*3);
                  NotMagicNum = STSYS_ReadRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*4);
                  if((MagicNum == MAGIC_NUM)
                  && (MagicNum == (~NotMagicNum))
                  && (JumpAddress == (~NotJumpAddress)))
                  {
                  entry = (void (*)(void))JumpAddress;
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*1, DEAD_PATTERN);
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*2, DEAD_PATTERN);
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*3, DEAD_PATTERN);
                  STSYS_WriteRegDev32LE(FDMA_SRAM_TOP_ADDRESS - 4*4, DEAD_PATTERN);
                  #if 0/*Setup For watchdog in case jump failed.*/
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCNT, 0x5AF0);
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA543);
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCSR2, 0xAA01);
                  STSYS_WriteRegDev16LE(ST40_CPG_WTCSR, 0xA5C7);
                  #endif entry(); while(1);
                  }
                  }
                  }void system_reboot(void)
                  {
                  ulong sr;
                  asm ("stc sr, %0":"=r" (sr));
                  sr |= (1 << 28); /* set block bit */
                  asm ("ldc %0, sr": :"r" (sr));
                  asm volatile ("trapa #0");
                  }


      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文字幕无碼在线 | 亚洲欧美日韩国产 | 狠狠综合久久久久综合网小蛇 | 日本特黄特色特爽特刺激大片 | 日本乱中文字幕在线系列 | 亚洲高清国产免费大片 |