?? ata.c
字號:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h >
#include "Typedef.h"
#include "AT89C51SND.h"
#include "config.h"
#include "constant.h"
#include "global.h"
#include "macro.h"
#include "external.h"
#include "gpio.h"
/**************************************************************************
* C O N S T A N T S
*************************************************************************/
/**************************************************************************
* M A C R O S
*************************************************************************/
/**************************************************************************
* D A T A T Y P E S
*************************************************************************/
/**************************************************************************
* G L O B A L D A T A
*************************************************************************/
/**************************************************************************
* Function Name:
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
void ATAInit(char u8Reset)
{
gATACapacity = 0;
ATA_RESET();
msDelay(5);
msDelay(5);
msDelay(5);
WriteReg(DRV_HEAD,0xa0);
ATAWaitCardReady(1500);
gATACapacity = ATACapacity();
}
/**************************************************************************
* Function Name:
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
void ATA_RESET(void)
{
P4_5=0;
msDelay(5);
msDelay(5);
msDelay(5);
P4_5=1;
}
/**************************************************************************
* Function Name:
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT8 ATAWaitDataReady(void)
{
UINT8 temp;
gTB = 0;
do { temp=ReadReg(ALT_STATUS);
if ( (temp & 0x01)||(gTB>=10000) ) return temp;
} while((temp & 0x89)!=0x08); //[11/08]
gTB = 0;
do {
temp=ReadReg(STATUS);
if ( (temp & 0x01)||(gTB>=10000) ) return temp;
} while((temp & 0x89)!=0x08); //[11/08]
return 0;
}
/**************************************************************************
* Function Name:
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
/*wait BSY=0,DRDY=1*/
UINT8 ATAWaitCardReady(UINT16 timeout)
{
UINT8 temp;
gTB = 0;
do {
temp=ReadReg(ALT_STATUS);
//if ( (temp & 0x01)||(gTB>=timeout) ) return 1;//error
} while((temp & 0xC0)!=0x40);
gTB = 0;
do {
temp=ReadReg(STATUS);
//if ( (temp & 0x01)||(gTB>=timeout) ) return 1;
} while((temp & 0xC0)!=0x40);
return 0;
}
/**************************************************************************
* Function Name:ATAReadID
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
void ATAReadID(void)
{
ATAWaitCardReady(6000);
WriteReg(DRV_HEAD,0XA0);
WriteReg(COMMAND,0XEC);
ATAWaitDataReady();
Read1Sector();
ATAWaitCardReady(6000);
}
/**************************************************************************
* Function Name:ATACapacity
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT32 ATACapacity(void)
{
LongByte lbTotal ;
ATAReadID() ;
lbTotal.BYTE.B3=DMA_BUF[123];
lbTotal.BYTE.B2=DMA_BUF[122];
lbTotal.BYTE.B1=DMA_BUF[121];
lbTotal.BYTE.B0=DMA_BUF[120];
return(lbTotal.ULONG);
}
/**************************************************************************
* Function Name:ATAGetCapacity
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT32 ATAGetCapacity(void)
{
return gATACapacity;
}
/**************************************************************************
* Function Name:ATAMultipleRead
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT8 ATAMultipleRead(UINT32 u32SectorNo)
{
UINT8 i,j,Fcnt;
UINT16 bcnt=0;
bit begin_ping_pong=0;
union
{
UINT32 sn;
UINT8 secno[4];
} s;
s.sn=u32SectorNo;
if (ATAWaitCardReady(5000)) {
return 1;
}
//printf("ATAWaitCardReady\n");
// printf("gSectors:%d",gSectors);
WriteReg(DRV_HEAD,((s.secno[0] & 0x0f) | 0xE0));
WriteReg(CYH,(s.secno[1]));
WriteReg(CYL,(s.secno[2]));
WriteReg(SN, (s.secno[3]));
WriteReg(SC,gSectors);
WriteReg(COMMAND,0X20);
//printf("writeREG0k\n");
for(i=0;i<gSectors;i++)//how many sector must to read
{
if ( ATAWaitDataReady() ) return 1;//WAIT BSY=0,DRQ=1.
//printf("ATAWaitdataReady\n");
Read1Sector();
if(gbRunMode==USBMode)
{
bcnt=0;
for(j=0;j<8;j++)//64BYTE Packetsize*8
{
for(Fcnt=0;Fcnt<64;Fcnt++)
{
UEPDATX=DMA_BUF[bcnt];
bcnt++;
}
if(begin_ping_pong==0)begin_ping_pong =1;
else
{
while (!Usb_tx_complete_bit()){}
Usb_clear_TXCMPL_bit(); //ack transfer
}
Usb_set_TXRDY_bit(); //start usb transfer
gCBWDataLen=gCBWDataLen-64;
}
}
}
if(gbRunMode==USBMode)
{
while (!Usb_tx_complete_bit()){}
Usb_clear_TXCMPL_bit(); //last ack transfer
}
if (ATAWaitCardReady(5000)) return 1;
return 0;
}
/**************************************************************************
* Function Name:ATAMultipleWrite
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT8 ATAMultipleWrite(UINT32 u32SectorNo)
{
UINT8 i,j,Fcnt;
UINT16 bcnt=0;
union
{
UINT32 sn;
UINT8 secno[4];
} s;
s.sn=u32SectorNo;
if (ATAWaitCardReady(3600)) return 1;
WriteReg(DRV_HEAD,((s.secno[0] & 0x0f) | 0xE0));
WriteReg(CYH,(s.secno[1]));
WriteReg(CYL,(s.secno[2]));
WriteReg(SN, (s.secno[3]));
WriteReg(SC,gSectors);
WriteReg(COMMAND,0X30);
Set_Adr_DATA();
for(i=0;i<gSectors;i++)
{
if(i>0){
if ( ATAWaitDataReady() ) {return 1; }
}
for(j=0;j<8;j++){//collect one sector
while (!Usb_receive_out_data()); /* wait end of reception */
for(Fcnt=0;Fcnt<32;Fcnt++)
{
//DMA_BUF[bcnt]=UEPDATX;
//bcnt++;
P0=UEPDATX;//DATA7~0
P2=UEPDATX;//DATA15~8
P3_6=0;
msDelay(1);
P3_6=1;
msDelay(1);
}
Usb_clear_RXOUT_PP(); /* usb read acknowledgement */
}
}
if (ATAWaitCardReady(3600)) return 1;
return 0;
}
/**************************************************************************
* Function Name:ATAIsReady
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT8 ATAIsReady(void)
{
return(1); // ATA_RDY
}
/**************************************************************************
* Function Name:WriteReg
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
void WriteReg(UINT8 reg,UINT8 Data)
{
if(reg==DRV_HEAD)
Set_Adr_DRV_HEAD()
else if(reg==COMMAND)
Set_Adr_COMMAND()
else if(reg==DEV_CTR)
Set_Adr_DEV_CTR()
else if(reg==CYL)
Set_Adr_CYL()
else if(reg==CYH)
Set_Adr_CYH()
else if(reg==SN)
Set_Adr_SN()
else if(reg==SC)
Set_Adr_SC()
P0=Data;
_nop_();
_nop_();
_nop_();
P3_6=0;
msDelay(1);
P3_6=1;
_nop_();
_nop_();
_nop_();
}
/**************************************************************************
* Function Name:ReadReg
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
UINT8 ReadReg(UINT8 Reg)
{
UINT8 temp;
if(Reg==STATUS)
Set_Adr_STATUS()
else if(Reg==ALT_STATUS)
Set_Adr_ALT_STATUS()
P0=0xff;
P3_7=0;
msDelay(1);
temp=P0;
msDelay(1);
P3_7=1;
return temp;
}
/**************************************************************************
* Function Name:Read1Sector
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
void Read1Sector(void)
{ UINT16 bcnt;
Set_Adr_DATA();
for(bcnt=0;bcnt<=255;bcnt++)
{
P3_7=0;
_nop_();
_nop_();
DMA_BUF[(bcnt<<1)]=P0;
DMA_BUF[(bcnt<<1)+1]=P2;
P3_7=1;
_nop_();
_nop_();
}
}
/**************************************************************************
* Function Name:msDelay
*
* Descriptions:
*
* Arguments:
*
* Returns: None
**************************************************************************/
void msDelay(UINT8 i) // in ms.
{
UINT8 j;
for (j=0; j<200 ; j++) {
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -