u-boot2010.06的移植(3)——支持nand启动

本文探讨了NAND闪存启动的基本原理,并通过具体实例K9F2G08介绍了地址周期及其应用。同时,文章深入分析了启动过程中遇到的问题及解决方案,包括内存读取方法的正确实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么要支持nand启动?这是面试的时候问的一个问题,结果我说是就是多一种支持,事后想想回答的太笨了啊,最起码也得回答个nand便宜啊,至于从sd卡驱动,以后再说。。

nand启动原理很简单,就是用nand的读方法从当前地址拷贝到链接地址,其中的难点是写地址。

以K9F2G08 (256M*8bit) 为例,其地址周期如下图:

其中列地址A0-A10也称为页内地址;行地址A12-A28也成为页号,即页的号码,第五周期的A28也成为块号。而A11是给OOB用的对OOB没有研究,先略过。。。

所以对于向页内的某个地址读写,其实际的地址排布是A28、A27、A26、... ...A13、A12、A10、A9、A8、... ...A2、A1、A0 (没有A11)。
    
另一个难点(也说不上难点,我掌握的不好而已)是关于内存的步长。开始我是这么写的:

        #define NFDATA (*((volatile unsigned long *)0x4E000010))
        。。。。。。
       
 static unsigned long nand_read_data(void)

   {
            return NFDATA;
        }
        。。。。。。
        static void nand_read_to_buf(unsigned char *buf, unsigned long addr, unsigned long count)
       {
             volatile int i = 0;
             unsigned long col = addr & 0x7ff;
  
             nand_select();
             while (i < count)
             {
 
                 nand_write_cmmd(0x00);
                 nand_write_addr(addr);
                 nand_write_cmmd(0x30);
                 nand_wait_ready();
                 for (; (col < 2048) && (i < count); i++, addr++, col++)
                 {
                     buf[i] = nand_read_data();
                 }
                 col = 0;
             }
             nand_deselect();
       }

    但是启动不起来,原因是nand_read_to_buf()的第一个参数buf是char *类型的,而nand_read_data()的返回值类型是unsigned long,肯定不对了,所以应该把nand_read_data()的返回值类型改为unsigned char,#define NFDATA (*((volatile unsigned char*)0x4E000010))
另一种改法就是步长为四字节的处理,但这样的话要求判断是否对齐,而且大小端的问题也要注意到,等系统学习完一遍了在研究。

<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(150) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值