UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Observer sonnart
Observer
509 次查看
注册日期: ‎09-05-2018

Zynq 7000 NAND FLASH 读取OOB的问题

平台:ZYNQ 7000 

软件:vivado 2017.2 

SDK:2017.1

NAND FLASH:AMD/Spansion S34ML01G1

NAND FLASH具体信息如下:

Zynq> nand info

Device 0: nand0, sector size 128 KiB
Page size 2048 b
OOB size 64 b
Erase size 131072 b
subpagesize 2048 b
options 0x 1000
bbt options 0x 28000

在U-BOOT erase或者初始化的时候都会读取OOB,在U-BOOT中定义的读取OOB的命令为0x50

#define NAND_CMD_READOOB 0x50
读取OOB的函数代码如下:
static int zynq_nand_read_oob(struct mtd_info *mtd, struct nand_chip *chip,
int page)
{
unsigned long data_phase_addr = 0;
int data_width = 4;
u8 *p;
 
chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
 
p = chip->oob_poi;
chip->read_buf(mtd, p, (mtd->oobsize - data_width));
p += mtd->oobsize - data_width;
 
data_phase_addr = (unsigned long)chip->IO_ADDR_R;
data_phase_addr |= ZYNQ_NAND_CLEAR_CS;
chip->IO_ADDR_R = (void __iomem *)data_phase_addr;
 
chip->read_buf(mtd, p, data_width);
 
 
return 0;
}

但是在NAND FLASH(S34ML01G1)的数据手册中,并没有定义这个命令(0x50)

ZYNQ 7000手册中,是支持S34ML01G1的。

 

问题:U-BOOT在读取OOB的时候会卡住,U-BOOT该怎么处理这个问题。

谢了先

 

 

0 项奖励
5 条回复5
Xilinx Employee
Xilinx Employee
447 次查看
注册日期: ‎05-11-2010

回复: Zynq 7000 NAND FLASH 读取OOB的问题

0x50这个命令只存在于一些比较老的page size小于512的nand flash器件。在zynq_nand_cmd_function()中你可以看到这个命令被替换了。

/* Emulate NAND_CMD_READOOB for large page device */
	if ((mtd->writesize > ZYNQ_NAND_ECC_SIZE) &&
	    (command == NAND_CMD_READOOB)) {
		column += mtd->writesize;
		command = NAND_CMD_READ0;
	}

 

0 项奖励
Observer sonnart
Observer
405 次查看
注册日期: ‎09-05-2018

回复: Zynq 7000 NAND FLASH 读取OOB的问题

非常感谢热心的回复。

看了下u-boot的代码,zynq_nand_cmd_function函数缺省对命令进行了转换。

测量了下R/B管脚的信号:

1、测试代码循环读取芯片ID(NAND_CMD_READID 0x90),R/B管脚有200ns的低电平,随后跳转到高电平,符    号NAND FLASH的DATASHEET描述,读取操作R/B时,管脚为低电平,即BUSY状态,读完后,为高电平,即      IDLE状态

2、测试代码循环读取OOB命令(NAND_CMD_READOOB,0x50),R/B管脚一直处于低电平状态,即BUSY状态

 

请问有可能是硬件问题吗?

 

 

0 项奖励
Xilinx Employee
Xilinx Employee
376 次查看
注册日期: ‎05-11-2010

回复: Zynq 7000 NAND FLASH 读取OOB的问题

UG933里面关于nand的PCB guideline不多,但是也要按照里面的要求来。R/B管脚需要外部上拉。如果你有SnowLeo 7010板子的原理图,可以参考里面的nand flash。

你可以用nand standalone example测试一下,\SDK\2018.3\data\embeddedsw\XilinxProcessorIPLib\drivers\nandps_v2_4\examples

vivado工程里nand参数设置需要根据nand flash data sheet里的参数计算得到。附件是一个例子。

0 项奖励
Observer sonnart
Observer
339 次查看
注册日期: ‎09-05-2018

回复: Zynq 7000 NAND FLASH 读取OOB的问题

standalone模式稍后会测试。

另外一个疑问,zynq_nand_device_ready函数:

static int zynq_nand_device_ready(struct mtd_info *mtd)
{
 
   u32 csr_val;
 
   csr_val = readl(&zynq_nand_smc_base->csr);
 
  /* Check the raw_int_status1 bit */
  if (csr_val & ZYNQ_MEMC_SR_RAW_INT_ST1) {
  /* Clear the interrupt condition */
   writel(ZYNQ_MEMC_SR_INT_ST1, &zynq_nand_smc_base->cfr);
   return 1;
  }
  return 0;
}
 
为什么是判断E000E000寄存器的bit6,即NAND FLASH的中断状态来确定RB信号,而不是调用0x70命令,读取状态值,然后再判断状态值的第6bit的值(nand_wait_status_ready函数就是这么判断的)。
 
 

 

0 项奖励
Xilinx Employee
Xilinx Employee
320 次查看
注册日期: ‎05-11-2010

回复: Zynq 7000 NAND FLASH 读取OOB的问题

这个nand controller用的是arm的PL350控制器,附件是它的user guide。在2-22页你可以找到这些介绍。

You can poll for either a page program or page read completion in two ways:


• Poll the raw_int_status bit in the memc_status Register to determine when the
memory busy_<x> output has gone HIGH, indicating a page program completion
or read data ready.

• In a system with multiple NAND flash devices connected to the SMC. The busy
outputs are wire-ANDed to produce the single busy_<x> input to the SMC, that
only transitions HIGH when all devices have completed. You can determine the
status register of each NAND chip by reading the individual device status register.

0 项奖励