📄 rbc.c
字号:
//这时SCSI基本命令的子集。这部分代码用于对主机发出的SCSI命令进行解码
////////////////////////////////////////////////////////////////////////////////////
//
// 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 "config.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 bFlags;
// MCU Timer bit flags
#define MCUBF_Timer bFlags.bits.timer
INT8_EXT Hal4Sys_ClockTicks;
// D12 bit flags
#define D12BF_SetupOverwritten bFlags.bits.setup_overwritten
#define D12BF_Configuration bFlags.bits.;configuration
//USB
// DefaultControlPipe Finite State Machine [One-Hot]
STRUC_EXT char_bit _DCPFSMstate;
#define DCPFSMstate _DCPFSMstate
#define DCPFSM_SetupProc _DCPFSMstate.bit_.b0
#define DCPFSM_DataIn _DCPFSMstate.bit_.b1
#define DCPFSM_DataOut _DCPFSMstate.bit_.b2
#define DCPFSM_COhandshake _DCPFSMstate.bit_.b3
#define DCPFSM_CIhandshake _DCPFSMstate.bit_.b4
#define DCPFSM_Stall _DCPFSMstate.bit_.b7
// 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;
#define REQBF_DCPRequest_dir bFlags.bits.DCPRequst_Dir
#define REQBF_DCPRequest_EPdir bFlags.bits.DCPRequst_EPDir
#define REQBF_StallDCPRequest bFlags.bits.Stall_DCPRequest
// Bulk-Only TP Finite State Machine [One-Hot]
STRUC_EXT char_bit _BOTFSMstate;
#define BOTFSMstate _BOTFSMstate.char_
#define BOTFSM_IDLE _BOTFSMstate.bit_.b0
#define BOTFSM_CBWProc _BOTFSMstate.bit_.b1
#define BOTFSM_DataIn _BOTFSMstate.bit_.b2
#define BOTFSM_DataOut _BOTFSMstate.bit_.b3
#define BOTFSM_CSWProc _BOTFSMstate.bit_.b4
#define BOTFSM_CSW _BOTFSMstate.bit_.b5
#define BOTFSM_Stall _BOTFSMstate.bit_.b7
// 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
//
#define BOTXfer_Abort bFlags.bits.Abort_BOT
INT16_EXT BOTXfer_wResidue;
uint8 * BOTXfer_pData;
STRUC_EXT TPBLK_STRUC 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)
#define BOTBF_StallAtBulkOut bFlags.bits.BO_Stalled
#define BOTBF_StallAtBulkIn bFlags.bits.BI_Stalled
// Xfer_Space
STRUC_EXT char_bit _Xfer_Space;
#define Xfer_Space _Xfer_Space.char_
#define DCPXfer_atMCUCODE _Xfer_Space.bit_.b0
#define DCPXfer_atMCURAM _Xfer_Space.bit_.b1
#define DCPXfer_atEEROM _Xfer_Space.bit_.b2
#define DCPXfer_atATA _Xfer_Space.bit_.b3
#define BOTXfer_atRAM _Xfer_Space.bit_.b4
#define BOTXfer_atATA _Xfer_Space.bit_.b5
#define BOTXfer_atROM _Xfer_Space.bit_.b6
STRUC_EXT HW_ATA_DEVICES_EXTENSION Hal4ATA_DevExt;
#define ATADevExt_IDData Hal4ATA_DevExt.IdentifyData
#define ATABF_IsAttached bFlags.bits.ATABF_IsAttached
#define ATABF_IsSupportMultiSector bFlags.bits.ATABF_IsSupportMultiSector
#define ATABF_IDEXfer_dir bFlags.bits.ATABF_IDEXfer_dir
#define ATABF_IsSkipSetParameters bFlags.bits.ATABF_IsSkipSetParameters
INT8_EXT Hal4ATA_SectCntInBlk;
//*************************************************************************
// Public temp var
//*************************************************************************
STRUC_EXT FLEXI_INT32 tempvars4UsbReq;
STRUC_EXT char_bit _Xfer_Space;
#define Xfer_Space _Xfer_Space.char_
#define DCPXfer_atMCUCODE _Xfer_Space.bit_.b0
#define DCPXfer_atMCURAM _Xfer_Space.bit_.b1
#define DCPXfer_atEEROM _Xfer_Space.bit_.b2
#define DCPXfer_atATA _Xfer_Space.bit_.b3
#define BOTXfer_atRAM _Xfer_Space.bit_.b4
#define BOTXfer_atATA _Xfer_Space.bit_.b5
#define BOTXfer_atROM _Xfer_Space.bit_.b6
//*************************************************************************
// Private Data
//*************************************************************************
const REQUEST_SENSE_DATA Req_SenseData=
{
//0x70, 0x00, 0x06, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x29,
//0x00, 0x00, 0x00, 0x00, 0x00
0xf0, // 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;
0x20,// 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))
const MODE_PARAMETER_HEAD ParaHeadMask =
{
PARAMETER_LIST_LENGTH-1, /* mode data length*/
0, /* medium type*/
0, /* device spec Param*/
0 /* block Descriptor length*/
};
const 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*/
};
const MODE_PARAMETER_HEAD DefaultParaHead =
{
PARAMETER_LIST_LENGTH-1, /* mode data length*/
0, /* medium type*/
0, /* device spec Param*/
0 /* block Descriptor length*/
};
const 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*/
};
const 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
}
};
const VPD_DEVICE_ID_PAGE DeviceIDPage =
{
RBC_DEVICE,
0x00,
VPDPAGE_DEVICE_IDENTITY,
0x00,
sizeof(ASCII_ID_DESCRIPTOR),//36
{
0x02,
0x00,
0x01,
0x00,
0x00,
0x00,
sizeof(ASCII_ID_STRING),//32
{
// ASCII_ID_STRING
'P','h','i','l',
'i','p','s',' ',
'S','u','p','e',
'r',' ','D','i',
's','k',' '
}
}
};
const 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
//*************************************************************************
//*************************************************************************
// 函数名:uint8 RBC_Handler( void )
// 输入:void (通过全局变量传输)
// 输出:
// 描述:处理UFI名令
//*************************************************************************
uint8 RBC_Handler( void )
{
//#define cdbGeneric RBC_CDB.RbcCdb_Generic
#define cdbGeneric RBC_CDB
uint8 retStatus = FALSE;
BOTXfer_wResidue = 0;
switch(TPBulk_CBW.OperationCode)
{
/* required command */
case RBC_CMD_READ10://28
retStatus = RBC_Read();
break;
case RBC_CMD_READCAPACITY://25
retStatus = RBC_ReadCapacity();
break;
case RBC_CMD_STARTSTOPUNIT://1b
retStatus = RBC_OnOffUnit();
break;
case RBC_CMD_SYNCCACHE://35
retStatus = RBC_SyncCache();
break;
case RBC_CMD_VERIFY10://2f
retStatus = RBC_Verify();
break;
case RBC_CMD_WRITE10://2a
retStatus = RBC_Write();
break;
case SPC_CMD_INQUIRY://12
retStatus = SPC_Inquiry();
break;
case SPC_CMD_MODESELECT6://0x15
retStatus = SPC_ModeSelect();
break;
case SPC_CMD_MODESENSE6://1A
retStatus = SPC_ModeSense();
break;
case 0x5a://1A
retStatus = SPC_ModeSense();
break;
case SPC_CMD_PRVENTALLOWMEDIUMREMOVAL://1E
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://04
retStatus = RBC_Format();
break;
case SPC_CMD_RESERVE6://16
retStatus = SPC_Reserve6();
break;
case SPC_CMD_RELEASE6://17
retStatus = SPC_Release6();
break;
case SPC_CMD_PERSISTANTRESERVIN://5E
retStatus = SPC_PersisReserveIn();
break;
case SPC_CMD_PERSISTANTRESERVOUT://5F
retStatus = SPC_PersisReserveOut();
break;
case SPC_CMD_WRITEBUFFER://3B
retStatus = SPC_WriteBuff();
break;
case SPC_CMD_READLONG://23
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
////////////////////////////////////////////////////////////////////////////////////
uint8 SPC_READLONG(void)//0x23
{
#define spcReaLong RBC_CDB.RE_FM_Capacities
Xfer_Space &= BOTXFERSPACE_MASK;//0x0F
BOTXfer_atRAM = 1;
BOTXfer_wResidue = sizeof(READ_FORMAT_CAPACITIES);//
spcReaLong.CapacityLBA = Hal4Sys_SwapINT32(ATADevExt_IDData.CurrentSectorCapacity.u0);
spcReaLong.DescriptorCode = 0x02;
spcReaLong.CapacityLength_2 = 0x00;
spcReaLong.CapacityLength_1 = 0x02;
spcReaLong.CapacityLength_0 = 0x00;
spcReaLong.FormattableLBA = Hal4Sys_SwapINT32(ATADevExt_IDData.CurrentSectorCapacity.u0);
spcReaLong.FormattableLength_2 = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -