📄 idetask.c
字号:
/*
* 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 + -