版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、四川大学锦城学院本科毕业论文 基于arm的mini bootloader设计与实现四川大学锦城学院 本科生毕业论文(设计) 题 目 基于arm的mini bootloader设计与实现 学 院 四川大学锦城学院 专 业 软件工程 学生姓名 学 号 070231006 年级 07 指导教师 教务部制表二一一年 三 月 十 日基于arm的mini bootloader设计与实现专业:软件工程学生: 指导教师: 摘 要在目前日益信息化的社会中,计算机和网络的应用已经全面渗透到日常生活的每个角落。各式各样的新型嵌入式系统在应用数量上已经远远超过通用计算机。任何一个人都可能拥有从大到小的各种使用嵌入式技
2、术的电子产品,小到mp3,pda等微型数字化产品,大到网络家电、智能家电、车载电子等设备。在工业和服务领域中,使用嵌入式技术的数字机床、智能工具、机器人、也将逐渐改变传统工业和服务方式。嵌入式系统可分为有操作系统和无操作系统,然而,在简单的嵌入式系统中,我们往往只需要写一段简单的程序到可编程器件中就能实它的功能。但是,如果当一个嵌入式系统非常复杂的,简单的程序不能满足我们的需求,这时候我们往往会需要功能强大的操作系统支持。但现在几乎所有的操作系统都不能独立的从一块储存介质中启动,例如我们常用的pc机,它也需要bios的支持才能完成启动,由此我们想到有没有一种程序可以像bios一样引导嵌入式系统
3、启动呢?它的工作原理是什么呢?而bootloader就为人们实现了这样的功能。关键词: 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导论11.1本论文的学术背景以及研究意义11.1.1本论文学术背景11.1.2本论文的研究内容11.2论文思路及结构22研究方法及内容22.1arm简介22.1.1arm技术的应用领域及其特点22.1.2arm处理器的工作状态和模式22.1.3arm寄存器介绍32.2bootloader简介42.2.1boot
9、loader移植的必要性42.2.2bootloader所支持的cpu和嵌入式系统42.2.3几种常用的bootloader介绍42.3嵌入式linux简介52.3.1linux内核支持的处理器架构52.3.2vmlinuz、zimage介绍52.3.3linux的启动设置53mini bootloader的实现步骤63.1初始化cpu63.1.1定义全局入口63.1.2设置中断向量表63.1.3设置全部变量73.1.4关闭看门狗73.1.5关闭所有中断83.1.6初始化系统时钟93.1.7初始化bank113.1.8设置uart0133.1.9跳入main函数143.2初始化gpio143.
10、3初始化nand153.3.1配置nfconf、nfcont153.3.2重置nand173.3.3检测设备号173.4判断页面大小类型183.5获取系统参数193.6读nand flash203.6.1k9f1g08u0b介绍203.6.2坏块检测203.6.3读取nand flash中的一页223.6.4读zimage到sdram243.7启动内核253.7.1bootloader与内核的参数传递253.7.2启动内核274结语28参考文献31致 谢32321 导论1.1 本论文的学术背景以及研究意义1.1.1 本论文学术背景随着人民生活水平的提高而带来巨大消费需求、信息化进程的推进、电信
11、运营业的发展,信息产业市场空间将得到更进一步的拓展。在这良好的经济环境下,嵌入式系统领域也得到了进一步的拓宽与发展。嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可剪裁来适应系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统是将先进的计算机技术、半导体技术、电子技术以及各行业的具体应用相结合后的产物,它是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。嵌入式系统广泛地应用在信息终端、工业控制和信息家电等领域。在嵌入式系统的开发中,嵌入式软件是实现各种功能的关键,也是计算机技术最活跃的研究方向之一。不同应用对嵌入式软件有不同的要求,并且随着嵌入式技术的发展,
12、这些要求也在不断的变化。通常,应用系统对嵌入式软件的最基本要求是体积小、运行速度快、具有较好的可剪裁性和可移植性。 特别值得注意的是,现在对与嵌入式软件来说,都需要操作系统的支持。简单的嵌入式系统没有操作系统,而只是一个简单的控制循环。但是,当系统变得越来越复杂的时候,就需要一个嵌入式操作系统来支持,否则应用软件就会变得非常复杂,使开发难度加大,安全性和可靠性都难以得到保证。嵌入式软件,特别是需要操作系统的支持,使得对硬件的要求越来越高。针对嵌入式系统的各种微处理器也遍布各个角落。特别是采用arm技术的各种微处理器遍及各行各业的市场。arm技术以其较高的性能和功效以及低功耗,使得在嵌入式系统中
13、得到了广泛的应用。世界上几乎所有的主要半导体厂商都生产基于arm体系结构的处理器,如motorola,ateml,philips,samsung等。目前arm芯片广泛应用于无线产品,如:pda、gps、网络、消费电子产品及智能卡。可以说,arm技术无处不在。 随着嵌入式产品中高端微处理器arm的加入以及软件上操作系统的支持,使得整个嵌入式系统拥有了比较完整的构架。现在,专门为嵌入式产品开发的各个操作系统层出不穷,windows ce,pocket pc,linux 等等,受到各界关注也特别多。然而,如何进行引导全入市操作系统这个问题却很少有人提出。这就产生了另一个相关主题bootloader。
14、bootloader本身的功能就是引导与加载内核镜像。如何实现bootloader 的基本功能,如何针对基于arm体系的微处理器来实现bootloader,就成为本论文的一个基本论题。1.1.2 本论文的研究内容本论文主要讲述了一个基于arm的mini型bootloader的实现过程,主要用于引导arm-linux系统启动。概括起来主要包括以下几个方面:研究了arm体系结构,以及基于arm的汇编指令。研究了bootloader的工作原理,bootloader如何对cpu初始化,如何对nand flash初始化,如何读nand flash,如何给内核提供启动参数,以及如何引导arm-linux系
15、统启动。研究了linux系统启动过程。1.2 论文思路及结构下面对论文的思路和设计做简单的描述:第二章主要描述了研究中涉及到的内容,arm体系结构,bootloader,以及嵌入式linux系统。第三章主要描述了bootloader对arm cpu初始化的过程,如何读nand flash,bootloader与内核的参数交互,以及bootloader如何引导嵌入式linux系统启动。2 研究方法及内容2.1 arm简介2.1.1 arm技术的应用领域及其特点目前为止,arm微处理器及技术的应用几乎已深入到各个领域:在工业控制领域中,作为32位的risc架构,基于arm核的处理器占据了各个领域微
16、处理器市场的大部分市场,它的低功耗,高性价比,向传统的8位/16位微处理器发起了挑战。在无线通讯领域中,目前已经有超过85%的无线设备采用了arm微处理器,它的高性能和低成本巩固了它在无线电通讯领域的地位。而在网络应用中,采用arm技术的adsl芯片已逐渐获得竞争优势,目前arm技术在流行的数字音频播放器、数字机顶盒和游戏机中都已经得到了广泛的应用。包括现在的sim智能卡也采用了arm技术。除此之外,arm技术还应用到其它不同的领域,并将获得更大的市场。2.1.2 arm处理器的工作状态和模式arm处理器有两种工作状态,一种是arm状态,在该状态下,处理器执行的是32位对齐的arm指令,另外一
17、种是thumb状态,此时处理器执行的是16位的、半字对齐的thumb指令。在执行程序的过程中,处理器可以随时在两种工作状态下任意切换,并且状态转换不会影响处理器的工作模式和相应寄存器中的内容。arm有七种工作模式,分别为:用户模式(usr):arm处理器正常的程序执行状态。快速中断模式(fiq):用于高速数据传输或通道处理。外部中断模式(irq):用于通用的中断处理。管理模式(svc):操作系统使用的保护模式。数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。系统模式(sys):运行具有特权的操作系统任务。定义指令中止模式(und):当未定义的指令执行时进
18、入该模式,可用于支持硬件协处理器的软件仿真。2.1.3 arm寄存器介绍arm处理器含有37个寄存器,这些寄存器包括以下两类寄存器,31个通用寄存器和6个状态寄存器。在arm处理器的7种模式下都有一组对应的寄存器组。在任意时刻,可见的寄存器组包括15个通用寄存器r0r14、一个或两个状态寄存器和pc。在所有的寄存器中,有些是各种模式下共用的同一个物理寄存器,有些是各种模式自己独立拥有的物理寄存器。如图1所示: 图1:arm寄存器这里我们重点研究程序状态寄存器,也就是cprs寄存器,该寄存器可以在任何处理器模式下被访问。每一种模式下都有一个专用的物理状态寄存器,称为spsr(备份程序状态寄存器)
19、。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常退出时,可以用spsr中保存的值来恢复cpsr。cpsr的具体格式如下:图2:cprs寄存器对于这个寄存器,我重点研究了cprs的控制位:在这个寄存器中,控制位为cprs的低8位,i、f、t及m4:0,异常中断发生编号时,在特权级处理器模式下,可更改这些控制位。i/f中断控制位:当i=1时irq中断禁止,当f=1时fiq中断禁止。t控制位:该控制为用于选择处理器的工作状态,当t=0时,表示执行arm指令,当t=1时,表示执行thumb指令。m4:0控制位:该控制位用于选择处理器的工作模式,如图所示: 图3:cprs中m
20、4:0控制位当我们运行系统的时候,一般采用svc模式,也就是supervisor模式,这样我们就只需要将m4:0控制位的值设置为0b10011即可。2.2 bootloader简介2.2.1 bootloader移植的必要性bootloader是与系统硬件环境高度相关的初始化软件,它担负着初始化硬件和引导操作系统的双重责任。一些arm平台可以共用同一种bootloader,但是总的说来,每一个特定系统的bootloader都会有所不同。bootloader广泛用于有操作系统的手持终端设备、智能家电及机顶盒等嵌入式设备上,它负责完成硬件初始化、操作系统引导和系统配制等。bootloader移植是
21、在特定硬件平台上操作系统移植至关重要的一步。2.2.2 bootloader所支持的cpu和嵌入式系统每种不同的cpu体系结构都有不同的bootloader。有些bootloader也支持多种体系结构的cpu,比如u-boot就同时支持arm、mips、powerpc等体系结构。除了依赖于cpu的体系结构外,bootloader实际上也依赖于具体的嵌入式板级设备的配置。也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种cpu而构建的,要想让运行在一块板子上的bootloader程序也能运行在另一块板子上,通常也都需要修改bootloader的源程序。2.2.3 几种常用的bootloa
22、der介绍redboot:redboot是redhat公司随ecos发布的一个boot方案,是从ecos基础上剥离出来的,属于开源项目。它继承了ecos的简洁,轻巧,可灵活配置,稳定可到等品质优点。可以引导ecos系统和linux操作系统,支持在线读写flash等功能。u-boot:u-boot是由开源项目ppcboot发展起来的,armboot并入了ppcboot,和其他一些arch的loader合称u-boot。2002年12月17日第一个版本u-boot-0.2.0发布。u-boot支持的处理器构架包括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内核支持的处理器架构经过近20年的发展,目前linux不仅支持x86体系结构的处理器,还支持很多其它架构的微处理器。在linux内核源码树中我们可以看到,linux已支持alpha、arm、avr32、ia64、m68k、mips、powerpc等体系架构的微处理器。可见,linux具有强大的可移
24、植性,在嵌入式方面做出了巨大的贡献。2.3.2 vmlinuz、zimage介绍vmlinuz是内核源码编译出来最原始的内核文件,未经过压缩。zimage是vmlinuz经过相关代码压缩后的内核文件,它不仅是一个普通的压缩文件,而且在这个文件的头部内嵌有gzip自解压的代码,用于运行时自解压内核,所以不能用gzip命令将这个文件解压。2.3.3 linux的启动设置在linux-2.6.36.4documentationarmbooting中有对内核启动的说明,如下: 图4:内核启动说明由此可见,我们只需要向r0,r1,r2中写入相应的值,然后关闭中断,让cpu工作在scv模式,禁止mmu就可
25、以引导内核启动。其中r0中的值是0,r1中的值是机器码的编号,这个编号可以在内核目录树下archarmtoolsmach-types中查到,r2中的值是内核下载到sdram中的起始地址,然后pc指针直接跳转到那个地址执行,把控制权交给内核。3 mini bootloader的实现步骤3.1 初始化cpu3.1.1 定义全局入口定义全局入口first_sector,这是所有代码的入口,代码如下:.globl first_sector3.1.2 设置中断向量表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 设置全部变量这里全局变量的设置是为了使用这段连续的空间存储一些数据,以备bootloader后续使用,设置
28、一些参数与内核交互。设置方法如下: 0x20: fixed address global value.long zboot_magic魔数,内核与bootloader的约定.byte os_type, has_nand_bios, (logo_pos & 0xff).byte (logo_pos 8) &0xff).long os_start内核在flash中的储存地址.long os_length内核的大小.long os_ram_start内核在ram中的初始地址.string linux_cmd_linelinux启动参数,由bootloader传递给内核。3.1.4 关闭看门狗看门狗的
29、用途是使微控制器在进入错误状态后的一定时间内复位。当看门狗使能时,如果用户程序没有在周期时间内喂狗,看门狗会产生一个系统复位。所以如果不关闭看门狗的话,一但系统工作不正常,看门狗就会不停的重启系统,为了避免这样的麻烦,在此把看门狗关掉,在s3c2440手册中可看到关于看门狗的寄存器,如图5: 图5:看门狗定时寄存器所以,要关闭看门狗,直接向该寄存器中写入0x0即可,代码如下: disable watch dog timermovr1, #0x53000000看门狗寄存器地址movr2, #0x0strr2, r1向0x53000000地址写入0x03.1.5 关闭所有中断中断的作用是当cpu收
30、到异常信号时快速的转到相应的中断入口执行程序,这样对请求处理更及时,但是,在内核启动中有明确说明,启动内核前要关闭所有中断,所以,在此把所有中断全部关闭。在s3c2440手册中有相关中断屏蔽的说明,主要涉及的寄存器有intmsk和intsubmsk,这里包含了所有的中断类型,所以,只要设置这两个寄存器就能屏蔽所有的中断,其中intmsk寄存器中包含了中断和子中断,中断可以直接在这里面屏蔽,而子中断则需要在intsubmsk中才能关闭,参照s3c2440手册,关闭中断代码如下: disable all interruptsmovr1, #int_ctl_base中断寄存器的基地址0x4a0000
31、00movr2, #0xffffffff屏蔽所有中断strr2, r1, #ointmsk向intmsk寄存器中写入0xffffffffldrr2, =0x7ff屏蔽所有子中断strr2, r1, #ointsubmsk向intsubmsk寄存器中写入0x7ff3.1.6 初始化系统时钟一个正常的时钟是处理器正常工作的必要前提,在arm中,系统时钟由外部晶震提供,然后通过pll升频后供给cpu使用,cpu再通过分频器分频后供给不同的设备使用。但是在系统刚启动的时候,通过pll升频后的时钟是不稳定的,使用的外部晶振提供的时钟,频率为12m,所以需要cpu将时钟锁定一段时间,等待升频后的时钟稳定,
32、然后再通过分频器分频,重新设置时钟频率。由此,结合s3c2440手册,我们需要设置locktime、clkdivn、upllcon、mpllcon几个寄存器。首先设置locktime寄存器,代码如下: initialise system clocksmovr1, #clk_ctl_base时钟控制寄存器初始地址mvnr2, #0xff000000upll lock和mpll lock的计数值strr2, r1, #olocktime将计数值写入locktime寄存器中设置时钟分频寄存器,这里采用1:4:8分频,代码如下:movr1, #clk_ctl_base时钟控制寄存器初始地址ldrr2,
33、 clkdivn_value1:4:8,clkdivn_value = 0x05strr2, r1, #oclkdivn将0x05写入clkdivn寄存器设置p15协处理器,代码如下:mrcp15, 0, r1, c1, c0, 0读控制寄存器 orrr1, r1, #0xc0000000 mcrp15, 0, r1, c1, c0, 0写控制寄存器设置处理器输出频率,这里主要涉及两个寄存器,upllcon和mpllcon,由于找到一个合适的pll值不容易,三星官方给出了几组建议的设置,如图6: 图6:设置时钟频率根据手册的要求,如果要同时设置upllcon和mpllcon,需要首先设置upl
34、lcon,然后再设置mpllcon,并且在其中要插入7个nop,在图6的最下边有一句提示,说明48m和96m是用于upllcon寄存器,这里我们采取48m作为usb时钟频率,设置upllcon寄存器代码如下:movr1, #clk_ctl_baseldr r2, = upll_48mhz0x38022str r2, r1, #oupllcon把0x38022写入upllcon寄存器nop7个nop,等待时钟稳定nopnopnopnopnopnop接下来设置mpllcon寄存器,根据图6,我们设置系统时钟频率为405m,则mpllcon中的值就为0x7f021,设置该寄存器的相关代码如下:ldr
35、sp, dw_stack_start 设置堆栈指针地址ldr r2, mpll_value_user 0x7f021,405mstrr2, r1, #ompllcon将0x7f021写入mpllcon3.1.7 初始化bank在s3c2440芯片手册中有关于bank的说明,如图7所示:图7:s3c2440 memory control由上图可以看出,s3c2440有1g的地址空间,分成8块,每块128m,其中有6块供给rom、sram使用,其它两块供rom、sram、sdram使用,再根据其它外围器件的片选端决定这个器件使用的是哪一个bank,如图8所示:图8:s3c2440 memory m
36、ap另外,s3c2440还有关于管理内存映射的相关寄存器,起始地址为0x48000000,共有13个寄存器,要管理这8个bank,只需根据需要正确设置这是13个寄存器即可,这当然还要参照外围器件的片选和特性。这里我将描述的是基于mini2440板子的bank设置。bwscon寄存器是控制整个8个bank特性的寄存器,设置它们的总线宽度和等待状态。根据各个器件的片选和特性,设置这个寄存器的值为0x22111110,然后分别配置各个bank的寄存器,bankcon0bankcon5这六个寄存器管理bank0bank5,它们的管理方式一样,然后再通过bankcon6和bankcon7设置bank6b
37、ank7,这里bank6是连接的sdram类型的外围器件,所以要根据这个条件来选择这两个寄存器最后4位。如图9:图9:bankcon6的最后4位这里设置column address number为9bit,所以最后4位的值为0x09,接下来设置刷新寄存器refresh,该寄存器是设置sdram的寄存器,设置它支持自动刷新,刷新计数值为1259。再接下来依次设置banksize、mrsrb6、mrsrb7寄存器。设置bank的代码如下:memsetup: set memory control registersmovr1, #mem_ctl_basebank控制寄存器的基地址adrlr2, me
38、m_cfg_val数据段中存放bank控制寄存器值的首地址addr3, r1, #5252 = 13x41:ldrr4, r2, #4/ * strr4, r1, #4 *依次复制men_cfg_val中的值到bank控制寄cmpr1, r3 *存器中,总共13个值。bne1b */movpc, lr数据段 bank控制寄存器的值.align 4mem_cfg_val:.longvbwscon.longvbankcon0.longvbankcon1.longvbankcon2.longvbankcon3.longvbankcon4.longvbankcon5.longvbankcon6.lon
39、gvbankcon7.longvrefresh.longvbanksize.longvmrsrb6.longvmrsrb73.1.8 设置uart0这里设置uart的主要目的是使用串口打印,便于调试,跟踪bootloader启动,uart0是由gpio中的gph组管理。所以需要设置gph相关的寄存器。首先设置gph3为rxd0,gph2为txd0,然后禁止gph上拉, 相关代码如下: set gpio for uartmovr1, #gpio_ctl_basegpio基地址addr1, r1, #ogpio_hgph基地址ldrr2, gpio_con_uart配置gphcon中的值,0x00
40、16faaastrr2, 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关闭uart0的自动流控制movr2, #0x3strr2, r1, #oulcon常规方式传输,无校验,数据长度为8bitldrr2, =0x24
41、5设置uart0的传输模式。strr2, r1, #oucon设置波特率#define uart_brd (uart_pclk / (uart_baud_rate * 16) - 1)movr2, #uart_brdstrr2, r1, #oubrdivmovr3, #100等待波特率输出稳定movr2, #0x01:subr3, r3, #0x1tstr2, r3bne1bmovpc, lr返回,继续向下执行3.1.9 跳入main函数初始化了以上部分,跳入main函数,下面代码全部用c实现。代码如下:jump to mainblmain1:b1b 这里值得注意的是在main函数下边有一句代
42、码,这句代码的作用是如果处理器执行完main函数中的代码跳出后一直执行下面这条指令,即一直停留在这个位置,防止指针跳转到一个意想不到的地址执行,得到未知的结果,影响判断。3.2 初始化gpio初始化gpio口,供后续使用,代码如下:void port_init(void)gpacon = 0x7fffff;/ 设置gpa组的引脚功能gpbcon = 0x044555;/ 设置gpb组的引脚功能gpbup = 0x7ff;/ 禁止上拉 gpb10:0gpccon = 0xaaaaaaaa;gpcup = 0xffff;/ 禁止上拉 gpc15:0 gpdcon = 0x00151544;gpdd
43、at = 0x0430;gpdup = 0x877a;gpecon = 0xaa2aaaaa;gpeup = 0xf7ff;/ gpe11设置为输出gpfcon = 0x55aa;gpfup = 0xff;/ 禁止上拉 gpf7:0gpgcon = 1 10ns,twrph0=10ns*(6+1)=70 12,twrph1=10ns*(2+1)=30ns 5ns,这样我们就设置好了nand flash的时序特征。接下来设置nfcont寄存器,这里我们需要禁用软硬锁定,禁用中断非法访问等。根据以上要求,设置这两个寄存器的代码如下:#define tacls2#define twrph06#def
44、ine twrph12nfconf = (tacls 12) | (twrph0 8) | (twrph1 4) | (0 0);nfcont = (0 13) | (0 12) | (0 10) | (0 9) | (0 8) | (0 6) | (0 5) | (1 4) | (1 1) | (1 0);nfstat = 0;/ nand flash is busy。3.3.2 重置nand初始化了nand flash过后,将nand flash重置一次,重置nand flash需做到一下流程,首先禁止片选,清理传输状态,使用重置命令,等待传输状态,启用片选。代码如下:#define nf
45、_cmd(cmd)nfcmd=cmd;/重置nand flash#define nf_nfce_l()nfcont&=(11);/清理该位#define nf_nfce_h()nfcont|=(11);/使能该位#define nf_rstecc()nfcont|=(14);/初始化ecc#define nf_detect_rb() while(!(nfstat&(12);/等待状态使能static inline void nandreset(void)nf_nfce_l();nf_clear_rb();nf_cmd(0xff);/重置nand flash命令。nf_detect_rb();n
46、f_nfce_h();3.3.3 检测设备号每块nand flash都有自己的特性,要根据flash的特性来设置页面大小和块大小,通过检测flash的id号就可以区分flash的种类和特性,也可以通过语句判断让一个bootloader支持多种nand flash,这里我将讲述如何设置代码检测来支持两种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);/读取
47、地址delay();mid = nf_rddata8();/第一次读nand id,读厂商iddid = nf_rddata8();/第二次读nand iddontcare = nf_rddata8();/第三次读nand id,读设备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;/页面大小类型为2kbr
48、eak;default:;return (u32) (mid 24) | (did 16) | (dontcare 8) | id4th);3.4 判断页面大小类型判断页面大小类型非常关键,如果在以上代码中检测出的设备号与以上都不符合,那么g_page_type的值仍然为初始化的page_unknown,此时就提示出错,不进行下一步操作,并在串口打印出提示信息,代码如下:if (g_page_type = page_unknown) uart_sendstring(rnunsupport nandrn);/打印出错信息for(;);/bootloader挂起3.5 获取系统参数这里对参数的设置
49、和初始化,是为了以后读nand flash、给内核传递参数的时候会用到,这里采用一个结构体来储存这些数据,而在中断向量表定义后,我用了一段空间来储存一些数据,而这些数据就是要用到的一系列参数。首先定义一个结构体,代码如下: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;unsigned int os_ram_start;unsigned char linux_cmd512 - 0x34; _attribute_(packed) first_sector;在代码最后声明了一个结构体成员first_sector,该结构体成员定位到中断向量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 世界美术史 2-2021级本科(混合式)学习通超星期末考试答案章节答案2024年
- MS41-生命科学试剂-MCE
- 数字媒体基础学习通超星期末考试答案章节答案2024年
- 昌盛中学开展未成年人明德守礼“六个一”实施方案
- 2024年防洪防汛应急预案
- 计算机juc课程设计
- 水控课程设计丝绸
- 沼气池施工方案
- 合伙种植玉米合同(2篇)
- 小学六年级心理健康教学工作总结
- PEP版五年级英语上册教案Unit 1 单元教案 5
- 智能小区弱电室外管网施工方案(实用资料)
- 中医内科学 消渴课件
- 小学数学三年级上册五 四则混合运算教案
- 体检中心理论知识考核试题与答案
- 燃气安全知识与应急管理培训课件
- 国家社科基金申报经验课件
- 游标卡尺螺旋测微器读数例题
- tc官网软件资源中文产品手册
- 贺州市大岭古大理岩详查报告
- 企业经营管理尽职合规免责事项清单
评论
0/150
提交评论