版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、四川大學(xué)錦城學(xué)院本科畢業(yè)論文 基于arm的mini bootloader設(shè)計與實現(xiàn)四川大學(xué)錦城學(xué)院 本科生畢業(yè)論文(設(shè)計) 題 目 基于arm的mini bootloader設(shè)計與實現(xiàn) 學(xué) 院 四川大學(xué)錦城學(xué)院 專 業(yè) 軟件工程 學(xué)生姓名 學(xué) 號 070231006 年級 07 指導(dǎo)教師 教務(wù)部制表二一一年 三 月 十 日基于arm的mini bootloader設(shè)計與實現(xiàn)專業(yè):軟件工程學(xué)生: 指導(dǎo)教師: 摘 要在目前日益信息化的社會中,計算機和網(wǎng)絡(luò)的應(yīng)用已經(jīng)全面滲透到日常生活的每個角落。各式各樣的新型嵌入式系統(tǒng)在應(yīng)用數(shù)量上已經(jīng)遠(yuǎn)遠(yuǎn)超過通用計算機。任何一個人都可能擁有從大到小的各種使用嵌入式技
2、術(shù)的電子產(chǎn)品,小到mp3,pda等微型數(shù)字化產(chǎn)品,大到網(wǎng)絡(luò)家電、智能家電、車載電子等設(shè)備。在工業(yè)和服務(wù)領(lǐng)域中,使用嵌入式技術(shù)的數(shù)字機床、智能工具、機器人、也將逐漸改變傳統(tǒng)工業(yè)和服務(wù)方式。嵌入式系統(tǒng)可分為有操作系統(tǒng)和無操作系統(tǒng),然而,在簡單的嵌入式系統(tǒng)中,我們往往只需要寫一段簡單的程序到可編程器件中就能實它的功能。但是,如果當(dāng)一個嵌入式系統(tǒng)非常復(fù)雜的,簡單的程序不能滿足我們的需求,這時候我們往往會需要功能強大的操作系統(tǒng)支持。但現(xiàn)在幾乎所有的操作系統(tǒng)都不能獨立的從一塊儲存介質(zhì)中啟動,例如我們常用的pc機,它也需要bios的支持才能完成啟動,由此我們想到有沒有一種程序可以像bios一樣引導(dǎo)嵌入式系統(tǒng)
3、啟動呢?它的工作原理是什么呢?而bootloader就為人們實現(xiàn)了這樣的功能。關(guān)鍵詞: linux bootloader 嵌入式arm-based design and implementation of the mini bootloadermajor: software engineeringstudent: li hongjian supervisor: liang hongzhangabstractin the increasingly information-based society, computer and network has been fully penetrated i
4、nto every corner of daily life. a variety of new devices in the application of embedded system has been far more than the number of general-purpose computer any ordinary person may have a variety of large to small electronic products using embedded technology,small devices as mp3, pda and other mini
5、ature digital products, large appliances to the network, smart home appliances, car electronics equipment. in the industrial and services sectors, the use of embedded technology as digital machine tools, intelligent tools, industrial robots, service robots will gradually change the traditional way o
6、f industry and services.embedded system can be divided into operating system with and without operating system, however, in simple embedded system, we just tend to write a simple program to the programmable devices in its functionality can be implemented. however, if and when an embedded system is v
7、ery complex, simple program can not meet our needs, this time we will often need powerful operating system support. but now almost all of the operating system can not separate start from a storage medium, such as our common pc, it also needs bios support windows start, so we think is there have some
8、thing kind of bios boot program? and how does it work? the bootloader realize such a function for people.key words: linux bootloader embeded目 錄1導(dǎo)論11.1本論文的學(xué)術(shù)背景以及研究意義11.1.1本論文學(xué)術(shù)背景11.1.2本論文的研究內(nèi)容11.2論文思路及結(jié)構(gòu)22研究方法及內(nèi)容22.1arm簡介22.1.1arm技術(shù)的應(yīng)用領(lǐng)域及其特點22.1.2arm處理器的工作狀態(tài)和模式22.1.3arm寄存器介紹32.2bootloader簡介42.2.1boot
9、loader移植的必要性42.2.2bootloader所支持的cpu和嵌入式系統(tǒng)42.2.3幾種常用的bootloader介紹42.3嵌入式linux簡介52.3.1linux內(nèi)核支持的處理器架構(gòu)52.3.2vmlinuz、zimage介紹52.3.3linux的啟動設(shè)置53mini bootloader的實現(xiàn)步驟63.1初始化cpu63.1.1定義全局入口63.1.2設(shè)置中斷向量表63.1.3設(shè)置全部變量73.1.4關(guān)閉看門狗73.1.5關(guān)閉所有中斷83.1.6初始化系統(tǒng)時鐘93.1.7初始化bank113.1.8設(shè)置uart0133.1.9跳入main函數(shù)143.2初始化gpio143.
10、3初始化nand153.3.1配置nfconf、nfcont153.3.2重置nand173.3.3檢測設(shè)備號173.4判斷頁面大小類型183.5獲取系統(tǒng)參數(shù)193.6讀nand flash203.6.1k9f1g08u0b介紹203.6.2壞塊檢測203.6.3讀取nand flash中的一頁223.6.4讀zimage到sdram243.7啟動內(nèi)核253.7.1bootloader與內(nèi)核的參數(shù)傳遞253.7.2啟動內(nèi)核274結(jié)語28參考文獻(xiàn)31致 謝32321 導(dǎo)論1.1 本論文的學(xué)術(shù)背景以及研究意義1.1.1 本論文學(xué)術(shù)背景隨著人民生活水平的提高而帶來巨大消費需求、信息化進(jìn)程的推進(jìn)、電信
11、運營業(yè)的發(fā)展,信息產(chǎn)業(yè)市場空間將得到更進(jìn)一步的拓展。在這良好的經(jīng)濟環(huán)境下,嵌入式系統(tǒng)領(lǐng)域也得到了進(jìn)一步的拓寬與發(fā)展。嵌入式系統(tǒng)是以應(yīng)用為中心、以計算機技術(shù)為基礎(chǔ)、軟硬件可剪裁來適應(yīng)系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計算機系統(tǒng)。嵌入式系統(tǒng)是將先進(jìn)的計算機技術(shù)、半導(dǎo)體技術(shù)、電子技術(shù)以及各行業(yè)的具體應(yīng)用相結(jié)合后的產(chǎn)物,它是一個技術(shù)密集、資金密集、高度分散、不斷創(chuàng)新的知識集成系統(tǒng)。嵌入式系統(tǒng)廣泛地應(yīng)用在信息終端、工業(yè)控制和信息家電等領(lǐng)域。在嵌入式系統(tǒng)的開發(fā)中,嵌入式軟件是實現(xiàn)各種功能的關(guān)鍵,也是計算機技術(shù)最活躍的研究方向之一。不同應(yīng)用對嵌入式軟件有不同的要求,并且隨著嵌入式技術(shù)的發(fā)展,
12、這些要求也在不斷的變化。通常,應(yīng)用系統(tǒng)對嵌入式軟件的最基本要求是體積小、運行速度快、具有較好的可剪裁性和可移植性。 特別值得注意的是,現(xiàn)在對與嵌入式軟件來說,都需要操作系統(tǒng)的支持。簡單的嵌入式系統(tǒng)沒有操作系統(tǒng),而只是一個簡單的控制循環(huán)。但是,當(dāng)系統(tǒng)變得越來越復(fù)雜的時候,就需要一個嵌入式操作系統(tǒng)來支持,否則應(yīng)用軟件就會變得非常復(fù)雜,使開發(fā)難度加大,安全性和可靠性都難以得到保證。嵌入式軟件,特別是需要操作系統(tǒng)的支持,使得對硬件的要求越來越高。針對嵌入式系統(tǒng)的各種微處理器也遍布各個角落。特別是采用arm技術(shù)的各種微處理器遍及各行各業(yè)的市場。arm技術(shù)以其較高的性能和功效以及低功耗,使得在嵌入式系統(tǒng)中
13、得到了廣泛的應(yīng)用。世界上幾乎所有的主要半導(dǎo)體廠商都生產(chǎn)基于arm體系結(jié)構(gòu)的處理器,如motorola,ateml,philips,samsung等。目前arm芯片廣泛應(yīng)用于無線產(chǎn)品,如:pda、gps、網(wǎng)絡(luò)、消費電子產(chǎn)品及智能卡。可以說,arm技術(shù)無處不在。 隨著嵌入式產(chǎn)品中高端微處理器arm的加入以及軟件上操作系統(tǒng)的支持,使得整個嵌入式系統(tǒng)擁有了比較完整的構(gòu)架?,F(xiàn)在,專門為嵌入式產(chǎn)品開發(fā)的各個操作系統(tǒng)層出不窮,windows ce,pocket pc,linux 等等,受到各界關(guān)注也特別多。然而,如何進(jìn)行引導(dǎo)全入市操作系統(tǒng)這個問題卻很少有人提出。這就產(chǎn)生了另一個相關(guān)主題bootloader。
14、bootloader本身的功能就是引導(dǎo)與加載內(nèi)核鏡像。如何實現(xiàn)bootloader 的基本功能,如何針對基于arm體系的微處理器來實現(xiàn)bootloader,就成為本論文的一個基本論題。1.1.2 本論文的研究內(nèi)容本論文主要講述了一個基于arm的mini型bootloader的實現(xiàn)過程,主要用于引導(dǎo)arm-linux系統(tǒng)啟動。概括起來主要包括以下幾個方面:研究了arm體系結(jié)構(gòu),以及基于arm的匯編指令。研究了bootloader的工作原理,bootloader如何對cpu初始化,如何對nand flash初始化,如何讀nand flash,如何給內(nèi)核提供啟動參數(shù),以及如何引導(dǎo)arm-linux系
15、統(tǒng)啟動。研究了linux系統(tǒng)啟動過程。1.2 論文思路及結(jié)構(gòu)下面對論文的思路和設(shè)計做簡單的描述:第二章主要描述了研究中涉及到的內(nèi)容,arm體系結(jié)構(gòu),bootloader,以及嵌入式linux系統(tǒng)。第三章主要描述了bootloader對arm cpu初始化的過程,如何讀nand flash,bootloader與內(nèi)核的參數(shù)交互,以及bootloader如何引導(dǎo)嵌入式linux系統(tǒng)啟動。2 研究方法及內(nèi)容2.1 arm簡介2.1.1 arm技術(shù)的應(yīng)用領(lǐng)域及其特點目前為止,arm微處理器及技術(shù)的應(yīng)用幾乎已深入到各個領(lǐng)域:在工業(yè)控制領(lǐng)域中,作為32位的risc架構(gòu),基于arm核的處理器占據(jù)了各個領(lǐng)域微
16、處理器市場的大部分市場,它的低功耗,高性價比,向傳統(tǒng)的8位/16位微處理器發(fā)起了挑戰(zhàn)。在無線通訊領(lǐng)域中,目前已經(jīng)有超過85%的無線設(shè)備采用了arm微處理器,它的高性能和低成本鞏固了它在無線電通訊領(lǐng)域的地位。而在網(wǎng)絡(luò)應(yīng)用中,采用arm技術(shù)的adsl芯片已逐漸獲得競爭優(yōu)勢,目前arm技術(shù)在流行的數(shù)字音頻播放器、數(shù)字機頂盒和游戲機中都已經(jīng)得到了廣泛的應(yīng)用。包括現(xiàn)在的sim智能卡也采用了arm技術(shù)。除此之外,arm技術(shù)還應(yīng)用到其它不同的領(lǐng)域,并將獲得更大的市場。2.1.2 arm處理器的工作狀態(tài)和模式arm處理器有兩種工作狀態(tài),一種是arm狀態(tài),在該狀態(tài)下,處理器執(zhí)行的是32位對齊的arm指令,另外一
17、種是thumb狀態(tài),此時處理器執(zhí)行的是16位的、半字對齊的thumb指令。在執(zhí)行程序的過程中,處理器可以隨時在兩種工作狀態(tài)下任意切換,并且狀態(tài)轉(zhuǎn)換不會影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。arm有七種工作模式,分別為:用戶模式(usr):arm處理器正常的程序執(zhí)行狀態(tài)。快速中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理。外部中斷模式(irq):用于通用的中斷處理。管理模式(svc):操作系統(tǒng)使用的保護(hù)模式。數(shù)據(jù)訪問終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時進(jìn)入該模式,可用于虛擬存儲及存儲保護(hù)。系統(tǒng)模式(sys):運行具有特權(quán)的操作系統(tǒng)任務(wù)。定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時進(jìn)
18、入該模式,可用于支持硬件協(xié)處理器的軟件仿真。2.1.3 arm寄存器介紹arm處理器含有37個寄存器,這些寄存器包括以下兩類寄存器,31個通用寄存器和6個狀態(tài)寄存器。在arm處理器的7種模式下都有一組對應(yīng)的寄存器組。在任意時刻,可見的寄存器組包括15個通用寄存器r0r14、一個或兩個狀態(tài)寄存器和pc。在所有的寄存器中,有些是各種模式下共用的同一個物理寄存器,有些是各種模式自己獨立擁有的物理寄存器。如圖1所示: 圖1:arm寄存器這里我們重點研究程序狀態(tài)寄存器,也就是cprs寄存器,該寄存器可以在任何處理器模式下被訪問。每一種模式下都有一個專用的物理狀態(tài)寄存器,稱為spsr(備份程序狀態(tài)寄存器)
19、。當(dāng)特定的異常中斷發(fā)生時,這個寄存器用于存放當(dāng)前程序狀態(tài)寄存器的內(nèi)容。在異常退出時,可以用spsr中保存的值來恢復(fù)cpsr。cpsr的具體格式如下:圖2:cprs寄存器對于這個寄存器,我重點研究了cprs的控制位:在這個寄存器中,控制位為cprs的低8位,i、f、t及m4:0,異常中斷發(fā)生編號時,在特權(quán)級處理器模式下,可更改這些控制位。i/f中斷控制位:當(dāng)i=1時irq中斷禁止,當(dāng)f=1時fiq中斷禁止。t控制位:該控制為用于選擇處理器的工作狀態(tài),當(dāng)t=0時,表示執(zhí)行arm指令,當(dāng)t=1時,表示執(zhí)行thumb指令。m4:0控制位:該控制位用于選擇處理器的工作模式,如圖所示: 圖3:cprs中m
20、4:0控制位當(dāng)我們運行系統(tǒng)的時候,一般采用svc模式,也就是supervisor模式,這樣我們就只需要將m4:0控制位的值設(shè)置為0b10011即可。2.2 bootloader簡介2.2.1 bootloader移植的必要性bootloader是與系統(tǒng)硬件環(huán)境高度相關(guān)的初始化軟件,它擔(dān)負(fù)著初始化硬件和引導(dǎo)操作系統(tǒng)的雙重責(zé)任。一些arm平臺可以共用同一種bootloader,但是總的說來,每一個特定系統(tǒng)的bootloader都會有所不同。bootloader廣泛用于有操作系統(tǒng)的手持終端設(shè)備、智能家電及機頂盒等嵌入式設(shè)備上,它負(fù)責(zé)完成硬件初始化、操作系統(tǒng)引導(dǎo)和系統(tǒng)配制等。bootloader移植是
21、在特定硬件平臺上操作系統(tǒng)移植至關(guān)重要的一步。2.2.2 bootloader所支持的cpu和嵌入式系統(tǒng)每種不同的cpu體系結(jié)構(gòu)都有不同的bootloader。有些bootloader也支持多種體系結(jié)構(gòu)的cpu,比如u-boot就同時支持arm、mips、powerpc等體系結(jié)構(gòu)。除了依賴于cpu的體系結(jié)構(gòu)外,bootloader實際上也依賴于具體的嵌入式板級設(shè)備的配置。也就是說,對于兩塊不同的嵌入式板而言,即使它們是基于同一種cpu而構(gòu)建的,要想讓運行在一塊板子上的bootloader程序也能運行在另一塊板子上,通常也都需要修改bootloader的源程序。2.2.3 幾種常用的bootloa
22、der介紹redboot:redboot是redhat公司隨ecos發(fā)布的一個boot方案,是從ecos基礎(chǔ)上剝離出來的,屬于開源項目。它繼承了ecos的簡潔,輕巧,可靈活配置,穩(wěn)定可到等品質(zhì)優(yōu)點??梢砸龑?dǎo)ecos系統(tǒng)和linux操作系統(tǒng),支持在線讀寫flash等功能。u-boot:u-boot是由開源項目ppcboot發(fā)展起來的,armboot并入了ppcboot,和其他一些arch的loader合稱u-boot。2002年12月17日第一個版本u-boot-0.2.0發(fā)布。u-boot支持的處理器構(gòu)架包括powerpc, arm,mips,x86等等, u-boot(universal b
23、ootloader)從名字就可以看出,它是在gpl下資源代碼最完整的一個通用boot loader。u-boot提供兩種操作模式:啟動加載(boot loading)模式和下載(downloading)模式,并具有大型boot loader的全部功能。2.3 嵌入式linux簡介2.3.1 linux內(nèi)核支持的處理器架構(gòu)經(jīng)過近20年的發(fā)展,目前l(fā)inux不僅支持x86體系結(jié)構(gòu)的處理器,還支持很多其它架構(gòu)的微處理器。在linux內(nèi)核源碼樹中我們可以看到,linux已支持alpha、arm、avr32、ia64、m68k、mips、powerpc等體系架構(gòu)的微處理器??梢姡琹inux具有強大的可移
24、植性,在嵌入式方面做出了巨大的貢獻(xiàn)。2.3.2 vmlinuz、zimage介紹vmlinuz是內(nèi)核源碼編譯出來最原始的內(nèi)核文件,未經(jīng)過壓縮。zimage是vmlinuz經(jīng)過相關(guān)代碼壓縮后的內(nèi)核文件,它不僅是一個普通的壓縮文件,而且在這個文件的頭部內(nèi)嵌有g(shù)zip自解壓的代碼,用于運行時自解壓內(nèi)核,所以不能用gzip命令將這個文件解壓。2.3.3 linux的啟動設(shè)置在linux-2.6.36.4documentationarmbooting中有對內(nèi)核啟動的說明,如下: 圖4:內(nèi)核啟動說明由此可見,我們只需要向r0,r1,r2中寫入相應(yīng)的值,然后關(guān)閉中斷,讓cpu工作在scv模式,禁止mmu就可
25、以引導(dǎo)內(nèi)核啟動。其中r0中的值是0,r1中的值是機器碼的編號,這個編號可以在內(nèi)核目錄樹下archarmtoolsmach-types中查到,r2中的值是內(nèi)核下載到sdram中的起始地址,然后pc指針直接跳轉(zhuǎn)到那個地址執(zhí)行,把控制權(quán)交給內(nèi)核。3 mini bootloader的實現(xiàn)步驟3.1 初始化cpu3.1.1 定義全局入口定義全局入口first_sector,這是所有代碼的入口,代碼如下:.globl first_sector3.1.2 設(shè)置中斷向量表arm支持7個異常,2個中斷異常,每個異常都有一個入口地址,而這個地址就定義在異常向量表中,并且異常向量表的地址是固定的,占用0x00x1c
26、這32byte的地址空間。但這里我們只用到了一個異常類型,及reset異常。異常向量表的定義如下:first_sector: 0x00: resetbreset 0x04: undefined instruction exceptionundefentrypoint:bundefentrypoint 0x08: software interrupt exceptionswientrypoint:bswientrypoint 0x0c: prefetch abortprefetchabortenterypoint:bprefetchabortenterypoint 0x10: data acce
27、ss memory abortdataabortentrypoint:bdataabortentrypoint 0x14: not usednotusedentrypoint:bnotusedentrypoint 0x18: irq(interrupt request) exceptionirqentrypoint:birqhandle 0x1c: fiq(fast interrupt request) exceptionfiqentrypoint:bfiqentrypoint3.1.3 設(shè)置全部變量這里全局變量的設(shè)置是為了使用這段連續(xù)的空間存儲一些數(shù)據(jù),以備bootloader后續(xù)使用,設(shè)置
28、一些參數(shù)與內(nèi)核交互。設(shè)置方法如下: 0x20: fixed address global value.long zboot_magic魔數(shù),內(nèi)核與bootloader的約定.byte os_type, has_nand_bios, (logo_pos & 0xff).byte (logo_pos >>8) &0xff).long os_start內(nèi)核在flash中的儲存地址.long os_length內(nèi)核的大小.long os_ram_start內(nèi)核在ram中的初始地址.string linux_cmd_linelinux啟動參數(shù),由bootloader傳遞給內(nèi)核
29、。3.1.4 關(guān)閉看門狗看門狗的用途是使微控制器在進(jìn)入錯誤狀態(tài)后的一定時間內(nèi)復(fù)位。當(dāng)看門狗使能時,如果用戶程序沒有在周期時間內(nèi)喂狗,看門狗會產(chǎn)生一個系統(tǒng)復(fù)位。所以如果不關(guān)閉看門狗的話,一但系統(tǒng)工作不正常,看門狗就會不停的重啟系統(tǒng),為了避免這樣的麻煩,在此把看門狗關(guān)掉,在s3c2440手冊中可看到關(guān)于看門狗的寄存器,如圖5: 圖5:看門狗定時寄存器所以,要關(guān)閉看門狗,直接向該寄存器中寫入0x0即可,代碼如下: disable watch dog timermovr1, #0x53000000看門狗寄存器地址movr2, #0x0strr2, r1向0x53000000地址寫入0x03.1.5 關(guān)
30、閉所有中斷中斷的作用是當(dāng)cpu收到異常信號時快速的轉(zhuǎn)到相應(yīng)的中斷入口執(zhí)行程序,這樣對請求處理更及時,但是,在內(nèi)核啟動中有明確說明,啟動內(nèi)核前要關(guān)閉所有中斷,所以,在此把所有中斷全部關(guān)閉。在s3c2440手冊中有相關(guān)中斷屏蔽的說明,主要涉及的寄存器有intmsk和intsubmsk,這里包含了所有的中斷類型,所以,只要設(shè)置這兩個寄存器就能屏蔽所有的中斷,其中intmsk寄存器中包含了中斷和子中斷,中斷可以直接在這里面屏蔽,而子中斷則需要在intsubmsk中才能關(guān)閉,參照s3c2440手冊,關(guān)閉中斷代碼如下: disable all interruptsmovr1, #int_ctl_base中
31、斷寄存器的基地址0x4a000000movr2, #0xffffffff屏蔽所有中斷strr2, r1, #ointmsk向intmsk寄存器中寫入0xffffffffldrr2, =0x7ff屏蔽所有子中斷strr2, r1, #ointsubmsk向intsubmsk寄存器中寫入0x7ff3.1.6 初始化系統(tǒng)時鐘一個正常的時鐘是處理器正常工作的必要前提,在arm中,系統(tǒng)時鐘由外部晶震提供,然后通過pll升頻后供給cpu使用,cpu再通過分頻器分頻后供給不同的設(shè)備使用。但是在系統(tǒng)剛啟動的時候,通過pll升頻后的時鐘是不穩(wěn)定的,使用的外部晶振提供的時鐘,頻率為12m,所以需要cpu將時鐘鎖定
32、一段時間,等待升頻后的時鐘穩(wěn)定,然后再通過分頻器分頻,重新設(shè)置時鐘頻率。由此,結(jié)合s3c2440手冊,我們需要設(shè)置locktime、clkdivn、upllcon、mpllcon幾個寄存器。首先設(shè)置locktime寄存器,代碼如下: initialise system clocksmovr1, #clk_ctl_base時鐘控制寄存器初始地址mvnr2, #0xff000000upll lock和mpll lock的計數(shù)值strr2, r1, #olocktime將計數(shù)值寫入locktime寄存器中設(shè)置時鐘分頻寄存器,這里采用1:4:8分頻,代碼如下:movr1, #clk_ctl_base時
33、鐘控制寄存器初始地址ldrr2, clkdivn_value1:4:8,clkdivn_value = 0x05strr2, r1, #oclkdivn將0x05寫入clkdivn寄存器設(shè)置p15協(xié)處理器,代碼如下:mrcp15, 0, r1, c1, c0, 0讀控制寄存器 orrr1, r1, #0xc0000000 mcrp15, 0, r1, c1, c0, 0寫控制寄存器設(shè)置處理器輸出頻率,這里主要涉及兩個寄存器,upllcon和mpllcon,由于找到一個合適的pll值不容易,三星官方給出了幾組建議的設(shè)置,如圖6: 圖6:設(shè)置時鐘頻率根據(jù)手冊的要求,如果要同時設(shè)置upllcon和m
34、pllcon,需要首先設(shè)置upllcon,然后再設(shè)置mpllcon,并且在其中要插入7個nop,在圖6的最下邊有一句提示,說明48m和96m是用于upllcon寄存器,這里我們采取48m作為usb時鐘頻率,設(shè)置upllcon寄存器代碼如下:movr1, #clk_ctl_baseldr r2, = upll_48mhz0x38022str r2, r1, #oupllcon把0x38022寫入upllcon寄存器nop7個nop,等待時鐘穩(wěn)定nopnopnopnopnopnop接下來設(shè)置mpllcon寄存器,根據(jù)圖6,我們設(shè)置系統(tǒng)時鐘頻率為405m,則mpllcon中的值就為0x7f021,設(shè)
35、置該寄存器的相關(guān)代碼如下:ldrsp, dw_stack_start 設(shè)置堆棧指針地址ldr r2, mpll_value_user 0x7f021,405mstrr2, r1, #ompllcon將0x7f021寫入mpllcon3.1.7 初始化bank在s3c2440芯片手冊中有關(guān)于bank的說明,如圖7所示:圖7:s3c2440 memory control由上圖可以看出,s3c2440有1g的地址空間,分成8塊,每塊128m,其中有6塊供給rom、sram使用,其它兩塊供rom、sram、sdram使用,再根據(jù)其它外圍器件的片選端決定這個器件使用的是哪一個bank,如圖8所示:圖8:
36、s3c2440 memory map另外,s3c2440還有關(guān)于管理內(nèi)存映射的相關(guān)寄存器,起始地址為0x48000000,共有13個寄存器,要管理這8個bank,只需根據(jù)需要正確設(shè)置這是13個寄存器即可,這當(dāng)然還要參照外圍器件的片選和特性。這里我將描述的是基于mini2440板子的bank設(shè)置。bwscon寄存器是控制整個8個bank特性的寄存器,設(shè)置它們的總線寬度和等待狀態(tài)。根據(jù)各個器件的片選和特性,設(shè)置這個寄存器的值為0x22111110,然后分別配置各個bank的寄存器,bankcon0bankcon5這六個寄存器管理bank0bank5,它們的管理方式一樣,然后再通過bankcon6和
37、bankcon7設(shè)置bank6bank7,這里bank6是連接的sdram類型的外圍器件,所以要根據(jù)這個條件來選擇這兩個寄存器最后4位。如圖9:圖9:bankcon6的最后4位這里設(shè)置column address number為9bit,所以最后4位的值為0x09,接下來設(shè)置刷新寄存器refresh,該寄存器是設(shè)置sdram的寄存器,設(shè)置它支持自動刷新,刷新計數(shù)值為1259。再接下來依次設(shè)置banksize、mrsrb6、mrsrb7寄存器。設(shè)置bank的代碼如下:memsetup: set memory control registersmovr1, #mem_ctl_basebank控制寄
38、存器的基地址adrlr2, mem_cfg_val數(shù)據(jù)段中存放bank控制寄存器值的首地址addr3, r1, #5252 = 13x41:ldrr4, r2, #4/ * strr4, r1, #4 *依次復(fù)制men_cfg_val中的值到bank控制寄cmpr1, r3 *存器中,總共13個值。bne1b */movpc, lr數(shù)據(jù)段 bank控制寄存器的值.align 4mem_cfg_val:.longvbwscon.longvbankcon0.longvbankcon1.longvbankcon2.longvbankcon3.longvbankcon4.longvbankcon5.l
39、ongvbankcon6.longvbankcon7.longvrefresh.longvbanksize.longvmrsrb6.longvmrsrb73.1.8 設(shè)置uart0這里設(shè)置uart的主要目的是使用串口打印,便于調(diào)試,跟蹤bootloader啟動,uart0是由gpio中的gph組管理。所以需要設(shè)置gph相關(guān)的寄存器。首先設(shè)置gph3為rxd0,gph2為txd0,然后禁止gph上拉, 相關(guān)代碼如下: set gpio for uartmovr1, #gpio_ctl_basegpio基地址addr1, r1, #ogpio_hgph基地址ldrr2, gpio_con_uart
40、配置gphcon中的值,0x0016faaastrr2, r1, #ogpio_con配置gphconldrr2, gpio_up_uart配置gphup中的值,0x7ff,禁止上拉strr2, r1, #ogpio_up配置gphupblinituart初始化uart0 initialize uartinituart:ldrr1, serbaseuart的基地址movr2, #0x0strr2, r1, #oufcon配置uart0的fifostrr2, r1, #oumcon關(guān)閉uart0的自動流控制movr2, #0x3strr2, r1, #oulcon常規(guī)方式傳輸,無校驗,數(shù)據(jù)長度為
41、8bitldrr2, =0x245設(shè)置uart0的傳輸模式。strr2, r1, #oucon設(shè)置波特率#define uart_brd (uart_pclk / (uart_baud_rate * 16) - 1)movr2, #uart_brdstrr2, r1, #oubrdivmovr3, #100等待波特率輸出穩(wěn)定movr2, #0x01:subr3, r3, #0x1tstr2, r3bne1bmovpc, lr返回,繼續(xù)向下執(zhí)行3.1.9 跳入main函數(shù)初始化了以上部分,跳入main函數(shù),下面代碼全部用c實現(xiàn)。代碼如下:jump to mainblmain1:b1b 這里值得注
42、意的是在main函數(shù)下邊有一句代碼,這句代碼的作用是如果處理器執(zhí)行完main函數(shù)中的代碼跳出后一直執(zhí)行下面這條指令,即一直停留在這個位置,防止指針跳轉(zhuǎn)到一個意想不到的地址執(zhí)行,得到未知的結(jié)果,影響判斷。3.2 初始化gpio初始化gpio口,供后續(xù)使用,代碼如下:void port_init(void)gpacon = 0x7fffff;/ 設(shè)置gpa組的引腳功能gpbcon = 0x044555;/ 設(shè)置gpb組的引腳功能gpbup = 0x7ff;/ 禁止上拉 gpb10:0gpccon = 0xaaaaaaaa;gpcup = 0xffff;/ 禁止上拉 gpc15:0 gpdcon =
43、 0x00151544;gpddat = 0x0430;gpdup = 0x877a;gpecon = 0xaa2aaaaa;gpeup = 0xf7ff;/ gpe11設(shè)置為輸出gpfcon = 0x55aa;gpfup = 0xff;/ 禁止上拉 gpf7:0gpgcon = 1<<8;gpgdat = 0;gphcon = 0x16faaa;gphup = 0x7ff;/ 禁止上拉 gph10:0extint0 = 0x22222222;/ eint7:0extint1 = 0x22222222;/ eint15:8extint2 = 0x22222222;/ eint23:
44、163.3 初始化nand3.3.1 配置nfconf、nfcont要初始化nand flash,必須配置以上這兩個寄存器,首先看nfconf這個寄存器,在s3c2440中有對于該寄存器的介紹,如圖10: 圖10:nfconf寄存器由上圖可知,該寄存器是設(shè)置clt/ale的建立時間、nwe/nre持續(xù)的時間、寫進(jìn)去的數(shù)據(jù)起作用的時間,這需要根據(jù)nand flash的芯片資料來設(shè)置,這里我將基于k9f1gu0b來介紹如何初始化這個寄存器。首先看nand flash的時序圖,如圖11: 圖11:nand flash時序圖tacls:表示clt/ale的建立時間。twrph0:表示nwe/nre持續(xù)
45、的時間。twrph1:表示寫進(jìn)去的數(shù)據(jù)起作用的時間。再在k9f1gu0b芯片資料中有關(guān)于以上值的要求,如圖12:圖12:ac時序特征結(jié)合上面兩個圖,可以看出tacls相當(dāng)于tcls和tals參數(shù),twrph0相當(dāng)于twp,而twrph1相當(dāng)于tclh和talh。然后結(jié)合我們在初始化時鐘的時候設(shè)置hclk為100m,也就等于10ns,所以tacls=2*10ns=20ns > 10ns,twrph0=10ns*(6+1)=70 > 12,twrph1=10ns*(2+1)=30ns > 5ns,這樣我們就設(shè)置好了nand flash的時序特征。接下來設(shè)置nfcont寄存器,這里
46、我們需要禁用軟硬鎖定,禁用中斷非法訪問等。根據(jù)以上要求,設(shè)置這兩個寄存器的代碼如下:#define tacls2#define twrph06#define twrph12nfconf = (tacls << 12) | (twrph0 << 8) | (twrph1 << 4) | (0 << 0);nfcont = (0 << 13) | (0 << 12) | (0 << 10) | (0 << 9) | (0 << 8) | (0 << 6) | (0 <<
47、; 5) | (1 << 4) | (1 << 1) | (1 << 0);nfstat = 0;/ nand flash is busy。3.3.2 重置nand初始化了nand flash過后,將nand flash重置一次,重置nand flash需做到一下流程,首先禁止片選,清理傳輸狀態(tài),使用重置命令,等待傳輸狀態(tài),啟用片選。代碼如下:#define nf_cmd(cmd)nfcmd=cmd;/重置nand flash#define nf_nfce_l()nfcont&=(1<<1);/清理該位#define nf_nfce_h(
48、)nfcont|=(1<<1);/使能該位#define nf_rstecc()nfcont|=(1<<4);/初始化ecc#define nf_detect_rb() while(!(nfstat&(1<<2);/等待狀態(tài)使能static inline void nandreset(void)nf_nfce_l();nf_clear_rb();nf_cmd(0xff);/重置nand flash命令。nf_detect_rb();nf_nfce_h();3.3.3 檢測設(shè)備號每塊nand flash都有自己的特性,要根據(jù)flash的特性來設(shè)置頁面大
49、小和塊大小,通過檢測flash的id號就可以區(qū)分flash的種類和特性,也可以通過語句判斷讓一個bootloader支持多種nand flash,這里我將講述如何設(shè)置代碼檢測來支持兩種nand flash,它們的頁面分別為512和2048,代碼如下:static inline u32 nandcheckid(void)u8 mid, did, dontcare, id4th;nf_nfce_l();nf_cmd(0x90);/讀nand id命令nf_addr(0x0);/讀取地址delay();mid = nf_rddata8();/第一次讀nand id,讀廠商iddid = nf_rdd
50、ata8();/第二次讀nand iddontcare = nf_rddata8();/第三次讀nand id,讀設(shè)備idid4th = nf_rddata8();/第四次讀nand idnf_nfce_h();switch(did) case 0x76:/nand flash id號g_page_type = page512;/頁面大小類型為512bytebreak;case 0xf1:case 0xd3:g_page_type = page2048;/頁面大小類型為2kbreak;default:;return (u32) (mid << 24) | (did <<
51、 16) | (dontcare << 8) | id4th);3.4 判斷頁面大小類型判斷頁面大小類型非常關(guān)鍵,如果在以上代碼中檢測出的設(shè)備號與以上都不符合,那么g_page_type的值仍然為初始化的page_unknown,此時就提示出錯,不進(jìn)行下一步操作,并在串口打印出提示信息,代碼如下:if (g_page_type = page_unknown) uart_sendstring("rnunsupport nandrn");/打印出錯信息for(;);/bootloader掛起3.5 獲取系統(tǒng)參數(shù)這里對參數(shù)的設(shè)置和初始化,是為了以后讀nand flas
52、h、給內(nèi)核傳遞參數(shù)的時候會用到,這里采用一個結(jié)構(gòu)體來儲存這些數(shù)據(jù),而在中斷向量表定義后,我用了一段空間來儲存一些數(shù)據(jù),而這些數(shù)據(jù)就是要用到的一系列參數(shù)。首先定義一個結(jié)構(gòu)體,代碼如下:extern struct zboot_first_sector unsigned char dont_care0x20;/中斷向量表占用unsigned int magic;unsigned char os_type;unsigned char has_nand_bios;unsigned short logo_pos;unsigned int os_start;unsigned int os_length;un
53、signed int os_ram_start;unsigned char linux_cmd512 - 0x34; _attribute_(packed) first_sector;在代碼最后聲明了一個結(jié)構(gòu)體成員first_sector,該結(jié)構(gòu)體成員定位到中斷向量表中的first_sector段,再看下面一段代碼:#define g_magic(first_sector.magic)#define g_os_type(first_sector.os_type)#define g_has_nand_bios(first_sector.has_nand_bios)#define g_logo_pos(first_sector.logo_pos)#define g_os_start(first_sector.os_start)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020KET新題型官方模擬卷(讀寫部分)
- 科學(xué)課件教學(xué)
- 高級家具出租合同模板
- U9SMART敏捷實施方法論V6.5-01總體介紹
- 分?jǐn)?shù)的加法和減法異分母分?jǐn)?shù)加減法
- 小紅帽課件下載
- 櫥柜嵌入式定制合同模板
- 提供鉆石合同模板
- 社會研究方法課件
- 金屬鑄造合同模板
- 《中級財務(wù)會計(二)》作業(yè)冊形成性考核冊國家開放大學(xué)電大
- (小作坊食品生產(chǎn)許可證申請資料)酒坊蒸餾酒生產(chǎn)工藝流程及生產(chǎn)管理制度(全套)
- 2023年徐州市國盛控股集團有限公司招聘筆試題庫及答案解析
- 河北省滄州市藥品零售藥店企業(yè)藥房名單目錄
- 《試驗設(shè)計與統(tǒng)計分析》課程教學(xué)大綱
- 高一生物 基因工程的基本操作步驟(第1課時) 基因工程的基本操作程序 教學(xué)設(shè)計
- 奧運項目介紹課件
- 2020年中國自由貿(mào)易試驗區(qū)發(fā)展白皮書課件
- 糖尿病高危人群健康管理課件
- 呂氏春秋卷十一 仲冬紀(jì) 忠廉原文及翻譯
- 《相遇問題》-完整版PPT
評論
0/150
提交評論