📄 mmc_8c-source.html
字号:
00194 ConsolePutChar(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[7]);00195 ConsolePutChar(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[8]);00196 ConsoleWrite(<span class="stringliteral">" Production date: "</span>);00197 ConsolePutUInt(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[14]>>4);00198 ConsoleWrite(<span class="stringliteral">"/ "</span>);00199 ConsolePutUInt((<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[14]&0x0f)+1997);00200 ConsolePutChar(<span class="charliteral">'\r'</span>);00201 ConsoleWrite(<span class="stringliteral">"Media serial number: "</span>);00202 ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[10]);00203 ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[11]);00204 ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[12]);00205 ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[13]);00206 ConsolePutChar(<span class="charliteral">'\r'</span>);00207 00208 <span class="comment">/* print out card ident register</span>00209 <span class="comment"> for (c=0; c<30; c++){</span>00210 <span class="comment"> if ((c&0x03)==0) ConsolePutChar(' ');</span>00211 <span class="comment"> ConsolePutHex8(diskSect.raw.buf[c]);</span>00212 <span class="comment"> }</span>00213 <span class="comment"> */</span>00214 00215 <span class="keywordflow">return</span> 0; <span class="comment">/* All OK return */</span>00216 }00217 00218 00219 <a name="l00221"></a><a class="code" href="mmc_8c.html#a4">00221</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="mmc_8c.html#a4">RebootMMC</a>(){00222 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c;00223 00224 <span class="comment">//Try (indefinitely) to switch on the MMC card</span>00225 <span class="keywordflow">do</span>{00226 <span class="comment">/* MMC Don't use CRC - seems to be required by some MMC cards? */</span>00227 <a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x7B,0,0,0,0);00228 <span class="comment">/* MMC Init, command 0x40 should return 0x01 (idle) if all is ok. */</span>00229 }<span class="keywordflow">while</span> (<a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x40,0,0,0,0)!=0x01);00230 <span class="comment">// 0x01(idle) response detected.</span>00231 00232 ConsoleWrite(<span class="stringliteral">"Card found, starting... "</span>);00233 <span class="comment">/*Try max 255 times MMC Wake-up call: set to Not Idle (mmc returns 0x00)*/</span>00234 c=255;00235 <span class="keywordflow">while</span> ((c--)&&(<a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x41,0,0,0,16))){00236 <a class="code" href="board_8h.html#a49">Delay</a>(10);00237 <span class="keywordflow">if</span> (c==1){00238 <span class="comment">//timeout</span>00239 ConsoleWrite(<span class="stringliteral">"Failed.\r"</span>);00240 <span class="keywordflow">return</span> 2; <span class="comment">/* Not able to power up mmc */</span>00241 }00242 }00243 00244 ConsoleWrite(<span class="stringliteral">"Ok.\r"</span>);00245 <span class="keywordflow">return</span> 0;00246 }00247 00248 <a name="l00249"></a><a class="code" href="mmc_8h.html#a1">00249</a> <a class="code" href="board_8h.html#a45">Public</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="mmc_8c.html#a5">InitMMC</a>(){00250 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c;00251 00252 <span class="comment">//Switch off the MMC power supply</span>00253 <a class="code" href="board_8h.html#a28">MMC_OFF</a> = <a class="code" href="board_8h.html#a26">YES</a>; 00254 ConsoleWrite (<span class="stringliteral">"Init: MMC\r"</span>);00255 <a class="code" href="board_8h.html#a49">Delay</a>(100);00256 00257 <span class="comment">//Switch on the MMC power supply</span>00258 <a class="code" href="board_8h.html#a28">MMC_OFF</a> = <a class="code" href="board_8h.html#a27">NO</a>;00259 <a class="code" href="board_8h.html#a49">Delay</a>(100);00260 00261 <span class="comment">/* Allow MMC some time and clock cycles to reset */</span>00262 <span class="keywordflow">for</span> (c=0; c<200; c++){ 00263 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00264 <a class="code" href="board_8h.html#a41">SPIWait</a>();00265 }00266 <a class="code" href="board_8h.html#a49">Delay</a>(20);00267 00268 <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#a4">RebootMMC</a>()) <span class="keywordflow">return</span> 1; <span class="comment">//not able to powerup;</span>00269 <span class="comment">//An existing MMC card should be able to respond now.</span>00270 00271 <a class="code" href="mmc_8c.html#a3">GetStorageInformation</a>();00272 00273 <span class="comment">/* Set Block Size of 512 bytes (2 == 512 << 8) */</span>00274 <span class="keywordflow">if</span> ((c=<a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x50,0,0,2,0))) <span class="keywordflow">return</span> c|0x80; <span class="comment">/* blocksize error */</span>00275 00276 ConsoleWrite(<span class="stringliteral">"Scanning storage... "</span>);00277 00278 <span class="comment">/* Check if MMC supports interrupted data transfer */</span>00279 <span class="comment">/* This does a simple checksum check to see if interrupted and </span>00280 <span class="comment"> * non-interrupted read blocks are the same. */</span>00281 <span class="comment">/* This could be a function, so it is in braces for clarity purposes */</span>00282 { 00283 <span class="keywordflow">if</span> (<a class="code" href="mmc_8h.html#a2">SeekSector</a>(0)) <span class="keywordflow">return</span> 2; <span class="comment">//Storage powerup failure </span>00284 <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#a9">ReadPhysicalSector</a>()) <span class="keywordflow">return</span> 2; <span class="comment">//Storage powerup failure</span>00285 00286 <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> = <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[511];00287 <span class="keywordflow">for</span> (c=0; c<250; c++){00288 <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> += <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[c];00289 }00290 00291 ConsoleWrite(<span class="stringliteral">"Testing for seek mode..."</span>);00292 <span class="keywordflow">if</span> (<a class="code" href="mmc_8h.html#a2">SeekSector</a>(0)) <span class="keywordflow">return</span> 2;<span class="comment">//Storage powerup failure</span>00293 00294 <span class="comment">/* Send some extra SPI clocks */</span>00295 <a class="code" href="board_8h.html#a29">MMC_XCS</a> = <a class="code" href="board_8h.html#a31">MMC_NOT_SELECTED</a>;00296 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00297 <span class="keywordflow">for</span> (c=0; c<100; c++){00298 <a class="code" href="board_8h.html#a42">SPIPutChar</a>(0xff);00299 }00300 <a class="code" href="board_8h.html#a41">SPIWait</a>();00301 00302 <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#a9">ReadPhysicalSector</a>()){00303 ConsoleWrite(<span class="stringliteral">"Interrupted read failed.\r"</span>);00304 ConsoleWrite(<span class="stringliteral">"Using compatibility mode.\r"</span>);00305 <span class="keywordflow">return</span> 0x0e; <span class="comment">//ok but no support for seek-before-read</span>00306 00307 }<span class="keywordflow">else</span>{ 00308 <span class="comment">//Check if received data was same</span>00309 <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> -= <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[511];00310 <span class="keywordflow">for</span> (c=0; c<250; c++){00311 <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> -= <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[c];00312 }00313 }00314 00315 <span class="keywordflow">if</span> (<a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a>) { <span class="comment">/* Checksum does not match */</span>00316 ConsoleWrite(<span class="stringliteral">"This MMC has no support for interrupted read. "</span>);00317 ConsoleWrite(<span class="stringliteral">"Using compatibility mode.\r"</span>);00318 <span class="keywordflow">return</span> 0x0e; <span class="comment">//ok but no support for seek-before-read</span>00319 }00320 00321 ConsoleWrite(<span class="stringliteral">"\rInitMMC ok.\r"</span>);00322 }00323 00324 <span class="comment">/* All OK return */</span>00325 <span class="keywordflow">return</span> 0; <span class="comment">//ok and MMC supports seek-before-read</span>00326 00327 }00328 00329 <a name="l00332"></a><a class="code" href="mmc_8c.html#a6">00332</a> <span class="keywordtype">void</span> <a class="code" href="mmc_8c.html#a6">PerformBlockRead</a>(){00333 00334 <span class="preprocessor">#ifdef MMCDEBUG</span>00335 <span class="preprocessor"></span> ConsoleWrite(<span class="stringliteral">"<R"</span>); <span class="comment">//Actual Read</span>00336 <span class="preprocessor">#endif</span>00337 <span class="preprocessor"></span>00338 <span class="comment">/* Use shared global buffer pointer for speed*/</span>00339 <span class="comment">/* Loop unrolled 16 times for SPEED! :) */</span>00340 <a class="code" href="buffer_8c.html#a1">dataBufPtr</a> = <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>;00341 <span class="keywordflow">while</span> (<a class="code" href="buffer_8c.html#a1">dataBufPtr</a> < <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>+512){00342 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00343 <a class="code" href="board_8h.html#a41">SPIWait</a>();00344 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00345 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00346 <a class="code" href="board_8h.html#a41">SPIWait</a>();00347 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00348 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00349 <a class="code" href="board_8h.html#a41">SPIWait</a>();00350 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00351 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00352 <a class="code" href="board_8h.html#a41">SPIWait</a>();00353 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00354 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00355 <a class="code" href="board_8h.html#a41">SPIWait</a>();00356 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00357 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00358 <a class="code" href="board_8h.html#a41">SPIWait</a>();00359 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00360 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00361 <a class="code" href="board_8h.html#a41">SPIWait</a>();00362 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00363 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00364 <a class="code" href="board_8h.html#a41">SPIWait</a>();00365 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00366 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00367 <a class="code" href="board_8h.html#a41">SPIWait</a>();00368 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00369 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00370 <a class="code" href="board_8h.html#a41">SPIWait</a>();00371 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00372 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00373 <a class="code" href="board_8h.html#a41">SPIWait</a>();00374 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;00375 <a class="code" href="board_8h.html#a43">SPIPutCharWithoutWaiting</a>(0xff);00376 <a class="code" href="board_8h.html#a41">SPIWait</a>();00377 *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a44">SPI_RESULT_BYTE</a>;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -