<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html  xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<title></title>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta http-equiv="Content-Style-Type" content="text/css"/>
</head>
<body>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">Hello,</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">there is a bug in cfi_flash.c in function flash_get_size(). The problem appears if the board 
specific CFG_MAX_FLASH_SECT macro is smaller than the real number of sectors. </span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">In this case i use a 32 MiB Spansion flash (S29GL256), but we only want respectivly can use 
16 MiB of the flash because of the broken A24 line on the AT91RM9200. Therefore i defined 
CFG_MAX_FLASH_SECT to 128, but the real value is 256. The structure allocation of 
flash_info_t in flash.h defines the size of the protect array to CFG_MAX_FLASH_SECT (in 
my case 128). The for-loop in flash_get_size() initialises this array, but it does it for all 
sectors (erase_region_count) which is 256 in my case. This will cause the info-&gt;portwidth 
variable (and of course all following too) to be overwritten.</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">flash.h</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">****************************************</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">typedef struct {</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ulong&#160;&#160; size;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* total bank size in bytes&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
*/</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ushort&#160; sector_count;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* number of erase units&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
*/</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ulong&#160;&#160; flash_id;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* combined device &amp; manufacturer code&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ulong&#160;&#160; start[CFG_MAX_FLASH_SECT];&#160;&#160; /* physical sector start addresses */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; uchar&#160;&#160; protect[CFG_MAX_FLASH_SECT]; /* sector protection status&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160; #ifdef CFG_FLASH_CFI</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; uchar&#160;&#160; portwidth;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* the width of the port&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
*/</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; uchar&#160;&#160; chipwidth;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* the width of the chip&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
*/</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ushort&#160; buffer_size;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* # of bytes in write buffer&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ulong&#160;&#160; erase_blk_tout;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* maximum block erase timeout&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ulong&#160;&#160; write_tout;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* maximum write timeout&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
*/</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ulong&#160;&#160; buffer_write_tout;&#160;&#160;&#160;&#160;&#160; /* maximum buffer write timeout&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ushort&#160; vendor;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* the primary vendor id&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
*/</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ushort&#160; cmd_reset;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* Vendor specific reset command&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ushort&#160; interface;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* used for x8/x16 adjustments&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ushort&#160; legacy_unlock;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* support Intel legacy (un)locking&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160; #endif</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160; } flash_info_t;</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">****************************************</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">cfi_flash.c, flash_get_size()</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">****************************************</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; debug (&quot;erase_region_count = %d erase_region_size = %d\n&quot;,</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; erase_region_count, erase_region_size);</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (j = 0; j &lt; erase_region_count; j++) {</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; info-&gt;start[sect_cnt] = sector;</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sector += (erase_region_size * size_ratio);</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"> </span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /*</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; * Only read protection status from supported devices (intel...)</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; switch (info-&gt;vendor) {</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case CFI_CMDSET_INTEL_EXTENDED:</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case CFI_CMDSET_INTEL_STANDARD:</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; info-&gt;protect[sect_cnt] 
=</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
flash_isset (info, sect_cnt,</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
FLASH_OFFSET_PROTECT,</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 
FLASH_STATUS_PROTECT);</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; default:</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; info-&gt;protect[sect_cnt] 
= 0; /* default: not protected */</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"> </span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sect_cnt++;</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">******************************************</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">regards</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt"><br />
</span></font></div>
<div align="left"><font face="Arial" size="2"><span style="font-size:10pt">Mirco</span></font></div>
</body>
</html>