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

为什么要支持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) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值