freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

u-boot啟動(dòng)流程(編輯修改稿)

2025-05-15 06:51 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 [r1]的內(nèi)存 */221 cmp r0, r2 /* until source end addreee [r2] */222 ble copy_loop223 b stack_setup /* 跳過NAND Flash啟動(dòng)的代碼 */ 下面再來分析NAND Flash啟動(dòng)部分代碼:nand_boot: mov r1, NAND_CTL_BASE ldr r2, =( (712)|(78)|(74)|(00) ) str r2, [r1, oNFCONF] /* 設(shè)置NFCONF寄存器 */ /* 設(shè)置NFCONT,初始化ECC編/解碼器,禁止NAND Flash片選 */ ldr r2, =( (14)|(01)|(10) ) str r2, [r1, oNFCONT] ldr r2, =(0x6) /* 設(shè)置NFSTAT */str r2, [r1, oNFSTAT] /* 復(fù)位命令,第一次使用NAND Flash前復(fù)位 */ mov r2, 0xff strb r2, [r1, oNFCMD] mov r3, 0 /* 為調(diào)用C函數(shù)nand_read_ll準(zhǔn)備堆棧 */ ldr sp, DW_STACK_START mov fp, 0 /* 下面先設(shè)置r0至r2,然后調(diào)用nand_read_ll函數(shù)將UBoot讀入RAM */ ldr r0, =TEXT_BASE /* 目的地址:UBoot在RAM的開始地址 */ mov r1, 0x0 /* 源地址:UBoot在NAND Flash中的開始地址 */ mov r2, 0x30000 /* 復(fù)制的大小,并且必須是NAND Flash塊大小的整數(shù)倍,這里設(shè)置為0x30000(192KB) */ bl nand_read_ll /* 跳轉(zhuǎn)到nand_read_ll函數(shù),開始復(fù)制UBoot到RAM */tst r0, 0x0 /* 檢查返回值是否正確 */beq stack_setupbad_nand_read:loop2: b loop2 //infinite loop.align 2DW_STACK_START: .word STACK_BASE+STACK_SIZE4 其中NAND_CTL_BASE,oNFCONF等在include/configs/:define NAND_CTL_BASE 0x4E000000 // NAND Flash控制寄存器基址define STACK_BASE 0x33F00000 //base address of stackdefine STACK_SIZE 0x8000 //size of stackdefine oNFCONF 0x00 /* NFCONF相對(duì)于NAND_CTL_BASE偏移地址 */define oNFCONT 0x04 /* NFCONT相對(duì)于NAND_CTL_BASE偏移地址*/define oNFADDR 0x0c /* NFADDR相對(duì)于NAND_CTL_BASE偏移地址*/define oNFDATA 0x10 /* NFDATA相對(duì)于NAND_CTL_BASE偏移地址*/define oNFCMD 0x08 /* NFCMD相對(duì)于NAND_CTL_BASE偏移地址*/define oNFSTAT 0x20 /* NFSTAT相對(duì)于NAND_CTL_BASE偏移地址*/define oNFECC 0x2c /* NFECC相對(duì)于NAND_CTL_BASE偏移地址*/ NAND Flash各個(gè)控制寄存器的設(shè)置在S3C2440的數(shù)據(jù)手冊(cè)有詳細(xì)說明,這里就不介紹了。 代碼中nand_read_ll函數(shù)的作用是在NAND Flash中搬運(yùn)UBoot到RAM,該函數(shù)在board/samsung/mini2440/。 NAND Flash根據(jù)page大小可分為2種: 512B/page和2048B/page的。這兩種NAND Flash的讀操作是不同的。因此就需要UBoot識(shí)別到NAND Flash的類型,然后采用相應(yīng)的讀操作,也就是說nand_read_ll函數(shù)要能自動(dòng)適應(yīng)兩種NAND Flash。 參考S3C2440的數(shù)據(jù)手冊(cè)可以知道:根據(jù)NFCONF寄存器的Bit3(AdvFlash (Read only))和Bit2 (PageSize (Read only))可以判斷NAND Flash的類型。BitBit3與NAND Flash的block類型的關(guān)系如下表所示:表 NFCONF的BitBit2與NAND Flash的關(guān)系Bit2 Bit3010256 B/page512 B/page11024 B/page2048 B/page 由于的NAND Flash只有512B/page和2048 B/page這兩種,因此根據(jù)NFCONF寄存器的Bit3即可區(qū)分這兩種NAND Flash了。 完整代碼見board/samsung/mini2440/,這里給出偽代碼:int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size){//根據(jù)NFCONF寄存器的Bit3來區(qū)分2種NAND Flash if( NFCONF amp。 0x8 ) /* Bit是1,表示是2KB/page的NAND Flash */ { //////////////////////////////////// 讀取2K block 的NAND Flash //////////////////////////////////// } else /* Bit是0,表示是512B/page的NAND Flash */ { ///////////////////////////////////// 讀取512B block 的NAND Flash ///////////////////////////////////// } return 0。}(10)設(shè)置堆棧 /* 設(shè)置堆棧 */stack_setup: ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ sub r0, r0, CONFIG_SYS_MALLOC_LEN /* malloc area */ sub r0, r0, CONFIG_SYS_GBL_DATA_SIZE /* 跳過全局?jǐn)?shù)據(jù)區(qū) */ifdef CONFIG_USE_IRQ sub r0, r0, (CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)endif sub sp, r0, 12 /* leave 3 words for abortstack */ 只要將sp指針指向一段沒有被使用的內(nèi)存就完成棧的設(shè)置了。根據(jù)上面的代碼可以知道UBoot內(nèi)存使用情況了,如下圖所示: UBoot內(nèi)存使用情況(11)清除BSS段clear_bss: ldr r0, _bss_start /* BSS段開始地址,*/ ldr r1, _bss_end /* BSS段結(jié)束地址,*/ mov r2, 0x00000000 clbss_l:str r2, [r0] /* 將bss段清零*/ add r0, r0, 4 cmp r0, r1 ble clbss_l 初始值為0,無初始值的全局變量,靜態(tài)變量將自動(dòng)被放在BSS段。應(yīng)該將這些變量的初始值賦為0,否則這些變量的初始值將是一個(gè)隨機(jī)的值,若有些程序直接使用這些沒有初始化的變量將引起未知的后果。(12)跳轉(zhuǎn)到第二階段代碼入口 ldr pc, _start_armboot_start_armboot: .word start_armboot 跳轉(zhuǎn)到第二階段代碼入口start_armboot處。 UBoot啟動(dòng)第二階段代碼分析 start_armboot函數(shù)在lib_arm/,是UBoot第二階段代碼的入口。UBoot啟動(dòng)第二階段流程如下:圖 UBoot第二階段執(zhí)行流程 在分析start_armboot函數(shù)前先來看看一些重要的數(shù)據(jù)結(jié)構(gòu):(1)gd_t結(jié)構(gòu)體 UBoot使用了一個(gè)結(jié)構(gòu)體gd_t來存儲(chǔ)全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù),這個(gè)結(jié)構(gòu)體在include/asmarm/:typedef struct global_data { bd_t *bd。 unsigned long flags。 unsigned long baudrate。 unsigned long have_console。 /* serial_init() was called */ unsigned long env_addr。 /* Address of Environment struct */ unsigned long env_valid。 /* Checksum of Environment valid? */ unsigned long fb_base。 /* base address of frame buffer */ void **jt。 /* jump table */} gd_t。 UBoot使用了一個(gè)存儲(chǔ)在寄存器中的指針gd來記錄全局?jǐn)?shù)據(jù)區(qū)的地址:define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm (r8) DECLARE_GLOBAL_DATA_PTR定義一個(gè)gd_t全局?jǐn)?shù)據(jù)結(jié)構(gòu)的指針,這個(gè)指針存放在指定的寄存器r8中。這個(gè)聲明也避免編譯器把r8分配給其它的變量。任何想要訪問全局?jǐn)?shù)據(jù)區(qū)的代碼,只要代碼開頭加入“DECLARE_GLOBAL_DATA_PTR”一行代碼,然后就可以使用gd指針來訪問全局?jǐn)?shù)據(jù)區(qū)了。 根據(jù)UBoot內(nèi)存使用圖中可以計(jì)算gd的值:gd = TEXT_BASE -CONFIG_SYS_MALLOC_LEN - sizeof(gd_t) (2)bd_t結(jié)構(gòu)體 bd_t在include/:typedef struct bd_info { int bi_baudrate。 /* 串口通訊波特率 */ unsigned long bi_ip_addr。 /* IP 地址*/ struct environment_s *bi_env。 /* 環(huán)境變量開始地址 */ ulong bi_arch_number。 /* 開發(fā)板的機(jī)器碼 */ ulong bi_boot_params。 /* 內(nèi)核參數(shù)的開始地址 */ struct /* RAM配置信息 */ { ulong start。 ulong size。 }bi_dram[CONFIG_NR_DRAM_BANKS]。 } bd_t。 UBoot啟動(dòng)內(nèi)核時(shí)要給內(nèi)核傳遞參數(shù),這時(shí)就要使用gd_t,bd_t結(jié)構(gòu)體中的信息來設(shè)
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1