資源描述:
《bootloader啟動代碼分析》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、bootloader啟動代碼分析1,bootloader(第一部分)主要完成以下工作:1,設(shè)置CPU工作模式;2,關(guān)閉中斷;3,關(guān)閉Cache和Writebuffer;4,初始化SDRAM,配置存儲設(shè)備;5,復(fù)制FLASH中的代碼和數(shù)據(jù)到SDRAM中;6,內(nèi)存重映射,配置存儲設(shè)備;7,把RM和ZI從LOADADDR復(fù)制到executeADDR.8,設(shè)置??臻g指針,跳轉(zhuǎn)到C語言函數(shù)入口(啟動代碼第二部分)。2,具體代碼分析1,設(shè)置CPU工作模式MRSr0,cpsr#讀取CPSR狀態(tài)寄存器的值CPSR狀態(tài)寄存器結(jié)構(gòu):NZCVIFTModeBICr0,r0,#M
2、ASK_MODE&定義值為0x0000003F,把MODE清零;ORRr0,r0,#MODE_SVC32&宏定義值為0x00000013,把MODE設(shè)置為SVC模式;ORRr0,r0,#I_BIT&宏定義值為0x80,關(guān)IRQ;ORRr0,r0,#F_BIT&宏定義值為0x40,關(guān)FIQ;MSRcpsr_c,r0&回寫cpsr狀態(tài)寄存器設(shè)置完CPSR后,狀態(tài)寄存器中的值:NZCV11T100112,關(guān)閉中斷LDRr2,=ARM7_INTMASK&ARM7_INTMASK宏定義值為ASIC_BASE+0x4008,讀取interruptcontroller寄
3、存器MVNr1,#0&FFFFFFFFSTRr1,[r2]&回寫interruptcontroller寄存器,之后寄存器的值為全1,既關(guān)閉所有的中斷源;LDRr2,=ARM7_INTPEND&ARM7_INTPEND宏定義值為ASIC_BASE+0x4004,取interruptpend寄存器.MVNr1,#0&FFFFFFFFSTRr1,[r2]&回寫ARM7_INTPEND寄存器,之后寄存器的值為全1,既關(guān)閉所有的中斷標(biāo)志位;3,關(guān)閉Cache和WritebufferASIC_BASE宏定義值為0x03ff0000LDRr0,=ARM7_SYSCFG&
4、宏定義值為ASIC_BASE+0x0000LDRr1,=0x87ffffA00X87ffffA0的二進(jìn)制為10000111111111111111111110100000SEMustbesettozero.CEWhensetto'1',cacheoperationsareenabled.設(shè)置為0,將CACHE禁用。WEWhensetto"1",writebufferoperationsareenabled.設(shè)置為0,將writebuffer禁用。CMThis2-bitvaluedetermineshowinternalmemoryistobedevided
5、intocacheandSRAM.00=4-KbyteSRAM,4Kbytecache01=0-KbyteSRAM,8Kbytecache10=8-KbyteSRAM,0Kbytecache設(shè)置為10,將CACHE大小設(shè)置為0。InternalSRAM基地址為3FE(1111111110)寄存器的基地址為3FF《16為變成3FF0000,所以ASIC_BASE宏定義值為0x03ff0000。STRr1,[r0];將設(shè)置寫入SYSCFG寄存器4,初始化SDRAM,配置存儲設(shè)備IMPORT
6、Image$$RO$$Base
7、IMPORT
8、Image$$RO$$L
9、imit
10、IMPORT
11、Image$$RW$$Base
12、IMPORT
13、Image$$RW$$Limit
14、IMPORT
15、Image$$ZI$$Base
16、IMPORT
17、Image$$ZI$$Limit
18、Image$$RO$$Base為RO段基地址,Image$$RO$$Limit為RO段結(jié)束地址;Image$$RW$$Base為RW段基地址,Image$$RW$$Limit為RW段結(jié)束地址;Image$$ZI$$Base為ZI段基地址,Image$$ZI$$Limit為ZI段結(jié)束地址;導(dǎo)入這些內(nèi)置變量,這些變量由編譯器產(chǎn)生。初始化數(shù)據(jù)總線寄存器LDRr1,=r
19、EXTDBWTH;EXTDBWTH宏定義值為0x00003001。即[1:0]DatabuswidthforROM/SRAM/FLASHbank0(DSR0)01=Byte(8bits)(FLASH數(shù)據(jù)總線寬度為一個字節(jié))[13:12]DatabuswidthforDRAMbank0(DSD0)11=Word(32bits)(DRAM數(shù)據(jù)總線寬度為4個字節(jié))初始化FLASHLDRr2,=rROMCON0;ROMCON0宏定義值為0x02000060(00000010000000000000000001100000),即FLASH基地址為0,結(jié)束地址為200
20、000(20〈〈16)(0-2M)LDRr3,=rROMCON1;