分类: LINUX
2008-08-28 17:43:34
1、两个命令
setbootcmdtftp84000000uImage\;bootm84000000
setbootdelay1
2、非linuxkernel的引导实现方法:
一共三个函数:jump,selectboot和system_boot
把jump放在需要跳转的地方,参数就是要跳转的地址。然后返回,重启系统。select放在main的开头。通过判断ram的特定地址的特定信息实现跳转。
system_boot实现系统的重新启动
#defineFDMA_SRAM_TOP_ADDRESS0xB9229800#defineMAGIC_NUM0x71097100#defineDEAD_PATTERN0xBAD0BADF#defineST40_CPG_REGS_BASE0xFFC00000#defineST40_CPG_WTCNT(ST40_CPG_REGS_BASE 0x08)#defineST40_CPG_WTCSR(ST40_CPG_REGS_BASE 0x0C)#defineST40_CPG_WTCSR2(ST40_CPG_REGS_BASE 0x1C)voidJump(unsignedintaddress){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);/*Watchdogcounter*/STSYS_WriteRegDev16LE(ST40_CPG_WTCSR,0xA547);/*Watchdogcontrol*/STSYS_WriteRegDev16LE(ST40_CPG_WTCSR2,0xAA00);/*Watchdogcontrol2*/STSYS_WriteRegDev16LE(ST40_CPG_WTCSR,0xA5C7);/*Startwatchdogcounter*/for(;;);}voidSelectBoot(void){unsignedintMagicNum=0;unsignedintNotMagicNum=0;unsignedintJumpAddress=0;unsignedintNotJumpAddress=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);#if0/*SetupForwatchdogincasejumpfailed.*/STSYS_WriteRegDev16LE(ST40_CPG_WTCNT,0x5AF0);STSYS_WriteRegDev16LE(ST40_CPG_WTCSR,0xA543);STSYS_WriteRegDev16LE(ST40_CPG_WTCSR2,0xAA01);STSYS_WriteRegDev16LE(ST40_CPG_WTCSR,0xA5C7);#endifentry();while(1);}}}voidsystem_reboot(void){ulongsr;asm("stcsr,%0":"=r"(sr));sr|=(1<<28);/*setblockbit*/asm("ldc%0,sr"::"r"(sr));asmvolatile("trapa#0");}