Top secrets sources NedoPC ngs

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//RU">
<html>
        <head>
                <title>Ðàáîòàåì ñ MMC</title>
                <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=Windows-1251">
                <LINK href="style.css"type=text/css rel=stylesheet>
                <SCRIPT LANGUAGE="JavaScript" SRC="menu.js" TYPE="text/javascript"></SCRIPT>
        </head>
<body>
<!-- onLog counter begin -->
<script language="javascript"><!--
var ref; ref = escape(document.referrer);
var doc; doc = escape(window.location.href);
document.write('<a href=http://www.onlog.ru><img src="http://www.onlog.ru/counter.php?id=1289&ref='+ref+'&doc='+doc+'" width=1 height=1 border=0 alt=""></a>')
// --></script>
<!-- onLog counter end -->
<table border="0" cellspacing="20" cellpadding="0" width="100%">
<tr>
        <td rowspan="2" valign="top">
                <script language="JavaScript" type="text/javascript">display_menu(5,2);</script>
                <noscript>Ìåíþ íà JavaScript</noscript>
        </td>
        <th>
                <A NAME="beg"><h1 align="center">ĸøåâî è ñåðäèòî!</h1></A>
        </th>
</tr>
<tr>
        <td valign="top">
        <h2>Àçû ðàáîòû ñ MMC</h2>
        <div align="justify">
        &nbsp;&nbsp;&nbsp;&nbsp;MMC êàðòû èìåþò äîñòàòî÷íî ïðîñòîå óïðàâëåíèå. Ïàìÿòü ðàçáèòà íà ñåêòîðà ïî 512 áàéò. Êàðòû ôîðìàòèðóþòñÿ òàê æå, êàê îáû÷íûå âèí÷åñòåðû ïîä DOS: ñ 1 ðàçäåëîì, ôàéëîâàÿ ñèñòåìà - FAT16. ×òåíèå âîçìîæíî êàê îòäåëüíûìè áàéòàìè, òàê è áëîêàìè.<br>&nbsp;&nbsp;&nbsp;&nbsp;Íàïðÿæåíèå ïèòàíèÿ êàðòû äîëæíî áûòü â ïðåäåëàõ +2.7â...+3.6Â, ñêîðîñòü îáìåíà äî 20 ìáèò/ñ. Ïðè ïðîñòîå áîëåå 5ìñ êàðòî÷êà ïåðåâîäèòñÿ â sleep ðåæèì ñ ìàëûì ýíåðãîïîòðåáëåíèåì, è âûõîäèò èç íåãî àâòîìàòè÷åñêè ïðè âîçîáíîâëåíèè îáìåíà.<h4 align="center">Èíòåðôåéñ êàðòû</h4>&nbsp;&nbsp;&nbsp;&nbsp;MMC êàðòû ìîãóò ðàáîòàòü â äâóõ ðåæèìàõ îáìåíà - <I>MultiMediaCard protocol</I> è <I>SPI protocol</I>.Ïåðâûé áîëåå ñêîðîñòíîé, à â ïîëüçó âòîðîãî ãîâîðèò òî, ÷òî ìíîãî êîíòðîëëåðîâ èìåþò âñòðîåííûé SPI èíòåðôåéñ. Íèæå ïðèâåäåíà ðàçâîäêà MMC èìåííî äëÿ ðàáîòû â ðåæèìå SPI:<br><br><table class="p" align="center"><tr><td class="p" rowspan="8"><IMG src="pic/mmc_flash.png" alt="ðàçâîäêà MMC"></td><th>PIN</th><th>Èìÿ</th><th>Ôóíêöèÿ</th></tr><tr><td class="p">1</td><td class="p">xCS</td><td class="p">Âûáîð êðèñòàëëà</td></tr><tr><td class="p">2</td><td class="p">DI</td><td class="p">Âõîäíûå äàííûå</td></tr><tr><td class="p">3</td><td class="p">VSS</td><td class="p">Çåìëÿ</td></tr><tr><td class="p">4</td><td class="p">VDD</td><td class="p">Ïèòàíèå +3.3â</td></tr><tr><td class="p">5</td><td class="p">SCLK</td><td class="p">Ñèíõðîíèçàöèÿ</td></tr><tr><td class="p">6</td><td class="p">VSS2</td><td class="p">Çåìëÿ</td></tr>    <tr><td class="p">7</td><td class="p">DO</td><td class="p">Âûõîäíûå äàííûå</td></tr></table><br>&nbsp;&nbsp;&nbsp;&nbsp;Cèãíàë âûáîðêè èìååò "0" àêòèâíûé óðîâåíü. SPI ïîðò â óïðàâëÿþùåì êîíòðîëëåðå (äàëåå ÌÊ) äîëæåí áûòü íàñòðîåí òàê, ÷òîáû àêòèâíûì áûë ïåðåäíèé ôðîíò SCLK:<br>  <div align="center"><IMG src="pic/spi_wave.png" alt="SPI îáìåí"></div><br>&nbsp;&nbsp;&nbsp;&nbsp;Ñðàçó æå íàïîìíþ î òîì, ÷òî ôàêòè÷åñêè ïåðåäà÷à áàéòà èç êîíòðîëëåðà (DO) îñóùåñòâëÿåòñÿ ïàðàëëåëüíî ñ ïðè¸ìîì ïî äðóãîé ëèíèè (DI). ×òîáû íà÷àòü ïðè¸ì/ïåðåäà÷ó ÷åðåç SPI â PICå (â Master mode), â áóôôåð ïðè¸ìîïåðåäàò÷èêà SSPBUF íóæíî ÷òî-òî çàïèñàòü, à ïîñëå îêîí÷àíèÿ ïåðåñûëêè èç SSPBUF ñ÷èòàòü ïðèíÿòîå.  ïðîñòåéøåì ñëó÷àå îáìåí ñ êàðòîé èìååò âèä "êîìàíäà - îòâåò":<br><div align="center"><IMG src="pic/spi_exch1.png" alt="êîìàíäà-îòâåò"><br><font size="-1"><b class="rd">Îáîçíà÷åíèÿ:</b>1 êëåòêà - 8 áèò; X - ïðîèçâîëüíî, Z - òðåòüå ñîñòîÿíèå, H - 0xFF, L - 0x00; Òð = 1&#247;8 áàéò, Òîòâ = 1&#247;many áàéò.<br>Âíèìàíèå! Ðèñóíêè ïîÿñíÿþò ïðèíöèï îáìåíà, ïîýòîìó ìàñøòàáû íå ñîáëþäåíû!</font></div><br>&nbsp;&nbsp;&nbsp;&nbsp;Îáìåí íà÷èíàåòñÿ ñ òîãî, ÷òî ÌÊ âûñòàâëÿåò ñèãíàë 0 íà xCS. Ñíà÷àëà ïîñûëàåì 6 áàéò êîìàíäû - ïîñëåäîâàòåëüíî ïèøåì â âûøåóêàçàííûé SSPBUF íóæíûå áàéòû, íå çàáûâàÿ ïåðåä çàïèñüþ î÷åðåäíîãî äîæèäàòüñÿ îêîí÷àíèÿ ïåðåäà÷è ïðåäûäóùåãî (áèò SSPSTAT,BF). Äàëåå íóæíî äîæäàòüñÿ îòâåòà êàðòû: ïèøåì â SPI áàéò 0xFF è ïî îêîí÷àíèè êàæäîé ïåðåäà÷è (êîíòðîëèðóåì SSPSTAT,BF) ÷èòàåì ïðèíÿòîå â SSPBUF. Ïåðâûé áàéò, îòëè÷íûé îò 0xFF, áóäåò ïåðâûì áàéòîì îòâåòà êàðòî÷êè (à äëÿ ðàññìàòðèâàåìûõ íèæå êîìàíä îòâåò âñåãäà ñîñòîèò èç 1 áàéòà).<br>&nbsp;&nbsp;&nbsp;&nbsp;Äàííûå, åñëè òðåáóåòñÿ, ïåðåäàþòñÿ ïîñëå îòâåòà áëîêîì çàäàííîé ðàíåå äëèíû:<br><div align="center"><IMG src="pic/spi_exch2.png" alt="êîìàíäà-îòâåò-äàííûå"></div><br>Íà÷àëî áëîêà äàííûõ "ëîâèòñÿ" òàê-æå: åãî ïåðâûé áàéò îòëè÷åí îò 0xff (ñì. íèæå).Ïîñëå îêîí÷àíèÿ îáìåíà íóæíî ïîäàòü 1 íà xCS.<br><br><h4 align="center">Êîìàíäû è îòâåòû</h4>&nbsp;&nbsp;&nbsp;&nbsp; Êîìàíäà èìååò äëèíó 6 áàéò, ïåðåäà÷à âñåãäà íà÷èíàåòñÿ ñî ñòàðøåãî áèòà. Ïàêåò êîìàíäû èìååò
        ñëåäóþùèé ôîðìàò:
        <table class="p" align="center">
                <tr><th>Ïîçèöèÿ áèòà</th><td class="p">47</td><td class="p">46</td><td class="p">[45:40]</td><td class="p">[39:8]</td><td class="p">[7:1]</td><td class="p">0</td></tr>
                <tr><th>Äëèíà</th><td class="p">1</td><td class="p">1</td><td class="p">6</td><td class="p">32</td><td class="p">7</td><td class="p">1</td></tr>
                <tr><th>Çíà÷åíèå</th><td class="p">'0'</td><td class="p">'1'</td><td class="p">x</td><td class="p">x</td><td class="p">x</td><td class="p">'1'</td></tr>
                <tr><th>Îïèñàíèå</th><td class="p">ñòàðò áèò</td><td class="p">-</td><td class="p">¹ êîìàíäû</td><td class="p">àðãóìåíò</td><td class="p">CRC7</td><td class="p">ñòîï áèò</td></tr>
        </table>
        <br>
        &nbsp;&nbsp;&nbsp;&nbsp;Ïðè ðàáîòå MMC â ðåæèìå SPI äîñòóïíî îêîëî 15 êîìàíä, ïîçâîëÿþùèõ âî-ïåðâûõ ïîëó÷èòü ïîëíóþ èíôîðìàöèþ
        î òèïå è òåêóùåì ñîñòîÿíèè êàðòû, âî-âòîðûõ ïðîèçâîäèòü çàïèñü è ÷òåíèå äàííûõ. Ðàññìîòðèì âñåãî ëèøü 4 êîìàíäû, ñ ïîìîùüþ
        êîòîðûõ ìîæíî ëèøü ÷èòàòü äàííûå ñ MMC áëîêàìè ðàçìåðîì 1&#247;512 áàéò (ìíå äëÿ ïëååðà âïîëíå õâàòàåò):
        <table class="p" align="center">
        <tr><th>Íîìåð<br>êîìàäû</th><th>Àðãóìåíò</th><th>Îïèñàíèå</th></tr>
        <tr><td class="p">CMD0</td><td class="p">íåò</td><td class="p">go_idle_state<br>Ñáðîñ</td></tr>
        <tr><td class="p">CMD1</td><td class="p">íåò</td><td class="p">send_op_cond<br>Èíèöèàëèçàöèÿ</td></tr>
        <tr><td class="p">CMD16</td><td class="p">[31:0] äëèíà áëîêà</td><td class="p">set_blocklen<br>óñòàíîâèòü ðàçìåð áëîêà</td></tr>
        <tr><td class="p">CMD17</td><td class="p">[31:0] àäðåñ áëîêà</td><td class="p">read_single_block<br>ïðî÷èòàòü áëîê ðàçìåðîì, óêàçàííûì set_block_len</td></tr>
        </table>
        Îáðàòèòå âíèìàíèå: âñå ÷èñëà, àðãóìåíòû è ò.ï. ïåðåäàþòñÿ íà÷èíàÿ ñî ñòàðøåãî áèòà, à àäðåñ áëîêà - àäðåñ ïåðâîãî áàéòà áëîêà.<br><br>
        &nbsp;&nbsp;&nbsp;&nbsp;Îòâåò íà ëþáóþ èç âûøåïðèâåä¸ííûõ êîìàíä ñîñòîèò èç îäíîãî áàéòà, ñòàðøèé áàéò âñåãäà ðàâåí 0.
        Äðóãèå áèòû - ôëàãè îøèáîê:<br>
        <div align="center"><IMG src="pic/resp1.png" alt="Îòâåò"></div><br>
        <ol>
        <li>Â ñïÿùåì ðåæèìå - êàðòà íàõîäèòñÿ â ñïÿùåì ðåæèìå è âûïîëíÿåòñÿ ïðîöåññ èíèöèàëèçàöèè;
        <li>Erase reset - ñòèðàíèå íå âûïîëíåíî, ò.ê îïåðàöèÿ ïðåðâàíà äî èñïîëíåíèÿ;
        <li>Íåäîïóñòèìàÿ êîìàíäà - îáíàðóæåí íåäîïóñòèìûé íîìåð êîìàíäû;
        <li>Îøèáêà CRC - ïîñëåäíÿÿ ïðèíÿòàÿ êîìàíäà íå ïðîøëà ïðîâåðêó CRC;
        <li>Erase_seq_error - îøèáêà â êîìàíäå ñòèðàíèÿ;
        <li>Îøèáêà àäðåñà - áëîê ïåðåñåêàåò ãðàíèöó ôèçè÷åñêîãî ñåêòîðà;
        <li>Îøèáêà ïàðàìåòðà - àðãóìåíò êîìàíäû âíå äîïóñòèìûõ ïðåäåëîâ äëÿ äàííîé êàðòû.</ol>
        Îøèáêè ¹2,4,5 íàì âñòðå÷àòüñÿ íå äîëæíû. Äëÿ îïåðàöèè ÷òåíèÿ CMD17 ñ÷èòûâàåìûé áëîê äîëæåí áûòü
        â ïðåäåëàõ îäíîãî ôèçè÷åñêîãî ñåêòîðà: åãî ðàçìåð íå äîëæåí ïðåâûøàòü 512 áàéò, à íà÷àëî è êîíåö ðàñïîëàãàòüñÿ â îäíîì
        è òîì æå ñåêòîðå. Åñëè ýòî íå âûïîëíåíî, òî ïîÿâèòñÿ îøèáêà ¹6<br>
        &nbsp;&nbsp;&nbsp;&nbsp;Áëîê äàííûõ èìååò äëèíó îò 4 äî N+3 áàéò, ãäå N - ÷èñëî, óêàçàííîå â àðãóìåíòå CMD16. Ïåðâûé áàéò ïðè ïåðåäà÷å îò MMC ê ÌÊ ðàâåí 0xFE, äàëåå ñëåäóþò N áàéò çàïðàøèâàåìîé èíôîðìàöèè, à â êîíöå - 2 áàéòà CRC (èõ ñîäåðæèìîå ìîæíî èãíîðèðîâàòü, íî ïðî÷åñòü íóæíî îáÿçàòåëüíî!). Åñëè æå ïðè ÷òåíèè ïðîèçîø¸ë ñáîé è êàðòà íå ìîæåò ïðåäîñòàâèòü äàííûå, òî âìåñòî óêàçàííîãî áëîêà ïåðåäà¸òñÿ 1 áàéò ñ ôëàãîì îøèáêè:<div align="center"><img src="pic/resp2.png" alt="Îøèáêà äàííûõ"></div><br>
<ol>
        <li>Íåèçâåñòíàÿ îøèáêà - ñáîé ïî íåèçâåñòíîé ïðè÷èíå;
        <li>Îøèáêà ÑÑ - ñáîé âíóòðåííåãî êîíòðîëëåðà;
        <li>Ñáîé ÅÑÑ - àëãîðèòì ÅÑÑ íå ñìîã âîññòàíîâèòü äàííûå;
        <li>Âûõîä çà ãðàíèöó - àðãóìåíò êîìàíäû âíå äîïóñòèìûõ ïðåäåëîâ;
        <li>Êàðòà áëîêèðîâàíà - äîñòóï íå ðàçðåø¸í, ò.ê êàðòà çàùèùåíà ïàðîëåì.
</ol>
<h4 align="center">Èíèöèàëèçàöèÿ êàðòû</h4>
&nbsp;&nbsp;&nbsp;&nbsp;Ïåðåä ðàáîòîé êàðòó íåîáõîäèìî ïðàâèëüíî ïðîèíèöèàëèçèðîâàòü. Ñïóñòÿ íåñêîëüêî ìñ ïîñëå ïîäà÷è ïèòàíèÿ ïî SPI íóæíî îòïðàâèòü 0xFF 74 ðàçà è ïîäîæäàòü åù¸ 1ìñ. Âñ¸ ýòî âðåìÿ íà xCS äîëæíà áûòü ëîã. "1". Òåïåðü êàðòà ãîòîâà ê ïðè¸ìó êîìàíä. Ïîñëå âêëþ÷åíèÿ êàðòà íàõîäèòñÿ â ðåæèìå MultimediaCard protocol. Äëÿ ïåðåâîäà å¸ â ðåæèì SPI íàäî îòïðàâèòü êîìàíäó Ñáðîñ (CMD0) (íå çàáûâàéòå ïðî xCS).  ðåæèìå SPI ïðîâåðêà CRC îòêëþ÷åíà ïî óìîë÷àíèþ, ïîýòîìó ñîäåðæèìîå ïîëÿ CRC7 èãíîðèðóåòñÿ. Îäíàêî äëÿ CMD0 ïîëå CRC7 íóæíî óêàçàòü ïðàâèëüíî. Ïîñêîëüêó êîìàíäà íå èìååò ìåíÿþùèõñÿ â ïðîöåññå ðàáîòû àðãóìåíòîâ, òî è ñïåöèàëüíî âû÷èñëÿòü ýòî ïîëå íå îáÿçàòåëüíî: ïðàâèëüíàÿ CMD0 èìååò âèä: 0x40, 0x0, 0x0, 0x0, 0x0, 0x95. Äàëåå êàðòó íåîáõîäèìî ïðîèíèöèàëèçèðîâàòü. Äëÿ ýòîãî ïîñûëàåì êîìàíäó CMD1 äî òåõ ïîð, ïîêà â îòâåòå êàðòû áèò0 (â ñïÿùåì ðåæèìå) íå ñìåíèòñÿ ñ 1 íà 0. Ýòî áóäåò îçíà÷àòü, ÷òî êàðòà ãîòîâà ê ðàáîòå. Òåïåðü ìîæíî ïîñûëàòü ïðî÷èå êîìàíäû (ó íàñ ýòî CMD16 è CMD17).<br>
        <h4 align="center">Ôàéëîâàÿ cèñòåìà</h4>
&nbsp;&nbsp;&nbsp;&nbsp;Ñàìîå èíòåðåñíîå - ýòî ðàáîòà ñ ôàéëîâîé ñèñòåìîé. Íå áóäó ñèëüíî ðàñïðîñòðàíÿòüñÿ, ò.ê. â èíåòå èòàê íàâàëîì èíôîðìàöèè î òîì, ÷òî òàêîå FAT16 è ñ ÷åì å¸ åäÿò. Êðàòåíüêî ðàññêàæó î òîì, êàê èñïîëüçîâàòü ñîäåðæèìîå íåêîòîðûõ ñåêòîðîâ â ñâîèõ ëè÷íûõ öåëÿõ ;) <br>
Ñòðóêòóðà äèñêà:
<table class="p" align="center"><tr><td class="p">MasterBootRecord</td></tr><tr><td class="p">ðåçåðâèðîâàíî</td></tr><tr><td class="p">PartitionBootRecord</td></tr><tr><td class="p">FAT1</td></tr><tr><td class="p">FAT2</td></tr><tr><td class="p">Êîðíåâîé êàòàëîã</td></tr><tr><td class="p">êëàñòåð 002</td></tr><tr><td class="p">êëàñòåð 003</td></tr><tr><td class="p">***</td></tr></table><br>
&nbsp;&nbsp;&nbsp;&nbsp;MBR íàõîäèòñÿ â íóëåâîì ñåêòîðå äèñêà, ïîçèöèè îñòàëüíûõ ÷àñòåé áóäåì âû÷èñëÿòü. Ñòîèò îòìåòèòü, ÷òî åñëè êàðòî÷êà áûëà ïåðåôîðìàòèðîâàíà Windows, ñòðóêòóðà äèñêà ìîãëà èçìåíèòüñÿ: Windows ñòèðàåò MBR, è â íóëåâîì ñåêòîðå ñðàçó íà÷èíàåòñÿ PBR. ×òîáû ðàçëè÷èòü ñîäåðæèìîå íóëåâîãî ñåêòîðà íóæíî ñ÷èòàòü åãî ïåðâûå íåñê. áàéò. Åñëè áàéòû íóëåâûå - ýòî MBR, èíà÷å - PBR.<br>
Íóëåâîé ñåêòîð, îí æå Master Boot Record äèñêà, âûãëÿäèò ïðèìåðíî òàê:
        <table class="p" align="center">
                <tr><th>Ïîçèöèÿ áàéòà</th><th>Äëèíà(áàéò)</th><th>Îïèñàíèå</th><th>Ñîäåðæèìîå</th></tr>
                <tr><td class="p">0õ0</td><td class="p">446</td><td class="p">-</td><td class="p">0x0</td></tr>
                <tr><td class="p">0x1BE</td><td class="p">16</td><td class="p">îïèñàíèå ðàçäåëà</td><td class="p">ñì.íèæå</td></tr>
                <tr><td class="p">0x1CE</td><td class="p">16</td><td class="p">îïèñàíèå ðàçäåëà</td><td class="p">ñì.íèæå</td></tr>
                <tr><td class="p">0x1DE</td><td class="p">16</td><td class="p">îïèñàíèå ðàçäåëà</td><td class="p">ñì.íèæå</td></tr>
                <tr><td class="p">0x1EE</td><td class="p">16</td><td class="p">îïèñàíèå ðàçäåëà</td><td class="p">ñì.íèæå</td></tr>
                <tr><td class="p">0x1FE</td><td class="p">2</td><td class="p">ïîäïèñü</td><td class="p">0x55,0xAA</td></tr>
        </table><br>
Íàì íóæíî îïèñàíèå ïåðâîãî ðàçäåëà (òî, ÷òî ïî ñìåùåíèþ 0x1BE).×òî òàì åñòü:   
        <table class="p" align="center">
                <tr><th>Ïîçèöèÿ áàéòà</th><th>Äëèíà(áàéò)</th><th>Îïèñàíèå</th><th>Ñîäåðæèìîå</th></tr>
                <tr><td class="p">0x4</td><td class="p">1</td><td class="p">òèï ôàéëîâîé ñèñòåìû</td><td class="p">6=DOS 16-áèò ÔÀÒ<br>(âîçì. äð. âàðèàíòû)<br></td></tr>
                <tr><td class="p">0x8</td><td class="p">4</td><td class="p">ïîçèöèÿ 1 ñåêòîðà ðàçäåëà</td><td class="p">íîìåð ñåêòîðà</td></tr>
                <tr><td class="p">0xÑ</td><td class="p">2</td><td class="p">÷èñëî ñåêòîðîâ â ðàçäåëå</td><td class="p">îò 1 äî ìàêñ. ÷èñëà<br>ñåêòîðîâ äèñêà</td></td></tr>
        </table>
        <br>Ýòî, êîíå÷íî, íå âñ¸, íî ýòîãî âïîëíå õâàòèò. Êàê ïðèìåð ïðèâîæó òî, ÷òî íàïèñàíî â ìîåé êàðòî÷êå:<br>
        <b class="aq"><font size="-1"><pre>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

000001B0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 01   ................
000001C0   01 00 06 07 E0 D3 20 00  00 00 E0 D3 03 00 00 00   ....àÓ ...àÓ....
</pre></font></b>Çäåñü ïîçèöèÿ PBR -  ñåêòîð íîìåð 0x00000020, à ÷èñëî ñåêòîðîâ 0x0003D3E0 (âñå äëèííûå ÷èñëà çàïèñàíû ñ ìëàäøåãî áàéòà), Offset - ñìåùåíèå áàéòà îò íà÷àëà äèñêà. Íå ñòîèò çàáûâàòü, ÷òî ôèçè÷åñêèé àäðåñ PBR ðàâåí pbr_adr = 0x00000020 * 0x200 =0x00004000 (0x200 - ÷èñëî áàéò íà ñåêòîð).
Èä¸ì â Partition Boot Record ðàçäåëà:  
  <table class="p" align="center">
                <tr><th>Ïîçèöèÿ áàéòà</th><th>Äëèíà(áàéò)</th><th>Îïèñàíèå</th><th>Ñîäåðæèìîå</th></tr>
                <tr><td class="p">0õD</td><td class="p">1</td><td class="p">ñåêòîðîâ íà êëàñòåð, Sectors_per_Cluster</td><td class="p">XX(1...64)</td></tr>
                <tr><td class="p">0xE</td><td class="p">2</td><td class="p">÷èñëî ðåçåðâèðîâàííûõ ïîä PBR ñåêòîðîâ, Rezerv</td><td class="p">X</td></tr>
                <tr><td class="p">0x10</td><td class="p">1</td><td class="p">÷èñëî òàáëèö FÀÒ, Number_of_Fat</td><td class="p">2</td></tr>
                <tr><td class="p">0x11</td><td class="p">2</td><td class="p">÷èñëî çàïèñåé â êîðíåâîì êàòàëîãå, Root_dir_entry</td><td class="p">512</td></tr>
                <tr><td class="p">0x16</td><td class="p">2</td><td class="p">ñåêòîðîâ íà FÀÒ, Sectors_per_FAT</td><td class="p">XXX</td></tr>
                <tr><td class="p">0x20</td><td class="p">4</td><td class="p">âñåãî ñåêòîðîâ</td><td class="p">XXX</td></tr>
        </table>
        Îïÿòü-æå çäåñü â ïîìîùü ìîÿ êàðòî÷êà:
        <b class="aq"><font size="-1"><pre>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00004000   EB 00 90 20 20 20 20 20  20 20 20 00 02 04 01 00   ë.        .....
00004010   02 00 02 00 00 F8 F5 00  20 00 08 00 20 00 00 00   .....øõ. ... ...
00004020   E0 D3 03 00 80 00 29 A9  3D 30 FC 4E 4F 20 4E 41   àÓ..€.)©=0üNO NA
</pre></font></b>
&nbsp;&nbsp;&nbsp;&nbsp;Ìû âèäèì 0x04 ñåêòîðà íà êëàñòåð, 0x00F5 ñåêòîðîâ íà êàæäóþ FAT, ïîä PBR îòâåä¸í 1 ñåêòîð, 512 çàïèñåé â êîðíåâîì êàòàëîãå. Ýòèõ ÷åòûð¸õ ÷èñåë õâàòèò, ÷òîáû âû÷èñëèòü 3 âàæíûõ ñìåùåíèÿ:<br>
<ul>
        <li>Fat_base = pbr_adr+0x200*Rezerv;  (0x4200)
        <li>Root_base = Fat_base + Number_of_Fat * (Sectors_per_FAT * 0x200);  (0x41600)
        <li>Cluster_base = Root_base + Root_dir_entry * root_entry_size - 2 * (Sectors_per_Cluster * 0x200); (0x44600)
</ul>
&nbsp;&nbsp;&nbsp;&nbsp;Fat_base - àäðåñ íóëåâîãî áàéòà FAT, Root_base - àäðåñ íóëåâîãî áàéòà êîðíåâîãî êàòàëîãà, Cluster_base - àäðåñ íóëåâîãî (íå 002!!!) êëàñòåðà (íóëåâîãî êëàñòåðà íåò, íî òàê óäîáíåå, ñì. íèæå).  ñêîáêàõ - ÷èñëà äëÿ ìîåé MMC, root_entry_size - ðàçìåð çàïèñè â êîðíåâîì êàòàëîãå, ðàâåí 32 áàéòà.<br>

&nbsp;&nbsp;&nbsp;&nbsp;Âñå ñìåùåíèÿ åñòü, îñòàëîñü ñîâñåì íåìíîãî. Ðàçáåð¸ìñÿ ñ FAT. Âî ïåðâûõ âñ¸ ïðîñòðàíñòâî äèñêà (ïîñëå Root Dir) ïîäåëåíî íà ò.í. êëàñòåðû ïî "Sectors_per_Cluster" ñåêòîðîâ â êàæäîì. Âî âòîðûõ 2 êîïèè FAT èäåíòè÷íû, ïîýòîìó áóäåì ðàáîòàòü ñ ïåðâîé. À FAT ñîñòîèò èç ïîñëåäîâàòåëüíîñòè 2-õ áàéòíûõ ñëîâ (ÌËÀÄØÈÉ áàéò âïåðåäè). N-îå ñëîâî ñîîòâåòñòâóåò N-îìó êëàñòåðó (N>1), è ìîæåò ñîäåðæàòü ñëåäóþùóþ èíôîðìàöèþ:
<table class="p" align="center"><tr><th>×èñëî</th><th>Çíà÷åíèå</th></tr><tr><td class="p">0002-FFEF</td><td class="p">íîìåð ñëåäóþùåãî êëàñòåðà â öåïî÷êå</td></tr><tr><td class="p">FFF7</td><td class="p">ýòî äåôåêòíûé êëàñòåð</td></tr><tr><td class="p">FFF8-FFFF</td><td class="p">ýòî ïîñëåäíèé êëàñòåð öåïî÷êè</td></tr><tr><td class="p">0000,0001,FFF0-FFF6</td><td class="p">ðåçåðâèðîâàíî (è íàì íå èíòåðåñíî)</td></tr></table><br>
Èñõîäÿ èç ðàçáèåíèÿ äèñêà íà êëàñòåðû ôàéë, áóäü îí áîëüøå ðàçìåðà îäíîãî êëàñòåðà, åñòåñòâåííî ñîäåðæèò èõ íåñêîëüêî øòóê. Ïîñëåäîâàòåëüíîñòü íîìåðîâ êëàñòåðîâ, â êîòîðûõ çàïèñàí ôàéë, îáðàçóåò öåïî÷êó êëàñòåðîâ. Öåïî÷êà ñòðîèòñÿ òàê: íîìåð ïåðâîãî ÷èòàåòñÿ èç çàïèñè â êàòàëîãå; â ñîîòâåòñòâóþùåì ñëîâå FAT ïðè ýòîì óêàçàí ñëåäóþùèé êëàñòåð.  ñëîâå äëÿ ñëåäóþùåãî - íîìåð òðåòüåãî è ò.ä. ïîêà íå äîñòèãàåòñÿ êîíåö öåïî÷êè.
<br>&nbsp;&nbsp;&nbsp;&nbsp; Ìàëåíüêèé îðãàíèçàöèîííûé ìîìåíò: ïåðâûå 4 áàéòà FAT  - îáÿçàòåëüíàÿ ïîäïèñü, îçíà÷àåò, ÷òî ýòî íà÷àëî FAT. Ïîýòîìó Íåò íóëåâîãî è ïåðâîãî ñëîâà, Íåò íóëåâîãî è ïåðâîãî êëàñòåðîâ, ñðàçó çà RootDir ñèäèò êëàñòåð íîìåð 0002.
<br>
È ñíîâà îò òåîðèè ê ïðàêòèêå - ïðèäóìàííîå ìíîé äëÿ ïðèìåðà íà÷àëî FAT:
<b class="aq"><font size="-1"><pre>Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F
00004200   F8 FF FF FF 03 00 05 00  06 00 04 00 07 00 FF FF   øÿÿÿ..........ÿÿ
</pre></font></b>
&nbsp;&nbsp;&nbsp;&nbsp; Ïåðâûå 4 áàéòà  - ïîäïèñü. Äîïóñòèì, ôàéë íà÷èíàåòñÿ ñî 2 êëàñòåðà, Num = 2. Òîãäà àäðåñ ýòîãî êëàñòåðà adr = Cluster_base + Num * Sectors_per_cluster * 0x200. Êëàñòåð ìû ïðî÷èòàëè, à äàëüøå ÷èòàåì ñëîâî â FAT äëÿ ýòîãî êëàñòåðà, 2 áàéòà íà÷èíàÿ ñ àäðåñà adr = Fat_base + Num * 2 (0x4204).  íàøåì ñëó÷àå ýòî 0003 - íîìåð ñëåäóþùåãî êëàñòåðà (ñì. òàáëèöó). Ðàñøèôðîûâàÿ òàêèì îáðàçîì ñîäåðæèìîå Fat ïîëó÷èì öåïî÷êó:<br>
0002 - ïåðâûé,0003,0005,0004,0006,0007 - ïîñëåäíèé.<br> Åñëè ðàçîáðàòüñÿ - äîñòàòî÷íî ïðîñòî.<br><br>

&nbsp;&nbsp;&nbsp;&nbsp; Íàêîíåö çàãëÿíåì â êîðíåâîé êàòàëîã - òàì êðîìå èìåíè ôàéëà, äàòû, âðåìåíè, àòðèáóòîâ, óêàçàí ïåðâûé êëàñòåð ôàéëà è åãî ðàçìåð â áàéòàõ. Êàæäàÿ çàïèñü â êîðíåâîì êàòàëîãå ñîñòîèò èç 32 áàéò. Íàì íóæíî ïðî÷èòàòü áàéòû ñî ñìåùåíèåì 0x00,0x02,0x1A-0x1B,0x1C-0x1F. Åñëè íóëåâîé áàéò íå ðàâåí 0xE5, âòîðîé íå ðàâåí 0x00 èëè 0x04, òî 0x1B:0x1A - ïåðâûé êëàñòåð ôàéëà, à 0x1F:0x1E:0x1D:0x1C - åãî ðàçìåð â áàéòàõ. Ïîêà ïëååð áåç ýêðàíà, èìÿ ôàéëà ïîëó÷àòü íå îáÿçàòåëüíî... <br><br>
         

        <a name="sd_ps"><b class="aq">P.S.:</b></a> Êàê âûÿñíèëîñü, SD êàðòû ïîëíîñòüþ ñîâìåñòèìû ñ êàðòî÷êàìè MMC, â ò.÷. â ðåæèìå SPI. "Ëèøíèå" âûâîäû â ýòîì ðåæèìå íå èñïîëüçóþòñÿ:
        <br><br><table class="p" align="center"><tr><td class="p" rowspan="10"><IMG src="pic/sd_flash.png" alt="ðàçâîäêà SD"></td><th>PIN</th><th>Èìÿ</th><th>Ôóíêöèÿ</th></tr><tr><td class="p">1</td><td class="p">xCS</td><td class="p">Âûáîð êðèñòàëëà</td></tr><tr><td class="p">2</td><td class="p">DI</td><td class="p">Âõîäíûå äàííûå</td></tr><tr><td class="p">3</td><td class="p">VSS</td><td class="p">Çåìëÿ</td></tr><tr><td class="p">4</td><td class="p">VDD</td><td class="p">Ïèòàíèå +3.3â</td></tr><tr><td class="p">5</td><td class="p">SCLK</td><td class="p">Ñèíõðîíèçàöèÿ</td></tr><tr><td class="p">6</td><td class="p">VSS2</td><td class="p">Çåìëÿ</td></tr><tr><td class="p">7</td><td class="p">DO</td><td class="p">Âûõîäíûå äàííûå</td></tr><tr><td class="p">8</td><td class="p">RSV</td><td class="p">Ðåçåðâ</td></tr><tr><td class="p">9</td><td class="p">RSV</td><td class="p">Ðåçåðâ</td></tr></table><br>
&nbsp;&nbsp;&nbsp;&nbsp;Åäèíñòâåííî ÷òî ñòîèò ñäåëàòü - ïîñòàâèòü ïîäòÿãèâàþùèå ñîïðîòèâëåíèÿ íà âûâ. 8 è 9 (â ð-íå íåñê. äåÿòêîâ êÎì).
<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;Îñíîâíàÿ ÷àñòü ñîñòàâëåíà ïî ìàòåðèàëàì <a href="http://www.sandisk.com/pdf/oem/ProdManualMMCv5.2.pdf"target="_blank">"MultiMedia Card product manual v5.2"</a>, ñ ñàéòà <a href="http://www.sandisk.com">SanDisk</a>. Òåì, êòî çàõî÷åò ïîïîäðîáíåå ðàçîáðàòü äàííûé âîïðîñ, ðåêîìåíäóþ îáðàòèòüñÿ ê îçíà÷åííîìó äîêóìåíòó. Datasheet íà SD âçÿò ñ òîãî-æå ñàéòà :<a href="http://www.sandisk.com/pdf/oem/ProdManualSDCardv1.9.pdf"target="_blank">"SanDisk SD card product manual v1.9"</a>.
        <br>Î çàìå÷åííûõ î÷åïÿòêàõ è íåòî÷íîñòÿõ ïðîøó ïèñàòü ìíå.

        <br><div align="right"><i>&#169; Êàòè÷åâ À. 2004-2005ã</i></div>
        <hr><div align="center"><A HREF="#beg"> íà÷àëî </a>|<A HREF="javascript:history.back(-1)"> Íàçàä</a></div>
        </div>
        </td></tr>
</table>

</body></html>
<div align="center">
<br><br><br>
<table cellpadding=0 cellspacing=0 border=0>
<tr valign="top">
        <td>
                <div align="center">
                <table width="468" height="60" cellspacing="0" cellpadding="0" style="border: 1 solid #A3A5A8;">

                <tr><td align="center">

                        <a href="http://www.nm.ru/users/reg.dhtml" target="_blank" style="display:block; margin:0px"><img src="http://newmail.ru/hosting/hosting_newmail.gif" width="468" height="60" border="0"></a>

                </td></tr>

                <FORM NAME="regform" ACTION="http://www.nm.ru/users/reg.dhtml" target="_blank" METHOD="GET" >
                <tr><td align="center" valign="middle" width="468" height="40" style="background: url(http://newmail.ru/hosting/hosting_newmail_down.gif) repeat-x;">    
                               
                <input type="hidden" name="rid" value="hosting">
                                <input type="text" name="login" id="login" value="" maxlength="20" size="21" style="border: 1px solid #A3A5A8; background-color: #FFFFFF; font-size: 12px; width: 150px; height:17px; margin-bottom:2px">
                        <select name="domain" style="border: 1px solid #A3A5A8; background-color: #FFFFFF; font-size: 12px; height:16px;" >
                                        <option value="newmail.ru" >newmail.ru</option>
                                        <option value="hotmail.ru" >hotmail.ru</option>
                                        <option value="nm.ru" >nm.ru</option>
                                        <option value="nightmail.ru" >nightmail.ru</option>
                                </select>
                                <input type="submit" value="&raquo;&raquo;&raquo;" style="border:white 1px solid; background: url(http://newmail.ru/hosting/hosting_newmail_button.gif) ; font:bold 14px arial; color:white; height:21px; width:120px; cursor:pointer">
                   

                </td></tr>
                 </form>


                </table>
                </div>

                <script language="javascript"><!--skip ();
                u="count.rbc.ru/p429.gif";d=document;nv=navigator;na=nv.appName;p=0;j="N";
                n=(na.substring(0,2)=="Mi")?0:1;y="";
                y+="<img src='http://"+u+"?r="+d.referrer+"&width="+screen.width+"&height="+screen.height+"&hash="+d.location.hash.substr(1)+"&rf="+parent.document.referrer+"&rn="+Math.random();
                y+="' border=0 width=1 height=1 alt='count'>";
                d.write(y);if(!n) { d.write("<"+"!--"); }//--></script><noscript>
                <img src="http://count.rbc.ru/p429.gif" alt='count' border=0 width=1 height=1 >
                </noscript><script language="javascript1.2"><!--skip ();
                if(!n) { d.write("--"+">"); }//--></script>
                <a href="http://www.seall.ru/kino/"><img src="http://newmail.ru/forms/images/sp88_2.gif" width="88" height="2" border="0"></a>
                <!--BEGIN Back -->
                <script language="JavaScript">
                <!--
                var random = Math.floor(Math.random() * 1000000000);
                document.write('<scr' + 'ipt language="JavaScript" src="http://engine.adland.ru/code?pid=34&gid=40&oin=0&rid=' + random
                +'"></scr' + 'ipt>');
                // -->
                </script>
                <!--END Back -->
        </td>
        <td width="15px">&nbsp;</td>
        <td>
                <!--BEGIN Media2 Podval 400x90 (400x90)-->
                <script language="JavaScript">
                <!--
                var random = Math.floor(Math.random() * 1000000000), cdate = new Date();
                document.write('<iframe src="http://engine.adland.ru/code?pid=69&gid=55&oin=0&rto=0&srb=&rid=' + random + '&dom=' + cdate.getDate() + '&dow=' + cdate.getDay() + '&hod=' + cdate.getHours() + '" frameborder="0" vspace="0" hspace="0" width="400" height="90" marginwidth="0" marginheight="0" scrolling="no">');
                document.write('<a href="http://engine.adland.ru/default_reference?pid=69&gid=55" target="_top"><img src="http://engine.adland.ru/default_image?pid=69&gid=55" border="0"></a>');
                document.write('</iframe>');
                // -->
                </script>
                <noscript>
                <iframe src="http://engine.adland.ru/code?pid=69&gid=55&oin=0&rto=0" frameborder="0" vspace="0" hspace="0" width="400" height="90" marginwidth="0" marginheight="0" scrolling="no"><a href="http://engine.adland.ru/default_reference?pid=69&gid=55" target="_top"><img src="http://engine.adland.ru/default_image?pid=69&gid=55" border="0"></a></iframe>
                </noscript>
                <!--END Media2 -->
        </td>
</tr>
</table>
</div>
<script language="javascript">
var t_rn = Math.random();
var t_ref = encodeURIComponent(document.referrer);
var t_pg = encodeURIComponent(window.location.href);
var t_req = 'r='+t_ref+'&pg='+t_pg+'&'+t_rn;
document.write("<img src=\"http://t.pusk.ru/?"+t_req+"\" border=\"0\" width=\"1\" height=\"1\">");
</script>