arm地址空间分配与启动时地址的映射.doc

上传人:11****ws 文档编号:3009078 上传时间:2019-05-17 格式:DOC 页数:29 大小:125.50KB
下载 相关 举报
arm地址空间分配与启动时地址的映射.doc_第1页
第1页 / 共29页
arm地址空间分配与启动时地址的映射.doc_第2页
第2页 / 共29页
arm地址空间分配与启动时地址的映射.doc_第3页
第3页 / 共29页
arm地址空间分配与启动时地址的映射.doc_第4页
第4页 / 共29页
arm地址空间分配与启动时地址的映射.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

1、s3c2440 地址空间的分配 s3c2440 启动过程详解 一:地址空间的分配 1:s3c2440 是 32位的 ,所以可以寻址 4GB 空间, 内存( SDRAM) 和 端口(特殊寄存器) ,还有 ROM 都映射到同一个 4G空间里 . 2:开发板上一般都用 SDRAM做内存 flash( nor、 nand)来当做 ROM。其中 nand flash没有地址线,一次至少要读一页 (512B).其他两个有地址线 3:norflash 不用来运行代码,只用来存储代码, NORflash, SDRAM 可以直接运行代码) 4:s3c2440 总共有 8个内存 banks 6 个内存 bank可

2、以当作 ROM或者 SRAM来使用 留下的 2个 bank 除了当作 ROM 或者 SRAM,还可以用 SDRAM(各种内存的读写方式不一样 ) 7个 bank 的起始地址是固定的 还有一个灵活的 bank 的内存地址,并且 bank 大小也可以改变 5:s3c2440 支持两种启动模式 : NAND 和非 NAND(这里是 nor flash)。 具体采用的方式取决于 OM0、 OM1两个引脚 OM1:0所决定的启动方式 OM1: 0=00时,处理器从 NAND Flash启动 OM1: 0=01时,处理器从 16位宽度的 ROM启动 OM1: 0=10时,处理器从 32位宽度的 ROM启动

3、。 OM1: 0=11时,处理器从 Test Mode启动。 当从 NAND 启动时 cpu 会自动从 NAND flash 中读取前 4KB的数据放置在片内 SRAM里( s3c2440 是soc),同时把这段片内 SRAM 映射到 nGCS0 片选的空间(即 0x00000000)。 cpu是从 0x00000000开始执 行,也就是 NAND flash里的前 4KB内容。因为 NAND FLASH连地址线都没有,不能直接把 NAND 映射到 0x00000000,只好使用片内 SRAM 做一个载体。 通过这个载体把 nandflash 中大代码复制到 RAM(一般是 SDRAM)中去执

4、行 当从非 NAND flash 启动时 nor flash 被映射到 0x00000000 地址(就是 nGCS0,这里就不需要片内 SRAM 来辅助了,所以片内 SRAM 的起始地址还是 0x40000000) . 然后 cpu从 0x00000000开始执行(也就是在 Norfalsh 中执行 )。 总结: Arm 的启动都是从 0 地址开始,所不同的是地址的映射不一样。在 arm 开电的时候,要想让 arm 知道以某种方式(地址映射方式)运行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候 arm 会通过引脚的电平来判断。 1 当引脚 OM0 跟 OM1 有一个是高电

5、平时,这时地址 0 会映射到外部 nGCS0 片选的空间,也就是 Norflash,程序就会从 Norflash 中启动, arm 直接取 Norflash 中的指令运行。 2 当 OM0 跟 OM1 都为低电平,则 0 地址内部 bootbuf(一段 4k 的 SRAM) 开始。系统上电,arm 会自动把 NANDflash 中的前 4K 内容考到 bootbuf(也就是 0 地址),然后从 0 地址运行。 这时 NANDFlash 中的前 4K 就是启动代码(他的功能就是初始化硬件然后在把 NANDFlash中的代码复制到 RAM 中,再把相应的指针指向该运行的地方) 为什么会有这两种启动

6、方式,关键还是两种 flash 的不同特点造成, NOR FLASH 容量小,速度快,稳定性好,输入地址,然后给出读写信号即可从数据口得到数据,适合做程序存储器。 NAND FLASH 总容量大,但是读写都需要复杂的时序, 更适合做数据存储器。这种不同就造成了 NORflash 可以直接连接到 arm 的总线并且可以运行程序,而 NANDflash 必须搬移到内存( SDRAM)中运行。 在实际的开发中,一般可以把 bootloader 烧入到 Norflash,程序运行可以通过串口交互,进行一定的操作,比如下载,调试。这样就很可以很方便的调试你的一些代码。 Norflash 中的 Bootl

7、oader 还可以烧录内核到 Norflash 等等功能。 转: sdram,nand flash,nor flash,地址分配 前三篇文章里,我分析了 S3C2440 与 SDRAM,NOR FLASH,NAND FLASH 的连线。在S3C2440 开发板这个系统中,这三种存储芯片的地址是如何分配的呢? 首先看下图: 这是 S3C2440 的存储器地址分配图, SDARM 只能接在 BANK6 或 BANK7.从分析 SDRAM 接线的文章里的 SDRAM 接线图可以看 到, SDRAM 接的是 ngcs6,也就是接在 BANK6,因为选择的 SDRAM 是 2 片 32Mbyte,总容量

8、是 64Mbyte,所以 SDRAM 的地址范围是 0x3000 0000 - 0x33ff ffff。 S3C2440 的 OM0,OM1 脚决定系统启动模式: TQ2440 开发板的 NOR FLASH 是 16bit 数据位宽,选择从 NOR FLASH 启动,所以 OM0 接 VDD,OM1 接 VSS,从分析 NOR FLASH 接线的文章里的接线图可以看到, NOR FLASH 接的是 ngcs0,也就是接在 BANK0.因为选择的 NOR FLASH是 2Mbyte,所以 NOR FLASH 的地址范围是 0x0000 0000 - 0x001f ffff。上电时,程序会从 No

9、rflash 中启动, ARM 直接取 Norflash 中的指令运行。 最后来看 NAND FLASH, NAND FLASH 以页为单位读写,要先命令, 再给地址,才能读到 NAND 的数据。 NAND FLASH 是接在 NAND FLASH 控制器上而不是系统总线上,所以没有在 8 个 BANK 中分配地址。如果 S3C2440 被配置成从 Nand Flash 启动 , S3C2440 的 Nand Flash 控制器有一个特殊的功能 ,在 S3C2440上电后 ,Nand Flash 控制器会自动的把 Nand Flash 上的前 4K数据搬移到 4K内部SRAM 中 ,系统会从起

10、始地址是 0x0000 0000 的内部 SRAM 启动。程序员需要完成的工作 ,是把最核心的启动程序放在 Nand Flash 的前 4K 中 ,也就是说 ,你需要编写一个长度小于 4K 的引导程序 ,作用是将主程序拷贝到 SDRAM 中运行。 由于 Nand Flash 控制器从 Nand Flash 中搬移到内部 RAM 的代码是有限的 ,所以在启动代码的前 4K 里 ,我们必须完成 S3C2440 的核心配置以及把启动代码(U-BOOT)剩余部分搬到 RAM 中运行,至于将 2440 当做单片机玩裸跑程序的时候,就不要做这样的事情,当代码小于 4K 的时候,只要下到 nand flas

11、h 中就会被搬运到内部 RAM 中执行了。 不管是从 NOR FLASH 启动还是从 NAND FLASH 启动, ARM 都是从 0x0000 0000 地址开始执行的。 s3c2440 存储控制器和地址以及启动的理解 s3c2440 存储控制器和地址以及启动的理解 收藏 1.首先应该先了解 Flash ROM 的种类 NOR FLASH 地址线和数据线分开,来了地址和控制信号,数据就出来。 NAND Flash 地址线和数据线在一起,需要用程序来控制,才能出数据。 通俗的说,只给地址不行,要先命令,再给地址,才能读到 NAND的数据 ,在一个总线完成的。 结论是: ARM 无法从 NAND

12、直接启动。除非装载完程序,才能使用 NAND Flash. 2.Nand Flash 的命令、地址、数据都通过 I/O口发送,管脚复用,这样做做的好处是,可以明显减少 NAND FLASH 的管脚数目,将来如果设计者想将 NAND FLASH更换为更高密度、更大容量的,也不必改动电路板。在 S3C2440 中 NANDFLASH的控制依靠 NAND FLASH 控制器。不能够执行程序,本人总结其原因如下 : a. NAND FLASH 本身是连接到了控制器上而不是系统总线上。 CPU启动后是要取指令执行的,如果是 SROM、 NOR FLASH 等之类的, CPU 发个地址就可以取得指令并执

13、行, NAND FLASH 不行,因为 NAND FLASH 是管脚复用,它有自己的一套时序,这样 CPU 无法取得可以执行的代码,也就不能初始化系统了。 b. NAND FLASH 是顺序存取设备,不能够被随机访问,程序就不能够分支或跳转,这样你如何去设计程序。 3.在 2440 中为什么可以配置成从 Nand Flash 中启动程序? 如果 S3C2440 被配置成从 Nand Flash 启动 , S3C2440 的 Nand Flash 控制器有一个特殊的功能 ,在 S3C2440 上电后 ,Nand Flash 控制器会自动的把 Nand Flash 上的前 4K 数据搬移到 4K内

14、部 SRAM中 ,(此内部 RAM 被称为 Steppingstone)并把0x00000000设置内部 RAM的起始地址 ,CPU从内部 RAM的 0x00000000位置开始启动。这个过程不需要程序干涉。程序员需要完成的工作 ,是把最核心的启动程序放在 Nand Flash的前 4K中,也就是说 ,你需要编写一个长度小于 4K的引导程序 ,作用是将主程序拷贝到 SDRAM中运行 (NF地址不是线性的 ,程序不能直接运行 ,必须拷贝到线性 RAM 中? )。 4.Samsung S3C2440 支持 Nor Flash 和 Nand Flash 启动 ,在 TQ2440 上可以通过跳线设置启

15、动方式。主要由 OM1:0这两位来决定从何处启动。具体含义如下 : OM1:0所决定的启动方式 OM1: 0=00 时,处理器从 NAND Flash 启动 OM1: 0=01 时,处理器从 16位宽度的 ROM 启动 OM1: 0=10 时,处理器从 32位宽度的 ROM 启动。 OM1: 0=11 时,处理器从 Test Mode 启动。 Arm 的启动都是从 0地址开始,所不同的是地址的映射不一样。在 arm开电的时候,要想让 arm知道以某种方式(地址映射方式)运 行,不可能通过你写的某段程序控制,因为这时候你的程序还没启动,这时候 arm 会通过引脚的电平来判断。 a.当引脚 OM0

16、 跟 OM1 有一个是高电平时,这时地址 0会映射到外部 nGCS0片选的空间 (Bank0),也就是 Norflash,程序就会从 Norflash 中启动, arm 直接取Norflash 中的指令运行,不需要将 Norflash 中的内容拷贝到 SDRAM 中来。 b.当 OM0 跟 OM1都为低电平,则 0 地址内部 bootbuf(一段 4k的 SRAM)开始。系统上电, arm会自动把 NANDflash 中的前 4K内容拷贝到 bootbuf(也就是 0地址),然后从 0 地址运行。 这时 NANDFlash 中的前 4K 就是启动代码(他的功能就是初始化硬件然后在把NANDFl

17、ash 中的代码复制到 RAM中,再把相应的指针指向该运行的地方) 5.启动代码应该做什么? 由于 Nand Flash 控制器从 Nand Flash 中搬移到内部 RAM的代码是有限的 ,所以在启动代码的前 4K 里 ,我们必须完成 S3C2440 的核心配置以及把启动代码(U-BOOT)剩余部分搬到 RAM 中运行,至于将 2440当做单片机玩裸跑程序的时候,就不要做这样的事情,当代码小于 4K的时候,只 要下到 nand flash 中就会被搬运到内部 RAM 中执行了。 bootloader 在某种意义上来说即是一个启动代码,种类有很多( vivi uboot 等),但是功能上无非就

18、是完成一些初始化。 bootloader 是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化 CPU、堆栈、初始化存储器系统等,其功能类似于 PC机的 BIOS. 在实际的开发中,一般可以把 bootloader 烧入到 Norflash,程序运行可以通过串口交互,进行一定的操作, 比如下载,调试。这样就很可以很方便的调试你的一些代码。 Norflash 中的 Bootloader 还可以烧录内核到 Norflash 等等功能。 6.存储控制器的作用 在 2440 中分了 8个 bank,每个 bank 的基地址由 nCG

19、Sx 来选择,每个 bank 都接外设之后,就可以通过存储控制器来进行地址上的选择了。每个 bank 与外设的连接方式不一样,主要看外设是每次进行多少位的数据传输,如果是 8位,这样CPU 的地址线 A0就可以直接接外设的 A0,如果是 16位,那么 CPU 的 A1就该接到外设的 A0,一次类推往后移位,具体原因见错位 原因。 nor flash 接在 bank0,数据线为 16 位。存储控制器的特性如下: 1. 大小端设置 ; 2. 地址空间 :每个 bank为 128MB (总共 1GB); 3. 除了 bank0 其余所有 banks 的数据位宽是可编程的 (8/16/32-bit);

20、( bank0是 16/32 位) 4. 总共 8个 memory banks,其中 6 个 bank 是接 ROM,SRAM 等 ,其余 2个 bank 是接 ROM,SRAM,SDRAM 等 ; 5. 7 个 memory bank 的起始地址是固定的 ;(发现 size 也是固定的 ,128MB) 6. 1 个 memory bank 的起始地址和大小是可灵活可变的 ; 7. 所有 banks 的访问周期数是可编程的 ; 8. 支持片外等待信号以扩充总线周期 ; 9. SDRAM 在 Power down 模式下支持自动刷新 s3c2440 对 nandflash 的操作 (一 ) AR

21、M9 之 TQ2440 2010-08-28 11:41:18 阅读 110 评论 1 字号:大中小 订阅 nandflash 在对大容量的数据存储中发挥着重要的作用。相对于 norflash,它具有一些优势,但它的一个劣势是很容易产生坏块,因此在使用 nandflash时,往往要利用校验算法发现坏块并标注出来,以便以后不再使用该坏块。 nandflash没有地址或数据总线,如果是 8位 nandflash,那么它只有 8个 IO 口,这 8个IO 口用于传输命令、地址和数据。 nandflash 主要以 page(页)为单位进行读写,以 block(块)为单位进行擦除。每一页中又分为 mai

22、n 区和 spare 区, main区用于正常数据的存储, spare 区用于存储一些附加信息,如块好坏的标记、块的逻辑地址、页内数据的 ECC 校验和等。 三星公司是最主要的 nandflash 供应商,因 此在它所开发的各类处理器中,实现对 nandflash 的支持就不足为奇了。 s3c2440 不仅具有 nandflash的接口,而且还可以利用某些机制实现直接从 nandflash 启动并运行程序。本文只介绍如何对 nandflash 实现读、写、擦除等基本操作,不涉及 nandflash 启动程序的问题。 在这里,我们使用的 nandflash 为 K9F2G08U0A,它是 8位的

23、nandflash。不同型号的 nandflash 的操作会有所不同,但硬件引脚基本相同,这给产品的开发带来了便利。因为不同型号的 PCB 板 是一样的,只要更新一下软件就可以使用不同容量大小的 nandflash。 K9F2G08U0A 的一页为( 2K 64)字节(加号前面的 2K表示的是 main 区容量,加号后面的 64表示的是 spare 区容量),它的一块为 64页,而整个设备包括了2048 个块。这样算下来一共有 2112M 位容量,如果只算 main 区容量则有 256M字节(即 256M8 位)。要实现用 8 个 IO口来要访问这么大的容量, K9F2G08U0A规定了用 5

24、 个周期来实现。第一个周期访问的地址为 A0A7;第二个周期访问的地址为 A8A11,它作用在 IO0IO3 上,而此时 IO4IO7 必须为低电平;第三个周期访问的地址为 A12A19;第四个周期访问的地址为 A20A27;第五个周期访问的地址为 A28,它作用在 IO0上,而此时 IO1IO7 必须为低电平。前两个周期传输的是列地址,后三个周期传输的是行地址。通过分析可知,列地址是用于寻址页内空间,行地址用于寻址页,如果要直接访问块,则需要从地址 A18开始。 由于所有的命令、地址和数据全部从 8位 IO 口传输,所以nandflash 定义了一个命令集来完成各种操作。有的操作只需要一个命

25、令(即一个周 期)即可,而有的操作则需要两个命令(即两个周期)来实现。下面的宏定义为 K9F2G08U0A 的常用命令: #define CMD_READ1 0x00 /页读命令周期 1 #define CMD_READ2 0x30 /页读命令周期 2 #define CMD_READID 0x90 /读 ID 命令 #define CMD_WRITE1 0x80 /页写命令周期 1 #define CMD_WRITE2 0x10 /页写命令周期 2 #define CMD_ERASE1 0x60 /块擦除命令周期 1 #define CMD_ERASE2 0xd0 /块擦除命令周期 2 #d

26、efine CMD_STATUS 0x70 /读状态命令 #define CMD_RESET 0xff /复位 #define CMD_RANDOMREAD1 0x05 /随意读命令周期 1 #define CMD_RANDOMREAD2 0xE0 /随意读命令周期 2 #define CMD_RANDOMWRITE 0x85 /随意写命令 在这里,随意 读命令和随意写命令可以实现在一页内任意地址地读写。读状态命令可以实现读取设备内的状态寄存器,通过该命令可以获知写操作或擦除操作是否完成(判断第 6 位),以及是否成功完成(判断第 0位)。 下面介绍 s3c2440 的 nandflash 控

27、制器。 s3c2440 支持 8位或 16位的每页大小为 256 字, 512 字节, 1K字和 2K字节的 nandflash,这些配置是通过系统上电后相应引脚的高低电平来实现的。 s3c2440 还可以硬件产生 ECC 校验码,这为准确及时发现 nandflash 的坏块带来了方便。 nandflash 控制器的主要寄存器有 NFCONF( nandflash 配置寄存器), NFCONT( nandflash 控制寄存器),NFCMMD( nandflash 命令集寄存器), NFADDR( nandflash 地址集寄存器), NFDATA( nandflash 数据寄存器), NFM

28、ECCD0/1( nandflash 的 main 区 ECC 寄存器),NFSECCD( nandflash 的 spare 区 ECC 寄存器), NFSTAT( nandflash 操作状态寄存器), NFESTAT0/1( nandflash 的 ECC状态寄存器), NFMECC0/1( nandflash用于数据的 ECC寄存器),以及 NFSECC( nandflash 用于 IO的 ECC 寄存器)。 NFCMMD, NFADDR 和 NFDATA分别用于传输命令,地址和数据,为了方便起见,我们可以定义一些宏定义用于完成上述操作: #define NF_CMD(data) rN

29、FCMD = (data); /传输命令 #define NF_ADDR(addr) rNFADDR = (addr); /传输地址 #define NF_RDDATA() (rNFDATA) /读 32位数据 #define NF_RDDATA8() (rNFDATA8) /读 8 位数据 #define NF_WRDATA(data) rNFDATA = (data); /写 32位数据 #define NF_WRDATA8(data) rNFDATA8 = (data); /写 8 位数据 其中 rNFDATA8 的定义为 (*(volatile unsigned char *)0x4E

30、000010) /0x4E000010此地址是 NFDATA寄存器的地址 NFCONF 主要用到了 TACLS、 TWRPH0、 TWRPH1,这三个变量用于配置 nandflash的时序。 s3c2440的数据手册没有详细说明这三个变量的具体含义,但通过它所给出的时序图,我们可以看出, TACLS为 CLE/ALE 有效到 nWE有效之间的持续时间, TWRPH0 为 nWE的有效持续时间, TWRPH1 为 nWE无效到 CLE/ALE无效之间的持续时间,这些时间都是以 HCLK 为单位的(本文程序中的HCLK=100MHz)。通过查阅 K9F2G08U0A 的数据手册,我们可以找到并计算

31、该nandflash 与 s3c2440 相对应的时序: K9F2G08U0A 中的 tWP 与 TWRPH0 相对应,tCLH 与 TWRPH1 相对应,( tCLS tWP)与 TACLS相对应。 K9F2G08U0A 给出的都是最小时间, s3c2440 只要 满足它的最小时间即可,因此 TACLS、 TWRPH0、 TWRPH1这三个变量取值大一些会更保险。在这里,这三个值分别取 1, 2和 0。 NFCONF的第 0位表示的是外接的 nandflash 是 8位 IO还是 16位 IO,这里当然要选择 8位的 IO。 NFCONT 寄存器是另一个需要事先初始化的寄存器。它的第 13位

32、和第12 位用于锁定配置,第 8位到第 10 位用于 nandflash 的中断,第 4位到第 6位用于 ECC 的配置,第 1位用于 nandflash 芯片的选取,第 0位用于 nandflash控制器的使能。另外,为了初始化 nandflash,还需要配置 GPACON 寄存器,使它的第 17位到第 22 位与 nandflash 芯片的控制引脚相对应。下面的程序实现了初始化 nandflash 控制器: void NF_Init ( void ) rGPACON = (rGPACON /配置芯片引脚 /TACLS=1、 TWRPH0=2、 TWRPH1=0, 8位 IO rNFCONF

33、 = (TACLS12)|(TWRPH08)|(TWRPH14)|(00); /非锁定,屏蔽 nandflash 中断,初始化 ECC 及锁定 main 区和 spare 区 ECC,使能 nandflash 片选及控制器 rNFCONT = (013)|(012)|(010)|(09)|(08)|(16)|(15)|(14)|(11)|(10); 为了更好地应用 ECC 和使能 nandflash 片选,我们还需要一些宏定义: #define NF_nFCE_L() rNFCONT #define NF_CE_L() NF_nFCE_L() /打开 nandflash 片选 #define NF_nFCE_H() rNFCONT |= (11); #define NF_CE_H() NF_nFCE_H() /关闭nandflash 片选 #define NF_RSTECC() rNFCONT |= (14); /复位 ECC #define NF_MECC_UnLock() rNFCONT /解锁 main 区 ECC #define NF_MECC_Lock() rNFCONT |= (15); /锁定 main 区 ECC

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 医药卫生

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。