AM335x啟動流程(BootRom-MLO-Uboot)超詳細源碼分析_第1頁
AM335x啟動流程(BootRom-MLO-Uboot)超詳細源碼分析_第2頁
AM335x啟動流程(BootRom-MLO-Uboot)超詳細源碼分析_第3頁
AM335x啟動流程(BootRom-MLO-Uboot)超詳細源碼分析_第4頁
AM335x啟動流程(BootRom-MLO-Uboot)超詳細源碼分析_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

AM335x啟動流程(BootRom-MLO-Uboot)超詳細源碼分析寫的?常好,收藏學習參考?件:1,AM335xARMCortex-A8Microprocessors(MPUs)TechnicalReferenceManual.pdf;2,am3359.pdf;1,am335x的cpu上電后,會跳到哪個地址去執(zhí)??答:芯?到uboot啟動流程:ROM→MLO(SPL)→uboot.imgAM335x中bootloader被分成了3個部分:第?級bootloader:引導加載程序,板?上電后會?動執(zhí)?這些代碼,如選擇哪種?式啟動(NAND,SDcard,UART。。。),然后跳轉(zhuǎn)轉(zhuǎn)到第?級bootloader。這些代碼應該是存放在176KB的ROM中。第?級bootloader:MLO(SPL),?以硬件初始化:關閉看門狗,關閉中斷,設置CPU時鐘頻率、速度等操作。然后會跳轉(zhuǎn)到第三級bootloader。MLO?件應該會被映射到64KB的InternalSRAM中。第三級bootloader:uboot.img,C代碼的??。其中第?級bootloader是板?固化的,第?級和第三級是通過編譯uboot所得的。2,第?級bootloader:MLO(SPL)做了哪些事情?MLO(SPL)內(nèi)存分布如下:SPL內(nèi)存重映射:1<PATH:/arch/arm/cpu/armv7/omap-common/u-boot-spl.lds>2MEMORY{.sram:ORIGIN=CONFIG_SPL_TEXT_BASE,\3LENGTH=CONFIG_SPL_MAX_SIZE}4MEMORY{.sdram:ORIGIN=CONFIG_SPL_BSS_START_ADDR,\5LENGTH=CONFIG_SPL_BSS_MAX_SIZE}67OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")8OUTPUT_ARCH(arm)9ENTRY(_start)10SECTIONS11{12.text :13{14start=.;15arch/arm/cpu/armv7/start.o(.text)16*(.text*)17}>.sram1819.=ALIGN(4);20.rodata:{*(SORT_BY_ALIGNMENT(.rodata*))}>.sram2122.=ALIGN(4);23.data:{*(SORT_BY_ALIGNMENT(.data*))}>.sram24.=ALIGN(4);25image_copy_end=.;26_end=.;2728.bss:29{30.=ALIGN(4);31bss_start=.;32*(.bss*)33.=ALIGN(4);34bss_end=.;35}>.sdram36}1123<PATH:/include/configs/am335x_evm.h>#defineCONFIG_SPL_TEXT_BASE 0x402F0400#defineCONFIG_SPL_MAX_SIZE (46*1024)4#define4#defineCONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK56#defineCONFIG_SPL_BSS_START_ADDR0x800000007#defineCONFIG_SPL_BSS_MAX_SIZE 0x80000 512KB*/<spanstyle="font-size:16px;color:#003399;"><strong></strong>@1@保存啟動參數(shù)save_boot_params1<PATH:/arch/arm/cpu/armv7/start.S>2/*3*theactualresetcode4*/56reset:7blsave_boot_params1<PATH:/arch/arm/cpu/armv7/omap-common/lowlevel_init.S>2.globalsave_boot_params3save_boot_params:4/*5*Seeiftheromcodepassedpointerisvalid:6*Itisnotvalidifitisnotinnon-secureSRAM7*Thismayhappenifyouarebootingwiththehelpof8*debugger9*/10ldr r2,=NON_SECURE_SRAM_START11cmpr2,r012bgt1f13ldrr2,=NON_SECURE_SRAM_END14cmpr2,r015blt1f1617/*18*storethebootparamspassedfromromcodeorsaved19*andpassedbySPL20*/21cmpr0,#022beq1f23ldrr1,=boot_params24strr0,[r1]/*/*《PATH:/arch/arm/include/asm/arch-ti81xx/omap.h》Non-secureSRAMAddressesNon-secureRAMat0x40300000fordevices.ButwekeepSRAM_BASEat0x40304000(EMUbase)sothatourcodeworksforbothEMUand*/#defineNON_SECURE_SRAM_START0x40304000#defineNON_SECURE_SRAM_END0x4030E000#defineLOW_LEVEL_SRAM_STACK0x4030B7FC12345678問題:這些參數(shù)是保存在哪?的??概有哪些參數(shù)?答:這些參數(shù)保存的內(nèi)存地址為64KB的OCMRAM中:注:DowloadedImage區(qū)域:是?來保存MLO(SPL)?件的,其最?可達到109KB@a2@設置CPU為SVC32模式<PATH:/arch/arm/cpu/armv7/start.S><PATH:/arch/arm/cpu/armv7/start.S>/**setthecputoSVC32mode*/mrsr0,cpsrbicr0,r0,#0x1forrr0,r0,msrcpsr,r012345678CPSR:程序狀態(tài)寄存器(currentprogramstatusregister)(當前程序狀態(tài)寄存器),在任何處理器模式下被訪問。它包含了條件標志位、中斷禁?位、當前處理器模式標志以及其他的?些控制和狀態(tài)位。CPSR在?戶級編程時?于存儲條件碼。SPSR:程序狀態(tài)保存寄存器(savedprogramstatusregister),每?種處理器模式下都有?個狀態(tài)寄存器SPSR,SPSR?于保存CPSR中斷退出時,可以?SPSR來恢復CPSR。由于?戶模式和系統(tǒng)模式不是異常中斷模式,所以他沒有SPSR。當?戶在?戶模式或系統(tǒng)模式訪問SPSR,將產(chǎn)?不可預知的后果。CPSR格式如下所?。SPSR和CPSR格式相同。31302928272676543210NZCVQDNM(RAZ)IFTM4M3M2M1M0@a3@CPU的初始化《《PATH:/arch/arm/cpu/armv7/start.S》themaskROMcodeshouldhavePLLandothersstable*/#ifndefCONFIG_SKIP_LOWLEVEL_INITblcpu_init_crit#endif123451<PATH:/arch/arm/cpu/armv7/omap-common/lowlevel_init.S>2.globllowlevel_init3lowlevel_init:4/*5*Setupatemporarystack6*/7ldrsp,=LOW_LEVEL_SRAM_STACK89/*10*Savetheoldlr(passedinip)andthecurrentlrtostack11*/12push{ip,lr}13141415161718/**gosetuppll,mux,memory*/bls_initpop{ip,pc}問題:CPU的初始化有哪些內(nèi)容?答:@b1@?先要設置堆棧區(qū),因為將會調(diào)?C函數(shù)來實現(xiàn)CPU的初始化問題:這個堆棧在什么位置,其內(nèi)存??是多少?答1《PATH:/arch/arm/include/asm/arch-ti81xx/omap.h》2#defineLOW_LEVEL_SRAM_STACK0x4030B7FC<strong></strong>@b2@執(zhí)?s_init()函數(shù),實現(xiàn)CPU的初始化1123456789101112131415161718192021222324<PATH:/board/ti/am335x/evm.c>/**earlysysteminitofmuxingandclocks.*/voids_init(void){CanberemovedasA8comesupwithL2enabled*/l2_cache_enable();WDT1isalreadyrunningwhenthebootloadergetscontrol*Disableittoavoid"random"resets*/raw_writel(0xAAAA,WDT_WSPR);while(raw_readl(WDT_WWPS)0x0);raw_writel(0x5555,WDT_WSPR);while(raw_readl(WDT_WWPS)0x0);#ifdefCONFIG_SPL_BUILDSetupthePLLsandtheclocksfortheperipherals*/pll_init();/*EnableRTC32Kclock*/rtc32k_enable();UARTsoftreset*/u32regVal;u32uart_base=DEFAULT_UART_BASE;28enable_uart0_pin_mux();MotorControlBoardhasdefaultconsoleonUART3*/XXX:Thisisbeforewe'veprobed/setboard_id*/if(board_id==IA_BOARD){uart_base=UART3_BASE;34 }35regVal=raw_readl(uart_base+UART_SYSCFG_OFFSET);regVal|=UART_RESET;raw_writel(regVal,(uart_base+UART_SYSCFG_OFFSET));whileraw_readl(uart_base+UART_SYSSTS_OFFSET)&UART_CLK_RUNNING_MASK)UART_CLK_RUNNING_MASK);41Disablesmartidle*/regVal=raw_readl((uart_base+UART_SYSCFG_OFFSET));regVal|=UART_SMART_IDLE_EN;raw_writel(regVal,(uart_base+UART_SYSCFG_OFFSET));46InitializetheTimer*/init_timer();4950 preloader_console_init();5152 printf("\nlocation/board/ti/am335x\n"); 53 54 led();55 5657 config_am335x_ddr();5859 #endif60 }@c1@使能第?級緩沖區(qū)1/*CanberemovedasA8comesupwithL2enabled*/2l2_cache_enable();34<PATH:/arch/arm/cpu/armv7/ti81xx/cache.S>5l2_cache_enable:6push{r0,r1,r2,lr}7mrc15,0,r3,cr1,cr0,18orrr3,r3,#29mcr15,0,r3,cr1,cr0,110pop{r1,r2,r3,pc}@c2@關閉看門狗(WDT)1/*WDT1isalreadyrunningwhenthebootloadergetscontrol2*Disableittoavoid"random"resets3*/4raw_writel(0xAAAA,WDT_WSPR);5while(raw_readl(WDT_WWPS)!=0x0);6raw_writel(0x5555,WDT_WSPR);7while(raw_readl(WDT_WWPS)!=0x0);1<PATH:/arch/arm/include/asm/arch-ti81xx/cpu.h>2#defineWDT_WSPR(WDT_BASE+0x048)345<PATH:/arch/arm/include/asm/arch-ti81xx/hardware.h>6/*WatchdogTimer*/7#ifdefCONFIG_AM335X8#defineWDT_BASE 0x44E350009#else10#defineWDT_BASE 0x480C200011#endif@c3@給外設設置好PLL和時鐘頻率等1/*SetupthePLLsandtheclocksfortheperipherals*/2pll_init();345<PATH:/board/ti/am335x/pll.c>6/*7*ConfigurethePLL/PRCMfornecessaryperipherals8*/9voidpll_init()10{11mpu_pll_config(MPUPLL_M_500);12core_pll_config();13per_pll_config();14ddr_pll_config();15/*Enabletherequiredinterconnectclocks*/16interface_clocks_enable();17/*Enablepowerdomaintransition*/18power_domain_transition_enable();19/*Enabletherequiredperipherals*/20per_clocks_enable();21}@c4@使能32-KHz頻率的實時時鐘1123456/*EnableRTC32Kclock*/rtc32k_enable();《PATH/board/ti/am335x/evm.c》staticvoidrtc32k_enable(void)7{8/*Unlockthertc'sregisters*/9raw_writel(0x83e70b13,(AM335X_RTC_BASE+RTC_KICK0_REG));10raw_writel(0x95a4f1e0,(AM335X_RTC_BASE+RTC_KICK1_REG));1112/*EnabletheRTC32KOSC*/13raw_writel(0x48,(AM335X_RTC_BASE+RTC_OSC_REG));14}1516<PATH:/arch/arm/include/asm/arch-ti81xx/hardware.h>17/*RTCbaseaddress*/18#defineAM335X_RTC_BASE 0x44E3E0001920<PATH:/board/ti/am335x/evm.c>21#defineRTC_KICK0_REG 0x6c22#defineRTC_KICK1_REG 0x7023#defineRTC_OSC_REG 0x54@c5@使能UART01123456789101112131415161718192021222324252627282930/*UARTsoftreset*/u32regVal;u32uart_base=DEFAULT_UART_BASE;enable_uart0_pin_mux();/*IAMotorControlBoardhasdefaultconsoleonUART3*/XXX:Thisisbeforewe'veprobed/setboard_id*/if(board_id==IA_BOARD){uart_base=UART3_BASE;}regVal=raw_readl(uart_base+UART_SYSCFG_OFFSET);regVal|=UART_RESET;raw_writel(regVal,(uart_base+UART_SYSCFG_OFFSET));while((raw_readl(uart_base+UART_SYSSTS_OFFSET)&UART_CLK_RUNNING_MASK)!=UART_CLK_RUNNING_MASK);/*Disablesmartidle*/regVal=raw_readl((uart_base+UART_SYSCFG_OFFSET));regVal|=UART_SMART_IDLE_EN;raw_writel(regVal,(uart_base+UART_SYSCFG_OFFSET));<PATH:/arch/arm/include/asm/arch-ti81xx/cpu.h>#ifdefCONFIG_AM335X#defineDEFAULT_UART_BASE#endifUART0_BASE<PATH:/arch/arm/include/asm/arch-ti81xx/hardware.h>#ifdefCONFIG_AM335X31#defineUART0_BASE0x44E0900031#defineUART0_BASE0x44E0900032#else33#defineUART0_BASE0x48020000@c6@初始化定時器<PATH:/board/ti/am335x/evm.c><PATH:/board/ti/am335x/evm.c>staticvoidinit_timer(void){/*ResettheTimer*/raw_writel(0x2,(DM_TIMER2_BASE+TSICR_REG));/*Waituntiltheresetisdone*/while(raw_readl(DM_TIMER2_BASE+TIOCP_CFG_REG)&1);/*StarttheTimer*/raw_writel(0x1,(DM_TIMER2_BASE+TCLR_REG));}<PATH:/arch/arm/include/asm/arch-ti81xx/hardware.h>/*DMTimerbaseaddresses*/#defineDM_TIMER0_BASE0x4802C000#defineDM_TIMER1_BASE0x4802E000#defineDM_TIMER2_BASE0x48040000#defineDM_TIMER3_BASE0x48042000#defineDM_TIMER4_BASE0x48044000#defineDM_TIMER5_BASE0x48046000#defineDM_TIMER6_BASE0x48048000#defineDM_TIMER7_BASE0x4804A000InitializetheTimer*/init_timer();123456789101112131415161718192021222324252627@c7@初始化控制臺,通過UART可以查看相關信息1preloader_console_init();23《PATH:/arch/arm/cpu/armv7/omap-common/spl.c》4/*ThisrequiresUARTclockstobeenabled*/5voidpreloader_console_init(void)6{7constchar*u_boot_rev=U_BOOT_VERSION;8charrev_string_buffer[50];910gd=&gdata;11gd->bd=&bdata;12gd->flags|=GD_FLG_RELOC;13gd->baudrate=CONFIG_BAUDRATE;1415serial_init(); serialcommunicationssetup*/1617/*Avoidasecond"U-Boot"comingfromthisstring*/18u_boot_rev=&u_boot_rev[7];1920printf("\nU-BootSPL%s(%s-%s)\n",u_boot_rev,U_BOOT_DATE,21U_BOOT_TIME);22omap_rev_string(rev_string_buffer);23printf("TexasInstruments%s\n",rev_string_buffer);24}<spanstyle="font-size:14px;color:#003399;"></span>@c8@配置DDR1123456789101112131415161718192021222324config_am335x_ddr();《PATH:》/*voidDDR2_EMIF_Config(void);*/staticvoidconfig_am335x_ddr(void){intdata_macro_0=intdata_macro_1=enable_ddr_clocks();config_vtp();Cmd_Macro_Config();Data_Macro_Config(data_macro_0);Data_Macro_Config(data_macro_1);raw_writel(PHY_RANK0_DELAY,DATA0_RANK0_DELAYS_0);raw_writel(PHY_RANK0_DELAY,DATA1_RANK0_DELAYS_0);raw_writel(DDR_IOCTRL_VALUE,DDR_CMD0_IOCTRL);raw_writel(DDR_IOCTRL_VALUE,DDR_CMD1_IOCTRL);25raw_writel(DDR_IOCTRL_VALUE,DDR_CMD2_IOCTRL);26raw_writel(DDR_IOCTRL_VALUE,DDR_DATA0_IOCTRL);27raw_writel(DDR_IOCTRL_VALUE,DDR_DATA1_IOCTRL);2829raw_writel(raw_readl(DDR_IO_CTRL)&0xefffffff,DDR_IO_CTRL);30raw_writel(raw_readl(DDR_CKE_CTRL)|0x00000001,DDR_CKE_CTRL);3132config_emif_ddr2();33}343536《PATH:/arm/include/asm/arch-ti81xx/cpu.h》37#defineDATA0_RANK0_DELAYS_0 (DDR_PHY_BASE_ADDR+0x134)38#defineDATA1_RANK0_DELAYS_0 (DDR_PHY_BASE_ADDR+0x1D8)3940/*DDRoffsets*/41#defineDDR_PHY_BASE_ADDR 0x44E1200042#defineDDR_IO_CTRL 0x44E10E0443#defineDDR_CKE_CTRL 0x44E1131C#defineCONTROL_BASE_ADDR 0x44E10000@cDONE@@bDONE@@a4@設置internalRAM內(nèi)存空間的棧指針,調(diào)?board_init_f()函數(shù)SetstackpointerininternalRAMcallboard_init_f*/call_board_init_f:ldrsp,=(CONFIG_SYS_INIT_SP_ADDR)bicsp,sp,#78-bytealignmentforABIcompliance*/ldrr0,=0x00000000blboard_init_f1234561<PATH:include/configs/am335x_evm.h>2#defineCONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_INIT_RAM_ADDR+\3CONFIG_SYS_INIT_RAM_SIZE-\4GENERATED_GBL_DATA_SIZE)56#defineCONFIG_SYS_INIT_RAM_ADDRSRAM0_START7#defineCONFIG_SYS_INIT_RAM_SIZESRAM0_SIZE89<PATH:/arch/arm/include/asm/arch-ti81xx/hardware.h:begin>10#ifdefCONFIG_AM335X11#defineSRAM0_START 0x402F040012#else13#defineSRAM0_START 0x4030000014#endif15<PATH:/arch/arm/include/asm/arch-ti81xx/hardware.h:end>1617<PATH:/arch/arm/include/asm/arch-ti81xx/cpu.h:begin>18#ifdefined(CONFIG_AM335X)||defined(CONFIG_TI814X)19#defineSRAM0_SIZE (0x1B400)109KB*/20#defineSRAM_GPMC_STACK_SIZE (0x40)21#endif22<PATH:/arch/arm/include/asm/arch-ti81xx/cpu.h:end>2324<PATH:/am335x/include/generated/generic-asm-offsets.h:begin>25#defineGENERATED_GBL_DATA_SIZE(128)/*(sizeof(structglobal_data)+15)&~15*/26<PATH:/am335x/include/generated/generic-asm-offsets.h:end>1<PATH:/arch/arm/cpu/armv7/omap-common/spl.c'>2voidboard_init_f(ulongdummy)3{4/*5*Wecallrelocate_code()withrelocationtargetsameasthe6*CONFIG_SYS_SPL_TEXT_BASE.Thiswillresultinrelocationgetting7*skipped.Instead,only.bssinitializationwillhappen.That's8*allweneed9*/10debug(">>board_init_f()\n");11relocate_code(CONFIG_SPL_STACK,&gdata,CONFIG_SPL_TEXT_BASE);12}1314<PATH:/arch/arm/cpu/armv7/omap-common/spl.c:begin>15#defineCONFIG_SPL_TEXT_BASE 0x402F040016#defineCONFIG_SPL_MAX_SIZE (46*1024)17#defineCONFIG_SPL_STACK LOW_LEVEL_SRAM_STACK18<PATH:/arch/arm/cpu/armv7/omap-common/spl.c:end>1920<PATH:/arch/arm/include/asm/arch-ti81xx/omap.h:begin>21#defineLOW_LEVEL_SRAM_STACK0x4030B7FC22<PATH:/arch/arm/include/asm/arch-ti81xx/omap.h:end>112345678<PATH:/arch/arm/cpu/armv7/start.S>/*voidrelocate_code(addr_sp,gd,addr_moni)*This"function"doesnotreturn,insteaditcontinuesinRAMafterrelocatingthemonitorcode.**/9910111213.globlrelocate_coderelocate_code:movr4,r0/*saveaddr_sp*/movr5,r1/*saveaddrofgd*/movr6,r2saveaddrofdestination0x402F0400*/@a5@代碼重定位如果是直接跳到下?的堆棧初始化代碼clear_bss。如果不是就將??從NorFlash中拷貝到內(nèi)存中。NorFlash和NandFlash本質(zhì)區(qū)別就在于是否進?代碼拷貝,也就是下?代碼所表述:?論是NorFlash還是NandFlash,核?思想就是將uboot代碼搬運到內(nèi)存中去運?,但是沒有拷貝bss后?這段代碼,只拷貝bss前?的代碼,bss代碼是放置全局變量的。Bss段代碼是為了清零,拷貝過去再清零重復操作。1Setupthestack */2stack_setup:3movsp,r445adrr0,_start6cmpr0,r67moveqr9,#0 norelocation.relocationoffset(r9)=0*/8beqclear_bss skiprelocation*/9movr1,r6 r1<-scratchforcopy_loop*/10ldrr3,_image_copy_end_ofs11addr2,r0,r3 r2<-sourceendaddress */1213copy_loop: ?拷貝*/14ldmiar0!,{r9-r10} copyfromsourceaddress[r0]*/15stmiar1!,{r9-r10} copytargetaddress[r1]*/16cmpr0,r2 untilsourceendaddress[r2]*/17blocopy_loop@a6@清空bss段1clear_bss:23ldrr0,_bss_start_ofs4ldrr1,_bss_end_ofs5movr4,r6 relocaddr*/6addr0,r0,r47addr1,r1,r489movr2,#0x00000000 clear*/10101112131415161718192021clbss_l:strr2,[r0]addr0,r0,#4cmpr0,r1bneclbss_lclearloop...*//**Thesearedefinedintheboard-specificlinkerscript.*/.globl_bss_start_ofs_bss_start_ofs:.wordbss_start-_start bss_start=0x80000000*/@a7@調(diào)?函數(shù)board_init_r,?以完成MLO(SPI)階段的所有初始化,并跳轉(zhuǎn)到uboot.img階段1/*2*Wearedone.Donotreturn,insteadbranchtosecondpartofboard3*initialization,nowrunningfromRAM.4*/5jump_2_ram:6/*7*IfI-cacheisenabledinvalidateit8*/9#ifndefCONFIG_SYS_ICACHE_OFF10mcrp15,0,r0,c7,c5,0@invalidateicache11mcr p15,0,r0,c7,c10,4@DSB12mcr p15,0,r0,c7,c5,4@ISB13#endif14ldrr0,_board_init_r_ofs15adrr1,_start16addlr,r0,r117addlr,lr,r918/*setupparametersforboard_init_r*/19movr0,r5 gd_t*/20movr1,r6 dest_addr*/21/*jumptoit...*/22movpc,lr2324_board_init_r_ofs:25.wordboard_init_r-_start11234《PATH:/arch/arm/cpu/armv7/omap-common/spl.c》voidboard_init_r(gd_t*id,ulongdummy){u32boot_device;5debug(">>spl:board_init_r()\n");67timer_init();8i2c_init(CONFIG_SYS_I2C_SPEED,CONFIG_SYS_I2C_SLAVE);910#ifdefCONFIG_SPL_BOARD_INIT11spl_board_init();12#endif1314boot_device=omap_boot_device();15debug("bootdevice-%d\n",boot_device);16switch(boot_device){17#ifdefCONFIG_SPL_MMC_SUPPORT18caseBOOT_DEVICE_MMC1:19caseBOOT_DEVICE_MMC2:20spl_mmc_load_image();21break;22#endif23#ifdefCONFIG_SPL_NAND_SUPPORT24caseBOOT_DEVICE_NAND:25spl_nand_load_image();26break;27#endif28#ifdefCONFIG_SPL_YMODEM_SUPPORT29caseBOOT_DEVICE_UART:30spl_ymodem_load_image();31break;32#endif33default:34printf("SPL:Un-supportedBootDevice-%d!!!\n",boot_device);35hang();36break;37}3839switch(spl_image.os){40caseIH_OS_U_BOOT:41debug("JumpingtoU-Boot\n");42jump_to_image_no_args();43break;44default:45puts("UnsupportedOSimage..Jumpingnevertheless..\n");46jump_to_image_no_args();47}48}@aDONE@3,第三級bootloader:uboot.img做了哪些事情?uboot.img內(nèi)存分布如下:訪問/arch/arm/lib/board.c中的board_init_f()函數(shù):在uboot.img運?過程中,有兩個?常重要的結(jié)構體:gd_t和bd_t。其中gd_t:global_data數(shù)據(jù)結(jié)構的定義,位于:/arch/arm/include/asm/global_data.h中。其成員主要是?些全局的系統(tǒng)初始化參數(shù)。其中bd_t:bd_info數(shù)據(jù)結(jié)構的定義,位于:/arch/arm/include/asm/u-boot.h中。其成員是開發(fā)板的相關參數(shù)。112345678910111213141516171819202122<PATH:/arch/arm/include/asm/global_data.h>/*Thefollowingdatastructureisplacedinsomememorywhichisavailableveryearlyafterboot(likeDPRAMonMPC8xx/MPC82xx,orsomelockedpartsofthedatacache)allowforaminimumsetofglobalvariablesduringsysteminitialization(untilwehavesetupthememorycontrollersothatwecanuseRAM).*Keepit*SMALL*andremembersetGENERATED_GBL_DATA_SIZE>sizeof(gd_t)*/typedefstructglobal_data{bd_t*bd;unsignedlongunsignedunsignedunsignedunsignedunsignedflags;baudrate;have_console;serial_init()wascalled*/env_addr;AddressofEnvironmentstruct*/env_valid;ChecksumofEnvironmentvalid?*/fb_base;baseaddressofbuffer*/#ifdefCONFIG_FSL_ESDHCunsignedlongsdhc_clk;#endif23#ifdefCONFIG_AT91FAMILY24/*"staticdata"neededbyat91'sclock.c*/25unsignedlongcpu_clk_rate_hz;26unsignedlongmain_clk_rate_hz;27unsignedlongmck_rate_hz;28unsignedlongplla_rate_hz;29unsignedlongpllb_rate_hz;30unsignedlongat91_pllb_usb_init;31#endif32#ifdefCONFIG_ARM33/*"staticdata"neededbymostoftimer.conARMplatforms*/34unsignedlongtimer_rate_hz;35unsignedlongtbl;36unsignedlongtbu;37unsignedlonglongtimer_reset_value;3839404142434445unsignedlonglastinc;#endif#ifdefCONFIG_IXP425unsignedlongtimestamp;#endifunsignedlongrelocaddr;/*StartaddressofU-BootinRAM*/phys_size_tram_size;/*RAMsize*/46unsignedlongmon_len;/*monitorlen*/47unsignedlongirq_sp; irqstackpointer*/48unsignedlongstart_addr_sp;/*start_addr_stackpointer*/49unsignedlongreloc_off;50#if!(defined(CONFIG_SYS_ICACHE_OFF)&&defined(CONFIG_SYS_DCACHE_OFF))51unsignedlongtlb_addr;52#endif53void **jt; jumptable*/54char env_buf[32];bufferforgetenv()beforereloc.*/55}gd_t;5657#defineDECLARE_GLOBAL_DATA_PTR registervolatilegd_t*gdasm("r8")585960<PATH:/arch/arm/include/asm/u-boot.h>61typedefstructbd_info{62int bi_baudrate;serialconsolebaudrate*/63unsignedlongbi_ip_addr;/*IPAddress*/64ulong bi_arch_number;uniqueidforthisboard*/65ulong bi_boot_params;wherethisboardexpectsparams*/66struct RAMconfiguration*/67{68ulongstart;69ulongsize;70} bi_dram[CONFIG_NR_DRAM_BANKS];}bd_t;其中DECLARE_GLOBAL_DATA_PTR宏定義在系統(tǒng)初始化過程中會被頻繁調(diào)?,其的作?是,聲明gd這么?個全局的指針,這個指針指向gd_t結(jié)構體類型,并且這個gd指針是保存在ARM的r8這個寄存器??的。uboot.img第?個運?的?件還是start.o,其在運?訪問的board_init_f()函數(shù)定義在/arch/arm/lib/board.c中:<PATH:/arch/arm/lib/board.c><PATH:/arch/arm/lib/boar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論