📄 ata_8c-source.html
字号:
00200 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00201 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL);00202 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00203 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL);00204 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00205 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL);00206 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00207 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL);00208 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00209 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL);00210 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00211 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL);00212 *Buffer++ = *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH);00213 }00214 <span class="comment">//cbi(MCUCR, SRW); // disable RAM waitstate</span>00215 00216 }00217 00218 <span class="keywordtype">void</span> ataWriteDataBuffer(u08 *Buffer, u16 numBytes)00219 {00220 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00221 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00222 00223 <span class="comment">//sbi(MCUCR, SRW); // enable RAM waitstate</span>00224 00225 <span class="comment">// write data to drive</span>00226 <span class="keywordflow">for</span> (i=0; i<(numBytes/16); i++) 00227 {00228 <span class="comment">// optimize by writing 16 bytes in-line before looping</span>00229 <span class="comment">// keep byte order correct by using temp register</span>00230 temp = *Buffer++;00231 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00232 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00233 temp = *Buffer++;00234 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00235 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00236 temp = *Buffer++;00237 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00238 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00239 temp = *Buffer++;00240 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00241 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00242 temp = *Buffer++;00243 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00244 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00245 temp = *Buffer++;00246 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00247 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00248 temp = *Buffer++;00249 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00250 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00251 temp = *Buffer++;00252 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAH) = *Buffer++;00253 *((<span class="keyword">volatile</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) ATA_REG_BASE + ATA_REG_DATAL) = temp;00254 }00255 <span class="comment">//cbi(MCUCR, SRW); // disable RAM waitstate</span>00256 00257 }00258 00259 u08 ataStatusWait(u08 mask, u08 waitStatus)00260 {00261 <span class="keyword">register</span> u08 status;00262 00263 delay(100);00264 00265 <span class="comment">// wait for desired status</span>00266 <span class="keywordflow">while</span>( ((status = ataReadByte(ATA_REG_CMDSTATUS1)) & mask) == waitStatus );00267 00268 <span class="keywordflow">return</span> status;00269 }00270 00271 00272 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataReadSectorsCHS( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00273 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Head, 00274 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Track,00275 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Sector,00276 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00277 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00278 {00279 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00280 00281 <span class="comment">// Wait for drive to be ready</span>00282 temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00283 00284 <span class="comment">// Prepare parameters...</span>00285 ataWriteByte(ATA_REG_HDDEVSEL, 0xA0+(Drive ? 0x10:00)+Head); <span class="comment">// CHS mode/Drive/Head</span>00286 ataWriteByte(ATA_REG_CYLHI, Track>>8); <span class="comment">// MSB of track</span>00287 ataWriteByte(ATA_REG_CYLLO, Track); <span class="comment">// LSB of track</span>00288 ataWriteByte(ATA_REG_STARTSEC, Sector); <span class="comment">// sector</span>00289 ataWriteByte(ATA_REG_SECCOUNT, numsectors); <span class="comment">// # of sectors</span>00290 00291 <span class="comment">// Issue read sector command...</span>00292 ataWriteByte(ATA_REG_CMDSTATUS1, 0x21);00293 00294 <span class="comment">// Wait for drive to be ready</span>00295 temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00296 00297 <span class="keywordflow">if</span> (temp & ATA_SR_ERR)00298 {00299 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"RD ERR\r\n"</span>);00300 <span class="keywordflow">return</span> 1;00301 }00302 00303 <span class="comment">// Wait for drive to request data transfer</span>00304 ataStatusWait(ATA_SR_DRQ, 0);00305 00306 <span class="comment">// read data from drive</span>00307 ataReadDataBuffer(Buffer, 512*numsectors);00308 00309 <span class="comment">// Return the error bit from the status register...</span>00310 temp = ataReadByte(ATA_REG_CMDSTATUS1); <span class="comment">// read status register</span>00311 00312 <span class="keywordflow">return</span> (temp & ATA_SR_ERR) ? 1:0;00313 }00314 00315 00316 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataWriteSectorsCHS(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00317 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Head, 00318 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Track,00319 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Sector,00320 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00321 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00322 {00323 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00324 00325 <span class="comment">// Wait for drive to be ready</span>00326 temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00327 00328 <span class="comment">// Prepare parameters...</span>00329 ataWriteByte(ATA_REG_HDDEVSEL, 0xA0+(Drive ? 0x10:00)+Head); <span class="comment">// CHS mode/Drive/Head</span>00330 ataWriteByte(ATA_REG_CYLHI, Track>>8); <span class="comment">// MSB of track</span>00331 ataWriteByte(ATA_REG_CYLLO, Track); <span class="comment">// LSB of track</span>00332 ataWriteByte(ATA_REG_STARTSEC, Sector); <span class="comment">// sector</span>00333 ataWriteByte(ATA_REG_SECCOUNT, numsectors); <span class="comment">// # of sectors</span>00334 00335 <span class="comment">// Issue write sector command</span>00336 ataWriteByte(ATA_REG_CMDSTATUS1, 0x31);00337 00338 <span class="comment">//delay(100);</span>00339 00340 <span class="comment">// Wait for drive to request data transfer</span>00341 ataStatusWait(ATA_SR_DRQ, 0);00342 00343 <span class="comment">// write data to drive</span>00344 ataWriteDataBuffer(Buffer, 512*numsectors);00345 00346 <span class="comment">// Wait for drive to finish write</span>00347 temp = ataStatusWait(ATA_SR_BSY, ATA_SR_BSY);00348 00349 <span class="comment">// check for errors</span>00350 <span class="keywordflow">if</span> (temp & ATA_SR_ERR)00351 {00352 <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"WR ERR\r\n"</span>);00353 <span class="keywordflow">return</span> 1;00354 }00355 00356 <span class="comment">// Return the error bit from the status register...</span>00357 <span class="keywordflow">return</span> (temp & ATA_SR_ERR) ? 1:0;00358 }00359 00360 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataReadSectorsLBA( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00361 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> lba,00362 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00363 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00364 {00365 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cyl, head, sect;00366 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00367 00368 <span class="preprocessor">#ifdef DEBUG_ATA</span>00369 <span class="preprocessor"></span> <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"ATA LBA read "</span>);00370 <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(lba); <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">" "</span>);00371 <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(numsectors); <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">" "</span>);00372 <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)Buffer); 00373 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00374 <span class="preprocessor">#endif</span>00375 <span class="preprocessor"></span>00376 sect = (int) ( lba & 0x000000ffL );00377 lba = lba >> 8;00378 cyl = (int) ( lba & 0x0000ffff );00379 lba = lba >> 16;00380 head = ( (int) ( lba & 0x0fL ) ) | ATA_HEAD_USE_LBA;00381 00382 temp = ataReadSectorsCHS( Drive, head, cyl, sect, numsectors, Buffer );00383 00384 <span class="keywordflow">if</span>(temp)00385 ataDiskErr();00386 <span class="keywordflow">return</span> temp;00387 }00388 00389 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> ataWriteSectorsLBA( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Drive, 00390 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> lba,00391 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numsectors,00392 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *Buffer)00393 {00394 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> cyl, head, sect;00395 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;00396 00397 <span class="preprocessor">#ifdef DEBUG_ATA</span>00398 <span class="preprocessor"></span> <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"ATA LBA write "</span>);00399 <a class="code" href="group__rprintf.html#ga9">rprintfu32</a>(lba); <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">" "</span>);00400 <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(numsectors); <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">" "</span>);00401 <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)Buffer); 00402 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00403 <span class="preprocessor">#endif</span>00404 <span class="preprocessor"></span>00405 sect = (int) ( lba & 0x000000ffL );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -