📄 idetask.c
字号:
switch( IdeTsk_CmdPara.dataMode ) /* Process mode of the received command */
{
/*------------------------------------------------------------------*/
/* No command output,No data transfer (Simulate ATAPI with F/W.)*/
/*------------------------------------------------------------------*/
case IDE_CMD_PROT_FW_NON_DATA:
SendMessageNTFY_IDE_CMD( IDE_REQ_OK, 0 );
StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
break;
/*------------------------------------------------------------------*/
/* No command output,has data transfer(Simulate ATAPI with F/W.)*/
/*------------------------------------------------------------------*/
case IDE_CMD_PROT_FW_IN_DATA:
case IDE_CMD_PROT_FW_OUT_DATA:
rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* Sending and receiving size */
rdyData.xferCount = 1; /* Transfer times fixed to 1 */
if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
} else {
SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
}
IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Set to Data Transfer Phase */
/* Waiting for the Data Transfer start request*/
break;
/*------------------------------------------------------------------*/
//
/* Non-data command protocol */
/* PIO data in command protocol */
/* PIO data out command protocol */
/*------------------------------------------------------------------*/
case IDE_CMD_ATA_PROT_NON_DATA:
case IDE_CMD_ATA_PROT_SPIO: /* IDE(PIO) <-- PIO --> FIFO */
case IDE_CMD_ATA_PROT_HPIO: /* IDE(PIO) <-- DMA --> FIFO */
/*--------------------------------------------------------------*/
/* Set the I/F that is used when output command */
/*--------------------------------------------------------------*/
for( i=0; i<12; i++ ){
IdeCmdPara.commandBlock[i] = IdeTsk_CmdPara.deviceCmdBlock[i];
}
IdeTsk_CmdPara.xferCount = 1;/* Initializes it by the first time.*/
IdeTsk_CmdPara.tranTotalSize = 0;/* Initialize the transfer number*/
/*--------------------------------------------------------------*/
/* Send Command Block */
/*--------------------------------------------------------------*/
ATACmd_OutPIO();
break;
/*------------------------------------------------------------------*/
/* DMA command protocol */
/*------------------------------------------------------------------*/
case IDE_CMD_ATA_PROT_DMA: /* IDE(DMA) <-- DMA --> FIFO */
/*--------------------------------------------------------------*/
/* Set the I/F that is used when output command */
/*--------------------------------------------------------------*/
for( i=0; i<12; i++ ){
IdeCmdPara.commandBlock[i] = IdeTsk_CmdPara.deviceCmdBlock[i];
}
IdeTsk_CmdPara.xferCount = 1;/* Initializes it by the first time.*/
IdeTsk_CmdPara.tranTotalSize = 0;/* Initialize the transfer number*/
/*--------------------------------------------------------------*/
/* Send Command Block */
/*--------------------------------------------------------------*/
ATACmd_OutDMA();
break;
default:
break;
}
return STATUS_SUCCESS;
}
/*
//=============================================================================
// Function_Name: ATACmd_OutPIO
// description :
// argument :
// return :
// flag :
// global :
//=============================================================================
*/
void ATACmd_OutPIO( void ){
LONG result;
PARAM_MSG_NTFY_IDE_CMP_XFER_READY rdyData;
result = IDE_FuncCommandOut( DeviceID, DeviceNo, IDE_FUNC_PIO_MODE, &IdeCmdPara );
if( result == STATUS_SUCCESS ){
/* Waiting for INTRQ */
/* The direction of transfer is decided according to the command code. */
if( IdeCmdPara.commandMode == IDE_FUNC_ATAPI )
{
if( ATAPI_CmdInfo[ IdeCmdPara.commandBlock[0] ].Protocol == CMD_ATAPI_WRITE ){
IdeTranPara.direction = IDE_FUNC_IDE_OUT;
}
else{
IdeTranPara.direction = IDE_FUNC_IDE_IN;
}
}
else // IDE_FUNC_ATA
{
if( ATA_CmdInfo[ IdeCmdPara.commandBlock[7] ].Protocol == CMD_PIO_OUT ){
IdeTranPara.direction = IDE_FUNC_IDE_OUT;
}
else{
IdeTranPara.direction = IDE_FUNC_IDE_IN;
}
}
if(( IdeTsk_CmdPara.dataMode == IDE_CMD_ATA_PROT_HPIO )||
( IdeTsk_CmdPara.dataMode == IDE_CMD_ATA_PROT_SPIO )){
if( IdeTranPara.direction == IDE_FUNC_IDE_OUT ){
/* OUT only. */
IDEStatus = 0x00; /* Clear */
do{
IDE_FuncGetStatus( DeviceID, DeviceNo, &IDEStatus, &transferSize, senseData );
}while( IDEStatus == IDE_FUNC_BSY );
/* Read the status until it is not BUSY. */
if( IDEStatus == IDE_FUNC_TRAN_READY ){
/* It is ready for transfer */
rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* The size to process */
rdyData.xferCount = IdeTsk_CmdPara.xferCount;/* Present processing count (one - count) */
if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
} else {
SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
}
IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Enter Data Transfer Phase */
}
else{
/* ERROR Complete Statsu Check */
IDE_DeviceError( DeviceType, IDEStatus, senseData, &IdeTsk_CmdError[DeviceNo] );
SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.tranTotalSize );
StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
}
}
else{
IdeTsk_Inf.sState = IDE_SSTS_COMMAND;/* Set to Command Phase */
}
}
else{
IdeTsk_Inf.sState = IDE_SSTS_COMMAND;/* Set to Command Phase */
}
}
else{ /* Error */
IDESetSenseKey( SENSE_INVALID_COMMAND_OPERATION_CODE, &IdeTsk_CmdError[DeviceNo] );
SendMessageNTFY_IDE_CMD( IDE_REQ_NG, 0 );
StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
}
}
/*
//=============================================================================
// Function_Name: ATACmd_OutDMA
// description :
// argument :
// return :
// flag :
// global :
//=============================================================================
*/
void ATACmd_OutDMA( void ){
LONG result;
PARAM_MSG_NTFY_IDE_CMP_XFER_READY rdyData;
result = IDE_FuncCommandOut( DeviceID, DeviceNo, IDE_FUNC_DMA_MODE, &IdeCmdPara );
if( result == STATUS_SUCCESS ){
if( IdeCmdPara.commandMode == IDE_FUNC_ATAPI )
{
if( ATAPI_CmdInfo[ IdeCmdPara.commandBlock[0] ].Protocol == CMD_ATAPI_WRITE ){
IdeTranPara.direction = IDE_FUNC_IDE_OUT;
}
else{
IdeTranPara.direction = IDE_FUNC_IDE_IN;
}
}
else // IDE_FUNC_ATA
{
if( ATA_CmdInfo[ IdeCmdPara.commandBlock[7] ].Protocol == CMD_DMA_OUT ){
IdeTranPara.direction = IDE_FUNC_IDE_OUT;
}
else{
IdeTranPara.direction = IDE_FUNC_IDE_IN;
}
}
rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* Sending and receiving size */
rdyData.xferCount = IdeTsk_CmdPara.xferCount;/* Transfer times */
if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
/* Transmission is started at DirectCopy. */
if(IdeTsk_CmdPara.xferMode == IDE_XFER_DIRECT) {
if( DeviceType == IDE_DEV_ATA ){/* Check the connected device */
ATACmd_XferStart();
}
else if( DeviceType == IDE_DEV_ATAPI ){
ATAPICmd_XferStart();
}
else{
ATACmd_XferStart();
}
} else {
SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
}
} else {
SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
}
if(IdeTsk_CmdPara.xferMode != IDE_XFER_DIRECT) {
IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Enter Data Transfer Phase */
/* Because there is no INTRQ */
/* Waiting for the Start Data Transfer request*/
}
}
else{ /* Error */
IDESetSenseKey( SENSE_INVALID_COMMAND_OPERATION_CODE, &IdeTsk_CmdError[DeviceNo] );
SendMessageNTFY_IDE_CMD( IDE_REQ_NG, 0 );
StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
}
}
/*
//=============================================================================
// Function_Name: ATACmd_OutINTRQWait
// description :
// argument :
// return :
// flag :
// global :
//=============================================================================
*/
LONG ATACmd_OutINTRQWait( void )
{
PARAM_MSG_NTFY_IDE_CMP_XFER_READY rdyData;
switch( IdeTsk_CmdPara.dataMode ) /* Process mode of the received command */
{
/*------------------------------------------------------------------*/
/* Non-data command protocol */
/*------------------------------------------------------------------*/
case IDE_CMD_ATA_PROT_NON_DATA:
if( IDEIntStatus.DetectINTRQ == 1 ){
IDE_FuncGetStatus( DeviceID, DeviceNo, &IDEStatus, &transferSize, senseData );
if( IDEStatus == IDE_FUNC_CMD_COMP ){
SendMessageNTFY_IDE_CMD( IDE_REQ_OK, IdeTsk_CmdPara.dataSize );
}else{
SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.dataSize );
}
StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
IDEIntStatus.DetectINTRQ = 0;
}
break;
/*------------------------------------------------------------------*/
/* PIO data in command protocol */
/* PIO data out command protocol */
/*------------------------------------------------------------------*/
case IDE_CMD_ATA_PROT_SPIO: /* IDE(PIO) <-- PIO --> FIFO */
case IDE_CMD_ATA_PROT_HPIO: /* IDE(PIO) <-- DMA --> FIFO */
if( IDEIntStatus.DetectINTRQ == 1 ){
IDE_FuncGetStatus( DeviceID, DeviceNo, &IDEStatus, &transferSize, senseData );
if( IDEStatus != IDE_FUNC_BSY ){
/* IDE Device STATUS Check */
rdyData.xferDataLen = IdeTsk_CmdPara.dataSize;/* The size to process */
rdyData.xferCount = IdeTsk_CmdPara.xferCount;/* Present processing count(one-count) */
if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
} else {
SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_CMP_XFER_READY,
sizeof(PARAM_MSG_NTFY_IDE_CMP_XFER_READY), &rdyData );
}
IdeTsk_Inf.sState = IDE_SSTS_XFER;/* Enter Data Transfer Phase */
}
else{
/* Command Complete Check */
if( IDEStatus == IDE_FUNC_CMD_COMP ){
SendMessageNTFY_IDE_CMD( IDE_REQ_OK, IdeTsk_CmdPara.tranTotalSize );
}else{
/* ERROR Complete Statsu Check */
IDE_DeviceError( DeviceType, IDEStatus, senseData, &IdeTsk_CmdError[DeviceNo] );
SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.tranTotalSize );
}
StatusChange( IDE_MSTS_IDLE );/* Idle state (command processing is completed) */
}
IDEIntStatus.DetectINTRQ = 0;
}
break;
/*------------------------------------------------------------------*/
/* DMA command protocol */
/*------------------------------------------------------------------*/
case IDE_CMD_ATA_PROT_DMA: /* IDE(DMA) <-- DMA --> FIFO */
/* DMA output command,but doesn't output INTRQ.*/
break;
default:
break;
}
return STATUS_SUCCESS;
}
/*
//=============================================================================
// Function_Name: ATACmd_XferStart
// description :
// argument :
// return :
// flag :
// global :
//=============================================================================
*/
LONG ATACmd_XferStart( void )
{
LONG result;
PARAM_MSG_NTFY_IDE_XFER_CMP xferData;
switch( IdeTsk_CmdPara.dataMode ) /* Process mode of the received command */
{
/*------------------------------------------------------------------*/
/* No command output,has data transfer(Simulate ATAPI with F/W.)*/
/*------------------------------------------------------------------*/
case IDE_CMD_PROT_FW_IN_DATA: /* FW --> HOST */
case IDE_CMD_PROT_FW_OUT_DATA: /* HOST --> FW */
if( IdeTsk_CmdPara.dataMode == IDE_CMD_PROT_FW_IN_DATA ){
/* FW --> HOST */
result = IDE_ChangeSendPara( DeviceType, IdeTsk_CmdPara.cmdBlock,
IdeTsk_CmdPara.bufferPtr, &IdeTsk_CmdPara.dataSize );
}
else{ /* HOST --> FW */
result = IDE_ChangeRecivePara( DeviceType, IdeTsk_CmdPara.cmdBlock,
IdeTsk_CmdPara.bufferPtr, IdeTsk_CmdPara.dataSize );
}
if( result == STATUS_SUCCESS ){
xferData.result = IDE_REQ_OK;
}
else{
xferData.result = IDE_REQ_NG;
}
/* Send message */
if( RegRead( REG08_HostDeviceSel ) & BIT_HOSTxDEVICE_HOST ){
SendMessage( MBXID_USBH_SAMPLE, MSG_NTFY_IDE_XFER_CMP,
sizeof(PARAM_MSG_NTFY_IDE_XFER_CMP), &xferData );
} else {
SendMessage( MBXID_DEVICE, MSG_NTFY_IDE_XFER_CMP,
sizeof(PARAM_MSG_NTFY_IDE_XFER_CMP), &xferData );
}
if( result == STATUS_SUCCESS ){/* Processing result */
SendMessageNTFY_IDE_CMD( IDE_REQ_OK, IdeTsk_CmdPara.dataSize );
}
else{
SendMessageNTFY_IDE_CMD( IDE_REQ_NG, IdeTsk_CmdPara.dataSize );
}
StatusChange( IDE_MSTS_IDLE );/* Idle
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -