📄 atapi.h
字号:
#ifndef __ATA_H__
#define __ATA_H__
#include <windows.h>
#include <types.h>
#include <wtypes.h>
#include "defines.h"
#if 0
#define ATA_CONTROL (0x00) //ATA0 enable and clock down status
#define ATA_STATUS (0x04) //ATA0 status
#define ATA_COMMAND (0x08) //ATA0 command
#define ATA_SWRST (0x0C) //ATA0 software reset
#define ATA_IRQ (0x10) //ATA0 interrupt sources
#define ATA_IRQ_MASK 0x14) //ATA0 interrupt mask
#define ATA_CFG (0x18) //ATA0 configuration for ATA interface
#define ATA_PIO_TIME (0x2C) //ATA0 PIO timing
#define ATA_UDMA_TIME (0x30) //ATA0 UDMA timing
#define ATA_XFR_NUM (0x34) //ATA0 transfer number
#define ATA_XFR_CNT (0x38) //ATA0 current transfer count
#define ATA_TBUF_START (0x3C) //ATA0 start address of track buffer
#define ATA_TBUF_SIZE (0x40) //ATA0 size of track buffer
#define ATA_SBUF_START (0x44) //ATA0 start address of Source buffer1
#define ATA_SBUF_SIZE (0x48) //ATA0 size of source buffer1
#define ATA_CADR_TBUF (0x4C) //ATA0 current write address of track buffer
#define ATA_CADR_SBUF (0x50) //ATA0 current read address of source buffer
#define ATA_PIO_DTR (0x54) //ATA0 PIO device data register
#define ATA_PIO_FED (0x58) //ATA0 PIO device Feature/Error register
#define ATA_PIO_SCR (0x5C) //ATA0 PIO sector count register
#define ATA_PIO_LLR (0x60) //ATA0 PIO device LBA low register
#define ATA_PIO_LMR (0x64) //ATA0 PIO device LBA middle register
#define ATA_PIO_LHR (0x68) //ATA0 PIO device LBA high register
#define ATA_PIO_DVR (0x6C) //ATA0 PIO device register
#define ATA_PIO_CSD (0x70) //ATA0 PIO device command/status register
#define ATA_PIO_DAD (0x74) //ATA0 PIO device control/alternate status register
#define ATA_PIO_READY (0x78) //ATA0 PIO data read/write ready
#define ATA_PIO_RDATA (0x7C) //ATA0 PIO read data from device data register
#define BUS_FIFO_STATUS (0x90) //Internal AHBP fifo status
#define ATA_FIFO_STATUS (0x94) //Internal ATA0 fifo status
#endif
/*=========================================================================
* 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 0xffffffe0
/*
#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 0x30010000
#define PIODMA_BUFFER_VA 0x80010000
#define PIODMA_BUFFER_SIZE 0x10000
//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 AtaDiskRead(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);
int AtaDiskWrite(DWORD dStartSec, BYTE *pTargetBuf, UINT16 usNumSec);
int OpenMedia(ATA_MODE mode);
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(UINT32 nLBA,UINT32 nSectorCount,UINT32 nDesAddress);
int ReadSector_PioDma(UINT32 uLBA,UINT32 uDesAddress);
int ReadSectors_Udma(UINT32 uLBA,UINT32 uSectorCount,UINT32 uSrcAddress);
int WriteSectors_Pio(UINT32 nLBA,UINT32 nSectorCount,UINT32 nSrcAddress);
int WriteSector_PioDma(UINT32 uLBA, UINT32 uSrcAddress);
int WriteSectors_Udma(UINT32 uLBA, UINT32 uSectorCount, UINT32 uSrcAddress);
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);
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 + -