由于地址只能在I/O[7:0]上传递 , 因此 , 必须采用移位的方式进行 。例如 , 对于512Mbit x8的NAND flash , 地址范围是0~0x3FF_FFFF , 只要是这个范围内的数值表示的地址都是有效的 。
以NAND_ADDR 为例: 第1 步是传递column address , 就是NAND_ADDR[7:0] , 不需移位即可传递到I/O[7:0]上 , 而halfpage pointer即A8 是由操作指令决定的 , 即指令决定在哪个halfpage 上进行读 写 , 而真正的A8 的值是不需程序员关心的 。第2 步就是将NAND_ADDR 右移9位 , 将NAND_ADDR[16:9]传到I/O[7:0]上; 第3 步将NAND_ADDR[24:17]放到I/O上; 第4步需要将NAND_ADDR[25]放到I/O上; 因此 , 整个地址传递过程需要4 步才能完成 , 即4-step addressing 。
如果NAND Flash 的容量是32MB(256Mbit)以下 , 那么 , block adress最高位只到bit24 , 因此寻址只需要3步 。下面 , 就x16 的NAND flash 器件稍微进行一下说明 。
由于一个page 的main area 的容量为256word , 仍相当于512byte 。但是 , 这个时候没有所谓的1st halfpage 和2nd halfpage 之分了 , 所以 , bit8就变得没有意义了 , 也就是这个时候 A8 完全不用管 , 地址传递仍然和x8 器件相同 。
除了 , 这一点之外 , x16 的NAND使用方法和 x8 的使用方法完全相同 。三、NAND flash驱动解读 以前由于做移植多一些 , 那些工作很简单(现在看来) , 从来都不用去关心驱动里面到底怎么实现的 , 这几次面试才发现真的是学的太浅了 , 似乎我还在学习仰泳而那些牛人基本都属于潜水级的了 , 潜的不知有多深 。
我对照着开发板所带的NAND flash驱动和k9f1208的芯片资料把这些代码通读了一遍 , 终于明白了NAND flash的读写过程是如何实现的了 。我所参考的驱动是mizi公司为三星芯片所写的 , 我看看了 , 大概和官方2.4.18内核的nand.c差不多 。
在s3c2410处理器中有专门的NAND flash控制器 , 他们位于SFR区 , 具体可以参看s3c2410用户手册 。以下的这些代码均可以在vivi或者kernel里面找到 , 文中会标明程序出自何处 。
在vivi中 , 有关 。
3.nandflash什么刷写step1:由于按键组合为更新模式 , 首先挂载SD卡
step2:在卡里搜索文件u-boot-aml-ucl.bin是否存在 , 如果存在 , 进入step3 , 否则进入step6
step3: 擦写(scrub)整个flash(nand_erase_nand()函数) , 包括OOB区 , 也就是有可能把本来保存在flash里的厂商提供的坏块标志刷掉 。擦写的过程中 , 如果发现擦写失败(失败检测标志推断为判>;断erase fail的管脚 , 这里需确认) , 那么就运行aml_nand_block_markbad() , 把坏快标志写到数据结构体aml_chip->block_status里 。这个结构体为内核申请的一块非易失性空间(可能为sram , 也可>;能是flash里的第一个扇区 , 要确认) 。
【nand格式怎么写】step4:把u-boot-aml-ucl.bin刷写到flash里 , 并且把启动配置(env)也写到flash里
step5: 软复位系统 , 重启
step6: 跑flash里的uboot程序
step7:在卡里寻找uImage_recovery , 进入kernel恢复模式
step8: kernel恢复模式会根据卡里的更新脚本(factory_update_param.aml )或根据手动操作重新刷写系统等操作
由上可知 , 该系统方案的nand flash的坏块管理是用非易失性内存数据结构保留坏块信息的方式 。当更新系统时 , 如果需要更新uboot程序 , 则会进行flash的全面擦写及坏块表的全面更新 , 如果不需要更新
- 中班下学期计划怎么写
- 向公司申请空调怎么写
- 公司空调申请怎么写
- 新朋友的英文怎么写
- 自己的qq邮箱怎么写
- 方案分析报告怎么写
- 假设和依赖怎么写
- 房地产晋升经理怎么写
- 太阳能路灯申请怎么写
- 客房主管考核评语怎么写