📄 rbc.c
字号:
/*
////////////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1999-2003 PHILIPS Semiconductors - APIC
//
// Module Name:
//
// rbc.c
//
// Abstract:
//
// These are the structures and defines used in the Reduced Block Command set
//
// Author:
//
// Hilbert Zhang ZhenYu
//
// Revision History:
//
// Created 01 Jun. 1999
//
// Copyright @ 1999-2003, PHILIPS Semiconductors - APIC. All rights reserved.
//
*/
#include <reg51.h> /* special function register declarations */
#undef GLOBAL_EXT
#include "SysCnfg.h"
#include "BasicTyp.h"
#include "common.h"
#include "Hal4D12.h"
#include "ATA.h"
#include "RBC.h"
#include "RBCCmd.h"
#include "Hal4ata.h"
#include "Hal4Sys.h"
#include "TPBulk.h"
/*
//*************************************************************************
// Public Data
//*************************************************************************
*/
//sbit ATA_RD_N = 0xB6;
// bit Flags
STRUC_EXT BITFLAGS BDATA_SEG bFlags;
// MCU Timer bit flags
BIT_EXT MCUBF_Timer;
INT8_EXT Hal4Sys_ClockTicks;
// D12 bit flags
BIT_EXT D12BF_SetupOverwritten;
BIT_EXT D12BF_Configuration;
//USB
// DefaultControlPipe Finite State Machine [One-Hot]
INT8_EXT BDATA_SEG DCPFSMstate;
BIT_EXT DCPFSM_SetupProc;
BIT_EXT DCPFSM_DataIn;
BIT_EXT DCPFSM_DataOut;
BIT_EXT DCPFSM_COhandshake;
BIT_EXT DCPFSM_CIhandshake;
BIT_EXT DCPFSM_Stall;
// DCP FSM
// SETUP Stage -> SETUP Proc -> DATA OUT Stage -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
// SETUP Stage -> SETUP Proc -> CONTROL OUT Handshake -> STATUS Stage -> IDLE
// SETUP Stage -> SETUP Proc -> DATA IN Stage-> CONTROL IN Handshake ->STATUS Stage -> IDLE
//
INT16_EXT DCPXfer_wResidue;
INT8_EXT * DCPXfer_pData;
// USB Device Request
STRUC_EXT DEVICE_REQUEST DCPDeviceRequest;
INT8_EXT UsbReq_Recipient;
INT8_EXT UsbReq_Type;
INT8_EXT UsbReq_Request;
BIT_EXT REQBF_DCPRequest_dir;
BIT_EXT REQBF_StallDCPRequest;
BIT_EXT REQBF_DCPRequest_EPdir;
// Bulk-Only TP Finite State Machine [One-Hot]
INT8_EXT BDATA_SEG BOTFSMstate;
BIT_EXT BOTFSM_CBWProc;
BIT_EXT BOTFSM_DataIn;
BIT_EXT BOTFSM_DataOut;
BIT_EXT BOTFSM_CSWProc;
BIT_EXT BOTFSM_CSW;
BIT_EXT BOTFSM_IDLE;
BIT_EXT BOTFSM_Stall;
// BOT FSM
// IDLE Stage -> CBW -> CBW Proc -> DATA OUT Stage -> CSW Proc -> CSW Stage -> IDLE
// IDLE Stage -> CBW -> CBW Proc -> DATA IN Stage -> CSW Proc -> CSW Stage -> IDLE
// STALL Stage -> IDLE
//
BIT_EXT BOTXfer_Abort;
INT16_EXT BOTXfer_wResidue;
INT8_EXT * BOTXfer_pData;
STRUC_EXT TPBLK_STRUC DATA_SEG TPBulk_Block;
#define TPBulk_CBW TPBulk_Block.TPBulk_CommandBlock
#define CBW_wXferLen TPBulk_CBW.dCBW_DataXferLen
#define RBC_CDB TPBulk_CBW.cdbRBC
#define RBC_LUN TPBulk_CBW.bCBW_LUN
#define TPBulk_CSW TPBulk_Block.TPBulk_CommandStatus
#define CSW_wResidue ((INT16)TPBulk_CSW.dCSW_DataResidue)
BIT_EXT BOTBF_StallAtBulkOut;
BIT_EXT BOTBF_StallAtBulkIn;
// Xfer_Space
INT8_EXT BDATA_SEG Xfer_Space;
// Default Control Pipe Tansfer DCPXfer
BIT_EXT DCPXfer_atMCUCODE;
BIT_EXT DCPXfer_atMCURAM;
BIT_EXT DCPXfer_atEEROM;
BIT_EXT DCPXfer_atATA;
// Bulk Only Xfer space
BIT_EXT BOTXfer_atRAM;
BIT_EXT BOTXfer_atATA;
BIT_EXT BOTXfer_atROM;
STRUC_EXT HW_ATA_DEVICES_EXTENSION Hal4ATA_DevExt;
#define ATADevExt_IDData Hal4ATA_DevExt.IdentifyData
BIT_EXT ATABF_IsAttached;
BIT_EXT ATABF_IsSupportMultiSector;
BIT_EXT ATABF_IDEXfer_dir;
BIT_EXT ATABF_IsSkipSetParameters;
INT8_EXT Hal4ATA_SectCntInBlk;
/*
//*************************************************************************
// Public temp var
//*************************************************************************
*/
STRUC_EXT FLEXI_INT32 tempvars4UsbReq;
INT8_EXT BDATA_SEG FlexByte;
BIT_EXT FlexByte_b0;
BIT_EXT FlexByte_b1;
BIT_EXT FlexByte_b2;
BIT_EXT FlexByte_b3;
BIT_EXT FlexByte_b4;
BIT_EXT FlexByte_b5;
BIT_EXT FlexByte_b6;
BIT_EXT FlexByte_b7;
/*
//*************************************************************************
// Private Data
//*************************************************************************
*/
code REQUEST_SENSE_DATA Req_SenseData=
{
//0x70, 0x00, 0x06, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x29,
//0x00, 0x00, 0x00, 0x00, 0x00
0x70, // INT8 ResponseCode : 7;
0, // INT8 Valid : 1;
0,// INT8 SegmentNum;
0x5,// INT8 SenseKey : 4; 5= illegal request
0, // INT8 Reserved0 : 1;
0,// INT8 WrongLenIndicator : 1;
0,// INT8 EndofMedium : 1;
0,// INT8 FileMark : 1;
0,// INT8 Info_0;
0,// INT8 Info_1;
0,// INT8 Info_2;
0,// INT8 Info_3;
0xA,// INT8 AdditionalSenseLen;
0,// INT8 CommandSpecInfo_0;
0,// INT8 CommandSpecInfo_1;
0,// INT8 CommandSpecInfo_2;
0,// INT8 CommandSpecInfo_3;
0x29,// INT8 ASC;
0,// INT8 ASCQ;
0,// INT8 FieldReplacableUnitCode;
0,// INT8 SenseKeySpec_0 : 7;
0,// INT8 SenseKeySpecValid : 1;
0,// INT8 SenseKeySpec_1;
0 // INT8 SenseKeySpec_2;
};
RBC_PROPERTY RBC_PropertyData;
#define PARAMETER_LIST_LENGTH (sizeof(MODE_PARAMETER_HEAD)+sizeof(MODE_PARAMETER_HEAD))
code MODE_PARAMETER_HEAD ParaHeadMask =
{
PARAMETER_LIST_LENGTH-1, /* mode data length*/
0, /* medium type*/
0, /* device spec Param*/
0 /* block Descriptor length*/
};
code MODE_RBC_DEVICE_PARAMETERS_PAGE ParaPageMask =
{
MODE_PAGE_RBC_DEVICE_PARAMETERS,
0, /*Reserved*/
0, /*PageSavable*/
0x00, /*PageLength*/
0, /*WriteCacheDisable*/
00, /*Reserved*/
{
/*Logical block Size = 512 Bytes*/
0x00,
0x00
},
{
/*Number of logical blocks*/
0x00,
0x00,
0x00,
0x00,
0x00
},
0x00, /*Power/Peformance*/
0, /*LockDisable*/
0, /*FormatDisable*/
0, /*WriteDisable*/
0, /*ReadDisable*/
0x0, /*Reserved*/
0x00 /*Reserved*/
};
code MODE_PARAMETER_HEAD DefaultParaHead =
{
PARAMETER_LIST_LENGTH-1, /* mode data length*/
0, /* medium type*/
0, /* device spec Param*/
0 /* block Descriptor length*/
};
code MODE_RBC_DEVICE_PARAMETERS_PAGE DefaultParaPage =
{
MODE_PAGE_RBC_DEVICE_PARAMETERS,
0, /*Reserved*/
1, /*PageSavable*/
0x0B, /*PageLength*/
0, /*WriteCacheDisable*/
00, /*Reserved*/
{
/*Logical block Size = 512 Bytes*/
0x02,
0x00
},
{
/*Number of logical blocks*/
0x00,
0x00,
0x00,
0x00,
0x00
},
0xFF, /*Power/Peformance*/
0, /*LockDisable*/
0, /*FormatDisable*/
0, /*WriteDisable*/
0, /*ReadDisable*/
0x0, /*Reserved*/
0x00 /*Reserved*/
};
code VPD_SERIAL_PAGE SerialPage =
{
RBC_DEVICE,
0x00,
VPDPAGE_SERIAL_NUMBER,
0x00,
24, //size of SerialNumber
{
// SerialNumber
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0,
'0',0
}
};
code VPD_DEVICE_ID_PAGE DeviceIDPage =
{
RBC_DEVICE,
0x00,
VPDPAGE_DEVICE_IDENTITY,
0x00,
sizeof(ASCII_ID_DESCRIPTOR),
{
0x02,
0x00,
0x01,
0x00,
0x00,
0x00,
sizeof(ASCII_ID_STRING),
{
// ASCII_ID_STRING
'P','h','i','l',
'i','p','s',' ',
'S','u','p','e',
'r',' ','D','i',
's','k',' '
}
}
};
code STD_INQUIRYDATA inquiryData =
{
0x00,// RBC_DEVICE,
0,//INT8 Reserved0 : 3;
0,//INT8 Reserved1 : 7;
1,//INT8 RemovableMedia : 1;
2,//INT8 Reserved2;
2,//INT8 Reserved3 : 5;
0,//INT8 NormACA : 1;
0,//INT8 Obsolete0 : 1;
0,//INT8 AERC : 1;
//INT8 Reserved4[3];
{
0x1F,0,0
},
0,//INT8 SoftReset : 1;
0,//INT8 CommandQueue : 1;
0,//INT8 Reserved5 : 1;
0,//INT8 LinkedCommands : 1;
0,//INT8 Synchronous : 1;
0,//INT8 Wide16Bit : 1;
0,//INT8 Wide32Bit : 1;
0,//INT8 RelativeAddressing : 1;
//INT8 VendorId[8];
{
'P','H','I','L',
'I','P','S',' '
},
//INT8 ProductId[16];
{
'U','S','B','-',
'I','D','E',' ',
'A','d','a','p',
't','e','r',' '
},
//INT8 ProductRevisionLevel[4];
{
'0','.','0','0'
},
// Above is 36 bytes
// can be tranmitted by Bulk
//INT8 VendorSpecific[20]; out[64 bytes] within one packet only.
{
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
},
0,//INT8 InfoUnitSupport : 1;
0,//INT8 QuickArbitSupport : 1;
0,//INT8 Clocking : 2;
0,//INT8 Reserved1 : 4;
0,//INT8 Reserved2 ;
//USHORT VersionDescriptor[8] ;
{
0, 0, 0, 0,
0, 0, 0, 0
},
//INT8 Reserved3[22];
{
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0
}
};
/*
//*************************************************************************
// Subroutines
//*************************************************************************
*/
BOOLEAN RBC_Handler( void )
{
#define cdbGeneric RBC_CDB.RbcCdb_Generic
BOOLEAN retStatus = FALSE;
BOTXfer_wResidue = 0;
switch(cdbGeneric.OperationCode)
{
/* required command */
case RBC_CMD_READ10:
retStatus = RBC_Read();
break;
case RBC_CMD_READCAPACITY:
retStatus = RBC_ReadCapacity();
break;
case RBC_CMD_STARTSTOPUNIT:
retStatus = RBC_OnOffUnit();
break;
case RBC_CMD_SYNCCACHE:
retStatus = RBC_SyncCache();
break;
case RBC_CMD_VERIFY10:
retStatus = RBC_Verify();
break;
case RBC_CMD_WRITE10:
retStatus = RBC_Write();
break;
case SPC_CMD_INQUIRY:
retStatus = SPC_Inquiry();
break;
case SPC_CMD_MODESELECT6://0x15
retStatus = SPC_ModeSelect();
break;
case SPC_CMD_MODESENSE6:
retStatus = SPC_ModeSense();//0x1A
break;
case SPC_CMD_PRVENTALLOWMEDIUMREMOVAL:
retStatus = SPC_LockMedia();
break;
case SPC_CMD_TESTUNITREADY: //0x00
retStatus = SPC_TestUnit();
break;
case SPC_CMD_REQUESTSENSE: //0x03
retStatus = SPC_RequestSense();
break;
/* optional commands */
case RBC_CMD_FORMAT:
retStatus = RBC_Format();
break;
case SPC_CMD_RESERVE6:
retStatus = SPC_Reserve6();
break;
case SPC_CMD_RELEASE6:
retStatus = SPC_Release6();
break;
case SPC_CMD_PERSISTANTRESERVIN:
retStatus = SPC_PersisReserveIn();
break;
case SPC_CMD_PERSISTANTRESERVOUT:
retStatus = SPC_PersisReserveOut();
break;
case SPC_CMD_WRITEBUFFER:
retStatus = SPC_WriteBuff();
break;
case SPC_CMD_READLONG:
retStatus = SPC_READLONG();//0x23
break;
default:
// Invalid CBW
TPBulksup_ErrorHandler(CASECBW,0);
//SCSI_SENSE_ILLEGAL_REQUEST=0x05
//SCSI_ADSENSE_ILLEGAL_COMMAND=0x20
RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_ILLEGAL_COMMAND,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
break;
}
return retStatus;
#undef cdbGeneric
}
/*
////////////////////////////////////////////////////////////////////////////////////
// Reduced Block Command Support
////////////////////////////////////////////////////////////////////////////////////
*/
BOOLEAN SPC_READLONG(void)
{
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
RBC_BuildSenseData(SCSI_SENSE_ILLEGAL_REQUEST,SCSI_ADSENSE_INVALID_CDB,0);
TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
}
BOOLEAN RBC_Read(void)
{
#define cdbRead RBC_CDB.RbcCdb_Read
Hal4ATA_SectCntInBlk = ATADevExt_IDData.MaximumBlockTransfer << BITNUM4EP2PKT_PER_SECTOR;
/*
// Setting ATA Hardware
*/
ATABF_IDEXfer_dir = 1;
Hal4ATA_ReadWriteSetting();
/*
// config TPBulkXfer Paras
*/
Xfer_Space &= BOTXFERSPACE_MASK;
BOTXfer_atATA = 1;
BOTXfer_wResidue = CBW_wXferLen;
TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
RBC_BuildSenseData(SCSI_SENSE_NO_SENSE,0,0);
BOTFSMstate = USBFSM4BOT_DATAIN;
return (TRUE);
#undef cdbRead
}
/*
BOOLEAN RBC_Read(void)
{
char temp, temp1;
unsigned int a ;
unsigned int i;
int b;
#define cdbRead RBC_CDB.RbcCdb_Read
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -