话说。。。(嘘声,“入正题把!“)<br /><br />好好:<br /><br />首先,porting linux的时候要规划内存影像,如小弟的系统有64m SDRAM,<br />地址从0x 0800 0000 -0x0bff ffff,32m flash,地址从0x0c00 0000-0x0dff ffff.<br />规划如下:bootloader, linux kernel, rootdisk放在flash里。<br />具体从 0x0c00 0000开始的第一个1M放bootloader,<br />0x0c10 0000开始的2m放linux kernel,从 0x0c30 0000开始都给rootdisk。<br /><br />启动:<br />首先,启动后arm920T将地址0x0c00 0000映射到0(可通过跳线设置),<br />实际上从0x0c00 0000启动,进入我们的bootloader,但由于flash速度慢,<br />所以bootloader前面有一小段程序把bootloader拷贝到SDRAM 中的0x0AFE0100,<br />再从0x 0800 0000 运行bootloader,我们叫这段小程序为flashloader,<br />flashloader必须要首先初始化SDRAM,不然往那放那些东东:<br /><br />.equ SOURCE, 0x0C000100 bootloader的存放地址<br />.equ TARGET, 0x0AFE0100 目标地址<br />.equ SDCTL0, 0x221000 SDRAM控制器寄存器<br />// size is stored in location 0x0C0000FC<br /><br />.global _start<br />_start: //入口点<br /><br />//;***************************************<br />//;* Init SDRAM<br />//;***************************************<br /><br />// ;***************<br />// ;* SDRAM<br />// ;***************<br /><br />LDR r1, =SDCTL0 //<br /><br />// ; Set Precharge Command<br />LDR r3, =0x92120200<br />//ldr r3,=0x92120251<br />STR r3, [r1]<br /><br />// ; Issue Precharge All Commad<br />LDR r3, =0x8200000<br />LDR r2, [r3]<br /><br />// ; Set AutoRefresh Command<br />LDR r3, =0xA2120200<br />STR r3, [r1]<br /><br />// ; Issue AutoRefresh Command<br />LDR r3, =0x8000000<br />LDR r2, [r3]<br />LDR r2, [r3]<br /><br />LDR r2, [r3]<br />LDR r2, [r3]<br />LDR r2, [r3]<br />LDR r2, [r3]<br />LDR r2, [r3]<br />LDR r2, [r3]<br /><br />// ; Set Mode Register<br />LDR r3, =0xB2120200<br />STR r3, [r1]<br /><br />// ; Issue Mode Register Command<br />LDR r3, =0x08111800 //; Mode Register Value<br />LDR r2, [r3]<br /><br />// ; Set Normal Mode<br />LDR r3, =0x82124200<br />STR r3, [r1]<br /><br />//;***************************************<br />//;* End of SDRAM and SyncFlash Init *<br />//;***************************************<br /><br />// copy code from FLASH to SRAM<br /><br />_CopyCodes:<br />ldr r0,=SOURCE<br />ldr r1,=TARGET<br />sub r3,r0,#4<br />ldr r2,[r3]<br /><br />_CopyLoop:<br />ldr r3,[r0]<br />str r3,[r1]<br />add r0,r0,#4<br />add r1,r1,#4<br />sub r2,r2,#4<br />teq r2,#0<br />beq _EndCopy<br />b _CopyLoop<br /><br />_EndCopy:<br />ldr r0,=TARGET<br />mov pc,r0<br /><br />欲知后事如何,下回分解:<br /> |
|