u-boot啟動(dòng)流程分析_第1頁(yè)
u-boot啟動(dòng)流程分析_第2頁(yè)
u-boot啟動(dòng)流程分析_第3頁(yè)
u-boot啟動(dòng)流程分析_第4頁(yè)
u-boot啟動(dòng)流程分析_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、這個(gè)鏈接腳本,可以知道目標(biāo)程序的各先看 board/smsk2410/u-boot.lds部分鏈接順序。OUTPUT_FORMAT (elf32-littlearm, elf32-littlearm ,elf32-littlearm)/*OUTPUT_FORMAT (elf32-arm , elf32-arm , elf32-arm )*/OUTPUT_ARCH (arm )ENTRY (_start)SECTIONS.=0x00000000; /*指定可執(zhí)行image文件的全局入口點(diǎn),通常這個(gè)地址都放在ROM (flash )0x0位置。必須使編譯器知道這個(gè)地址,通常都 是修改此處來(lái)完成*/

2、.=ALIGN (4);.text :cpu/arm920t/start .o (.text )*(. text ).=ALIGN (4);.rodata : *(. rodata ) .=ALIGN (4);.data : *(.data ) .=ALIGN (4);.got : *(.got ) 一 ,_u_boot_cmd_start=.;.u_boot_cmd : *(. u_boot_cmd ) _u_boot_cmd_end=.;.=ALIGN (4);_bss_start =.;.bss : *(. bss) _end =.;第一個(gè)要鏈接的是 cpu/arm920t/starto

3、,那么U-Boot的入口指令一定位于這個(gè)程序中。下面詳細(xì)分析一下程序跳轉(zhuǎn)和函數(shù)的調(diào)用關(guān)系以及函數(shù) 實(shí)現(xiàn)。1 . Stage1 : cpu/arm920t/start.S這個(gè)匯編程序是 U-Boot的入口程序,開頭就是復(fù)位向量的代碼Ki&tTWtTlrfUpirdt_seqiieiie :mkii_loop()U-Boot啟動(dòng)代碼流程圖_start : b reset / 復(fù)位向量;;設(shè)置異常向量表ldr pc , _undefined_instructionldr pc , .softwaren terruptldr pc , _prefetch_abortldr pc , _data_abo

4、rtldr pc , _not_usedldr pc ,rq /中斷向量ldr pc , _fiq /中斷向量/ * the actual reset code */reset : /復(fù)位啟動(dòng)子程序/ *設(shè)置CPU為SVC32模式*/mrs r0 ,cpsrbic r0 ,rO,#Ox1f ;位清除,將某些位的值置0 : r0 = r0 AND ( !0x1f)orr r0 ,r0 ,#0xd3 ;邏輯或,將r0與立即數(shù)進(jìn)行邏輯或,放在r0中(第 一個(gè))msr cpsr ,r0/*關(guān)閉看門狗*/ * turn off the watchdog */#if defined (CONFIG_S3C

5、2400 )# define pWTCON 0x15300000# define INTMSK 0x14400008 / addresses */# define CLKDIVN 0x14800014 / #elif defined (CONFIG_S3C2410# define pWTCON 0x53000000# define INTMSK 0x4A000008 / addresses */Interupt -Controller base* clock divisor register */)Interupt - Controller base# define INTSUBMSK 0x4

6、A00001C# define CLKDIVN 0x4C000014 /clock divisor register */#endif#if defined (CONFIG S3C2400 ) | defined (CONFIG S3C2410 )Idr r0 , = pWTCONmov r1 , #0x0str r1 , r0/*禁止所有中斷和設(shè)置 CPU頻率*/ * mask all IRQs by setting all bits in the INTMR - default*/mov r1 , #0xffffffffldr r0 ,=INTMSKstr r1 , r0# if defi

7、ned (CONFIG_S3C2410 )ldr r1 , = 0x3ffldr r0 ,=INTSUBMSKstr r1 , r0# endif/ * FCLK:HCLK:PCLK = 1 :2:4 */ ;FCLK 用于 CPU , HCLK 用于 AHB ,PCLK 用于 APB/ * default FCLK is 120 MHz ! */ldr r0,二CLKDIVN ;根據(jù)硬件手冊(cè)來(lái)設(shè)置 CLKDIVN寄存器mov r1 , #3 ;用戶手冊(cè)的推薦值str r1 , r0#endif /* CONFIG_S3C2400 | CONFIG_S3C2410 */*這些初始化代碼在系統(tǒng)重

8、起的時(shí)候執(zhí)行,運(yùn)行時(shí)熱復(fù)位從RAM中啟動(dòng)不執(zhí)行*/ * we do sys -critical inits only at reboot ,* not when booting from*/#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpunit_crit;跳轉(zhuǎn)去初始化 CPU#endif;#ifdef CONFIG_INIT_CRITICAL 原文中的,估計(jì)是 1.1.16 版本的;bl cpu_init_crit;#endif/* CPU和RAM兩個(gè)關(guān)鍵的初始化子程序*/*初始化CPU */cpu_init_crit/ * flush v4 I/D caches

9、 設(shè)置 CP15*/mov r0, #0mcr p15 , 0, r0 , c7 , c7,0 / * flush v3/v4 cache */ ;使 1/D cache 失效:將寄存器r0的數(shù)據(jù)傳送到協(xié)處理器p15的c7中。C7寄存器位對(duì)應(yīng)cp15中的cache控制寄存器mcr p15 , 0, r0, c8 , c7, 0 /* flush v4 TLB */ ;使 TLB 操作寄存器失效: 將r0數(shù)據(jù)送到cp15的c8、c7中。C8對(duì)應(yīng)TLB操作寄存器/ * disable MMU stuff and caches 禁止 MMU 和 caches*/mrc p15 , 0, r0 , c

10、1 , c0,0 ;先把 c1 和 c0 寄存器的各位置 O(rO = 0)bic r0 , r0 , #0x00002300 clear bits 13, 9:8 (- V- - RS)bic r0 , r0, #0x00000087 clear bits 7, 2:0 (BCAM );這里我本來(lái)有個(gè)疑問(wèn):為什么要分開設(shè)置。因?yàn)閍rm匯編要求的立即數(shù)格式所決定的orr r0 , r0 , #0x00000002 set bit 2(?) (A) Align ;上一條已經(jīng)設(shè)置bitl為0,這一條又設(shè)置為 1 ? ?orr r0 , r0 , #0x00001000 set bit 12(I)

11、I-Cachemcr p15 , 0, r0 , c1 , c0,0 ;用上面(見下面)設(shè)定的r0的值設(shè)置c1 ? ? (cache類型寄存器)和c0 (control字寄存器),以下為c0的位定義 ;bit8 : 0 = Disable System protection;bit9 : 0 = Disable ROM protection;bit0 : 0 = MMU disabled;bit1 : 0 = Fault checking disabled禁止糾錯(cuò);bit2 : 0 = Data cache disabled ;bit7 : 0 = Little -endian operati

12、on;bit12 : 1 = Instruction cache enabled/ *配置內(nèi)存區(qū)控制寄存器?有待分析,是1.1.4版本的* before relocating , we have to setup RAM timing* because memory timing is board-dependend , you will* find a lowlevelnit.S in your board directory .*/mov ip, lrbl lowlevel_init;位于 board/smdk2410/lowlevel_init .S:用于完成芯片存儲(chǔ)器的初始化,執(zhí)行完成

13、后返回mov lr, ipmov pc , lrrelocate : /* 把 U-Boot 重新定位到 RAM */adr r0 , _start / * r0是代碼的當(dāng)前位置*/ ;adr偽指令,匯編器自動(dòng)通過(guò)當(dāng)前PC的值算出 如果執(zhí)行到_start時(shí)PC的值,放到r0中: 當(dāng)此段在flash中執(zhí)行時(shí)r0 = _start = 0 ;當(dāng)此段在 RAM 中執(zhí)行時(shí)_start =_TEXT_BASE(在 board/smdk2410/config .mk 中指定的值為 0x33F80000,即u-boot在把代碼拷貝到 RAM中去執(zhí)行的代碼段的開 始)ldr r1 , _TEXT_BASE /

14、* 測(cè)試判斷是從 Flash 啟動(dòng),還是 RAM */ ; 此句執(zhí)行的結(jié)果r1始終是0X33FF80000,因?yàn)榇酥凳怯志幾g器指定的 (ads中設(shè)置,或-D設(shè)置編譯器參數(shù))cmp r0 , r1 / *比較r0和r1,調(diào)試的時(shí)候不要執(zhí)行重定位*/beq stack setup /*如果r0等于r1,跳過(guò)重定位代碼*/ *準(zhǔn)備重新定位代碼 */ ;以上確定了復(fù)位啟動(dòng)代碼是在 flash中執(zhí) 行的(是系統(tǒng)重啟,而不是軟復(fù)位),就需要把代碼拷貝到 RAM中去執(zhí)行, 以下為計(jì)算即將拷貝的代碼的長(zhǎng)度ldr r2 , _armboot_start;前面定義了,就是 _startldr r3 , _bss_

15、start ;所謂bss段,就是未被初始化的靜態(tài)變量存放的 地方,這個(gè)地址是如何的出來(lái)的?根據(jù) board/smsk2410/u -boot .Ids 內(nèi)容?sub r2 , r3 , r2 / * r2 得到 armboot 的大小 */add r2 , r0 , r2 / * r2 得到要復(fù)制代碼的末尾地址*/copy_loop : /*重新定位代碼*/ ;開始循環(huán)拷貝啟動(dòng)的代碼到RAM中l(wèi)dmia r3-r10 / *從源地址rO復(fù)制 */ ;r0 指向 _start (=0)stmia r3-r10 / *復(fù)制到目的地址r1 */ ;r1指向_TEXT_BASE(二 0x33F8000

16、0 )cmp r0, r2 / *復(fù)制數(shù)據(jù)塊直到源數(shù)據(jù)末尾地址r2 */ble copy_loop;這里附上u-boot各存儲(chǔ)區(qū)域的映射圖,從網(wǎng)上找的,這下對(duì)于這幾個(gè) 地址的位置就一目了然了,對(duì)于我這種菜鳥真的是好圖啊!endb&s_start全局?jǐn)?shù)堀結(jié)構(gòu)體 ._ cJ_t的扌旨針gdSDRAM、h地址增加方向FLASH ;SDRAM 8ASE0X0000 0000/*初始化堆棧等*/stack_setup:ldr r0, _TEXT_BASE /* 上面是 128 KiB 重定位的 u-boot */sub r0, r0, #CFG_MALLOC_LEN /*向下是內(nèi)存分配空間*/sub r

17、0, r0, #CFG_GBL_DATA_SIZE /* 然后是 bdinfo 結(jié)構(gòu)體地址空間 */#ifdef CONFIG_USE_IRQsub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ) #endif ;這些宏定義在 /include/configs/smdk2410.h中:#define CFG_MALLOC_LEN (CFG_ENV_SIZE +128*1024);64K+128K=0xC0#define CFG_ENV_SIZE 0x10000/* Total Size of EnvironmentSector 64 k

18、*/#define CONFIG_STACKSIZE#define CFG_GBL_DATA_SIZE128/* size in bytes reserved for(128*1024)/* regular stack 128k */nitial data */用0x33F8000-0xC0 -0x80得到_TEXT_BASE向下(低地址)的堆棧指針sp的起點(diǎn)地址sub sp, r0, #12 /* 為 abort-stack 預(yù)留 3 個(gè)字 */;得到最終 sp 指針初始值clear_bss:ldr r0, _bss_start /* 找到 bss 段起始地址 */ldr r1, _bss_

19、end /* bss 段末尾地址 */mov r2, #0x00000000 /* 清零 */clbss_l:str r2, r0 /* bss段地址空間清零循環(huán) */add r0, r0, #4cmp r0, r1bne clbss_l/* 跳轉(zhuǎn)到start_armboot函數(shù)入口,_start_armboot 字保存函數(shù)入口指針*/ldr pc, _start_armboot_start_armboot: .word start_armboot ;start_armboot函數(shù)在ib arm/board.c中實(shí)現(xiàn)2. Stage2 : lib_arm/board.c此文件是u-boot S

20、tage2 部分,入口為 Stagel最后調(diào)用的 start_armboot 函數(shù)。注意上面最后 ldr至U pc的是_start_armboot 這個(gè)地 址,而非start_armboot 變量。start_armboot 是U-Boot執(zhí)行的第一個(gè)C語(yǔ)言函數(shù),完成系統(tǒng)初始化 工作,進(jìn)入主循環(huán),處理用戶輸入的命令。void start_armboot (void )DECLARE_GLOBAL_DATA_PTR ;/此宏定義了一個(gè)gd_t類型的指針*gd,并指名用r8寄存器來(lái)存儲(chǔ):#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *

21、gd asm (r8)ulong size ;init_fnc_t * init_fnc_ptr ;char *s;/* Pointer is writable since we allocated a register for it上面那個(gè)宏的作用*/gd = (gd_t *)(_armboot_start - CFG_MALLOC_LEN -sizeof (gd_t );/此C語(yǔ)句引用的是sta比S中的地址標(biāo)號(hào)_armboot_start,但是得到的卻是其中所指的變量 _start的值(在RAM中,_start =0x33F80000 )。 Ps :_armboot_sta比.word _

22、startgd是全局變量,位置在堆棧區(qū)以下(低地址):typedef struct global_data bd_t *bd ;unsignedlongflags ;unsignedlongbaudrate ;unsignedlonghave_console ; /* serial_init() was called */unsignedlongreloc off ; /* Relocation Offset */ 此變量有什么用?unsignedlongenv_addr ; /* Address of Environment struct */unsignedlongenv_valid ;

23、/* Checksum of Environment valid? */unsignedlongfb_base ; /* base address of frame buffer */#ifdef CONFIG_VFDunsignedcharvfd_type ; /* display type */#endif#if 0unsignedlongcpu_clk ; /* CPU clock in Hz! */unsignedlongbus_clk ;unsignedlongram_size ; /* RAM size */unsignedlongreset_status ; /* reset s

24、tatus register at boot */#endifvoid * jt; /* jump table */ gd t ;/* compiler optimization barrier needed for GCC = 3.4 */_asmvolatile_ (: : :memory );memset (void *)gd , 0, sizeof (gd_t );gd - bd = (bd_t *)( char *)gd - sizeof (bd_t);/ 得到 bd 的起點(diǎn)memset (gd - bd , 0, sizeof (bd_t );monitor_flash_len =

25、 _bss_start - _armboot_start ;/*順序執(zhí)行init_sequence數(shù)組中的初始化函數(shù)*/for (init_fnc_ptr = init_sequence ; *init_fnc_ptr ; + init_fnc_ptr ) if (*init_fnc_ptr )() != 0) hang ();/*配置可用的Flash */size = flash_init ();/初始化Nor flash的函數(shù),函數(shù)實(shí)現(xiàn)在下面display_flash_config/* _armboot_start在u-boot.lds 鏈接腳本中定義 */mem_malloc_init(

26、_armboot_start-CFG_MALLOC_LEN );將 CFG_MALLOC_LEN區(qū)域用memset函數(shù)清零(直接往目的地址寫/0)(size); / 打印到控制臺(tái):Flash: 512 kB/*配置環(huán)境變量,重新定位 */剛才的初始化函數(shù)中有一個(gè)是env_init(),根env_relocate ();據(jù)CRC校驗(yàn)來(lái)初始化gd-env_addr 變量(自己設(shè)定的還是初始值), 此函數(shù)是作用是將環(huán)境變量值從某個(gè)flash和RAM之間的拷貝。下圖描述了 ENV的初始化過(guò)程:/*從環(huán)境變量中獲取IP地址,放到全局變量gd中*/gd - bd - bi_ip_addr = getenv

27、_IPaddr (ipaddr);/*以太網(wǎng)接口 MAC地址,放到全局變量gd中,實(shí)現(xiàn)過(guò)程有待研究*/int i;ulong reg ;char *s, *e;uchar tmp 64;i = getenv_r (ethaddr , tmp , sizeof (tmp );s = (i 0) ? tmp : NULL ;for (reg = 0; reg bd - bi_enetaddr reg = s ? simple_strtoul (s, & e, 16): 0;if (s)s = (*e) ? e + 1 : e;devices_init (); /*獲取列表中的設(shè)備*/jumptab

28、le_init ();console_init_r (); /*完整地初始化控制臺(tái)設(shè)備*/enable_interrupts (); /* 使能例外處理 */*通過(guò)環(huán)境變量初始化*/if (s = getenv (loadaddr ) != NULL ) load_addr = simple_strtoul (s, NULL , 16);/以上幾個(gè)初始化函數(shù)有待研究/* main loop()總是試圖自動(dòng)啟動(dòng),循環(huán)不斷執(zhí)行 */for (;) main_loop (); /*主循環(huán)函數(shù)處理執(zhí)行用戶命令-common/main.c */* NOTREACHED - no way out of c

29、ommand loop exceptbooting */以上總體的瀏覽了 u-boot的啟動(dòng)過(guò)程,搞的比較亂,以后有空再修改 整理一下,有幾個(gè)地方還有待弄清,還有Stage2中的多個(gè)初始化函數(shù),待續(xù)。OO前面大致分析了 u-boot啟動(dòng)的兩個(gè)階段的大致流程,今天再更詳細(xì)的分析 一下啟動(dòng)過(guò)程中涉及的幾個(gè)用于初始化的子函數(shù)。分析不當(dāng)?shù)牡胤剑M艿玫街刚?、lowlevel_init ( start.S中用于配置內(nèi)存區(qū)控制寄存器,位于 board/smdk2410/lowlevel_init.S)start.S中跳轉(zhuǎn)代碼:* before relocating , we have to setu

30、p RAM timing* because memory timing is board-dependend , you will* find a lowlevelnit.S in your board directory .*/mov ip , lrbl lowlevelnit/*位于board/smdk2410/lowlevel init.S:用于完成芯片存儲(chǔ)器的初始化,執(zhí)行完成后返回*/mov lr, ipmov pc, IrLowlevelnit 文件代碼不是很多,精簡(jiǎn)一下貼在這里:#define BWSCON 0x48000000/* BWSCON */#define DW8(0x0

31、)#define DW16(0x1 )#define DW32(0x2)#define WAIT(0x1 2)#define UBLB(0x1 3)#define B1_BWSCON據(jù)總線寬度*/(DW32 )/* 定義每個(gè)bank的數(shù)#define B2_BWSCON(DW16 )#define B3_BWSCON(DW16 + WAIT + UBLB)#define B4_BWSCON(DW16 )#define B5_BWSCON(DW16 )#define B6_BWSCON(DW32 )#define B7_BWSCON(DW32 )/* BANK0CON */#define B0

32、Tacs0x0/* 0clk */# defineB0_Tcos0x0/* 0clk */# defineB0_Tacc0x7/* 14clk */# defineB0_Tcoh0x0/* 0clk */# defineB0_Tah0x0/* 0clk */# defineB0_Tacp0x0# defineB0_PMC0x0/* normal */* BANKICON */*之間省略了多個(gè)bank區(qū)的配置,類似上面的 BANK0CON。具體配置參數(shù)見源文件*/* BANK7CON */* REFRESH parameter */#define REFEN0x1/* Refresh enabl

33、e */#define TREFMD0x0/* CBR(CAS before RAS)/Autorefresh */# defineTrp0x0/* 2clk */# defineTrc0x3/* 7clk */# defineTchr0x2/* 3clk */# defineREFCNT1113/* period=15.6us, HCLK=60Mh z,(2048+1 -15.6*60) */*TEXT BASE:.word TEXT BASE.globl lowlevelnitlowlevell_i nit/* memory control configuration */* make r

34、0 relative the current location so that it */* reads SMRDATA out of FLASH rather than memory ! */ldr r0 , = SMRDATA /* SMRDATA 見下面,BWSCON 寄存器的后面緊接著就是0-7個(gè)bank的控制寄存器的地址,這里整個(gè)數(shù)據(jù)是8個(gè)bank的配置參數(shù)和另外4個(gè)寄存器的配置參數(shù),具體按照s3c2410 的datasheet 進(jìn)行配置 */ldrr1 , _TEXT_BASEsubr0 , r0 , r1ldrr1 , = BWSCON/* Bus Width Status Co

35、ntroller從 BWSCON寄存器的地址開始寫13*4這么長(zhǎng)的數(shù)據(jù),也就是從SMRDATA標(biāo)號(hào)開始的那些配置好的數(shù)據(jù),一并寫入*/add r2 , r0 , #13*40:ldr r3 , r0, #4str r3 , r1 , #4cmp r2 , r0bne 0b/* everything is fine now上面都配置好了,返回start.S */mov pc , lrtorg/* the literal pools origin */*下面共有13個(gè)word,設(shè)置了一系列連續(xù)的寄存器的值,給上面循環(huán) 賦值用*/SMRDATA :.word(0+( B1_BWSCON 4)+( B

36、2_BWSCON 8)+( B3_BWSCON 12)+( B 4_BWSCON 16)+( B5_BWSCON 20)+( B6_BWSCON 24)+( B7_ BWSCON 28).word(B0_Tacs 13)+( B0_Tcos 11)+( B0_Tacc 8)+( B0_Tcoh 6)+( B0_Tah 4)+( B0_Tacp 2)+( B0_PMC ).word(B1_Tacs 13)+( B1_Tcos 11)+(B1_Tacc 8)+( B1_Tcoh 6)+( B 1_Tah 4)+( B1_Tacp 2)+( B1_PMC ).word(B2_Tacs 13)+( B

37、2_Tcos 11)+( B2_Tacc 8)+( B2_Tcoh 6)+( B2_Tah 4)+( B2_Tacp 2)+( B2_PMC ).word(B3_Tacs 13)+( B3_Tcos 11)+( B3_Tacc 8)+( B3_Tcoh 6)+( B 3_Tah 4)+( B3_Tacp 2)+( B3_PMC ).word(B4_Tacs 13)+( B4_Tcos 11 )+( B4_Tacc 8)+( B4_Tcoh 6)+( B4_Tah 4)+( B4_Tacp 2)+( B4_PMC ).word(B5_Tacs 13)+( B5_Tcos 11)+( B5_Tac

38、c 8)+( B5_Tcoh 6)+( B 5_Tah 4)+( B5_Tacp 2)+( B5_PMC ).word (B6_MT 15)+( B6_Trcd 2)+( B6_SCAN ).word (B7_MT 15)+( B7_Trcd 2)+( B7_SCAN ).word(REFENvv 23)+( TREFMD 22)+( Trp 20)+( Trc 18)+(Tchr LOCKTIME = OxFFFFFF;/* configure MPLL */clk_power - MPLLCON = (M_MDIV 12) + (M_PDIV UPLLCON = (U M MDIV 12)

39、 + (U M PDIV GPACON=0x007FFFFF ;gpio- GPBCON=0x00044555;gpio- GPBUP =0x000007FF ;gpio- GPCCON=0xAAAAAAAA ;gpio- GPCUP =0x0000FFFF ;gpio- GPDCON=0xAAAAAAAA ;gpio- GPDUP =0x0000FFFF ;gpio- GPECON=0xAAAAAAAA ;gpio- GPEUP =0x0000FFFF ;gpio- GPFCON=0x000055AA;gpio- GPFUP =0x000000FF ;gpio- GPGCON=0xFF95F

40、FBA ;gpio- GPGUP =0x0000FFFF ;gpio- GPHCON=0x002AFAAA ;gpio- GPHUP =0x000007FF ;/CPU 體/* arch number of SMDK2410-Board */gd - bd - bi arch number = MACH TYPE SMDK2410系結(jié)構(gòu)編號(hào)/* adress of boot parameters */gd - bd - bi_boot_params = 0x30000100 ;/存放內(nèi)核啟動(dòng)引導(dǎo)的參數(shù),此變量在后面可傳遞給go函數(shù)的第三個(gè)參數(shù)icache_enable ();dcache_en

41、able ();return 0;(3) env_init初始化環(huán)境變量。全局定義的env_t *env_ptr = (env_t*)CFG_ENV_ADDR,先CRC校驗(yàn)是否正確,若正確就設(shè)置 gd-env_valid=1,否之調(diào)用默認(rèn)環(huán)境變量,并設(shè)置 gd-env_valid = 0。冷復(fù)位時(shí),env ptr-data無(wú)數(shù)據(jù),CRC肯定錯(cuò)誤,所以開機(jī)后會(huì)提示bad CRC.int env_init (void )DECLARE_GLOBAL_DATA_PTR ;if (crc32 (0, env_ptr - data , ENV_SIZE) = env_ptr - crc) gd - en

42、v_addr = (ulong )&( env_ptr - data );gd - env_valid=1;return (0);gd- env_addr =(ulong )& default_environment0;gd- env valid =0;return (0);(4) init_baudrate獲取環(huán)境變量,把其中的波特率值給全局gd,若獲取為空值,則賦默認(rèn)的 115200 。static int init_baudrate (void )DECLARE_GLOBAL_DATA_PTR ;uchar tmp 64 ;/* long enough for environment variables */int i = getenv_r (baudrate , tmp , sizeof (tmp );/將環(huán)境變量獲取到tmp中,i為得到的環(huán)境變量的長(zhǎng)度gd - bd - bi_baudrate = gd - baudrate = (i 0)/如果確實(shí)獲取到了 env,則給gd,否則把宏定義的11520

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論