
//SD dir control bit cmddir=bit0 clken=bit1
//output
#define SDDIR			(*(u16*)0x8800000)
//SD send get control bit send=bit0 get=bit1
//output
#define SDCON			(*(u16*)0x9800000)
//SD output data obyte[7:0]=AD[7:0]
//output
#define SDODA			(*(u16*)0x9000000)
//SD input data AD[7:0]=ibyte[7:0]
//input
#define SDIDA			(*(u16*)0x9000000)
//readsector data1
#define SDIDA1			(*(u16*)0x9200000)
//readsector data2
#define SDIDA2			(*(u16*)0x9400000)
//readsector data3
#define SDIDA3			(*(u16*)0x9600000)
//SD stutas cmdneg=bit0 cmdpos=bit1 issend=bit2 isget=bit3
//input
#define SDSTA			(*(u16*)0x9800000)

u16  Hal4ATA_StatusByte;
void DMA3(u32 src, u32 dst, u32 cnt);

//read status register and save to Hal4ATA_StatusByte 
void Hal4ATA_GetStatus(void)
{
	Hal4ATA_StatusByte = SDSTA;
}

//wait command send end
BOOLEAN Hal4ATA_WaitOnBusy(void)
{
	Hal4ATA_GetStatus();
	while (Hal4ATA_StatusByte&0x01 != 0x1)
	{
		Hal4ATA_GetStatus();
	}
	return TRUE;
}

//wait data ready
BOOLEAN Hal4ATA_WaitOnBusyNDrdy(void)
{
	Hal4ATA_GetStatus();
	while ( (Hal4ATA_StatusByte&0x40) !=0x40)
	{
		Hal4ATA_GetStatus();
	}
	return TRUE;
}

//read sector datamust be bypass one word
void readdata3(u16* p)
{
	u32 i;
	u16 back;
	
	SDDIR=0x49;
	Hal4ATA_WaitOnBusyNDrdy();
	SDDIR=0x09;
	
	back=*(p-1);
	SDDIR=0x8;//cmd input clken=0 datadir input clock=0
	SDCON=0x4;//send=0 get=0 en25=1 cmd1=0
	DMA3(0x8800000,(u32)(p-1),0x80000101);
	DMA3(0x8800000,(u32)&i,0x80400004);
	*(p-1)=back;
}

//read one sectoruse CMD17
void readsector(u16 * p,u32 sectorn)
{
	SDCON=0x8;
	SDIDA1=0x40+17;
	SDIDA2=(sectorn>>7);
	SDIDA3=(sectorn<<9);
	
	SDDIR=0x29;
	Hal4ATA_WaitOnBusy();
	SDDIR=0x09;
	
	readdata3(p);
}


