基于cortex-a8nandflash的设计与现实本科论文(编辑修改稿)内容摘要:

FFFF 128MB SROM Bank 0 0x9800_0000 0x9FFF_FFFF 128MB SROM Bank 0 0xA000_0000 0xA7FF_FFFF 128MB SROM Bank 0 0xAB00_0000 0xAFFF_FFFF 128MB SROM Bank 0 0xC000_0000 0xCFFF_FFFF 256MB MP3_SRAM output 0xD000_0000 0xD000_FFFF 64KB IROM 0xD001_0000 0xD001_FFFF 64KB Reserved 0xD002_0000 0xD003_7FFF 96KB IRAM 0xDB00_0000 0xDFFF_FFFF 512MB DMZ ROM (二) 完整的启动序列 系统刚启动时,会运行 IROM 中的固化代码,进行一些通用的初始化,具体步骤包括: 第一步 关闭看门狗; 第二步 初始化 icache; 第三步 初始化堆栈; 第四步 设置时钟; 第五步 判断启动设备 (nand/sd/onenand 等 ),检查校验和,然后从启动设备中拷贝前 16K 的 代码到 IRAM 的 0xD0020xx0 处; 第六步 若是安全模式启动,则进行完整性检查; 第七步 跳转到 IRAM 的 0xD0020xx0 地址上继续运行; (三) 使用 MiniTools 烧写裸机程序 用裸机程序烧写到 sd卡上,然后通过 sd启动来运行我们的程序,这样做缺点太多。 MiniTools 是一个烧写下载工具,其简要特性如下: 中国传媒大学南广学院本科毕业论文 7 1) 无需串口连接 : MiniTools 完全采用 USB 线传输数据,无需串口,连接更简单,桌面更整洁。 2) 真正一键烧写: MiniTools 真正实现一键烧写,烧写文件可单选,也 可全选,不仅可以烧写系统 (android, linux, wince),还是烧写裸机,下载和烧写一气呵成。 3) 快速启动 : 以前的烧写方式需要不断来回插拔 sd 卡,这样不但容易损坏卡座,而且效率低下;现在使用 MiniTools,所有操作均在 PC上完成,无需拔卡,无需接触开发板,立马查看到程序的运行效果,可以令开发更加快速方便。 4) 集成串口助手 :借鉴了国内其他类似串口软件功能,更加方便实用,比如可自动定时发送任何数据或文件等。 5) 支持 32/64bit电脑: MiniTools安装程序已经包含 32/64bit电脑所需的 USB下载驱动,可通吃所有 Windows 平台,如 WinXP, Win7 等;底层驱动采用 Google 官方提供的 Fastboot,因此更加稳定可靠,不会蓝屏。 6) 跨平台:采用 Qt4 开发,可以支持各种 Windows 系统或 Linux 发行版。 烧写有两种方式:第一种方式下载到 DRAM,第二种方式下载到 NAND FLASH, 方式一 下载到 DRAM,其设置方式如图 5: 图 5 平台工具 先选中上方的 ” Download and run“,设置好下载地址,并且需要将地址发送给cpu“ RAMAddress(Download/Loading)”,选择要运行的裸机程序, 再点击“下载运行”就可以了。 MiniTools 首先会把裸机程序下载到 DRAM 的地址 0x20xx0000 处,然后跳中国传媒大学南广学院本科毕业论文 8 转到该地址上运行裸机程序,所以只要 PC 上一点击“下载运行”就可以马上看到开发板上裸机程序的运行效果了。 对于 Mini210S 开发板, MiniTools 支持的裸机程序下载地址是 :0x20xx0000~0x3F5FFFFF(共 502M) ,剩下的 0x3F600000~0x3FFFFFFF 的 10M空间用来运行 Superboot, 502M 的空间足够让我们运行任何裸机程序了。 注意:不同的 CPU 会有不同的起始地址,在此为 0x20xx0000。 第二种方式是下载到 NAND FLASH,其设置方式如下图 6: 图 6 平台工具 选中“ Install to NAND Flash”,设置好加载地址“ RAM Address”,选择使用 Superboot加载裸机程序,并选择要加载的裸机程序,点击“开始烧写”; MiniTools首先把Superboot和裸机程序都烧写到 NAND FLASH中,然后点击“快速启动”,这时 NAND FLASH中的 Superboot会把裸机程序拷贝到 DRAM的 0x20xx0000地址处,然后跳转到该地址上运行裸机程序,这样我们就可以在开发板上观察裸机的运行效果了。 上面两种方式都可以烧写运行我们的裸机程序,由于方式一较为便捷,并且不会损坏 NAND Flash中的原有数据,本设计所涉及的所有的程序都统一采用了第一种方式进行烧写和运行。 四、 NAND FLASH 驱动的具体的实现 (一) NAND FLASH 坏块的处理 中国传媒大学南广学院本科毕业论文 9 NAND FLASH 的固有原因 ,坏块不可避免 ,所以我们的驱动必须具有坏块管理功能 ,坏块又分为出厂坏块和 使用中产生的坏块 ,NAND FLASH 一般出厂时会有坏块,生产厂商会标记出出厂坏块 ,对应的标记位在初始化的过程中会被读出来 ,不同厂商的坏块标记也不都相同 ,为了考虑兼容性 ,我们的驱动必须考虑常用的所有情况 ,如果是坏块就会记录下来 ,以后的使用中不再使用这个坏块。 当我们在日常正常操作过程中 ,出现三次失败对一个坏块的操作 ,我们就认为这个块坏了 ,这就是使用中坏块 ,将这个块标记为坏块 ,并从预留的块中找一块来替换它 ,预留块是事先预留用来进行坏块替换的块 ,预留块不直接参加读写 ,所以预留块的大小不计算在整个 NAND FLASH 可以使用的存储空间中 ,这样设计的原因是避免了因为坏块的出现而造成的存储容量的不断减小 ,对于用户来说更容易接受 ,预留块的多少可以在驱动中根据需求来调整。 在我们的设计中 ,我们预留 Flash 芯片容量, 10%的容量大小的块来作为坏块替换预留块。 对于 MLC规格的 NAND FLASH芯片 ,读操作也可能给块中的数据带来不确定性 ,这种干扰称作读操作带来的干扰 ,为了避免这种干扰 ,我们会根据芯片说明书中建议的读次数 ,当一个块的读次数达到了建议值 ,我们会将该块的内容擦除掉再重新写回,所以在驱动中我们也必须保留每个块的读次数。 (二) 相关程序代码分析 代码中 NAND Flash 初始化函数 nand_init(),代码如下 void nand_init(void) { //1. 配置 NAND Flash NFCONF =(TACLS12)|(TWRPH08)|(TWRPH14)|(03)|(02)|(11)|(00)。 NFCONT =(018)|(017)|(016)|(010)|(09)|(08)|(07)|(06)|(0x31)|(10)。 // 2. 配置引脚 MP0_1CON = 0x22333322。 MP0_2CON = 0x00002222。 MP0_3CON = 0x22222222。 // 3. 复位 nand_reset()。 } 共 3 个步骤: 第一步 配置 NAND FLASH,主要是设置 NFCONF 和 NFCONT 两个寄存器。 第二步 配置引脚,用于 NAND Flash 相关功能; 第三步 复位 ;复位代码如下: 中国传媒大学南广学院本科毕业论文 10 static void nand_reset(void) { nand_select_chip()。 nand_send_cmd(NAND_CMD_RES)。 nand_wait_idle()。 nand_deselect_chip()。 } NAND Flash 的复位操作共 4 个步骤: ( 1) 发片选,实质就是 NFCONT amp。 = ~(11)。 往 NFCONT 的 bit[1]写 0; ( 2) 发命令复位命令 NAND_CMD_RES (0xff)。 实质就是 NFCMMD = cmd。 将命令写到NFCMMD 寄存器; (3) 等待 NAND Flash 就绪;实质就是 while( !(NFSTAT amp。 (BUSY4)) ),读 NFSTAT的 bit[4]检查 NAND Flash 是否就绪; (4) 取消片选,实质就是 NFCONT |= (11)。 往 NFCONT 的 bit[1]写 1; Flash 读 ID 函数 nand_read_id(),核心代码如下 void nand_read_id(void) { nand_id_info nand_id。 // 1. 发片选 nand_select_chip()。 // 2. 读 ID nand_send_cmd(NAND_CMD_READ_ID)。 nand_send_addr(0x00)。 nand_wait_idle()。 = nand_read()。 = nand_read()。 = nand_read()。 = nand_read()。 = nand_read()。 printf(NDFH:mcode=%x,devicecode=%x\r\n,)。 nand_deselect_chip()。 } 中国传媒大学南广学院本科毕业论文 11 Device DeviceCode(2nd Cycle) 3rd Cycle 4th Cycle 5th Cycle K9K8G08U0A D3h 51h 95h 58h K9WAG08U1A Same as K9K8G08U0A in it K9NBG08U5A 图 7 NAND Flash 读 ID操作 根据上图 7, NAND Flash 的读 ID 操作共 5 个步骤: 第一步 发片选; 第二步 发 读 ID 命令 NAND_CMD_READ_ID(0x90); 第三步 发地址 0x00;调用函数 nand_send_addr(); 第四步 等待 NAND Flash 就绪; 第五步 读 ID;调用了 nand_read()函数,实质就是读 NFDATA 寄存器; 下面是 nand_send_addr()的代码: { // 列地址,即页内地址 col = addr % NAND_PAGE_SIZE。 // 行地址,即页地址 row = addr / NAND_PAGE_SIZE。 // Column Address A0~A7 NFADDR = col amp。 0xff。 for(i=0。 i10。 i++)。 // Column Address A8~A11 NFADDR = (col 8) amp。 0x0f。 for(i=0。 i10。 i++)。 // Row Address A12~A19 NFADDR = row amp。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。