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

📄 rbc.c

📁 ARM嵌入式系统软件开发实例(一) 里面含有很多UCOS教程和源码
💻 C
📖 第 1 页 / 共 2 页
字号:
//这时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 + -