王靈芝課件第十次課bootloader_第1頁
王靈芝課件第十次課bootloader_第2頁
王靈芝課件第十次課bootloader_第3頁
王靈芝課件第十次課bootloader_第4頁
王靈芝課件第十次課bootloader_第5頁
已閱讀5頁,還剩76頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 bootloader 漳州師范學(xué)院王靈芝本章主要內(nèi)容5.1 嵌入式系統(tǒng)的引導(dǎo)代碼5.2 Bootloader之ViVi5.4FS2410的BootLoader5.1 嵌入式系統(tǒng)的引導(dǎo)代碼本節(jié)內(nèi)容1、Bootloader簡介2、Bootloader工作模式 3、Bootloader啟動過程建立交叉編譯環(huán)境Bootloader的/移植/配置/編譯kernel的移植/配置/編譯根文件系統(tǒng)Cramfs的實現(xiàn)嵌入式系統(tǒng)軟件開發(fā)流程用戶應(yīng)用程序開發(fā)5.1.1 Bootloader簡介Bootloader,為引導(dǎo)加載程序,是嵌入式系統(tǒng)加電后運行的第一段代碼,相當于PC機的BIOS。 Bootload

2、er的位置:通常固化在硬件上的某個固態(tài)存儲設(shè)備上,加電后自啟動。 Bootloader功能:初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,將系統(tǒng)的軟、硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。 Bootloader在軟件的層次位置Bootloader的地址:在嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時從地址0 x0000,0000處開始執(zhí)行,在這個地址處安排的就是Bootloader。Bootloader是嚴重地依賴于硬件而實現(xiàn)的。每種不同體系結(jié)構(gòu)的處理器都有不同的Bootloader。不過Bootloader的發(fā)展也趨于支持多種體系結(jié)構(gòu),如現(xiàn)在比較成熟的vivi、RedBoot和

3、U-Boot等。 幾種發(fā)布的Bootloader1、vivivivi是韓國Mizi公司開發(fā)的Bootloader,適用于ARM9處理器。2、RedBoot RedBoot即紅帽(Red Hat)嵌入式調(diào)試引導(dǎo)程序,是一種用于嵌入式系統(tǒng)的獨立開放源代碼引導(dǎo)/裝載器。3、U-Boot U-Boot(Universal Bootloader)由德國DENX小組開發(fā),是一款目前功能較為強大的開源Bootloader程序,它支持多種處理器平臺,包括ARM、PowerPC、MIPS等。 5.1.2 Bootloader操作模式 大多數(shù)Bootloader都有兩種不同的操作模式:“啟動加載”模式和“下載”模

4、式。其區(qū)別對于開發(fā)人員才有意義。從最終用戶的角度看,Bootloader的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載模式與下載模式的區(qū)別。 1、啟動加載(Bootloading)模式啟動加載模式稱為“自舉”(Autonomous)模式。即Bootloader從目標機上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到 RAM 中運行,整個過程并沒有用戶的介入。啟動加載模式是 Bootloader的正常工作模式,在嵌入式產(chǎn)品發(fā)布的時侯,Bootloader必須工作在這種模式下。 2、下載(Downloading)模式下載方式:在這種模式下,目標機上的Bootloader將通過串口連接或網(wǎng)絡(luò)連接等通信手

5、段從主機下載文件。下載內(nèi)容及存儲:主要是下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被 Bootloader寫到目標機上的FLASH 類固態(tài)存儲設(shè)備中。下載模式應(yīng)用場合:Bootloader的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用到這種工作模式。用戶應(yīng)用接口:工作于這種模式下的Bootloader通常都會向它的終端用戶提供一個簡單的命令行接口。 如在RedBoot下,將出現(xiàn)“RedBoot”提示符;在vivi Bootloader 下出現(xiàn)“vivi”提示符。2、下載(Downloading)

6、模式2、下載(Downloading)模式RedBoot的Bootloader像RedBoot或U-Boot等功能強大的Bootloader通常都可同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。比如,RedBoot在啟動時處于正常的啟動加載模式,但是它會延時3秒等待終端用戶按下任意鍵而將RedBoot切換到下載模式。如在等待時間內(nèi)沒有接收到用戶按鍵,則繼續(xù)啟動 Linux 內(nèi)核。 5.1.3 Bootloader啟動過程Bootloader的啟動可以分為兩個階段 p1461、第一階段階段1主要包含依賴于CPU體系結(jié)構(gòu)及硬件設(shè)備的初始化等。通常都用匯編語言來實現(xiàn)。這個階段的任

7、務(wù)有5:(1)、基本的硬件設(shè)備初始化這是 Bootloader 一開始就執(zhí)行的操作,其目的是為階段2 的執(zhí)行、以及隨后kernel 的執(zhí)行準備好一些基本的硬件環(huán)境。 它通常包括以下工作:1 屏蔽所有的中斷。為中斷提供服務(wù)通常是 OS 設(shè)備驅(qū)動程序的責任,因此在 Boot Loader 的執(zhí)行全過程中可以不必響應(yīng)任何中斷。2 設(shè)置 CPU 的速度和時鐘頻率。 3 RAM 初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存控制寄存器等。 4 初始化 LED。典型地,通過 GPIO 來驅(qū)動 LED,其目的是表明系統(tǒng)的狀態(tài)是 OK 還是 Error。如果板子上沒有 LED,那么也可以通過初始

8、化 UART 向串口打印 Boot Loader 的 Logo 字符信息來完成這一點。 5 關(guān)閉 CPU 內(nèi)部指令數(shù)據(jù) cache。通常使用cache以及寫緩存是為了提高系統(tǒng)性能,但是可能該改變訪問主存的數(shù)量、類型和時間,因此Boot Loader 不需要5.1.3 Bootloader啟動過程(2)、為階段2代碼準備RAM空間為了獲得更快的執(zhí)行速度,通常把 階段2 的代碼加載到 RAM 空間中來執(zhí)行。 準備RAM空間考慮的因素:階段2代碼大小、堆棧、頁大?。?KB的倍數(shù))、安排位置等。 總的空間有1MB足夠,安排在RAM的頂端較恰當。(3)、拷貝階段2代碼到RAM空間(4)、設(shè)置好堆棧堆棧指

9、針sp設(shè)置在1MB 的 RAM 空間的最頂端(堆棧向下生長)。(5)、跳轉(zhuǎn)到階段2的C程序入口點在上述一切都就緒后,就可以跳轉(zhuǎn)到 Bootloader 的 stage2 去執(zhí)行了。2、第二階段階段2通常用C語言來實現(xiàn),以便實現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和可移植性。這個階段的主要任務(wù)有5個:(1)、初始化本階段要使用到的硬件至少初始化一個串口,以便和終端用戶進行 I/O 輸出信息等。(2)、檢測系統(tǒng)內(nèi)存映射(memory map)所謂內(nèi)存映射,就是指明在整個物理地址空間中有哪些地址范圍被分配用來作為系統(tǒng)的 RAM 單元。為后面使用RAM、運行程序做好準備。(3)、將kernel和根文件

10、系統(tǒng)映像從flash讀到RAM空間(4)、為kernel設(shè)置啟動參數(shù)這是在調(diào)用內(nèi)核之前應(yīng)該做的準備工作。Linux 2.4.x 以后的內(nèi)核都期望以標記列表(tagged list)的形式來傳遞啟動參數(shù)。啟動參數(shù)標記列表方法:以ATAG_CORE標記開始,以ATAG_NONE標記結(jié)束。在嵌入式 Linux 系統(tǒng)中,通常需要由 Boot Loader 設(shè)置的啟動參數(shù)有:ATAG_CORE、ATAG_MEM(內(nèi)存映射)、ATAG_NONE等。(5)、調(diào)用內(nèi)核Bootloader調(diào)用Linux kernel的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處。在跳轉(zhuǎn)時必須滿足下列條件:1)、CPU寄存器的設(shè)置:R0為

11、0;R1為機器類型ID;R2為啟動參數(shù),標記列表在RAM中的起始基地址。 (機器類型參見 linux/arch/arm/tools/mach-types目錄)2)、CPU模式: CPU必須設(shè)置為SVC模式,必須禁止中斷(IRQs和FIQs)。3)、 MMU 和 Cache的設(shè)置:MMU 必須關(guān)閉;指令 Cache 可以打開也可以關(guān)閉; 數(shù)據(jù) Cache 必須關(guān)閉。5.1 vivi Bootloader接口命令vivi有兩種工作模式,一種是 “啟動加載”模式,另一種是命令行模式。利用串行口與主機的連接,可以進行命令行操作。vivi啟動后,通過串行口發(fā)出如下信息:Press Return to s

12、tart the Linux now, any other key for vivi按下除了“Enter”之外的鍵,便可進入命令行模式。vivi的接口命令有5條。vivi接口命令命 令功 能Load下載flash或RAM命令PartMTD分區(qū)操作命令param設(shè)置、查看參數(shù)命令Boot啟動系統(tǒng)命令flashFlash管理命令1、load下載文件命令功能:將二進制文件下載到Flash或RAM格式:load | media_type:存儲器類型,F(xiàn)lash或RAMpartname:分區(qū)名稱addr size:下載的地址及占用空間大小x|y|z:文件的傳輸協(xié)議。x表示采用xmodem協(xié)議,y表示采用

13、ymodem協(xié)議,z表示采用zmodem協(xié)議。目前vivi僅支持xmodem協(xié)議。例1:viviload flash kernel x表示下載壓縮的內(nèi)核映像文件zImage到flash存儲器的內(nèi)核分區(qū)中,采用xmodem傳輸協(xié)議。例2:viviload flash 0 x80000 0 xc0000 x2、partMTD分區(qū)操作命令操作命令:顯示、增加、刪除、復(fù)位、保存MTD分區(qū)等。各個命令格式:part show:顯示分區(qū)信息part del :刪除指定的分區(qū)part reset:恢復(fù)分區(qū)的默認值part save:在flash中保存分區(qū)和參數(shù)值增加新的分區(qū)part add :partnam

14、e:新分區(qū)名稱offset:新分區(qū)的偏移地址size:新分區(qū)的大小flag:新分區(qū)的類型,可以是JFFS2、LOCKED、BONFS3、param設(shè)置或查看分區(qū)參數(shù)命令查看分區(qū)參數(shù): param show設(shè)置啟動等待按鍵延遲:param set boot_delay n(s)設(shè)置通信初始化超時:param set xmodem_initial_timeout m (s)4、boot引導(dǎo)內(nèi)核命令格式:boot media_type | media_type:存儲器類型,flash或RAMpartname:內(nèi)核所在分區(qū)名稱addr:內(nèi)核所在器件的偏移地址size:內(nèi)核的大小若boot(無參數(shù)),則

15、從kernel內(nèi)核對應(yīng)的分區(qū)(kernel)讀取內(nèi)核映像啟動。例如:1、viviboot nand 0 x80000內(nèi)核在nand flash中,偏移地址為0 x80000,大小為缺省值0 xc00002、viviboot nor 0 x80000例如:vivi bootvivi 從kernel mtd 分區(qū)處讀到linux 內(nèi)核文件。有時,要在ram 中驗證內(nèi)核,所以,可用如下命令vivi load ram 0 x30008000 0 xd0000 xvivi boot ramvivi 就從ram 中啟動linux 內(nèi)核。5、flashflash存儲器管理命令擦除flash數(shù)據(jù)格式:flas

16、h erase | 說明:對flash只有擦除命令。例如:flash erase 0 x80000 0 xc0000一、對vivi進行配置運行vivi配置程序menuconfig: makemenuconfig啟動對vivi配置的主菜單,根據(jù)自己的目標系統(tǒng)逐項進行設(shè)置,設(shè)置完后退出保存即可。5.2.2 vivi源碼的修改移植vivi的移植方法步驟:對vivi進行修改移植對vivi進行配置對vivi進行編譯下載、運行vivi二、對vivi進行修改移植設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為設(shè)Linux系統(tǒng)的目錄結(jié)構(gòu)為:cygwinfriendly-arm crosstool kernel vivi1、修改v

17、ivi/Makefile(1)修改交叉編譯庫和頭文件 1)修改編譯器路徑:將: PILE=/opt/host/armv4l/bin/armv4l-unknown-linux-修改為: PILE= arm-linux-gcc的路徑如: PILE=/friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/bin/arm-linux-2)修改編譯器庫文件路徑:將:ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2修改為: ARM_GCC_LIBS=符合本機

18、的路徑如:ARM_GCC_LIBS= /friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/lib/gcc-lib/arm-linux/2.95.3 3)增加交叉編譯時頭文件的搜索路徑:LIBC_INCLUDE_DIR=本機的include的路徑如:LIBC_INCLUDE_DIR= /friendly-arm/ crosstool/arm-linux/gcc-2.95.3-glibc-2.2.3/include(2)Linux內(nèi)核包含文件 修改Linux頭文件所在路徑將:LINUX_INCLUDE_DIR=/opt/host/ar

19、mv4l/include改為:LINUX_INCLUDE_DIR=符合本機的如:LINUX_INCLUDE_DIR=/friendly-arm/kernel/include2、修改vivi中與硬件相關(guān)的部分只需要修改:/friendly-arm/vivi/include/platform/下面的文件smdk2410.h即可。文件smdk2410.h的內(nèi)容是針對開發(fā)板的硬件配置的,主要有:時鐘設(shè)置、存儲器初始化、通用I/O口初始化、UART初始化、vivi初始配置等。根據(jù)自己的目標板的實際情況進行設(shè)置即可。 3、支持Nor Flash啟動的修改 (vivi/arch/s3c2410/smdk.c

20、)(1) Nor flash分區(qū)對于一個嵌入式系統(tǒng),可能會采用Nor flash、Nand flash、SDRAM等多種介質(zhì)構(gòu)成存儲器系統(tǒng), Nor flash(如1、2MB)用于存放、運行bootloader,Nand flash用于存放操作系統(tǒng)、其它系統(tǒng)軟件、應(yīng)用程序和各種文件, SDRAM用于運行程序和存放數(shù)據(jù)。如果系統(tǒng)有Nor flash存儲器(一般沒有),則需要做相應(yīng)修改。修改方法:在vivi/arch/s3c2410/smdk.c中的分區(qū)代碼,添加上Nor flash分區(qū):#ifdef CONFIG_S3C2410_AMD_BOOTmtd_partition_t default_m

21、td_partitions = name:vivi,offset:0,size:0 x00020000,flag:0, name:param,offset:0 x00020000,size:0 x00010000,flag:0, name:kernel,offset:0 x00030000,size:0 x000C0000,flag:0, name:root,offset:0 x00100000,size:0 x00140000,flag:MF_BONFS;#endif(2)內(nèi)核啟動參數(shù)設(shè)置經(jīng)過上面修改,系統(tǒng)板可以從Nand flash中啟動Linux,也可以從Nor flash中啟動Linu

22、x,另外還需要修改啟動命令:#ifdef CONFIG_S3C2410_NAND_BOOTChar Linux_cmd = noinitrd root=/dev/bon/2 init =/linuxrc console=tty1console=ttyS0;#elseChar Linux_cmd = noinitrd root=/dev/mtdblock/3init =/linuxrc console=tty1 console=ttyS0;式中啟動命令:noinitrd:不使用ramdisk;root:根文件系統(tǒng)所在的MTD分區(qū)init:內(nèi)核運行入口命令文件console:內(nèi)核信息輸出控制臺tt

23、yS0表示串行口;tty0表示虛擬終端LCD。說明:關(guān)于Linux啟動命令的參數(shù),可以參考Kernel/Documentatio/下面的文件kernel-parameters.txt。4、增加一種下載操作load flash j操作在Nand啟動時,可以從JTAG下載程序到SDRAM(0 x30000000),然后用“l(fā)oad flashj”來燒寫相應(yīng)的分區(qū),并且可以做vivi、kernel、root這3個分區(qū)的操作。其中大部分操作與使用X-Modem和 Y-Modem等功能類似,所以命名為J-Modem,并特別修改以下3個部分。(1)在 vivi/include/priv_data.h中增加

24、宏定義原來為:#define X_MODEM1#define Y_MODEM2#define Z_MODEM3增加:#define JTAG_D4(2)在 vivi/lib/load_file.c中增加對J-Modem的識別原來為:modem_is(const char *mt) else if (strncmp(z, mt, 1) = 0) return Z_MODEM; else return UNKNOWN_MODEM;修改為:modem_is(const char *mt) else if (strncmp(z, mt, 1) = 0) return Z_MODEM; else if

25、(strncmp(“J, mt, 1) = 0) return JTAG_D; else return UNKNOWN_MODEM;說明:該修改僅提高了下載到SDRAM的速度三、對vivi進行編譯在vivi目錄下執(zhí)行以下命令: makecleanmake make clean是清除以前編譯時生成的所有目標文件和臨時文件。如果沒有錯誤,編譯后會生成vivi的目標文件vivi.bin。四、對vivi進行下載利用JTAG口將vivi下載到目標板的Nor flash空間(0 x000000 x20000)。然后對目標板加電,使vivi啟動運行,觀察運行情況。一、vivi源代碼目錄結(jié)構(gòu)vivi源代碼包含

26、的目錄有:arch、Documentation、drivers、init、include、lib、scripts、test、util等10目錄,共300多個文件。各個目錄內(nèi)容如下:1、arch(architecture)目錄它下面的文件為與CPU硬件相關(guān)的初始化代碼,此目錄包含了所用vivi支持的CPU。一般只包含S3C2410 x的文件。第一階段程序的入口點2、Documentation目錄其下文件為vivi使用指南。3、drivers目錄存放的為MTD(數(shù)據(jù)存儲媒質(zhì))設(shè)備讀寫控制文件和串行口操作文件,對串行口支持xmodem和ymodem協(xié)議。4、init目錄該目錄下是系統(tǒng)初始化文件mai

27、n.c、version.c,后者是vivi版本信息,main.c為vivi整個初始化的結(jié)構(gòu)。3、drivers目錄第二階段程序的入口點5、init目錄5、lib目錄該目錄下是公共應(yīng)用及接口代碼,如時鐘功能文件time.c,堆棧初始化文件heap.c等文件。 6、include目錄存放所有的頭文件,包括S3C2410微處理器的和S3C2410開發(fā)板的頭文件。7、scripts目錄該目錄存放的是系統(tǒng)配置需要的腳本文件,如menuconfig和configue文件。 8、CVS目錄所有的目錄下面都有一個CVS目錄,存放的是該目錄的路徑和它的子目錄。lib目錄include目錄在lib/platfor

28、m/smdk2410.h中定義了與開發(fā)板相關(guān)的資源配置參數(shù),我們往往只需要修改這個文件就可以配置目標板的參數(shù)比如時鐘、波特率、引導(dǎo)參數(shù)、物理內(nèi)存映射等5、lib目錄該目錄下是公共應(yīng)用及接口代碼,如時鐘功能文件time.c,堆棧初始化文件heap.c等文件。 6、include目錄存放所有的頭文件,包括S3C2410微處理器的和S3C2410開發(fā)板的頭文件。7、scripts目錄該目錄存放的是系統(tǒng)配置需要的腳本文件,如menuconfig和configue文件。 8、CVS目錄所有的目錄下面都有一個CVS目錄,存放的是該目錄的路徑和它的子目錄。scripts目錄該目錄存放的是系統(tǒng)配置需要的腳本文

29、件,如menuconfig和configue文件。CVS目錄 所有的目錄下面都有一個CVS目錄,存放的是該目錄的路徑和它的子目錄。二、vivi源代碼文件與功能結(jié)構(gòu)vivi源代碼文件:1、vivi/arch/s3c2410/head.s2、一段過度,實現(xiàn)循環(huán)調(diào)用,main返回后重新復(fù)位LDRSP,DW_STACK_STARTMOVFP,#0MOVA2,#0BLmainMOVPC,#FLASH_BASE3、vivi/init/main.c在匯編中利用跳轉(zhuǎn)語句跳入main()函數(shù)。當main()函數(shù)返回時,重啟(1)階段1:arch/s3c2410/head.Shead.S有900多行,沿著代碼執(zhí)行

30、的順序,head.S完成9件事情.下面我們會詳細的介紹.當執(zhí)行完head.S的代碼后,內(nèi)存的使用情況如下:映射到bank6開始的存儲器單元.地址從0 x300000000-0 x34000000共64M的存儲空間將VIVI的第一階段拷貝到bank0地址為0 x000000000開始的4K字節(jié),作為起步石為加載 stage2 準備 RAM 空間1M為加載 stage2 準備 RAM 空間 為了獲得更快的執(zhí)行速度,通常把 stage2 加載到 RAM 空間中來執(zhí)行,因此必須為加載 Boot Loader 的 stage2 準備好一段可用的 RAM 空間范圍。 由于 stage2 通常是 C 語言執(zhí)

31、行代碼,因此在考慮空間大小時,除了 stage2 可執(zhí)行映象的大小外,還必須把堆棧空間也考慮進來。此外,空間大小最好是 memory page 大小(通常是 4KB)的倍數(shù)。一般而言,1M 的 RAM 空間已經(jīng)足夠了。具體的地址范圍可以任意安排,比如 將 stage2 安排到整個 RAM 空間的最頂 1MB(也即(RamEnd-1MB) - RamEnd)是一種值得推薦的方法。 (1)階段1:arch/s3c2410/head.S 沿著代碼執(zhí)行的順序,head.S完成如下幾件事情: 1、關(guān)WATCH DOG:上電后,WATCH DOG默認是開著的 p1512、禁止所有中斷:vivi中沒用到中斷

32、(不過這段代碼實在多余,上電后中斷默認是關(guān)閉的) p1523、初始化系統(tǒng)時鐘:啟動MPLL,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz,“CPU bus mode”改為“Asynchronous bus mode”。請參考實驗:時鐘與總線 4、初始化內(nèi)存控制寄存器:還記得那13個寄存器嗎?請復(fù)習(xí)實驗五:SDRAM控制器5、檢查是否從掉電模式喚醒,若是,則調(diào)用WakeupStart函數(shù)進行處理這是一段沒用上的代碼,vivi不可能進入掉電模式 (1)階段1:arch/s3c2410/head.S6、點亮所有LED p1537、初始化UART0: p154a設(shè)置GPIO,選

33、擇UART0使用的引腳 b初始化UART0,設(shè)置工作方式(不使用FIFO)、波特率115200 8N1、無流控等,請參考實驗:UART 8、將vivi所有代碼(包括階段1和階段2)從nand flash復(fù)制到SDRAM中: P155-156 請參考實驗:FLASH控制器a設(shè)置nand flash控制寄存器 P155reset NANDb設(shè)置堆棧指針調(diào)用C函數(shù)時必須先設(shè)置堆棧 P156get read to call C functionc設(shè)置即將調(diào)用的函數(shù)nand_read_ll的參數(shù):r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=復(fù)制的長度(以字節(jié)為單

34、位) P156copy vivi to RAMd調(diào)用nand_read_ll進行復(fù)制 e進行一些檢查工作:上電后nand flash最開始的4K代碼被自動復(fù)制到一個稱為“Steppingstone”的內(nèi)部RAM中(地址為0 x00000000-0 x00001000);在執(zhí)行nand_read_ll之后,這4K代碼同樣被復(fù)制到SDRAM中(地址為0 x33f00000-0 x33f01000)。比較這兩處的4K代碼,如果不同則表示出錯 copy vivi to RAM ldr r0, =VIVI_RAM_BASE ;SRAM存放vivi的基地址 /*在/vivi/linux/platform/

35、smdk2410.h中定義 #define VIVI_RAM_BASE (DRAM_BASE + DRAM_SIZE - VIVI_RAM_SIZE) #define VIVI_RAM_SIZESZ_1M*/ mov r1, #0 x0 /nand flash中放置的VIVI首地址mov r2, #0 x20000 ;0 x20000-128k字節(jié) /拷貝的數(shù)據(jù)塊大小,可以修改的bl nand_read_ll ;nand_read_ll在/vivi/arch/s3c2410/nand_read.c中定義 ;r0,r1,r2分別為函數(shù)的三個參數(shù) ;從NANDFlash的0地址拷貝128k到SDR

36、AM指定處 VIVI_RAM_BASE tst r0, #0 x0 beq ok_nand_read 若讀取正確,跳轉(zhuǎn)到ok_nand_read#ifdef CONFIG_DEBUG_LL 否則打印錯誤信息bad_nand_read: ldr r0, STR_FAIL ldr r1, SerBase bl PrintWord 1: b 1b infinite loop #endif ok_nand_read: 打印正確信息#ifdef CONFIG_DEBUG_LL ldr r0, STR_OK ldr r1, SerBase bl PrintWord #endif 8、將vivi所有代碼(包

37、括階段1和階段2)從nand flash復(fù)制到SDRAM中: P155-156 請參考實驗:FLASH控制器a設(shè)置nand flash控制寄存器 P155reset NANDb設(shè)置堆棧指針調(diào)用C函數(shù)時必須先設(shè)置堆棧 P156get read to call C functionc設(shè)置即將調(diào)用的函數(shù)nand_read_ll的參數(shù):r0=目的地址(SDRAM的地址),r1=源地址(nand flash的地址),r2=復(fù)制的長度(以字節(jié)為單位) P156copy vivi to RAMd調(diào)用nand_read_ll進行復(fù)制 e進行一些檢查工作:上電后nand flash最開始的4K代碼被自動復(fù)制到一

38、個稱為“Steppingstone”的內(nèi)部RAM中(地址為0 x00000000-0 x00001000);在執(zhí)行nand_read_ll之后,這4K代碼同樣被復(fù)制到SDRAM中(地址為0 x33f00000-0 x33f01000)。比較這兩處的4K代碼,如果不同則表示出錯 void nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) int i, j; if (start_addr & NAND_BLOCK_MASK) | (size & NAND_BLOCK_MASK) return ; /* 若為無效

39、參數(shù),退出 invalid alignment */ NFCONF &= 0 x800; /* chip Enable */ for(i=0; i 10; i+); for(i=start_addr; i 9) & 0 xff; NFADDR = (i 17) & 0 xff; NFADDR = (i 25) & 0 xff; wait_idle(); /等待系統(tǒng)空閑/從FLASH地址中讀入數(shù)據(jù)存入SRAM中指定的地址,完成將vivi復(fù)制到RAM for(j=0; j NAND_SECTOR_SIZE; j+, i+) *buf = (NFDATA & 0 xff); buf+; /* chi

40、p Disable */ NFCONF |= 0 x800; /* chip disable */ return ; inline void wait_idle(void) int i;while(!(NFSTAT & BUSY)for(i=0; i10; i+); /這段的作用是判斷NAND的狀態(tài), NFSTAT=0/表明NAND忙,執(zhí)行延時子程序。等待NAND空閑9、跳到bootloader的階段2運行就是調(diào)用init/main.c中的main函數(shù): a重新設(shè)置堆棧 b設(shè)置main函數(shù)的參數(shù) c調(diào)用main函數(shù)P155get read to C function LDRSP,DW_STACK_STARTMOVFP,#0MOVA2,#0BLmainMOVPC,#FLASH_BASE2、第二階段階段2通常用C語言來實現(xiàn),以便實現(xiàn)更復(fù)雜的功能,也使程序有更好的可讀性和可移植性。這個階段的主要任務(wù)有5個:(1)、初始化本階段要使用到的硬件(2)、檢測系統(tǒng)內(nèi)存映射(memory map)所謂內(nèi)存映射,就是指明在整個物理地址空間中有哪些地址范圍被分配用來作為系統(tǒng)的

溫馨提示

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

評論

0/150

提交評論