📄 mmc_8c-source.html
字号:
<a name="l00465"></a>00465 count = 0;<a name="l00466"></a>00466 }<a name="l00467"></a>00467 <span class="keywordflow">else</span> { <span class="comment">/* Multiple block write */</span><a name="l00468"></a>00468 <span class="keywordflow">if</span> (CardType & 2) {<a name="l00469"></a>00469 send_cmd(<a class="code" href="mmc_8c.html#78289a7a85ffcfddd626694105dc0780">CMD55</a>, 0); send_cmd(<a class="code" href="mmc_8c.html#14506e981f38b6177bc36f72c2ca18b1">CMD23</a>, count); <span class="comment">/* ACMD23 */</span><a name="l00470"></a>00470 }<a name="l00471"></a>00471 <span class="keywordflow">if</span> (send_cmd(<a class="code" href="mmc_8c.html#ee2c673fba987178f4642531fdeefe9e">CMD25</a>, sector) == 0) { <span class="comment">/* WRITE_MULTIPLE_BLOCK */</span><a name="l00472"></a>00472 <span class="keywordflow">do</span> {<a name="l00473"></a>00473 <span class="keywordflow">if</span> (!xmit_datablock(buff, 0xFC)) <span class="keywordflow">break</span>;<a name="l00474"></a>00474 buff += 512;<a name="l00475"></a>00475 } <span class="keywordflow">while</span> (--count);<a name="l00476"></a>00476 <span class="keywordflow">if</span> (!xmit_datablock(0, 0xFD)) <span class="comment">/* STOP_TRAN token */</span><a name="l00477"></a>00477 count = 1;<a name="l00478"></a>00478 }<a name="l00479"></a>00479 }<a name="l00480"></a>00480 <a name="l00481"></a>00481 <a class="code" href="mmc_8c.html#1cbd972fc333e07d29999e284020c362">DESELECT</a>(); <span class="comment">/* CS = H */</span><a name="l00482"></a>00482 rcvr_spi(); <span class="comment">/* Idle (Release DO) */</span><a name="l00483"></a>00483 <a name="l00484"></a>00484 <span class="keywordflow">return</span> count ? RES_ERROR : RES_OK;<a name="l00485"></a>00485 }<a name="l00486"></a>00486 <span class="preprocessor">#endif </span><span class="comment">/* _READONLY */</span><a name="l00487"></a>00487 <a name="l00488"></a>00488 <a name="l00489"></a>00489 <a name="l00490"></a>00490 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00491"></a>00491 <span class="comment">/* Miscellaneous Functions */</span><a name="l00492"></a>00492 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00493"></a>00493 <a name="l00494"></a><a class="code" href="mmc_8c.html#e342f09a55603a5053750e2fd040f4a8">00494</a> DRESULT <a class="code" href="mmc_8c.html#e342f09a55603a5053750e2fd040f4a8">disk_ioctl</a> (<a name="l00495"></a>00495 BYTE drv, <span class="comment">/* Physical drive nmuber (0) */</span><a name="l00496"></a>00496 BYTE ctrl, <span class="comment">/* Control code */</span><a name="l00497"></a>00497 <span class="keywordtype">void</span> *buff <span class="comment">/* Buffer to send/receive control data */</span><a name="l00498"></a>00498 )<a name="l00499"></a>00499 {<a name="l00500"></a>00500 DRESULT res;<a name="l00501"></a>00501 BYTE n, csd[16];<a name="l00502"></a>00502 WORD csize;<a name="l00503"></a>00503 <a name="l00504"></a>00504 <a name="l00505"></a>00505 <span class="keywordflow">if</span> (drv) <span class="keywordflow">return</span> RES_PARERR;<a name="l00506"></a>00506 <span class="keywordflow">if</span> (Stat & STA_NOINIT) <span class="keywordflow">return</span> RES_NOTRDY;<a name="l00507"></a>00507 <a name="l00508"></a>00508 <a class="code" href="mmc_8c.html#56e8d2ffde94d0c5fdf14b772a32a77f">SELECT</a>(); <span class="comment">/* CS = L */</span><a name="l00509"></a>00509 <a name="l00510"></a>00510 res = RES_ERROR;<a name="l00511"></a>00511 <span class="keywordflow">switch</span> (ctrl) {<a name="l00512"></a>00512 <span class="keywordflow">case</span> GET_SECTOR_COUNT : <span class="comment">/* Get number of sectors on the disk (DWORD) */</span><a name="l00513"></a>00513 <span class="keywordflow">if</span> ((send_cmd(<a class="code" href="mmc_8c.html#1fac6a251d7e7dc204d21639bf521459">CMD9</a>, 0) == 0) && rcvr_datablock(csd, 16)) {<a name="l00514"></a>00514 <span class="keywordflow">if</span> ((csd[0] >> 6) == 1) { <span class="comment">/* SDC ver 2.00 */</span><a name="l00515"></a>00515 csize = csd[9] + ((WORD)csd[8] << 8) + 1;<a name="l00516"></a>00516 *(DWORD*)buff = (DWORD)csize << 10;<a name="l00517"></a>00517 } <span class="keywordflow">else</span> { <span class="comment">/* MMC or SDC ver 1.XX */</span><a name="l00518"></a>00518 n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;<a name="l00519"></a>00519 csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1;<a name="l00520"></a>00520 *(DWORD*)buff = (DWORD)csize << (n - 9);<a name="l00521"></a>00521 }<a name="l00522"></a>00522 res = RES_OK;<a name="l00523"></a>00523 }<a name="l00524"></a>00524 <span class="keywordflow">break</span>;<a name="l00525"></a>00525 <a name="l00526"></a>00526 <span class="keywordflow">case</span> GET_SECTOR_SIZE : <span class="comment">/* Get sectors on the disk (WORD) */</span><a name="l00527"></a>00527 *(WORD*)buff = 512;<a name="l00528"></a>00528 res = RES_OK;<a name="l00529"></a>00529 <span class="keywordflow">break</span>;<a name="l00530"></a>00530 <a name="l00531"></a>00531 <span class="keywordflow">case</span> CTRL_SYNC : <span class="comment">/* Make sure that data has been written */</span><a name="l00532"></a>00532 <span class="keywordflow">if</span> (wait_ready() == 0xFF)<a name="l00533"></a>00533 res = RES_OK;<a name="l00534"></a>00534 <span class="keywordflow">break</span>;<a name="l00535"></a>00535 <a name="l00536"></a>00536 <span class="keywordflow">case</span> MMC_GET_CSD : <span class="comment">/* Receive CSD as a data block (16 bytes) */</span><a name="l00537"></a>00537 <span class="keywordflow">if</span> ((send_cmd(CMD9, 0) == 0) <span class="comment">/* READ_CSD */</span><a name="l00538"></a>00538 && rcvr_datablock(buff, 16/2))<a name="l00539"></a>00539 res = RES_OK;<a name="l00540"></a>00540 <span class="keywordflow">break</span>;<a name="l00541"></a>00541 <a name="l00542"></a>00542 <span class="keywordflow">case</span> MMC_GET_CID : <span class="comment">/* Receive CID as a data block (16 bytes) */</span><a name="l00543"></a>00543 <span class="keywordflow">if</span> ((send_cmd(<a class="code" href="mmc_8c.html#e7b800ed8e7bd52e6f570a5ce72b8104">CMD10</a>, 0) == 0) <span class="comment">/* READ_CID */</span><a name="l00544"></a>00544 && rcvr_datablock(buff, 16/2))<a name="l00545"></a>00545 res = RES_OK;<a name="l00546"></a>00546 <span class="keywordflow">break</span>;<a name="l00547"></a>00547 <a name="l00548"></a>00548 <span class="keywordflow">case</span> MMC_GET_OCR : <span class="comment">/* Receive OCR as an R3 resp (4 bytes) */</span><a name="l00549"></a>00549 <span class="keywordflow">if</span> (send_cmd(<a class="code" href="mmc_8c.html#a7a26b2cf17e1ff5967820a1fa41a7aa">CMD58</a>, 0) == 0) { <span class="comment">/* READ_OCR */</span><a name="l00550"></a>00550 <span class="keywordflow">for</span> (n = 0; n < 4; n++)<a name="l00551"></a>00551 *((BYTE*)buff+n) = rcvr_spi();<a name="l00552"></a>00552 res = RES_OK;<a name="l00553"></a>00553 }<a name="l00554"></a>00554 <span class="keywordflow">break</span>;<a name="l00555"></a>00555 <a name="l00556"></a>00556 <span class="keywordflow">default</span>:<a name="l00557"></a>00557 res = RES_PARERR;<a name="l00558"></a>00558 }<a name="l00559"></a>00559 <a name="l00560"></a>00560 <a class="code" href="mmc_8c.html#1cbd972fc333e07d29999e284020c362">DESELECT</a>(); <span class="comment">/* CS = H */</span><a name="l00561"></a>00561 rcvr_spi(); <span class="comment">/* Idle (Release DO) */</span><a name="l00562"></a>00562 <a name="l00563"></a>00563 <span class="keywordflow">return</span> res;<a name="l00564"></a>00564 }<a name="l00565"></a>00565 <a name="l00566"></a>00566 <a name="l00567"></a>00567 <a name="l00568"></a>00568 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00569"></a>00569 <span class="comment">/* Device timer interrupt procedure (Platform dependent) */</span><a name="l00570"></a>00570 <span class="comment">/*-----------------------------------------------------------------------*/</span><a name="l00571"></a>00571 <span class="comment">/* This function must be called in period of 10ms */</span><a name="l00572"></a>00572 <a name="l00573"></a><a class="code" href="mmc_8c.html#045f8898a243c16aca4e64e069c49c03">00573</a> <span class="keywordtype">void</span> <a class="code" href="mmc_8c.html#045f8898a243c16aca4e64e069c49c03">disk_timerproc</a> (<span class="keywordtype">void</span>)<a name="l00574"></a>00574 {<a name="l00575"></a>00575 <span class="keyword">static</span> BYTE pv;<a name="l00576"></a>00576 BYTE n, s;<a name="l00577"></a>00577 <a name="l00578"></a>00578 <a name="l00579"></a>00579 n = Timer1; <span class="comment">/* 100Hz decrement timer */</span><a name="l00580"></a>00580 <span class="keywordflow">if</span> (n) Timer1 = --n;<a name="l00581"></a>00581 n = Timer2;<a name="l00582"></a>00582 <span class="keywordflow">if</span> (n) Timer2 = --n;<a name="l00583"></a>00583 <a name="l00584"></a>00584 <a name="l00585"></a>00585 n = pv; <span class="comment">// store old value</span><a name="l00586"></a>00586 pv = <a class="code" href="mmc_8c.html#f0d219bf523e1f70163e044c4cbc20af">MMC_cardPresent</a> () | <a class="code" href="mmc_8c.html#fab21f6428fd2447dee44d73a5b7042e">MMC_cardWriteProtected</a> ();<a name="l00587"></a>00587 <a name="l00588"></a>00588 <span class="keywordflow">if</span> (n == pv) <span class="comment">/* Have contacts stabled? */</span><a name="l00589"></a>00589 {<a name="l00590"></a>00590 <a name="l00591"></a>00591 s = Stat;<a name="l00592"></a>00592 <a name="l00593"></a>00593 <span class="keywordflow">if</span> (pv & <a class="code" href="mmc_8c.html#572cdb8c6d4db7fa9fcf995c55f9e60b">SOCKWP</a>) <span class="comment">/* WP is H (write protected) */</span><a name="l00594"></a>00594 {<a name="l00595"></a>00595 s |= STA_PROTECT;<a name="l00596"></a>00596 }<a name="l00597"></a>00597 <span class="keywordflow">else</span> <span class="comment">/* WP is L (write enabled) */</span><a name="l00598"></a>00598 {<a name="l00599"></a>00599 s &= ~STA_PROTECT;<a name="l00600"></a>00600 }<a name="l00601"></a>00601 <a name="l00602"></a>00602 <span class="keywordflow">if</span> (pv & <a class="code" href="mmc_8c.html#293d517245047871e5ba4eaebae946a7">SOCKINS</a>) <span class="comment">/* INS = H (Socket empty) */</span><a name="l00603"></a>00603 {<a name="l00604"></a>00604 s |= (STA_NODISK | STA_NOINIT);<a name="l00605"></a>00605 }<a name="l00606"></a>00606 <span class="keywordflow">else</span> <span class="comment">/* INS = L (Card inserted) */</span><a name="l00607"></a>00607 {<a name="l00608"></a>00608 s &= ~STA_NODISK;<a name="l00609"></a>00609 }<a name="l00610"></a>00610 <a name="l00611"></a>00611 Stat = s;<a name="l00612"></a>00612 }<a name="l00613"></a>00613 }<a name="l00614"></a>00614 </pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 21 19:25:34 2007 for Sample MSP430-4619LCD Project by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.1 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -