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

📄 ata.h

📁 三星公司S3c2443的测试程序源码
💻 H
字号:
/*----------------------------------------------------------------------
 *
 * Filename: ata.h
 *
 * Contents: class ATA
 *
 * Authors: Whing, Anderson, Sean, ...
 *
 * Notes:
 *   1.
 *   2.
 *
 * Copyright (c) 2005 SAMSUNG Electronics.
 *----------------------------------------------------------------------
 */

#ifndef __ATA_H__
#define __ATA_H__


//#include "fat.h"
#include "Def.h"
#define CFCON_MODE

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

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

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

enum ATA_INT_SRC 
{
	ATA_INT_XFER_DONE, ATA_INT_UDMA_HOLD, ATA_INT_IRQ, ATA_INT_TBUF_FULL, ATA_INT_SBUF_EMPTY
};

enum ATA_MODE 
{
	PIO_CPU, PIO_DMA, UDMA
};

#define SRC_INT_NUM 5 

class ATA 
{
public :
	bool OpenMedia(void);
	bool OpenMedia(ATA_MODE mode);
	bool CloseMedia(void);
	virtual bool ReadBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr);
	virtual bool WriteBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr);
	virtual bool StartReadingBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr);
	virtual bool StartWritingBlocks(U32 uStBlock, U32 uBlocks, U32 uBufAddr);
	bool IsReadingBlocksDone(void);
	bool IsWritingBlocksDone(void);
	void ContinueReadingBlocks(void);
	void ContinueWritingBlocks(void);
	void ChangeMode(void);

	void Init(void);
	void IdentifyDevice(void);
	void GetMaxSectors(U32& maxSec);
	void GetMaxMultiple(U32& maxMulti);
	void ResetAll(void );
	void Clear_Pending(U32 srcInt);
	bool FindInterruptRequest(U32& nthBit);
	void ClearAllInterrupt(void);	
	void SetTransferCommand(ATA_TRANSFER_CMD command);
	void IsTBufFullContinue(bool& status);
	void IsSBufEmptyContinue(bool& status);
	void SetMultiple(U32 uSector);

	bool ReadSectors_Pio(U32 nLBA,U32 nSectorCount,U32 nDesAddress);
	bool ReadSector_PioDma(U32 uLBA,U32 uDesAddress);
	bool ReadSectors_MultiplePioDma(U32 uLBA, U32 uDesAddress); ///
	bool ReadSectors_Udma(U32 uLBA,U32 uSectorCount,U32 uSrcAddress);

	bool WriteSectors_Pio(U32 nLBA,U32 nSectorCount,U32 nSrcAddress);
	bool WriteSector_PioDma(U32 uLBA, U32 uSrcAddress);
	bool WriteSectors_MultiplePioDma(U32 uLBA, U32 uSrcAddress); ///
	bool WriteSectors_Udma(U32 uLBA, U32 uSectorCount, U32 uSrcAddress);

	void SetAtaMode(ATA_MODE mode);
	bool IsDmaDone(void);
	
protected:
	
	bool WaitForDeviceReady(void);
	void WaitForHostReady(void);
	
	void SetPioMode(PIOMODE pmode);
	void SetUdmaMode(UDMAMODE umode);
	void SetLittleEndian(void);
	void SetConfigMode(ATA_MODE mode, bool isWriteMode);	

	void ReadDeviceReg(U32 nRegister, U8& data);
	void GetDataFromDevice(U16& data);

	void WaitForTransferDone(void);
	void WriteOnTaskFileReg(U32 nRegister,U32 nValue);
	void PutDataToDevice(U16 data);	

	void SetAtaOnOff(U8 OnOff);

	void SetAtaDevice(U32 nLBA, U32 nSectorCount);


	U32 m_uCfgReg;
	ATA_MODE m_eMode;

	U32 m_uMaxMultiple;
	U32 m_uCurrentMultiple;
	U32 m_uMaxSectors;
	PIOMODE m_eMaxPioMode;
	PIOMODE m_eCurrentPioMode;
	U32 m_uMaxUdmaMode;
	U32 m_uCurrentUdmaMode;

};

inline void ATA::SetAtaMode(ATA_MODE mode) { m_eMode = mode; }



#endif // __ATA_H__

⌨️ 快捷键说明

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