<br><font size=2 face="sans-serif">Hi,</font>
<br>
<br><font size=2 face="sans-serif">This patch is specifically for u-bootloader
to program binaries generated by mkyaffsimage, for example, as these binaries
includes the 16 bytes oob. All comments are appreciated.</font>
<br>
<br><font size=2 face="sans-serif">Typical usage will be &quot;nand write.noecc
&lt;source address&gt; &lt;Nand offset address&gt; &lt;size&gt;&quot;.</font>
<br>
<br><font size=2 face="sans-serif">Terence.</font>
<br>
<br><font size=2 face="sans-serif">diff /data/src/u-boot-1.1.4/common/cmd_nand.c
./common/cmd_nand.c</font>
<br>
<br><font size=2 face="sans-serif">8a9,12</font>
<br><font size=2 face="sans-serif">&gt; &nbsp;*</font>
<br><font size=2 face="sans-serif">&gt; &nbsp;* Added programming in both
block and spare column area</font>
<br><font size=2 face="sans-serif">&gt; &nbsp;* Specifically, it is meant
for programming binary generated by mkyaffsimage</font>
<br><font size=2 face="sans-serif">&gt; &nbsp;* (C) 2006 Applied Biosystems
Instruments &lt;terence.soh@appliedbiosystems.com&gt;</font>
<br><font size=2 face="sans-serif">70a75</font>
<br><font size=2 face="sans-serif">&gt; #define NANDRW_NOECC &nbsp; &nbsp;
&nbsp; &nbsp;0x08</font>
<br><font size=2 face="sans-serif">93a99,105</font>
<br><font size=2 face="sans-serif">&gt; static int nand_write_noecc (struct
nand_chip* nand, size_t to, size_t len,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;size_t * retlen, const u_char * buf);</font>
<br><font size=2 face="sans-serif">&gt; static int nand_read_noecc(struct
nand_chip *nand, size_t start, size_t len,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;size_t * retlen, u_char *buf);</font>
<br><font size=2 face="sans-serif">&gt; int nand_rw_noecc (struct nand_chip*
nand, int cmd,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; size_t start, size_t len,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; size_t * retlen, u_char * buf);</font>
<br><font size=2 face="sans-serif">98a111</font>
<br><font size=2 face="sans-serif">&gt; static int pages_per_block;</font>
<br><font size=2 face="sans-serif">219a233,235</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; else if (cmdtail &amp;&amp; !strncmp(cmdtail,
&quot;.noecc&quot;, 2)) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cmd |=
NANDRW_NOECC; &nbsp; &nbsp; &nbsp; &nbsp;/* read/write to OOB without
ECC */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">243,244c259,265</font>
<br><font size=2 face="sans-serif">&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; ret = nand_rw(nand_dev_desc + curr_device,
cmd, off, size,</font>
<br><font size=2 face="sans-serif">&lt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp;(size_t *)&amp;total, (u_char*)addr);</font>
<br><font size=2 face="sans-serif">---</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if(cmd &amp; NANDRW_NOECC){</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret =
nand_rw_noecc(nand_dev_desc + curr_device, cmd, off, size,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&amp;total, (u_char*)addr);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret =
nand_rw(nand_dev_desc + curr_device, cmd, off, size,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&amp;total, (u_char*)addr);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">287a309,310</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &quot;nand
read.noecc addr off size - read data without ECC&quot;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &quot;nand
write.noecc addr off size - write data without ECC&quot;</font>
<br><font size=2 face="sans-serif">447a471,528</font>
<br><font size=2 face="sans-serif">&gt; /* Dealing in (nand-&gt;oobblock
+ nand-&gt;oobsize) i.e. 528, 2112... bytes per page */</font>
<br><font size=2 face="sans-serif">&gt; int nand_rw_noecc (struct nand_chip*
nand, int cmd,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; size_t start, size_t len,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; size_t * retlen, u_char * buf)</font>
<br><font size=2 face="sans-serif">&gt; {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; int
ret = 0, n, total = 0;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; unsigned
long eblk;</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; while
(len) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (start%((nand-&gt;oobblock + nand-&gt;oobsize)*pages_per_block)
== 0) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* have
crossed into new erase block, deal with</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*
it if it is sure marked bad.</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*/</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eblk =
start/((nand-&gt;oobblock + nand-&gt;oobsize)*pages_per_block);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eblk *=
nand-&gt;oobblock;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (check_block(nand,
eblk)) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (cmd == (NANDRW_WRITE | NANDRW_NOECC))
{</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start
+= ((nand-&gt;oobblock + nand-&gt;oobsize)*pages_per_block);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if(cmd &amp; NANDRW_NOECC){</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Start
on 528/2112 bytes boundary */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(start%((nand-&gt;oobblock
+ nand-&gt;oobsize))){</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; printf(&quot;\nError: Reading/Writing must
start from %d byte page boundary, 0x%8X\n&quot;,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (nand-&gt;oobblock
+ nand-&gt;oobsize),start);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; return -1;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else{</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* reading and writing without ECC */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (cmd &amp; NANDRW_READ) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret =
nand_read_noecc(nand, start,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min(len,
(nand-&gt;oobblock + nand-&gt;oobsize)*pages_per_block),</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp;n,
(u_char*)buf);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret =
nand_write_noecc(nand, start,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; min(len,
(nand-&gt;oobblock + nand-&gt;oobsize)*pages_per_block),</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &amp;n,
(u_char*)buf);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (ret)</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; start &nbsp;+= n;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; buf &nbsp; += n;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; total += n;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; len &nbsp; -= n;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; if
(retlen)</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; *retlen = total;</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; return
ret;</font>
<br><font size=2 face="sans-serif">&gt; }</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">724a806</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; pages_per_block = nand-&gt;erasesize / nand-&gt;oobblock;</font>
<br><font size=2 face="sans-serif">878a961,1010</font>
<br><font size=2 face="sans-serif">&gt; /* Read entire page (without ECC)
*/</font>
<br><font size=2 face="sans-serif">&gt; static int nand_read_noecc(struct
nand_chip *nand, size_t start, size_t len,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;size_t * retlen, u_char *buf)</font>
<br><font size=2 face="sans-serif">&gt; {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; int
col, page;</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
First we calculate the starting page */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Address here take spare area into account */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; page
= start / (nand-&gt;oobblock + nand-&gt;oobsize);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Get raw starting column */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; col
= start % (nand-&gt;oobblock + nand-&gt;oobsize);</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Initialize return value */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; *retlen
= 0;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;NAND_ENABLE_CE(nand); &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp;/* set pin low */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Loop until all data read */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; while
(*retlen &lt; len) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Send the read command */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; NanD_Command(nand, NAND_CMD_READ0);</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Address to NAND flash don't take the spare
area into account */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (nand-&gt;bus16) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NanD_Address(nand,
ADDR_COLUMN_PAGE,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(page * nand-&gt;oobblock)
+ (col &gt;&gt; 1));</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NanD_Address(nand,
ADDR_COLUMN_PAGE,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(page * nand-&gt;oobblock)
+ col);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Read the data directly into the return
buffer */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if ((*retlen + (nand-&gt;oobblock + nand-&gt;oobsize
- col)) &gt;= len) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NanD_ReadBuf(nand,
buf + *retlen, len - *retlen);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *retlen
= len;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* We're
done */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NanD_ReadBuf(nand,
buf + *retlen, nand-&gt;oobblock + nand-&gt;oobsize - col);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; *retlen
+= nand-&gt;oobblock + nand-&gt;oobsize - col;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* For subsequent reads align to page boundary.
*/</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; col = 0;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Increment page address */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; page++;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
De-select the NAND device */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; NAND_DISABLE_CE(nand);
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/*
set pin high */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Always successful. No ECC */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; return
0;</font>
<br><font size=2 face="sans-serif">&gt; }</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">1247a1380,1457</font>
<br><font size=2 face="sans-serif">&gt; /* Write entire page (including
out of bound area) */</font>
<br><font size=2 face="sans-serif">&gt; static int nand_write_noecc (struct
nand_chip* nand, size_t to, size_t len,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp;size_t * retlen, const u_char * buf)</font>
<br><font size=2 face="sans-serif">&gt; {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; int
i, page, col, ret, cnt = 0;</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Initialize return length value */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; *retlen
= 0;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; ret
= 0;</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Get page */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; page
= ((int) to) / (nand-&gt;oobblock + nand-&gt;oobsize);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Get the starting column. Should be zero */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; col
= to % (nand-&gt;oobblock + nand-&gt;oobsize);</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; /*
Loop until all data is written */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; while
(*retlen &lt; len) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Write data into buffer */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if ((col + len - *retlen) &gt;= (nand-&gt;oobblock
+ nand-&gt;oobsize)) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* &gt;=
(nand-&gt;oobblock + nand-&gt;oobsize) bytes to be written */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (i
= col, cnt = 0; i &lt; (nand-&gt;oobblock + nand-&gt;oobsize); i++, cnt++)
{</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; nand-&gt;data_buf[i] = buf[(*retlen + cnt)];</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Less
than (nand-&gt;oobblock + nand-&gt;oobsize) bytes to be written */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (i
= col, cnt = 0; cnt &lt; (len - *retlen); i++, cnt++) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; nand-&gt;data_buf[i] = buf[(*retlen + cnt)];</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* set pin low */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NAND_ENABLE_CE(nand);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; NanD_Command (nand, NAND_CMD_SEQIN);</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (nand-&gt;bus16) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NanD_Address
(nand, ADDR_COLUMN_PAGE,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (page * nand-&gt;oobblock)
+ (col &gt;&gt; 1));</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NanD_Address
(nand, ADDR_COLUMN_PAGE,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (page * nand-&gt;oobblock)
+ col);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Write out complete page of data */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if (nand-&gt;bus16) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (i
= 0; i &lt; cnt; i += 2) {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; WRITE_NAND (nand-&gt;data_buf[i] +</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; (nand-&gt;data_buf[i + 1] &lt;&lt; 8),</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; nand-&gt;IO_ADDR);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; } else {</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /* Send
command to begin auto page programming */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (i
= 0; i &lt; cnt ; i++)</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; WRITE_NAND (nand-&gt;data_buf[i], nand-&gt;IO_ADDR);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Send command to actually program the data
*/</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; NanD_Command (nand, NAND_CMD_PAGEPROG);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; NanD_Command (nand, NAND_CMD_STATUS);</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; NAND_WAIT_READY(nand);</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* See if device thinks it succeeded */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; if(READ_NAND (nand-&gt;IO_ADDR) &amp; 0x01)
{</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf
(&quot;%s: Failed write, page 0x%08x, &quot;, __FUNCTION__,</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; page);</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ret =
-1;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* De-select the NAND device */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; NAND_DISABLE_CE(nand); &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* set pin high */</font>
<br><font size=2 face="sans-serif">&gt; </font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Next data start at page boundary */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; col = 0;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Update written bytes count */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; *retlen += cnt;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; /* Increment page address */</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; page++;</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; }</font>
<br><font size=2 face="sans-serif">&gt; &nbsp; &nbsp; &nbsp; &nbsp; return
ret;</font>
<br><font size=2 face="sans-serif">&gt; }</font>
<br><font size=2 face="sans-serif">&gt; </font>