⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ata_8c-source.html

📁 方便飞利浦arm7tdmi 处理器lpc2100开发的C函数库 Procyon ARMlib-LPC2100 C-Language Function Library for Philips LPC21
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00187     <span class="keywordflow">for</span> (i=0; i&lt;(numBytes/16); i++)00188     {00189         <span class="comment">// optimize by reading 16 bytes in-line before looping</span>00190         *buf++ = membusRead(ATA_REG_DATA);00191         *buf++ = membusRead(ATA_REG_DATA);00192         *buf++ = membusRead(ATA_REG_DATA);00193         *buf++ = membusRead(ATA_REG_DATA);00194         *buf++ = membusRead(ATA_REG_DATA);00195         *buf++ = membusRead(ATA_REG_DATA);00196         *buf++ = membusRead(ATA_REG_DATA);00197         *buf++ = membusRead(ATA_REG_DATA);00198     }00199     <span class="comment">//cbi(MCUCR, SRW);          // disable RAM waitstate</span>00200     00201 }00202 00203 <span class="keywordtype">void</span> ataWriteDataBuffer(u08 *Buffer, u16 numBytes)00204 {00205     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00206 00207     uint16_t* buf = (uint16_t*)Buffer;00208 00209     <span class="comment">// write data to drive</span>00210     <span class="keywordflow">for</span> (i=0; i&lt;(numBytes/16); i++)     00211     {00212         <span class="comment">// optimize by writing 16 bytes in-line before looping</span>00213         membusWrite(ATA_REG_DATA, *buf++);00214         membusWrite(ATA_REG_DATA, *buf++);00215         membusWrite(ATA_REG_DATA, *buf++);00216         membusWrite(ATA_REG_DATA, *buf++);00217         membusWrite(ATA_REG_DATA, *buf++);00218         membusWrite(ATA_REG_DATA, *buf++);00219         membusWrite(ATA_REG_DATA, *buf++);00220         membusWrite(ATA_REG_DATA, *buf++);00221     }00222 }00223 00224 u08 ataStatusWait(u08 mask, u08 waitStatus)00225 {00226     <span class="keyword">register</span> u08 status;00227 00228     delay(100);00229 00230     <span class="comment">// wait for desired status</span>00231     <span class="keywordflow">while</span>( ((status = ataReadByte(ATA_REG_CMDSTATUS1)) &amp; mask) == waitStatus );00232 00233     <span class="keywordflow">return</span> status;00234 }00235 00236 00237 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataReadSectorsCHS(    <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00238                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Head, 00239                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Track,00240                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Sector,00241                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00242                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00243 {00244     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00245 00246     <span class="comment">// Wait for drive to be ready</span>00247     temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00248 00249     <span class="comment">// Prepare parameters...</span>00250     ataWriteByte(ATA_REG_HDDEVSEL, 0xA0+(Drive ? 0x10:00)+Head); <span class="comment">// CHS mode/Drive/Head</span>00251     ataWriteByte(ATA_REG_CYLHI, Track&gt;&gt;8);          <span class="comment">// MSB of track</span>00252     ataWriteByte(ATA_REG_CYLLO, Track);             <span class="comment">// LSB of track</span>00253     ataWriteByte(ATA_REG_STARTSEC, Sector);     <span class="comment">// sector</span>00254     ataWriteByte(ATA_REG_SECCOUNT, numsectors); <span class="comment">// # of sectors</span>00255 00256     <span class="comment">// Issue read sector command...</span>00257     ataWriteByte(ATA_REG_CMDSTATUS1, 0x21);00258 00259     <span class="comment">// Wait for drive to be ready</span>00260     temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00261 00262     <span class="keywordflow">if</span> (temp &amp; ATA_SR_ERR)00263     {00264         <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">"RD ERR\r\n"</span>);00265         <span class="keywordflow">return</span> 1;00266     }00267 00268     <span class="comment">// Wait for drive to request data transfer</span>00269     ataStatusWait(ATA_SR_DRQ, 0);00270 00271     <span class="comment">// read data from drive</span>00272     ataReadDataBuffer(Buffer, 512*numsectors);00273 00274     <span class="comment">// Return the error bit from the status register...</span>00275     temp = ataReadByte(ATA_REG_CMDSTATUS1); <span class="comment">// read status register</span>00276 00277     <span class="keywordflow">return</span> (temp &amp; ATA_SR_ERR) ? 1:0;00278 }00279 00280 00281 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataWriteSectorsCHS(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00282                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Head, 00283                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Track,00284                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Sector,00285                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00286                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00287 {00288     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00289 00290     <span class="comment">// Wait for drive to be ready</span>00291     temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00292 00293     <span class="comment">// Prepare parameters...</span>00294     ataWriteByte(ATA_REG_HDDEVSEL, 0xA0+(Drive ? 0x10:00)+Head); <span class="comment">// CHS mode/Drive/Head</span>00295     ataWriteByte(ATA_REG_CYLHI, Track&gt;&gt;8);          <span class="comment">// MSB of track</span>00296     ataWriteByte(ATA_REG_CYLLO, Track);             <span class="comment">// LSB of track</span>00297     ataWriteByte(ATA_REG_STARTSEC, Sector);     <span class="comment">// sector</span>00298     ataWriteByte(ATA_REG_SECCOUNT, numsectors); <span class="comment">// # of sectors</span>00299 00300     <span class="comment">// Issue write sector command</span>00301     ataWriteByte(ATA_REG_CMDSTATUS1, 0x31);00302 00303     <span class="comment">//delay(100);</span>00304 00305     <span class="comment">// Wait for drive to request data transfer</span>00306     ataStatusWait(ATA_SR_DRQ, 0);00307 00308     <span class="comment">// write data to drive</span>00309     ataWriteDataBuffer(Buffer, 512*numsectors);00310     00311     <span class="comment">// Wait for drive to finish write</span>00312     temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00313 00314     <span class="comment">// check for errors</span>00315     <span class="keywordflow">if</span> (temp &amp; ATA_SR_ERR)00316     {00317         <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">"WR ERR\r\n"</span>);00318         <span class="keywordflow">return</span> 1;00319     }00320 00321     <span class="comment">// Return the error bit from the status register...</span>00322     <span class="keywordflow">return</span> (temp &amp; ATA_SR_ERR) ? 1:0;00323 }00324 00325 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataReadSectorsLBA(    <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00326                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> lba,00327                                             <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00328                                     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00329 {00330     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cyl, head, sect;00331     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00332 00333 <span class="preprocessor">#ifdef DEBUG_ATA</span>00334 <span class="preprocessor"></span>    <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">"ATA LBA read "</span>);00335     <a class="code" href="rprintf_8h.html#a15">rprintfu32</a>(lba); <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">" "</span>);00336     <a class="code" href="rprintf_8h.html#a14">rprintfu16</a>(numsectors); <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">" "</span>);00337     <a class="code" href="rprintf_8h.html#a14">rprintfu16</a>((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)Buffer); 00338     <a class="code" href="rprintf_8c.html#a10">rprintfCRLF</a>();00339 <span class="preprocessor">#endif</span>00340 <span class="preprocessor"></span>00341     sect = (<span class="keywordtype">int</span>) ( lba &amp; 0x000000ffL );00342     lba = lba &gt;&gt; 8;00343     cyl = (<span class="keywordtype">int</span>) ( lba &amp; 0x0000ffff );00344     lba = lba &gt;&gt; 16;00345     head = ( (<span class="keywordtype">int</span>) ( lba &amp; 0x0fL ) ) | ATA_HEAD_USE_LBA;00346 00347     temp = ataReadSectorsCHS( Drive, head, cyl, sect, numsectors, Buffer );00348 00349     <span class="keywordflow">if</span>(temp)00350         ataDiskErr();00351     <span class="keywordflow">return</span> temp;00352 }00353 00354 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataWriteSectorsLBA(   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00355                                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> lba,00356                                                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00357                                         <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00358 {00359     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cyl, head, sect;00360     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00361 00362 <span class="preprocessor">#ifdef DEBUG_ATA</span>00363 <span class="preprocessor"></span>    <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">"ATA LBA write "</span>);00364     <a class="code" href="rprintf_8h.html#a15">rprintfu32</a>(lba); <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">" "</span>);00365     <a class="code" href="rprintf_8h.html#a14">rprintfu16</a>(numsectors); <a class="code" href="rprintf_8h.html#a8">rprintfStr</a>(<span class="stringliteral">" "</span>);00366     <a class="code" href="rprintf_8h.html#a14">rprintfu16</a>((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)Buffer); 00367     <a class="code" href="rprintf_8c.html#a10">rprintfCRLF</a>();00368 <span class="preprocessor">#endif</span>00369 <span class="preprocessor"></span>00370     sect = (<span class="keywordtype">int</span>) ( lba &amp; 0x000000ffL );00371     lba = lba &gt;&gt; 8;00372     cyl = (<span class="keywordtype">int</span>) ( lba &amp; 0x0000ffff );00373     lba = lba &gt;&gt; 16;00374     head = ( (<span class="keywordtype">int</span>) ( lba &amp; 0x0fL ) ) | ATA_HEAD_USE_LBA;00375 00376     temp = ataWriteSectorsCHS( Drive, head, cyl, sect, numsectors, Buffer );00377 00378     <span class="keywordflow">if</span>(temp)00379         ataDiskErr();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -