📄 ata_8c-source.html
字号:
00187 <span class="keywordflow">for</span> (i=0; i<(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<(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)) & 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>>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 & 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 & 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>>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 & 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 & 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 & 0x000000ffL );00342 lba = lba >> 8;00343 cyl = (<span class="keywordtype">int</span>) ( lba & 0x0000ffff );00344 lba = lba >> 16;00345 head = ( (<span class="keywordtype">int</span>) ( lba & 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 & 0x000000ffL );00371 lba = lba >> 8;00372 cyl = (<span class="keywordtype">int</span>) ( lba & 0x0000ffff );00373 lba = lba >> 16;00374 head = ( (<span class="keywordtype">int</span>) ( lba & 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 + -