使用默认的驱动两种型号都是可以启动的 但是U0E的使用mtd utils工具无法正常写入 看到网上有一些文章进行了分析主要原因如下
U0E的nop最大值是1
U0D的Nop最大值是4
按照我的理解就是在program/erase时只能对第一页进行一次操作
在u-boot中nandflash main area和spare area都是在write_page函数里完成 没有单独执行write_oob
而在文件系统读写时首先写了一次oob然后才执行的write_page第一次写的oob应该是yaffs相关的数据 这里就进行了两次操作就是说 导致通过nandwrite工具写稿的yaffs2文件无法挂载 解决办法就是将yaffs相关数据就第一次写的数据与第二次写的数据合并后一次性写入.
因为U0E读ID时第5个字节是0x55而U0B是0x54所以通过这个判断进行区分
include/linux/mtd/nand.h中修改struct nand_chip结构
加上nopone
uint8_t *bbt;
struct nand_bbt_descr *bbt_td;
struct nand_bbt_descr *bbt_md;
struct nand_bbt_descr *badblock_pattern;
void *priv;
int nopone;//add by hclydao 20150714 for U0E
drivers/mtd/nand/s3c_nand.c s3c_nand_probe函数修改如下
增加初始化
for (i = 0; i < plat_info->chip_nr; i++) {
nand->IO_ADDR_R = (char *)(s3c_nand.regs + S3C_NFDATA);
nand->IO_ADDR_W = (char *)(s3c_nand.regs + S3C_NFDATA);
nand->cmd_ctrl = s3c_nand_hwcontrol;
nand->dev_ready = s3c_nand_device_ready;
nand->scan_bbt = s3c_nand_scan_bbt;
nand->options = 0;
nand->nopone = 0;//add by hclydao 20150714 for U0E
增加如下判断
tmp = readb(nand->IO_ADDR_R); /* Maf. ID */
maf_id = tmp;
tmp = readb(nand->IO_ADDR_R); /* Device ID */
for (j = 0; nand_flash_ids[j].name != NULL; j++) {
if (tmp == nand_flash_ids[j].id) {
type = &nand_flash_ids[j];
break;
}
}
if (!type) {
printk(KERN_ERR "Unknown NAND Device.\n");
goto exit_error;
}
nand->cellinfo = readb(nand->IO_ADDR_R); /* the 3rd byte */
tmp = readb(nand->IO_ADDR_R); /* the 4th byte */
if((maf_id == NAND_MFR_SAMSUNG) && (readb(nand->IO_ADDR_R) & 0x1))//add by hclydao 20150514 for U0E
nand->nopone = 1;
drivers/mtd/nand/nand_base.c中
nand_do_write_oob函数部分修改如下
memset(chip->oob_poi, 0xff, mtd->oobsize);
nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops);
if(!chip->nopone) { //modify by hclydao 20150714 for U0E
status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);
memset(chip->oob_poi, 0xff, mtd->oobsize);
} else {
status = 0;
}
条件满足时不写oob同时保存oob_poi中的数据
nand_do_write_ops函数部分修改如下
/* If we're not given explicit OOB data, let it be 0xFF */
if(!chip->nopone) { //modify by hclydao 20150714 for U0E
if (likely(!oob))
memset(chip->oob_poi, 0xff, mtd->oobsize);
}
保证oob_poi中的数据不被清除
重新下载最 调用nandwrite写入yaffs2格式文件后能正常挂载.