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

📄 idetask.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
 * description: IDETask
 * Maker	  : Nobuhiro Hatazawa  2004.11.20  S1R72V03
 * Copyright  : (C)2004,SEIKO EPSON Corp. All Rights Reserved.
 */

#include <string.h>
#include "SPRDEF.h"
#include "SPRSTS.h"
#include "OSCall.h"
#include "usbh_SampleTask.h"
#include "DeviceTask.h"

#include "IDETask.h"
#include "IDE_Func.h"
#include "ATA_ATAPIIF.h"
#include "Handler.h"
#include "led_if.h"

/*--------------------------------------------------------------------------*/
/* Constant definition */
/*--------------------------------------------------------------------------*/
#define DEVICE_MODE			(0)				/* HOSTxDEVICE bit Device Mode */
#define HOST_MODE			(1)				/* HOSTxDEVICE bit Host Mode */
#define WAIT_JOIN			(10)			/* Before start the DirectCopy,the task is wating for join in the IDE.This is the polling interval time*/
#define CHA_NUM				(1)				/* Channel A Number */
#define CHE_NUM				(6)				/* Channel E Number */

#define IDE_DATA_IN        (1)             /* Direction of data Transfer(internal use) */
#define IDE_DATA_OUT       (0)             /* Direction of data transfer(internal use) */

/* The Macro used for byte access */
#define	DIRECT_B(a)	*(unsigned char *)&(a)
/* The macro used for seperate 16 bits number into 8 bits number*/
#define WORD2BYTE_H(w)				((UCHAR)((w) >> 8))
#define WORD2BYTE_L(w)				((UCHAR)((w)	 ))
/* The macro used for seperate 32 bits number into 8 bits number */
#define DWORD2BYTE_HH(dw)			((UCHAR)((dw) >> 24))
#define DWORD2BYTE_HL(dw)			((UCHAR)((dw) >> 16))
#define DWORD2BYTE_LH(dw)			((UCHAR)((dw) >>  8))
#define DWORD2BYTE_LL(dw)			((UCHAR)((dw)	   ))
#define MAKEDWORD_B( a, b, c, d )	((ULONG) ( ((ULONG)(a)) | ((ULONG)((ULONG)(b))) << 8 | ((ULONG)((ULONG)(c))) << 16 | ((ULONG)((ULONG)(d))) << 24))

/*--------------------------------------------------------------------------*/
/* Varables 															*/
/*--------------------------------------------------------------------------*/

/*------------------------------------------------------------------*/
/* Task information 											*/
/*------------------------------------------------------------------*/
static	IDE_TASK_INF		IdeTsk_Inf;	/* Task information 			*/
static	IDE_TASK_CMDPARA	IdeTsk_CmdPara;
static	IDE_TASK_SENSE_DATA	IdeTsk_CmdError[MAX_DEVICE];

static	IDE_FUNCXFERPARA	IdeXferPara;/* IDE XferRate Set Parameter 		*/

typedef struct{
	unsigned char	DetectTerm			:1;	/* bit0 Detected Device terminate	*/
	unsigned char	DetectINTRQ			:1;	/* bit1 Detected Interrupt			*/
	unsigned char	IDE_Cmp				:1;	/* bit2 DMA Complete				*/
	unsigned char	Reserved3			:1;	/* bit3 							*/
	unsigned char	CompleteINTRQ		:1;	/* bit4 Auto Status Read Complete	*/
	unsigned char	IDE_SeqWrRegCmp		:1;	/* bit5 Sequence Write Complete		*/
	unsigned char	IDE_RegErr			:1;	/* bit6 Register Access Error		*/
	unsigned char	IDE_RegCmp			:1;	/* bit7 Register Access Cmplete		*/
}IDE_IntStat;
static	IDE_IntStat	IDEIntStatus;		/* IDE Interrupt Status 			*/

/*** STRAGE_lib.c ***/
static	IDE_FUNCCMDPARA		IdeCmdPara;	/* IDE Commnad Parameter 			*/
static	IDE_FUNCDEVICELIST	DeviceList;	/* IDE Device List					*/
static	IDE_FUNCTRANPARA	IdeTranPara;/* IDE Transfer Parameter 			*/

static	USHORT	DeviceID;				/* IDE Func Access Id 				*/
static	USHORT	DeviceNo;				/* IDE Device No 					*/
static	ULONG	IDEStatus;				/* IDE Status 						*/
static	UCHAR	DeviceType;				/* IDE Device Type 					*/
static	ULONG	transferSize;
static	UCHAR	senseData[32];
static	USHORT	ReadSectorSize[MAX_DEVICE];	/* Read Sector Size / Byte 		*/
static	USHORT	WriteSectorSize[MAX_DEVICE];/* Write Sector Size / Byte 	*/

/* Send Cue Seet Parmeter */
typedef struct cueseet{
	UCHAR	lbaAddHH;
	UCHAR	lbaAddHL;
	UCHAR	lbaAddLH;
	UCHAR	lbaAddLL;
	UCHAR	writeSector;
}CUE_SEET_DATA;
CUE_SEET_DATA	CueSeetData[100];		/* Send Cue Seet Parameter 			*/
static	USHORT	CueSeetPtr;				/* Send Cue Seer Parameter Pointer 	*/

static	IDE_TASK_UNIT_FLAG	UnitFlag[MAX_DEVICE];
										/* Unit Atention Flag				*/

/*--------------------------------------------------------------------------*/
/* Mode Sense/Selct Data													*/
/*--------------------------------------------------------------------------*/
/*------------------------------------------------------------------*/
/* DefPage															*/
/*------------------------------------------------------------------*/
/* Read, Write Recovery Parameter */
static UCHAR DefPage01[] = {
	0x01,	/* PS=0, page code=01h */
	0x0a,	/* Lenth of page 0ah */
	0x00,	/* Error recovery parameter=00h */
	0x01,	/* Read retry times=01h */
	0x00,	/* Data correction length */
	0x00,	/* Hard offset */
	0x00,	/* Data strobe offset */
	0x00,	/* Reserve */
	0x01,	/* Write retry times =01h */
	0x00,	/* Reserve*/
	0x00,	/* Resovery time limitation */
	0x00	};	/* Cache control parameter */
static UCHAR DefPage08[] = {
	0x08,	/* PS=0, page code=08h */
	0x0a,	/* Length of page=0ah */
	0x04,	/* WCE=0, MF=0, RCD=0 */
	0x00,	/* Maintenance priority of Read/Write=0h, Maintenance priority of write data=0h */
	0x00,	/* Number of pre-fetch deterrence blocks(MSB)=00h */
	0x00,	/* Number of pre-fetch deterrence blocks(LSB)=00h */
	0x00,	/* Minimum pre-fetch(MSB)=00h */
	0x00,	/* Minimum pre-fetch(LSB)=00h */
	0x00,	/* Maximum pre-fetch(MSB)=00h */
	0x00,	/* Maximum pre-fetch(LSB)=00h */
	0x00,	/* Number of Maximum pre-fetch limitation blocks(MSB)=00h */
	0x00	};	/* Number of Maximum pre-fetch limitation blocks(LSB)=00h  */

/* Removable Block Access Capacities Page Parameter */

static UCHAR DefPage1b[] = {
	0x1B,	/* PS=0, Page code=1Bh */
	0x0a,	/* Length of page=0ah */
	0x00,	/* SRFP = 0 */
	0x00,	/* NCD = 0, MSL = 0, TLUN = 0 */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00	};	/* Reserved */

/*------------------------------------------------------------------*/
/* ChangablePage													*/
/*------------------------------------------------------------------*/
/* Read error recovery parameter */
static UCHAR ChangablePage01[] = {
	0x01,	/* PS=0, page code=01h */
	0x0a,	/* Lenth of page 0ah */
	0x00,	/* Error recovery parameter=00h  */
	0x00,	/* Read retry times=00h  */
	0x00,	/* Data correction length */
	0x00,	/* Head offset */
	0x00,	/* Data strobe offset */
	0x00,	/* Reserve */
	0x00,	/* Write retry times =00h */
	0x00,	/* Reserve*/
	0x00,	/* Resovery time limitation */
	0x00	};	/* Cache control parameter */
static UCHAR ChangablePage08[] = {
	0x08,	/* PS=0, page code=08h */
	0x0a,	/* Length of page=0ah */
	0x00,	/* WCE=0, MF=0, RCD=0 */
	0x00,	/* Maintenance priority of Read/Write=0h, Maintenance priority of write data=0h */
	0x00,	/* Number of pre-fetch control blocks(MSB)=00h */
	0x00,	/* Number of pre-fetch control blocks(LSB)=00h */
	0x00,	/* Minimum pre-fetch(MSB)=00h */
	0x00,	/* Minimum pre-fetch(LSB)=00h */
	0x00,	/* Maximum pre-fetch(MSB)=00h */
	0x00,	/* Maximum pre-fetch(LSB)=00h */
	0x00,	/* Number of Maximum pre-fetch limitation blocks(MSB)=00h */
	0x00	};	/* Number of Maximum pre-fetch limitation blocks(LSB)=00h  */

/* Removable Block Access Capacities Page Parameter */
static UCHAR ChangablePage1b[] = {
	0x1B,	/* PS=0, Page code=1Bh */
	0x0a,	/* Length of page=0ah */
	0x00,	/* SRFP = 0 */
	0x00,	/* NCD = 0, MSL = 0, TLUN = 0 */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00,	/* Reserved */
	0x00	};	/* Reserved */

static	UCHAR modeSenseWork[36+8];
static	UCHAR mode_data_cnt;			/* Memory of Mode Page length */
static	UCHAR *mode_data_addr;			/* Memory of Mode Page address	*/
static	UCHAR *mode_chg_addr;			/* Memory of Changeable Page address */
static	UCHAR *wk_ptr;					/* Memory of Work area address */

/*--------------------------------------------------------------------------*/
/* Prototype															*/
/*--------------------------------------------------------------------------*/
static	LONG	IDETaskInit( void );
static	LONG	IDEMailDataCancel( void );

static	LONG	IDE_ForceEvent( void );

static	LONG	IDE_IntEvent( void );
static	LONG	IDE_CmdExecSts_IntProc( void );

static	LONG	IDE_MsgEvent( PMSGIDE );
static	LONG	IDE_InitSts_MsgProc( PMSGIDE );
static	LONG	IDE_IdleSts_MsgProc( PMSGIDE );
static	LONG	IDE_CmdExecSts_MsgProc( PMSGIDE );

static	LONG	IDE_CmdIdle_Proc( PMSGIDE );
static	LONG	IDE_CmdExec_Proc( PMSGIDE );

static	LONG	HardReset( void );

static	LONG	SoftReset( void );

static	LONG	GetDeviceList( PMSGIDE );

static	LONG	SetXferRate( PMSGIDE );
static	LONG	SetXferRate_ParaCheck( PARAM_MSG_REQ_IDE_SET_XFERRATE* );

static	LONG	ATACmd_Main( UCHAR );

static	LONG	IDECmd_ParaCheck( PARAM_MSG_REQ_IDE_CMD* );
static	LONG	IDECmd_ParaSave( PARAM_MSG_REQ_IDE_CMD * );
static	LONG	ATACmd_Auto( void );
static	LONG	ATACmd_OutManual( void );
static	LONG	ATACmd_OutINTRQWait( void );
static	LONG	ATACmd_XferStart( void );
static	LONG	ATACmd_XferStop( void );
static	LONG	ATACmd_StatusINTRQWait( void );
static	void	ATACmd_Division( void );

static	LONG	XferStart_ParaCheck( PARAM_MSG_REQ_IDE_XFER_START* );

static	LONG	ATAPICmd_Main( UCHAR );
static	LONG	ATAPICmd_Auto( void );
static	LONG	ATAPICmd_OutManual( void );
static	LONG	ATAPICmd_OutINTRQWait( void );
static	LONG	ATAPICmd_XferStart( void );
static	LONG	ATAPICmd_XferStop( void );
static	LONG	ATAPICmd_StatusINTRQWait( void );

static	LONG	StatusError( PMSGIDE );

static	void	SendMessage( OS_ID, USHORT, USHORT, const VOID* );
static	OS_FLGPTN	WaitMessage( USHORT size, USHORT* msgAry, MSGIDE** pIDEMsg );

static	LONG	StatusWait( void );
static	UCHAR	GetDeviceType( UCHAR );

static	void	StatusChange( UCHAR );

static  LONG    ATAPICommandCheck( UCHAR devType, IDE_TASK_CMDPARA *pCmdPara, IDE_TASK_SENSE_DATA *pErrorPara,UCHAR *errInfo);
static	LONG	ATACommandCheck( UCHAR devType, IDE_TASK_CMDPARA *pCmdPara );
static	void	GetWriteDataSize( UCHAR *pCmdBlock );
static	LONG	IDE_ChangeSendPara( UCHAR devType, UCHAR *pCmdBlock, UCHAR *pBufPointer, ULONG *pDataSize );
static	LONG	IDE_ChangeRecivePara( UCHAR devType, UCHAR *pCmdBlock, VOID *pBufPointer, ULONG dataSize );

static	USHORT	ModeSenseSetModePage( UCHAR *pCmdBlocke, UCHAR *pBufPointer,ULONG *pDataSize );
static	LONG	IDE_DeviceError( UCHAR deviceType, ULONG Status, UCHAR *pSenseData, IDE_TASK_SENSE_DATA *pErrorPara );
static	LONG	IDESetSenseKey( ULONG sensekey, IDE_TASK_SENSE_DATA *pErrorPara );

static	void	SendMessageNTFY_IDE_CMD( UCHAR result, ULONG len );
static	UCHAR	DataModeSetATA( UCHAR );
static	LONG	IDEIntEventSet( UCHAR );
static	void	CommandLengthMake( UCHAR *cmdBlock, USHORT sector );
static	void	CommandLBAMake( UCHAR *cmdBlock, USHORT sector );
static	UCHAR GetDataProtocol( UCHAR command );
static	UCHAR	DataModeSetATAPI( UCHAR mode);

static void ATACmd_OutPIO( void );
static void ATACmd_OutDMA( void );

// Command protocol
#define CMD_ATAPI_WRITE			(0)		// ATAPI CMD PROTOCOL direction : OUT
#define CMD_ATAPI_READ			(1)		// ATAPI CMD PROTOCOL direction : IN
#define CMD_NON_DATA			(2)		// Non-data Command Protocol
#define CMD_DMA_OUT				(10)	// DMA Command Protocol
#define CMD_DMA_IN				(11)	// DMA Command Protocol
#define CMD_PIO_OUT				(4)		// PIO data-out Command Protocol
#define CMD_PIO_IN				(5)		// PIO data-in Command Protocol
#define CMD_PKT					(6)		// Packet Command Protocol
#define CMD_DMO					(7)		// Overlapped/queued DMA Command Protocol
#define CMD_DR					(8)		// Device reset Protocol
#define CMD_RESERVED			(9)		// Reserved command
static	void	MSelFindPage( UCHAR page );
static	LONG	IsMSelRcvParaInvalid(void);

typedef struct {
	UCHAR Reserved	:3;			/* Reserved 						*/
	UCHAR Protocol	:5;			/* Data transfer direction (0:OUT, 1:IN) */
} IDEInfo;

extern const IDEInfo ATAPI_CmdInfo[256];
extern const IDEInfo ATA_CmdInfo[256];
#ifdef DEBUG_C
extern ULONG IDEResetCount;
#endif
/*
//=============================================================================
// Function_Name: IDETask
// description	: IDE control task
// argument		:
// return		:
// flag			:
// global		:
//=============================================================================
*/
void IDETask( void )
{
FLGPTN		flgptn;
PMSGIDE		pk_msg;
OS_ER		ercd;

	IDETaskInit();						/* Task intialzie process 		*/

	while( 1 ){							/* Task main loop 				*/
										/* Waiting for event flag		*/
		OS_WaiFlg( FLGID_IDE, FLG_WAIT_PTN_IDE, TWF_ORW, &flgptn );

		if( flgptn & FLG_EVENT_FORCE_IDE ){
			/*******************************/
			/* Force process event	   */
			/*******************************/
			OS_ClrFlg( FLGID_IDE, ~(FLG_EVENT_FORCE_IDE) );/* Clear the flag  */

			IDEMailDataCancel();		/* Destruct message data */

			IDE_ForceEvent();			/* Process the force event 		*/
		}
		else if( flgptn & FLG_EVENT_INT_IDE ){
			/*******************************/
			/* Interrupt process event */
			/*******************************/
			OS_ClrFlg( FLGID_IDE, ~(FLG_EVENT_INT_IDE) );/* Clear the flag	*/

			IDE_IntEvent();				/* Process the interrupt event */
		}
		else if( flgptn & FLG_EVENT_MSG_IDE ){
			/*******************************/
			/* Message process event   */
			/*******************************/
										/* Receive message from the mail box */
			OS_DisDsp();
			ercd = OS_PRcvMbx( MBXID_IDE, ( T_MSG** )&pk_msg );

			if ( ercd == E_OK ){
				OS_EnaDsp();
										/* There is message				*/
				IDE_MsgEvent( pk_msg );	/* Process message event 		*/
										/* Free message buffer			*/
				OS_RelMpf( pk_msg->msgHead.useMpfId, (VP)pk_msg );
			}
			else if( ercd == E_TMOUT ){
										/* No message 					*/
				OS_ClrFlg( FLGID_IDE, ~(FLG_EVENT_MSG_IDE) );/* Clear the flag */
				OS_EnaDsp();
			}
			else{
				OS_EnaDsp();
										/* Receive message error 		*/
			}
		}
		else{
			OS_EnaDsp();
										/* Presently, None 				*/
		}
	}
}

/*
//=============================================================================
// Function_Name: IDETaskInit
// description	: IDE control task itialize process
// argument		:
// return		:
// flag			:
// global		:

⌨️ 快捷键说明

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