📄 ide.c
字号:
//ide.c
#include "AT91SAM7S64.h"
#include "Board.h"
#include "type.h"
#include "dbgu.h"
#include "ide.h"
#define WRITE 1
#define READ 0
#define vIdeSend8(a, d) (port_SendData(a, d))
#define vIdeRead8(a) (port_ReadData(a))
///////////////////////////////////////////////////////////////
void ide_TestBsy(void)
{
INT8U u8;
do
{
u8 = vIdeRead8(FILE7);
}
while(0x80 & u8);
}
///////////////////////////////////////////////////////////////
void ide_TestBsyDrq(void)
{
INT8U u8;
do
{
u8 = vIdeRead8(FILE7);
}
while( (0 != (0x80 & u8)) || (0 == (u8 | 0x40)) );
}
////////////////////////////////////////////////////////////////
void ide_vSendCommand(INT8U u8Com)
{
ide_TestBsy();
vIdeSend8(FILE7, u8Com);
}
////////////////////////////////////////////////////////////////
void ide_vIdeInit(void)
{
INT8U u8;
NLEBA_HIGH();
NLEAB_HIGH();
NOEBA_HIGH();
NOEAB_HIGH();
HDDRST_LOW();
port_Delay(5);
HDDRST_HIGH(); //reset release
do
{
vIdeSend8(FILE6, 0xa0);
u8 = vIdeRead8(FILE7);
}
while( (0 != (0x80 & u8)) || (0 == (u8 | 0x40)) );
vIdeSend8(FILE6, 0x20);
vIdeSend8(FILE2, 64);
vIdeSend8(FILE7, 0x91);
ide_TestBsy();
vIdeSend8(FILE7, 0x10);
ide_TestBsy();
}
/*
//////////////////////////////////////////////////////////////////
void ide_WRReady(INT32U addr,INT8U u8secternum,INT8U wrorrd)
{
INT8U u8Sector[4];
NLEBA_HIGH(); //ide->8bit port disable
NOEBA_HIGH();
u8Sector[0] = (INT8U)(addr >> 24);
u8Sector[1] = (INT8U)(addr >> 16);
u8Sector[2] = (INT8U)(addr >> 8);
u8Sector[3] = (INT8U)(addr);
ide_TestBsy();
vIdeSend8(FILE6, (0xe0 | (u8Sector[0] & 0x0f) ) );
vIdeSend8(FILE5, u8Sector[1]);
vIdeSend8(FILE4, u8Sector[2]);
vIdeSend8(FILE3, u8Sector[3]);
vIdeSend8(FILE2, u8secternum);
if(wrorrd == WRITE)
{
ide_vSendCommand(0x30); //write command
}
else
{
ide_vSendCommand(0x20);
}
////////////////////////////////////////////////////////////
ide_TestBsyDrq();
port_SetAddress(FILE0); //set data reg addr
*AT91C_PIOA_ODR |= (PORT_8BIT); //8bit port input mode
}
*/
//////////////////////////////////////////////////////////////////
void ide_ReadSector(INT32U addr, INT8U *pBuffer)
{
INT32U temp32;
INT16U i;
INT8U u8Sector[4];
NLEBA_HIGH(); //ide->8bit port disable
u8Sector[0] = (INT8U)(addr >> 24);
u8Sector[1] = (INT8U)(addr >> 16);
u8Sector[2] = (INT8U)(addr >> 8);
u8Sector[3] = (INT8U)(addr);
ide_TestBsy();
vIdeSend8(FILE6, (0xe0 | (u8Sector[0] & 0x0f) ) );
vIdeSend8(FILE5, u8Sector[1]);
vIdeSend8(FILE4, u8Sector[2]);
vIdeSend8(FILE3, u8Sector[3]);
vIdeSend8(FILE2, 1);
ide_vSendCommand(0x20);
ide_TestBsyDrq();
////////////////////////////////////////////////////////////
port_SetAddress(FILE0); //set data reg addr
*AT91C_PIOA_ODR |= (PORT_8BIT); //8bit port input mode
// ide_WRReady(addr, 1, READ);
for(i=0; i<256; i++)
{
NREAD_LOW(); //read signal active
*pBuffer ++ = (INT8U)(*AT91C_PIOA_PDSR);
NLEBA_LOW(); //ide->8bit port active
NLEBA_HIGH(); //ide->8bit port latch
NREAD_HIGH(); //read signal disable
NOEBA_LOW();
*pBuffer ++ = (INT8U)(*AT91C_PIOA_PDSR);
NOEBA_HIGH();
}
*AT91C_PIOA_OER |= (PORT_8BIT);
}
//////////////////////////////////////////////////////////////////
void ide_WriteSector(INT32U addr, INT8U *pBuffer)
{
INT16U i;
INT8U u8Temp;
INT8U u8Sector[4];
NLEBA_HIGH(); //ide->8bit port disable
NOEBA_HIGH();
u8Sector[0] = (INT8U)(addr >> 24);
u8Sector[1] = (INT8U)(addr >> 16);
u8Sector[2] = (INT8U)(addr >> 8);
u8Sector[3] = (INT8U)(addr);
ide_TestBsy();
vIdeSend8(FILE6, (0xe0 | (u8Sector[0] & 0x0f) ) );
vIdeSend8(FILE5, u8Sector[1]);
vIdeSend8(FILE4, u8Sector[2]);
vIdeSend8(FILE3, u8Sector[3]);
vIdeSend8(FILE2, 1);
ide_vSendCommand(0x30); //write command
ide_TestBsyDrq();
////////////////////////////////////////////////////////////
port_SetAddress(FILE0); //set data reg addr
*AT91C_PIOA_OER |= (PORT_8BIT); //8bit port output mode
// ide_WRReady(addr, 1, WRITE);
for(i=0; i<256; i++)
{
pBuffer ++; //point to high byte
u8Temp = *pBuffer;
*AT91C_PIOA_ODSR = (INT32U)(u8Temp); //high 8bit out
NLEAB_LOW(); //8bit port->ide active
NLEAB_HIGH(); //8bit port->ide latch
NOEAB_LOW();
pBuffer --; //point to low byte
u8Temp = *pBuffer;
*AT91C_PIOA_ODSR = (INT32U)(u8Temp);
NWRITE_LOW();
NWRITE_HIGH();
pBuffer += 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -