<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Sehr geil! Danke! Das hilft immens.</p>
<p>Column == Page und Row == Block? Da steh ich noch auf dem
Schlauch.</p>
<p>Gruss und vielen Dank</p>
<p>Sven<br>
</p>
<div class="moz-cite-prefix">On 03.01.21 19:27, Erwin Pschernig via
tiptoi-hw wrote:<br>
</div>
<blockquote type="cite"
cite="mid:trinity-1826e979-9682-456e-87a6-86ab1cb81c68-1609698431193@3c-app-gmx-bap07">
<div>
<div>Hallo zusammen,</div>
<div> </div>
<div>erstmal ein gutes neues Jahr und Grüße von einem der bisher
nur mitgelesen, aber das sollte sich in Zukunft hoffentlich
ändern.</div>
<div>Für richtige Hilfe muß ich mich noch ein wenig einlesen und
selbst ein wenig rumspielen sobald ich auch eine Bastelstift
habe [ Danke @Matthias für das Angebot :-) ].</div>
<div> </div>
<div>Aber vorab kann ich hier bei dem Thema evtl. mit ein paar
Grundlagen weiter helfen.</div>
<div> </div>
<div>Ich habe mir auch das Datenblatt mal kurz durchgeschaut und
kann folgende Erklärungen beisteuern.</div>
<div> </div>
<div>Der hier angesprochene NAND Flash ist eine etwas
aufwändigere (schnellere) Variante und man kann nicht direkt
auf den eigentlichen Flash zugreifen sonden wählt durch das
READ1 Kommando eine Page aus welche in den schnellen "read
cache" geladen wird. Daher kommt auch der recht große
Unterschied zwischen random access (25us max) und sequential
read (min 25ns = Faktor 1000 schneller).</div>
<div> </div>
<div>Der NAND Flash ist wie alle gängigen Flash Bausteine in
Pages und Blocks unterteilt um gewisse Operation (z.Bsp.
Löschen) performanter zu gestalten.</div>
<div>Bei dieser Variante hat eine Page 2 kByte und ein Block 128
kByte.</div>
<div> </div>
<div>Da Flash generell ein unsicherer Speicher ist und immer mal
wieder eine Zelle kaputt wird hat jede Page noch ein paar (64)
zusätzliche Bytes um solche auszugleichen.</div>
<div> </div>
<div>Damit ändert sich die Größe einer Page auf 2112 Byte ( 2 *
1024 + 64 ) was exakt der Cache größe entspricht.</div>
<div> </div>
<div>Das Kommando READ1 "00 cc cc rr rr rr 30" braucht auch
column (cc cc) und row (rr rr rr) zum Auswählen der
Speicherzelle. Hier erkennt man auch Aufgrund der Tatsache das
die Address zwischen den beiden Kommandobytes kommt den Cache
Vorgang.</div>
<div> </div>
<div>Solange kein weiteres READ1 Kommando kommt kann man nun
durch Toggeln der #RE Leitung nacheinander die gesammten Bytes
der Page sequentiell auslesen (das von Matthias angesprochene
auto increment), denn mit jedem #RE toggeln wird die column
address im 1 oder 2 Byte incrementiert (abhängig ob x8 oder
x16 Variante). Und es geht hier noch besser, um die nächste
Page zu lesen reicht es ein Kommando READ CACHE (SEQUENTIAL) =
31h zu senden und die nächsten 2112 Byte können gelesen
werden, ohne das erneut eine Adresse gesendet werden muß.</div>
<div> </div>
<div>Mit dieser Sequenz kann man also beginnend von der Adresse
0 den ganzen Speicher linear auslesen und muß dafür NUR die
einmal eine Adresse angeben.</div>
<div> </div>
<div>Damit ergibt sich für diesen Chip folgende Schlußfolgerung:</div>
<div> </div>
<div>row address = page ID</div>
<div>column addres = byte/word address inside a page</div>
<div> </div>
<div>Ich hoffe das hilft ein wenig zum Verständnis.</div>
<div>
<div>LG Erwin</div>
<div>
<div>
<div name="quote">
<div><b>Gesendet:</b> Sonntag, 03. Januar 2021 um 18:20
Uhr<br>
<b>Von:</b> "Sven A. Huerlimann via tiptoi-hw"
<a class="moz-txt-link-rfc2396E" href="mailto:tiptoi-hw@lists.nomeata.de"><tiptoi-hw@lists.nomeata.de></a><br>
<b>An:</b> <a class="moz-txt-link-abbreviated" href="mailto:tiptoi-hw@lists.nomeata.de">tiptoi-hw@lists.nomeata.de</a><br>
<b>Cc:</b> "Sven A. Huerlimann" <a class="moz-txt-link-rfc2396E" href="mailto:sh@sighup.ch"><sh@sighup.ch></a><br>
<b>Betreff:</b> Re: [Tiptoi-hw] Nochmals-Frage bez.
NAND-Access</div>
<div name="quoted-content">
<p>Servus!</p>
<div class="moz-cite-prefix">On 03.01.21 12:35,
Matthias Weber via tiptoi-hw wrote:</div>
<blockquote>
<p>Hallo!</p>
<div class="moz-cite-prefix">Sven A. Huerlimann via
tiptoi-hw wrote:</div>
<blockquote>
<pre class="moz-quote-pre">Hallo zusammen, ein gutes Neues!
Ich hab nochmals ein Verständnisproblem beim NAND Controller, ev. kann
mir da jemand weiterhelfen:
Ich hab ein halbwegs brauchbares Fundament für die NFC-Emulation. Ein
ungefähres Gespür für die Register und den Ablauf einer Flash-Read
Operation.</pre>
</blockquote>
<p>Uh, war kurz verwirrt. NFC = NAND Flash
Controller?</p>
<p>Für mich hat sich NFC als <span>Near Field
Communication eingebrannt.</span></p>
</blockquote>
Genau.. Bei mir eigentlich auch, aber irgendwann hab
ich kapituliert und das Anyka-Wording übernommen.
<blockquote>
<p> </p>
<blockquote>
<pre class="moz-quote-pre">Was ich jetzt sehe, ist das die FW folgendes macht:
- NAND-Reset (0xff, no cycles)
- NAND-Read (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30)
- und dann ein weiteres Command mit dem "Continue" bit gesetzt, aber nur
"ein" write ins command register.</pre>
</blockquote>
<p>Kannst du kurz nochmal erläutern, was du mit der
Beschreibung in den Klammern meinst? Beziehst du
dich immer auf das Kommando?</p>
</blockquote>
<p>Jup. Der NFC hat ein Register an 0x0404a000 (nennen
wir es mal NFC_COMMAND) und darüber (0ffset 0x04 -
0x1C) weitere Register im opensource-treiber nicht
explizit benannt sind, aber offenbar die weiteren
Cycle abbilden.</p>
<p>Ein Read-Cycle mit Addresse schreibt zum Beispiel
(Sorry fürs Spamen und die etwas infantile
Formatierung):</p>
<p>nfc status write<br>
Command valid bit set<br>
Chipselect asserted<br>
NFC_CTRL_REG_CE_SAVE_BIT asserted<br>
nfc status<br>
nfc status write<br>
Start of Command Cyce
///////////////////////////////////////////////<br>
NFC_COMMAND write (cycle 0): 00000064<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH ENABLE<br>
ADDRESSS LATCH DISABLE<br>
NFC_CMD_REG_CMD_CONF
++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
Commmand Cycle<br>
NFC_COMMAND write (cycle 1): 00000062<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH DISABLE<br>
ADDRESSS LATCH ENABLE<br>
NFC_CMD_REG_ADD_CONF
========================================================<br>
00000062<br>
NFC_COMMAND write (cycle 2): 00000062<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH DISABLE<br>
ADDRESSS LATCH ENABLE<br>
NFC_CMD_REG_ADD_CONF
========================================================<br>
00000062<br>
NFC_COMMAND write (cycle 3): 00000062<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH DISABLE<br>
ADDRESSS LATCH ENABLE<br>
NFC_CMD_REG_ADD_CONF
========================================================<br>
00000062<br>
NFC_COMMAND write (cycle 4): 00000062<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH DISABLE<br>
ADDRESSS LATCH ENABLE<br>
NFC_CMD_REG_ADD_CONF
========================================================<br>
00000062<br>
NFC_COMMAND write (cycle 5): 00000062<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH DISABLE<br>
ADDRESSS LATCH ENABLE<br>
NFC_CMD_REG_ADD_CONF
========================================================<br>
00000062<br>
NFC_COMMAND write (cycle 6): 00018064<br>
NFC_CMD_REG_INFO_POS write: 0030<br>
NFC_CMD_REG_CMD_BIT write<br>
WRITE ENABLE<br>
COMMAND LATCH ENABLE<br>
ADDRESSS LATCH DISABLE<br>
NFC_CMD_REG_CMD_CONF
++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
NFC_COMMAND write (cycle 7): 0001dc01<br>
NFC_CMD_REG_INFO_POS write: 003b<br>
NFC_CMD_REG_DELAY_BIT write<br>
WRTIE DISABLE<br>
COMMAND LATCH DISABLE<br>
ADDRESSS LATCH DISABLE<br>
NFC_CMD_REG_DELAY_BIT
-------------------------------------------------------<br>
EEEENNNNNDDDD of TRANSACTION
oooooooooooooooooooooooooooooooooooo<br>
NFC_CMD_REG_LAST_BIT write<br>
End Cycle<br>
Got NAND command: 00, Address: 00, 00, 00, 00, 00,
End: 30, Delay: 3b<br>
EEEENNNNNDDDD of TRANSACTION
oooooooooooooooooooooooooooooooooooo</p>
<blockquote>
<p> </p>
<p>Ich habe gerade das Datenblatt eines HY27UF084G2B
und <a class="moz-txt-link-freetext"
href="https://github.com/maehw/ftdi-nand-flash-reader/blob/master/bitbang_ft2232.c"
target="_blank" moz-do-not-send="true">https://github.com/maehw/ftdi-nand-flash-reader/blob/master/bitbang_ft2232.c</a>
befragt.</p>
<p>0x00 0x30 ist ein Page Read (READ1) Kommando.
Zwischen 0x00 und 0x30 kommen 5 Adress-Bytes (2x
Spalte, 3x Zeile).</p>
<p>Und dann werden bei einer Page wahrscheinlich <span
class="pl-c1">2112 Bytes am Stück gelesen.
Vielleicht siehst du das und ein interner Puffer
füllt sich?</span></p>
</blockquote>
<p>Ok. Hier ist das Problem, dass ich ja den Puffer
füllen muss :)</p>
<p>Ich denk ich schaufel einfach mal 2112 Bytes und
sehe was passiert.</p>
<blockquote>
<p> </p>
<blockquote>
<pre class="moz-quote-pre">Meine naive Annahme: Read-Cycle setzt mal auf (Startadresse, etc. etc.)
und danach kann mit diesem "Continue" einfach die nächste
Page?Block?Sector?Huga abgefragt werden?</pre>
</blockquote>
<p>Bei SPI-Flash kenne ich das, dass man keine
weiteren Adressen explizit angeben muss. Hier
könnte ich mir vorstellen, dass der NAND Flash
Controller einen Autoinkrement durchführt.</p>
</blockquote>
Was wird dann inkrementiert? Zeile? Spalte? Da magelts
bei mir stark an Durchblick.
<blockquote>
<p> </p>
Gruß<br>
Matthias</blockquote>
Gruss Sven
<blockquote>
<fieldset class="mimeAttachmentHeader"> </fieldset>
<pre class="moz-quote-pre">_______________________________________________
tiptoi-hw mailing list
<a class="moz-txt-link-abbreviated" href="mailto:tiptoi-hw@lists.nomeata.de" target="_blank" moz-do-not-send="true">tiptoi-hw@lists.nomeata.de</a>
<a class="moz-txt-link-freetext" href="https://lists.nomeata.de/mailman/listinfo/tiptoi-hw" target="_blank" moz-do-not-send="true">https://lists.nomeata.de/mailman/listinfo/tiptoi-hw</a>
</pre>
</blockquote>
_______________________________________________
tiptoi-hw mailing list <a class="moz-txt-link-abbreviated" href="mailto:tiptoi-hw@lists.nomeata.de">tiptoi-hw@lists.nomeata.de</a> <a
href="https://lists.nomeata.de/mailman/listinfo/tiptoi-hw"
target="_blank" moz-do-not-send="true">https://lists.nomeata.de/mailman/listinfo/tiptoi-hw</a></div>
</div>
</div>
</div>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
tiptoi-hw mailing list
<a class="moz-txt-link-abbreviated" href="mailto:tiptoi-hw@lists.nomeata.de">tiptoi-hw@lists.nomeata.de</a>
<a class="moz-txt-link-freetext" href="https://lists.nomeata.de/mailman/listinfo/tiptoi-hw">https://lists.nomeata.de/mailman/listinfo/tiptoi-hw</a>
</pre>
</blockquote>
</body>
</html>