⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atapi.h

📁 2443 wince5.0 bsp, source code
💻 H
字号:
#ifndef __ATA_H__
#define __ATA_H__

#include <windows.h>
#include <types.h>
#include <wtypes.h>
#include "defines.h"

#define __EVT1 

#define Lock()		EnterCriticalSection(&g_ControllerCriticalSection)
#define UnLock()		LeaveCriticalSection(&g_ControllerCriticalSection)

/*=========================================================================
 *          	          ata Register Address
 *=========================================================================
 */

#define DEV_ERROR		(&(g_vATAPIRegs->ATA_PIO_FED))
#define DEV_FEATURE		(&(g_vATAPIRegs->ATA_PIO_FED))
#define DEV_SECTOR		(&(g_vATAPIRegs->ATA_PIO_SCR))
#define DEV_LOWLBA		(&(g_vATAPIRegs->ATA_PIO_LLR))
#define DEV_MIDLBA		(&(g_vATAPIRegs->ATA_PIO_LMR))
#define DEV_HIGHLBA		(&(g_vATAPIRegs->ATA_PIO_LHR))
#define DEV_DEVICE		(&(g_vATAPIRegs->ATA_PIO_DVR))
#define DEV_STATUS		(&(g_vATAPIRegs->ATA_PIO_CSD))
#define DEV_COMMAND	(&(g_vATAPIRegs->ATA_PIO_CSD))
#define DEV_ALTANATE	(&(g_vATAPIRegs->ATA_PIO_DAD))
#define DEV_CONTROL		(&(g_vATAPIRegs->ATA_PIO_DAD))

/*=========================================================================
 *          	               ata Command
 *=========================================================================
 */
//#define IDENTIFYDEVICE				0xa1
#define IDENTIFYDEVICE				0xec
#define READSECTOR					0x20
#define READMULTIPLE				0xc4
#define READDMA						0xc8
#define WRITESECTOR					0x30
#define WRITEMULTIPLE				0xc5
#define WRITEDMA					0xca
#define SETFEATURES				0xEF



/*=========================================================================
 *          	               FIU interrupt
 *=========================================================================
 */

#define ATAPI_MASK					0xffffffff
/*
#define ATA_INT_SBUF_EMPTY			4
#define ATA_INT_TBUF_FULL			3
#define ATA_INT_IRQ					2
#define ATA_INT_UDMA_HOLD			1
#define ATA_INT_XFER_DONE			0
*/
/*=========================================================================
 *          	      ata controller error type
 *=========================================================================
 */
#define TIME_OUT_VALUE				2400 //1200
#define ATA_ABSENT					0
#define ATA_ATA						1
#define ATA_ATAPI					2
#define ATA_SECTORSIZE				512

//-------------------------------------------------------------------------
#define DEV_ACC_READY		0x2
#define PIO_DATA_READY	0x1

#define STATUS_DEVICE_BUSY_1	0x80
#define STATUS_DATA_REQUEST	0x58
#define STATUS_ERR			0x1

/*=========================================================================
 *          	      Start Buffer Address for PIODMA
 *=========================================================================
 */
#define PIODMA_BUFFER_PA 0x33fe0000
#define PIODMA_BUFFER_VA 0x83fe0000
#define PIODMA_BUFFER_SIZE 0x20000

//typedef char            CHAR;   /*  8-bit signed */
typedef char            INT08;  /*  8-bit signed */
//typedef short           INT16;  /* 16-bit signed */
typedef short           COUNT;  /* 16 bit signed */
typedef unsigned short UCOUNT;
//typedef long            INT32;  /* 32-bit signed */
//typedef long            LONG;   /* 32-bit signed */
typedef unsigned char   UCHAR;  /*  8-bit unsigned */
//typedef unsigned char   UINT8; /*  8-bit unsigned */
//typedef unsigned short  UINT16; /* 16-bit unsigned */
//typedef unsigned long   UINT32; /* 32-bit unsigned */
//typedef unsigned long   ULONG;  /* 32-bit unsigned */


typedef void *          SDHANDLE;


typedef unsigned char   UTINY;  /* unsigned 8 bit */
typedef unsigned char   UTEXT;  /* unsigned 8 bit for string */
typedef char            TEXT;   /* char for string */
typedef unsigned long   BLOCKT; /* 32-bit unsigned */
typedef short           PCFD;   /* file desc */



#define void          void      /* void  */
#define SDIMPORT        extern    /* For external data */
#define SDLOCAL         static    /* For internal data and functions */ 
#define SDGLOBAL        extern    /* For external functions */


/* Null pointer */
#define SDNULL          ((void *)0)
typedef struct _ATA_DEV_INFO 
{
	UINT32 CurrentCommand;
	UINT32 MaxMultiple;
	UINT32 CurrentMultiple;
	UINT32 MaxSectors;
	UINT32 DeviceType;
	int MaxPioMode;
	int MaxUdmaMode;
	int CurrentPioMode;
	int CurrentUdmaMode;
} ATA_DEV_INFO ;

typedef enum _ATA_ERR 
{
	ATA_NO_ERROR,
	ATA_TIMEOUT,
	ATA_ABORT,
	ATA_OUT_OF_ADDRESS,
	ATA_UNCORRECTABLE_DATA,
	ATA_DEV_INFO_BUSY,
	ATA_UNKNOWN
} ATA_ERR ;


typedef enum _PIOMODE
{
	PIO0, PIO1, PIO2, PIO3, PIO4
} PIOMODE;

typedef enum _UDMAMODE
{
	UDMA0, UDMA1, UDMA2, UDMA3, UDMA4
} UDMAMODE;

typedef enum _ATA_TRANSFER_COMMAND 
{
	ATA_CMD_STOP, ATA_CMD_START, ATA_CMD_ABORT, ATA_CMD_CONTINUE
} ATA_TRANSFER_CMD ;

typedef enum _ATA_INT_SRC 
{
	ATA_INT_XFER_DONE=0, ATA_INT_UDMA_HOLD, ATA_INT_IRQ, ATA_INT_TBUF_FULL, ATA_INT_SBUF_EMPTY
} ATA_INT_SRC ;

typedef enum _ATA_MODE 
{
	PIO_CPU, PIO_DMA, UDMA
} ATA_MODE ;

#define SRC_INT_NUM 6 

int AtapiDeviceInit(void);
int InitInterrupt(void);

int AtaDiskRead(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);
int AtaDiskWrite(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);

int OpenMedia(void);
int CloseMedia(void);
int ReadBlocks(UINT32 uStBlock, UINT32 uBlocks, UINT32 uBufAddr);
int WriteBlocks(UINT32 uStBlock, UINT32 uBlocks, UINT32 uBufAddr);
int StartReadingBlocks(UINT32 uStBlock, UINT32 uBlocks, UINT32 uBufAddr);
int StartWritingBlocks(UINT32 uStBlock, UINT32 uBlocks, UINT32 uBufAddr);


void Init(void);
//int Init(PIOMODE pmode, UINT32 multisize, UDMAMODE umode);
int CheckDevice(void);
int IdentifyDevice(void);
void GetMaxSectors(UINT32 *maxSec);
void ResetAll(void );
void ShowSetting(void);
void ClearPending(ATA_INT_SRC srcInt);
int FindInterruptRequest(UINT32 *nthBit);
void ClearAllInterrupt(void);	
int SetTransferCommand(UINT8 command);
void IsAtaTrackBufferFullDisable(UINT32 *status);
void IsAtaSourceBufferFullDisable(UINT32 *status);
int  ReadSectors_Pio(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);
int ReadSector_PioDma(UINT32 uLBA,UINT32 uDesAddress);
int ReadSectors_Udma(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);
int WriteSectors_Pio(UINT32 nLBA,UINT32 nSectorCount,UINT32 nSrcAddress);
int WriteSector_PioDma(UINT32 uLBA, UINT32 uSrcAddress);
int WriteSectors_Udma(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);

void SetBufferDirection(UINT32 uDirection); // only for SMDK b'd 060812
ATA_ERR ReadSectors_MultiplePioDma(UINT32 nLBA,UINT32 nDesAddress);
ATA_ERR ReadPiodmaAbort(UINT32 nLBA,UINT32 nDesAddress);	
ATA_ERR ReadSectorsInt(UINT32 nLBA,UINT32 nSectorCount,UINT32 nDesAddress);	
ATA_ERR ReadUdmaAbort(UINT32 nLBA,UINT32 nSectorCount,UINT32 nSrcAddress);
ATA_ERR ReadUdmaFull(UINT32 nLBA,UINT32 nSectorCount,UINT32 nSrcAddress);
ATA_ERR ReadUdmaReq(UINT32 nLBA,UINT32 nSectorCount,UINT32 HWSize,UINT32 nSrcAddress);
	
ATA_ERR WriteMultiplePiodma(UINT32 nLBA,UINT32 nSrcAddress);
ATA_ERR WriteSectorsInt(UINT32 nLBA,UINT32 nSectorCount,UINT32 nSrcAddress);
ATA_ERR WriteUdmaFull(UINT32 nLBA, UINT32 nSectorCount, UINT32 nSrcAddress);
ATA_ERR WriteUdmaReq(UINT32 nLBA, UINT32 nSectorCount, UINT32 HWSize,UINT32 nSrcAddress);

void SetAtaMode(ATA_MODE mode);
	
	
ATA_ERR GetDevStatus(void);
int WaitForNoBusyStatus(void); // Wait until a device is ready
ATA_ERR WaitForDeviceInt(void);
ATA_ERR WaitForNoBusyAlternateStatus(void);
void SetMultiple(UINT32 nSector);
int SetPioMode(PIOMODE pmode);
void SetUdmaMode(UDMAMODE umode);
void SetLittleEndian(void);
void SetConfigMode(ATA_MODE mode, int isWriteMode);

int WaitForDeviceAccessReady(void); // Wait until a host is ready

int ReadDeviceReg(volatile UINT32 *nRegister, UINT8 *data);
int GetDataFromDevice(UINT16 *data);
void GetByteDataFromDevice(UINT8 *data) ;
int WaitForTransferDone(void);
int WriteOnTaskFileReg(volatile UINT32 *nRegister,UINT32 nValue);
int PutDataToDevice(UINT16* data);	
void PutByteDataToDevice(UINT8 *data);

void SetAtaOnOff(UINT8 OnOff);

int SetAtaDevice(UINT32 nLBA, UINT32 nSectorCount);

void ChangeBufferControl(ATA_MODE mode);
int IsReadingBlocksDone(void);
int IsWritingBlocksDone(void);
void WaitForHostReady(void);
int IsDmaDone(void);

#endif // __ATA_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -