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页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AM335x启动流程(BootRom-MLO-Uboot)超详细源码分析写的⾮常好,收藏学习参考⽂件:1,AM335xARMCortex-A8Microprocessors(MPUs)TechnicalReferenceManual.pdf;2,am3359.pdf;1,am335x的cpu上电后,会跳到哪个地址去执⾏?答:芯⽚到uboot启动流程:ROM→MLO(SPL)→uboot.imgAM335x中bootloader被分成了3个部分:第⼀级bootloader:引导加载程序,板⼦上电后会⾃动执⾏这些代码,如选择哪种⽅式启动(NAND,SDcard,UART。。。),然后跳转转到第⼆级bootloader。这些代码应该是存放在176KB的ROM中。第⼆级bootloader:MLO(SPL),⽤以硬件初始化:关闭看门狗,关闭中断,设置CPU时钟频率、速度等操作。然后会跳转到第三级bootloader。MLO⽂件应该会被映射到64KB的InternalSRAM中。第三级bootloader:uboot.img,C代码的⼊⼝。其中第⼀级bootloader是板⼦固化的,第⼆级和第三级是通过编译uboot所得的。2,第⼆级bootloader:MLO(SPL)做了哪些事情?MLO(SPL)内存分布如下:SPL内存重映射: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@保存启动参数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问题:这些参数是保存在哪⾥的?⼤概有哪些参数?答:这些参数保存的内存地址为64KB的OCMRAM中:注:DowloadedImage区域:是⽤来保存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:程序状态寄存器(currentprogramstatusregister)(当前程序状态寄存器),在任何处理器模式下被访问。它包含了条件标志位、中断禁⽌位、当前处理器模式标志以及其他的⼀些控制和状态位。CPSR在⽤户级编程时⽤于存储条件码。SPSR:程序状态保存寄存器(savedprogramstatusregister),每⼀种处理器模式下都有⼀个状态寄存器SPSR,SPSR⽤于保存CPSR中断退出时,可以⽤SPSR来恢复CPSR。由于⽤户模式和系统模式不是异常中断模式,所以他没有SPSR。当⽤户在⽤户模式或系统模式访问SPSR,将产⽣不可预知的后果。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的初始化有哪些内容?答:@b1@⾸先要设置堆栈区,因为将会调⽤C函数来实现CPU的初始化问题:这个堆栈在什么位置,其内存⼤⼩是多少?答1《PATH:/arch/arm/include/asm/arch-ti81xx/omap.h》2#defineLOW_LEVEL_SRAM_STACK0x4030B7FC<strong></strong>@b2@执⾏s_init()函数,实现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@使能第⼆级缓冲区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内存空间的栈指针,调⽤board_init_f()函数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中拷贝到内存中。NorFlash和NandFlash本质区别就在于是否进⾏代码拷贝,也就是下⾯代码所表述:⽆论是NorFlash还是NandFlash,核⼼思想就是将uboot代码搬运到内存中去运⾏,但是没有拷贝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@调⽤函数board_init_r,⽤以完成MLO(SPI)阶段的所有初始化,并跳转到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内存分布如下:访问/arch/arm/lib/board.c中的board_init_f()函数:在uboot.img运⾏过程中,有两个⾮常重要的结构体:gd_t和bd_t。其中gd_t:global_data数据结构的定义,位于:/arch/arm/include/asm/global_data.h中。其成员主要是⼀些全局的系统初始化参数。其中bd_t:bd_info数据结构的定义,位于:/arch/arm/include/asm/u-boot.h中。其成员是开发板的相关参数。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宏定义在系统初始化过程中会被频繁调⽤,其的作⽤是,声明gd这么⼀个全局的指针,这个指针指向gd_t结构体类型,并且这个gd指针是保存在ARM的r8这个寄存器⾥⾯的。uboot.img第⼀个运⾏的⽂件还是start.o,其在运⾏访问的board_init_f()函数定义在/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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论