nand_read_ll 分析

病了几天, 自己也偷懒了.今天继续

#define BUSY 1
inline void wait_idle(void) {
    int i;

    while(!(NFSTAT & BUSY))  ; NFSTAR只有第一位有效, 0: flash busy   1: ready to use  &:位与

//  回忆一下while的用法, 很久没用忘了.while(1),则执行下面的语句, 并回到while语句继续判断;  while(0),退出循环

// 所以, nfstat=busy的时候不断循环,直到 nfstat=ready to use
      for(i=0; i<10; i++);
}

#define NAND_SECTOR_SIZE 512  //1 page = 512 bytes
#define NAND_BLOCK_MASK  (NAND_SECTOR_SIZE - 1)

/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
    int i, j;

    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { // ||: 或 ; start_addr不可以等于511; size应该能等于511吧?
        return -1; /* invalid alignment */
    }

    /* chip Enable */
    NFCONF &= ~0x800;
    for(i=0; i<10; i++);

    for(i=start_addr; i < (start_addr + size);) {
      /* READ0 */
      NFCMD = 0;

      /* Write Address */
      NFADDR = i & 0xff;
      NFADDR = (i >> 9) & 0xff;
      NFADDR = (i >> 17) & 0xff;
      NFADDR = (i >> 25) & 0xff;  //分四段写入地址

      wait_idle();

      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {  //每次读取一个页面的数据, i会最后更新为下一个页面的地址.
 *buf = (NFDATA & 0xff);    //问题: 如何能肯定start_addr就是一个页面的第一个地址呢?如果不是第一个地址,那么j<nand_sector_size 是否会出错?

 buf++;
      }
    } 

 

玩了一下三国志11, 不错. 可以给老爸试一试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值