linux完整备份nand,arm-linux东东之nand之4:nand_command

090325154622.jpg

看到没有如果是A区开始It depends on how many data are inputted也就是可以超界.谁叫我是A区呢.从图可以看到只要下面还有区就可以超过.

chip->cmd_ctrl(mtd, readcmd, ctrl);

ctrl &= ~NAND_CTRL_CHANGE;

这两句就是发送命令选择区了.ctrl就更改了值.表示chage.关于怎么样发送.后面说.

ctrl = NAND_CTRL_ALE | NAND_CTRL_CHANGE;

/* Serially input address */

if (column != -1) {

/* Adjust columns for 16 bit buswidth */

if (chip->options & NAND_BUSWIDTH_16)

column >>= 1;

chip->cmd_ctrl(mtd, column, ctrl);

ctrl &= ~NAND_CTRL_CHANGE;

}

if (page_addr != -1) {

chip->cmd_ctrl(mtd, page_addr, ctrl);

ctrl &= ~NAND_CTRL_CHANGE;

chip->cmd_ctrl(mtd, page_addr >> 8, ctrl);

/* One more address cycle for devices > 32MiB */

if (chip->chipsize > (32 << 20))

chip->cmd_ctrl(mtd, page_addr >> 16, ctrl);

}

接下来就要发送地址了. NAND_CTRL_ALE就表示地址.column为-1就表示没有地址.这里很好理解了.来看一下这个:

/* One more address cycle for devices > 32MiB */

if (chip->chipsize > (32 << 20))

chip->cmd_ctrl(mtd, page_addr >> 16, ctrl);

如果NAND的容量超过了32M才会有第三个页地址.

…………………….

chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);

/*

* program and erase have their own busy handlers

* status and sequential in needs no delay

*/

switch (command) {

case NAND_CMD_PAGEPROG:

case NAND_CMD_ERASE1:

case NAND_CMD_ERASE2:

case NAND_CMD_SEQIN:

case NAND_CMD_STATUS:

return;

case NAND_CMD_RESET:

if (chip->dev_ready)

break;

udelay(chip->chip_delay);

chip->cmd_ctrl(mtd, NAND_CMD_STATUS,

NAND_CTRL_CLE | NAND_CTRL_CHANGE);

chip->cmd_ctrl(mtd,

NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);

while (!(chip->read_byte(mtd) & NAND_STATUS_READY)) ;

return;

/* This applies to read commands */

default:

/*

* If we don't have access to the busy pin, we apply the given

* command delay

*/

if (!chip->dev_ready) {

udelay(chip->chip_delay);

return;

}

}

/* Apply this short delay always to ensure that we do wait tWB in

* any case on any machine. */

ndelay(100);

nand_wait_ready(mtd);

}

.结合NAND的命令图这一段看懂应该没有问题

拿chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);这个命令来说:090325154742.jpg

ECH就是厂商ID,Device Code就设备ID.这是三星的NAND

nand_command就这样完了.完了.

还有一个就是: chip->cmd_ctrl

对于S3C2440来说就是:

static void s3c2440_nand_hwcontrol(struct mtd_info *mtd, int cmd,

unsigned int ctrl)

{

struct s3c2410_nand_info *info = s3c2410_nand_mtd_toinfo(mtd);

if (cmd == NAND_CMD_NONE)

return;

if (ctrl & NAND_CLE)

writeb(cmd, info->regs + S3C2440_NFCMD);

else

writeb(cmd, info->regs + S3C2440_NFADDR);

}

NFCMD就是命令寄存器.NFADDR就是地址寄存器.

#define NAND_CLE0x02

/* Select the address latch by setting ALE to high */

#define NAND_ALE0x04

#define NAND_CTRL_CLE(NAND_NCE | NAND_CLE)

#define NAND_CTRL_ALE(NAND_NCE | NAND_ALE)

NAND_CTRL_CLE就是NAND_CLE |NAND_NCE

返回了.真的完了.回来再看nand_get_flash_type

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值