📄 atapi.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 + -