对S3C2410-2440启动代码内数据复制过程的分析(原创)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

对S3C2410启动代码内数据复制过程的分析东莞权智集团范伟mail:fanwei326@163.com;wfan@gsl.com.cn本文若有错误之处,欢迎来信指正。S3C2410启动后先进行一些必要的设置,如关WatchDog,设置PLL与时钟,配置SDRAM,初始化堆栈等,网上有很多分析启动代码的文章,本文不打算再进行说明。本文分从NORFlash与NANDFlash启动两种情况分别进行分析。首先要知道NORFlash是XIP的,如果从NOR启动,代码首先在NORFlash内执行,考虑到运行速度,我们要把代码要复制到SDRAM内去执行。当系统被设置成从NANDFALSH启动(使用OM[1:0]引脚的电平来控制)时,由于其自身的特点,NANDFlash不具备运行程序的功能,程序不能在NANDFlash内执行,CPU会自动把NAND内头4K代码加载到CPU的内部SRAM(StepingStone垫脚石)中,然后把StepingStone映射到CPU地址空间的0地址处(BANK0),因此CPU会从StepingStone的0地址处取指令并执行。因为程序一般都会大于4K,我们必须把代码复制到SDRAM中去执行。综上所述,不管是从NOR的启动还是从NAND启动,都要把代码复制到SDRAM中去执行,这个复制过程要在头4K代码中完成。此后这4KB的SRAM还可以用作其它用途。另外必须注意到的是NOR的启动与NAND启动的程序入口点ResetEntry都为0,CPU在加电后会去0x0处取指执行,如下图所示。一、我们先看从NORFlash启动的情况:下面这段代码进行复制前的判断,因为从NANDFlash与从NORFlash启动的复制过程是大不相同的。;/**************************************************************************************;BWSCON的[2:1]反映了外部引脚OM[1:0]:若OM[1:0]!=00,从NORFLash启动或直接在内存运行;;若OM[1:0]==00,则为从NandFlash启动;**************************************************************************************/ldrr0,=BWSCONldrr0,[r0]andsr0,r0,#6bnecopy_proc_beg;若从NOR启动,跳转到标号copy_proc_begadrr0,ResetEntry;从NOR或NAND启动,ResetEntry都为0,但上面已经排除了NOR启动cmpr0,#0;所以入口是0地址表示是从NAND的StepingStone启动bnecopy_proc_beg;若从NOR启动,跳转到标号copy_proc_beg。否则往下执行若判断是从NORFlash启动,程序直接跳转到标号copy_proc_beg处执行:copy_proc_begadrr0,ResetEntry;r0=ResetEntry=0ldrr2,BaseOfROM;r2=|Image$$RO$$Base|=0x30000000cmpr0,r2;//如果从norflash启动,那么ResetEntry=0BaseOfROM=0x3000000,显然不相同ldreqr0,TopOfROMbeqInitRam;同时跳到InitRam因为现在程序仍然在NORFlash中执行,代码的执行基址还是0,所以“adrr0,ResetEntry”取得的ResetEntry相对地址是0。则r0≠r2,先执行下面的代码从NOR复制RO数据段到SDRAM,不直接跳转到InitRam进行RW段复制。ldrr3,TopOfROM0;循环复制Code数据ldmiar0!,{r4-r7};r0的初始值ResetEntry=0stmiar2!,{r4-r7};r2的初始值ROBase(0x30000000);上面的2行代码将从0开始的地址内的数据保存到SDRAM内以ROBase开始的地址内cmpr2,r3;复制的终止条件:复制了(ROLimit-ROBase)大小,即整个RO数据段bcc%B0;若r2r3,往回跳转到标号0subr2,r2,r3;r0+16,r2+16everytime,ifr2r3subr0,r0,r2;将可能多加的部分减回来,让r0对准ROM内RO段的结束点,也是RW数据段的开始点复制过程及结果如下图:代码段复制完紧接着就是复制RW段:RWDataRODataTotalROMSizeROMResetEntry0x00000000|Image$$RO$$Base|(0x30000000)RODataSDRAM加载域|Image$$RO$$Limit|从NORFlash的0地址开始复制长度为(ROLimit–ROBase)的数据到SDRAM的ROBase处r0(复制完后)r0(复制前)InitRam;从NORFlash复制RW段到SDRM中预设的RWBASE位置ldrr2,BaseOfBSS;r2=|Image$$RW$$Base|=|Image$$RO$$Limit|ldrr3,BaseOfZero;r3=|Image$$ZI$$Base|0;复制RW数据到BaseOfBSScmpr2,r3;比较r2,r3;看RW数据段有没有复制完ldrccr1,[r0],#4;R2R3,[r0]-r1,然后r0=r0+4,r0是RW数据段在ROM内的起始地址strccr1,[r2],#4;r2为|Image$$RW$$Base|地址,由编译器指定bcc%B0;若r2r3,RW段还没有复制完从NORFlash的RO段结束点开始复制RW数据到SDRAM的RWBase处,数据长度为RWLimit-RWBase还是有必要交代一下ADS中预定义的几个变量以及它们的作用。|Image$$RO$$Base|表示连接完成后程序映像RO段的起始地址;|Image$$RO$$Limit|表示连接完成后程序映像RO段的结束地址;|Image$$RW$$Base|表示连接完成后程序映像RW段的起始地址;|Image$$ZI$$Base|表示连接完成后程序映像ZI段的起始地址,注意由于RW段与ZI段在运行时是紧密挨着的哦,所以这个值也就代表了RW段的结束地址;|Image$$ZI$$Limit|表示连接完成后程序映像ZI段的结束地址。为了书写和阅读的方便,我们分别把上面几个值赋给变量BaseOfROM,TopOfROM,BaseOfBSS,BaseOfZero,EndOfBSS这样看起来就很简结了:BaseOfROMDCD|Image$$RO$$Base|;BaseOfROM地址内保存|Image$$RO$$Base|的值TopOfROMDCD|Image$$RO$$Limit|;BaseOfBSSDCD|Image$$RW$$Base|BaseOfZeroDCD|Image$$ZI$$Base|;ZIBase=RWLimitEndOfBSSDCD|Image$$ZI$$Limit|这样“ldrr2,BaseOfBSS”实际是加载了|Image$$RW$$Base|到r2。实际上也可以直接用ldrr2,=|Image$$RW$$Base|。复制完RW数据段,需要将ZI段清0。ZI段在SDRAM内是紧跟着RW段的,所以其起始地址|Image$$ZI$$Base|同时也是RW段的结束地址。下面的代码很简单明了:movr0,#0;用0初始化ZI区ldrr3,EndOfBSS;r3=|Image$$ZI$$Limit|;ZI段的结束地址1cmpr2,r3;r2是RWlimit,也就是ZI段的起始地址strccr0,[r2],#4;ZI数据段清0bcc%B1RWDataRODataTotalROMSizeROMResetEntry0x00000000|Image$$RO$$Base|(0x30000000)RODataSDRAM加载域|Image$$RO$$Limit|从NORFlash的(ROLimit–ROBase)地址开始复制(RWLimit–RWBase)的数据到SDRAM的RWBase处|Image$$RW$$Base|(0x30100000)ROLimit-ROBase|Image$$RW$$Limit|RWDatar0(复制后)r0(复制前)r2(复制后)r2(复制前)此后,程序就可以跳转到Main主函数处执行了。[:LNOT:THUMBCODEldrpc,GotoMain;//跳转到Main()主函数;它把$main_entry的绝对地址赋给PC,由于程序已经复制到SDRAM中,而且$main_entry的绝对地址是在SDRAM范围内,所以从这句代码以后,程序就开始从ROM跳到SDRAM内执行了。b.;就是仍跳回这一指令...不做任何事情的死循环]关于GotoMain标号,是在文件的最后定义的:GBLSmain_entrymain_entrySETSMainIMPORT$main_entryGotoMainDCD$main_entry因为“ldrpc,GotoMain”把$main_entry的绝对地址(即Main函数的入口地址)赋给PC,由于程序已经复制到SDRAM中,而且$main_entry的绝对地址是在SDRAM范围内,所以从这句代码以后,程序就开始从ROM跳到SDRAM内执行了。二、从NAND启动的分析从NAND启动,一样是用下面这段代码做判断:;/**************************************************************************************;BWSCON的[2:1]反映了外部引脚OM[1:0]:若OM[1:0]!=00,从NORFLash启动或直接在内存运行;;若OM[1:0]==00,则为从NandFlash启动;**************************************************************************************/ldrr0,=BWSCONldrr0,[r0]andsr0,r0,#6bnecopy_proc_beg;若从NOR启动,跳转到标号copy_proc_begadrr0,ResetEntry;从NOR或NAND启动,ResetEntry都为0,但上面已经排除了NOR启动RWDataRODataSDRAM|Image$$RW$$Base|(0x30100000)|Image$$RO$$Base|(0x30000000)ZIData|Image$$RO$$Limit||Image$$ZI$$Base|(|Image$$RW$$Limit|)|Image$$ZI$$Limit|ZI数据段清0cmpr0,#0;所以入口是0地址表示是从NAND的StepingStone启动bnecopy_proc_beg;若从NOR启动,跳转到标号copy_proc_beg。否则往下执行若判断是从NAND启动,不会跳转到copy_proc_beg,而是紧接着执行从NAND复制数据到SDRAM的代码,从NAND的开始处(第一个Block的头一页)复制总共256页即128Kbytes数据。过程与结果如下图所示,代码如下。nand_boot_begmovr5,#NFCONF;首先设定NAND的控制寄存器;NFCONF配置寄存器地址0x4E000000ldrr0,=(115)|(112)|(111)|(78)|(74)|(7)strr0,[r5];blReadNandID;接着读取NAND的ID号,结果保存在r5里movr6,#0;r6设初值0.ldrr0,=0xec73;期望的NANDID号cmpr5,r0;这里进行比较,r5是读取到的IDbeq%F1;相等

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功