Chinaunix首页 | 论坛 | 博客
  • 博客访问: 661079
  • 博文数量: 810
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5025
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 11:41
文章分类

全部博文(810)

文章存档

2011年(1)

2008年(809)

我的朋友

分类: LINUX

2008-08-22 11:43:20


实现了uboot对非linuxkernel的引导。虽然有一个IH_TYPE_STANDALONE,但是没有实现。nnd。只能自己想办法。实现详细见下面。

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");}
下载本文示例代码
阅读(289) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~