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