📄 ata.lst
字号:
201 1 WriteReg(DRV_HEAD,((s.secno[0] & 0x0f) | 0xE0));
202 1 WriteReg(CYH,(s.secno[1]));
203 1 WriteReg(CYL,(s.secno[2]));
204 1 WriteReg(SN, (s.secno[3]));
205 1 WriteReg(SC,gSectors);
206 1 WriteReg(COMMAND,0X20);
207 1
208 1
209 1 for(i=0;i<gSectors;i++)//how many sector must to read
210 1 {
211 2
212 2
213 2 if ( ATAWaitDataReady() ) return 1;//WAIT BSY=0,DRQ=1.
214 2 Set_Adr_DATA();
215 2 P0 = 0xff;
216 2 P2 = 0xff;
C51 COMPILER V7.50 ATA 11/03/2008 13:09:04 PAGE 5
217 2 bcnt=0;
218 2
219 2 for(j=0;j<8;j++)//64BYTE Packetsize*8
220 2 {
221 3 for(Fcnt=0;Fcnt<64;Fcnt++)
222 3 {
223 4 P3_7 = 0;
224 4 UEPDATX = P0;//DATA7~0
225 4 Fcnt++;
226 4 UEPDATX = P2;//DATA15~8
227 4 P3_7 = 1;
228 4 }
229 3 Usb_set_TXRDY_bit();
230 3 while (!Usb_tx_complete_bit()){}
231 3 Usb_clear_TXCMPL_bit(); //ack transfer
232 3
233 3 gCBWDataLen=gCBWDataLen-64;
234 3 }
235 2 }
236 1 if (ATAWaitCardReady()) return 1;
237 1 return 0;
238 1 }
239
240 /**************************************************************************
241 * Function Name:ATAMultipleWrite
242 *
243 * Descriptions:
244 *
245 * Arguments:
246 *
247 * Returns: None
248 **************************************************************************/
249 UINT8 ATAMultipleWrite(UINT32 u32SectorNo)
250 {
251 1 UINT8 i,j,Fcnt;
252 1 UINT16 bcnt=0;
253 1 union
254 1 {
255 1 UINT32 sn;
256 1 UINT8 secno[4];
257 1 } s;
258 1 s.sn=u32SectorNo;
259 1 if (ATAWaitCardReady()) return 1;
260 1 WriteReg(DRV_HEAD,((s.secno[0] & 0x0f) | 0xE0));
261 1 WriteReg(CYH,(s.secno[1]));
262 1 WriteReg(CYL,(s.secno[2]));
263 1 WriteReg(SN, (s.secno[3]));
264 1 WriteReg(SC,gSectors);
265 1 WriteReg(COMMAND,0X30);
266 1 for(i=0;i<gSectors;i++)
267 1 {
268 2 if(i>0){
269 3 if ( ATAWaitDataReady() ) {return 1; }
270 3 }
271 2 Set_Adr_DATA();
272 2 for(j=0;j<8;j++){//collect one sector
273 3
274 3 while(!(RXOUTB0||RXOUTB1));
275 3 for(Fcnt=0;Fcnt<64;Fcnt++)
276 3 {
277 4
278 4 P3_6=0;
C51 COMPILER V7.50 ATA 11/03/2008 13:09:04 PAGE 6
279 4 P0=UEPDATX;//DATA7~0
280 4 Fcnt++;
281 4 P2=UEPDATX;//DATA15~8
282 4 P3_6=1;
283 4 }
284 3 UEPSTAX=UEPSTAX & (~0x42);
285 3 }
286 2
287 2 }
288 1 if (ATAWaitCardReady()) return 1;
289 1 return 0;
290 1
291 1
292 1 }
293
294 /**************************************************************************
295 * Function Name:ATAIsReady
296 *
297 * Descriptions:
298 *
299 * Arguments:
300 *
301 * Returns: None
302 **************************************************************************/
303 UINT8 ATAIsReady(void)
304 {
305 1 return(1); // ATA_RDY
306 1 }
307
308 /**************************************************************************
309 * Function Name:WriteReg
310 *
311 * Descriptions:
312 *
313 * Arguments:
314 *
315 * Returns: None
316 **************************************************************************/
317 void WriteReg(UINT8 reg,UINT8 Data)
318 {
319 1
320 1 if(reg==DRV_HEAD)
321 1 Set_Adr_DRV_HEAD()
322 1 else if(reg==COMMAND)
323 1 Set_Adr_COMMAND()
324 1 else if(reg==DEV_CTR)
325 1 Set_Adr_DEV_CTR()
326 1 else if(reg==CYL)
327 1 Set_Adr_CYL()
328 1 else if(reg==CYH)
329 1 Set_Adr_CYH()
330 1 else if(reg==SN)
331 1 Set_Adr_SN()
332 1 else if(reg==SC)
333 1 Set_Adr_SC()
334 1
335 1 P0=Data;
336 1 _nop_();
337 1 _nop_();
338 1 _nop_();
339 1 P3_6=0;
340 1 msDelay();
C51 COMPILER V7.50 ATA 11/03/2008 13:09:04 PAGE 7
341 1 P3_6=1;
342 1 _nop_();
343 1 _nop_();
344 1 _nop_();
345 1
346 1 }
347
348 /**************************************************************************
349 * Function Name:ReadReg
350 *
351 * Descriptions:
352 *
353 * Arguments:
354 *
355 * Returns: None
356 **************************************************************************/
357 UINT8 ReadReg(UINT8 Reg)
358 {
359 1 UINT8 temp;
360 1 if(Reg==STATUS)
361 1 Set_Adr_STATUS()
362 1 else if(Reg==ALT_STATUS)
363 1 Set_Adr_ALT_STATUS()
364 1
365 1 P0=0xff;
366 1 P3_7=0;
367 1 msDelay();
368 1 temp=P0;
369 1 msDelay();
370 1 P3_7=1;
371 1 return temp;
372 1
373 1 }
374 /**************************************************************************
375 * Function Name:Read1Sector
376 *
377 * Descriptions:
378 *
379 * Arguments:
380 *
381 * Returns: None
382 **************************************************************************/
383 void Read1Sector(void)
384 { UINT16 bcnt;
385 1 Set_Adr_DATA();
386 1 for(bcnt=0;bcnt<=255;bcnt++)
387 1 {
388 2 P3_7=0;
389 2 _nop_();
390 2 _nop_();
391 2 DMA_BUF[(bcnt<<1)]=P0;
392 2 DMA_BUF[(bcnt<<1)+1]=P2;
393 2 P3_7=1;
394 2 _nop_();
395 2 _nop_();
396 2 }
397 1
398 1 }
399 /**************************************************************************
400 * Function Name:msDelay
401 *
402 * Descriptions:
C51 COMPILER V7.50 ATA 11/03/2008 13:09:04 PAGE 8
403 *
404 * Arguments:
405 *
406 * Returns: None
407 **************************************************************************/
408 void msDelay() // in ms.
409 {
410 1 UINT8 j;
411 1
412 1 for (j=0; j<200 ; j++) {
413 2
414 2 }
415 1
416 1 }
417
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 844 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 19
IDATA SIZE = 3 ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -