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

📄 rbc.c

📁 该软件为在sunplus的61单片机上实现的mp3播放器.里面有完整的源代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
unsigned int i;
#define cdbWrite    RBC_CDB.RbcCdb_Write
	Start_LBA  = cdbWrite.LBA_0 +
				 cdbWrite.LBA_1*0x100 +
				 cdbWrite.LBA_2*0x10000 +
				 cdbWrite.LBA_3*0x1000000;
	UartSendData(0xaa);		
	UartSendData(cdbWrite.LBA_0);	 
	UartSendData(cdbWrite.LBA_1);		
	UartSendData(cdbWrite.LBA_2);	 	
	UartSendData(cdbWrite.LBA_3);		
	UartSendData(0xbb);	 		
	Current_LBA = Start_LBA;			 
	SectorCount =cdbWrite.XferLength_0 + cdbWrite.XferLength_1 * 0x100;	
if (Start_LBA < 0x60)
{	
	NF_EraseBackBlock();
	if( (Current_LBA & 0x1f ) != 0 )					//Start Sector not First Sector in Block
		{
			NF_BackBlockHead(Current_LBA-1);
		}
		
	if( (SectorCount + (Current_LBA & 0x1f)) < 0x20 )
		{
		    NF_BackBlockTail(Current_LBA);
		}

    BOTXfer_wResidue = CBW_wXferLen;
    BOTXfer_pData = g_RWBuf;
   
	TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);		
	BOTXfer_atNF =TRUE;	
	BOTFSMstate= USBFSM4BOT_DATAOUT;
}
else
{
    BOTXfer_wResidue = CBW_wXferLen; 
	TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);	
	DMA_D12toNF(Start_LBA, SectorCount);
	BOTXfer_wResidue=0x00;
	TPBulk_CSWHandler();	// Goto USBFSM4BOT_CSWPROC;		
}   
	return (TRUE);
#undef cdbWrite
}

unsigned int RBC_ReadCapacity(void)
{
#define cdbReadCap RBC_CDB.RbcCdb_ReadCapacity
	/*
	// Calculate last sector.
	*/
	
	/* store it in big endian */
	cdbReadCap.tmpVar.CapData.LBA_3 = (NF_SECTOR_TOTAL_NUM >> 24)&0xff;
	cdbReadCap.tmpVar.CapData.LBA_2 = (NF_SECTOR_TOTAL_NUM >> 16)&0xff;
	cdbReadCap.tmpVar.CapData.LBA_1 = (NF_SECTOR_TOTAL_NUM >> 8)&0xff;
	cdbReadCap.tmpVar.CapData.LBA_0 = (NF_SECTOR_TOTAL_NUM )&0xff;

	/*
	// Bytes Per Block is 512Bytes
	// 00020000 is 0x200 in big endian
	*/
	cdbReadCap.tmpVar.CapData.BlockLen_3 = 0;
	cdbReadCap.tmpVar.CapData.BlockLen_2 = 0;
	cdbReadCap.tmpVar.CapData.BlockLen_1 = 0x02;
	cdbReadCap.tmpVar.CapData.BlockLen_0 = 0;
	/*
	// Adjust TPBulkXfer Paras
	*/

	BOTXfer_wResidue = sizeof(READ_CAPACITY_DATA);
	BOTXfer_pData = (unsigned int)&(cdbReadCap.tmpVar);

	TPBulksup_ErrorHandler(CASE6, BOTXfer_wResidue);
	
	BOTXfer_atROMorRAM=TRUE;
	BOTFSMstate=USBFSM4BOT_DATAIN;
	
	return(TRUE);
#undef cdbReadCap
}

unsigned int RBC_OnOffUnit(void)
{
#define cdbOnOffUnit RBC_CDB.RbcCdb_OnOffUnit

	//BOTXfer_wResidue = 0;

	switch(cdbOnOffUnit.Flags.bits1.PowerConditions)
	{
	case PWR_NOCHANGE:
		switch(cdbOnOffUnit.Flags.bits1.MediumState)
		{
		case MEDIUM_LOAD:
			break;
		case MEDIUM_UNLOAD:
			break;
		case MEDIUM_STOP:
			break;
		case MEDIUM_READY:
			break;
		}
		break;
	case PWR_ACTIVE:
		break;
	case PWR_IDLE:
		break;
	case PWR_STANDBY:
		break;
	case PWR_SLEEP:
		break;
	case PWR_DEVCTRL:
	default:
		break;
	}


	RBC_PropertyData.bits.MediumState = cdbOnOffUnit.Flags.bits1.MediumState;
	RBC_PropertyData.bits.PowerState = cdbOnOffUnit.Flags.bits1.PowerConditions;

	TPBulksup_ErrorHandler(CASE1,0);
	
    TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
    
	return TRUE;
#undef cdbOnOffUnit
}

unsigned int RBC_SyncCache(void)
{
#define cdbSyncRBC RBC_CDB.RbcCdb_SyncCache

	//BOTXfer_wResidue = 0;
	TPBulksup_ErrorHandler(CASE1,0);
    TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;
#undef cdbSyncRBC
}


unsigned int  RBC_Verify(void)
{
#define cdbVerifyRBC RBC_CDB.RbcCdb_Verify

	if( CBW_wXferLen == 0 )
	{
		//BOTXfer_wResidue = 0;
		TPBulksup_ErrorHandler(CASE1,0);
	    TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	}
	else
	{
		/*
		// Config TPBulkXfer Paras
		*/
		
		BOTXfer_atROMorRAM = TRUE;
		BOTXfer_wResidue = CBW_wXferLen;

		TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);		
		BOTFSMstate= USBFSM4BOT_DATAOUT;
	}
	return TRUE;
#undef cdbVerifyRBC
}

/*
////////////////////////////////////////////////////////////////////////////////////
// SCSI Primary Command Support
////////////////////////////////////////////////////////////////////////////////////
*/

unsigned int SPC_Inquiry(void)
{
#define cdbInquirySPC RBC_CDB.SpcCdb_Inquiry
	unsigned int		retStatus = FALSE;


	if(cdbInquirySPC.EnableVPD)
	{
		switch(cdbInquirySPC.PageCode)
		{
		case VPDPAGE_SERIAL_NUMBER:

			BOTXfer_pData =(unsigned int) &SerialPage;
			BOTXfer_wResidue = sizeof(VPD_SERIAL_PAGE);
			break;

		case VPDPAGE_DEVICE_IDENTITY:

			retStatus = TRUE;
			BOTXfer_pData = (unsigned int)&DeviceIDPage;
			BOTXfer_wResidue = sizeof(VPD_DEVICE_ID_PAGE);
			break;

		default:
			TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);

			TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
			return retStatus;
		}
	}
	else if(cdbInquirySPC.CmdSupportData)
	{
		TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
		TPBulk_CSWHandler();		// Goto USBFSM4BOT_CSWPROC;
		return retStatus;
	}
	else
	{

        BOTXfer_pData = (unsigned int) &inquiryData;
		BOTXfer_wResidue = sizeof(STD_INQUIRYDATA);
	}

	retStatus = TRUE;
    BOTXfer_atROMorRAM = TRUE;
//	BOTXfer_wResidue = CBW_wXferLen;//modify
	if( BOTXfer_wResidue > CBW_wXferLen )
	{
		BOTXfer_wResidue = CBW_wXferLen;
		TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
	}
	else if ( BOTXfer_wResidue == CBW_wXferLen )
	{
		TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
	}
	else
	{
		TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
	}

	BOTFSMstate=USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN

	return retStatus;
#undef cdbInquirySPC
}
unsigned int SPC_ModeSelect(void)
{
#define cdbModeSelectSPC    RBC_CDB.SpcCdb_ModeSelect
	unsigned int retStatus = FALSE;

	//
	//Just Retrieve and discard data from USB FIFO

    BOTXfer_atROMorRAM = TRUE;

    BOTXfer_pData = (unsigned int)0;
	BOTXfer_wResidue = cdbModeSelectSPC.ParameterLen;

	if(cdbModeSelectSPC.SavePage != 1)
	{
		if(CBW_wXferLen < BOTXfer_wResidue)
		{
			BOTXfer_wResidue = CBW_wXferLen;
			TPBulksup_ErrorHandler(CASE13,BOTXfer_wResidue);
			
			TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
			return retStatus;
		}
		else if(CBW_wXferLen == BOTXfer_wResidue)
		{
			TPBulksup_ErrorHandler(CASE12,BOTXfer_wResidue);
			retStatus = TRUE;
		}
		else
		{
			TPBulksup_ErrorHandler(CASE11,BOTXfer_wResidue);
			retStatus = TRUE;
		}

		BOTFSMstate= USBFSM4BOT_DATAOUT;
	}
	else
	{
		BOTXfer_wResidue = CBW_wXferLen;
		TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
		TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	}

	return retStatus;

#undef cdbModeSelectSPC
}


unsigned int SPC_ModeSense(void)
{
#define cdbModeSenseSPC RBC_CDB.SpcCdb_ModeSense
	unsigned int retStatus = FALSE;

	if(cdbModeSenseSPC.PageCode == MODE_PAGE_RBC_DEVICE_PARAMETERS )
	{
		switch(cdbModeSenseSPC.PageControl)
		{
		case PAGECTRL_CHANGEABLE:

			BOTXfer_pData =(unsigned int) &ParaHeadMask;
			BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);
			break;

		case PAGECTRL_DEFAULT:
		case PAGECTRL_CURRENT:

			BOTXfer_pData =(unsigned int) &DefaultParaHead;
			BOTXfer_wResidue = sizeof(PARAMETER_LIST_LENGTH);
			break;

		case PAGECTRL_SAVED:
		default:
			//retStatus = FALSE;
			TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
			TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
			break;
		}

		if(CBW_wXferLen < BOTXfer_wResidue)
		{
			BOTXfer_wResidue = CBW_wXferLen;
			TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
		}
		else if(CBW_wXferLen == BOTXfer_wResidue)
		{
			TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue); 
		}
		else
		{
			TPBulksup_ErrorHandler(CASE5,BOTXfer_wResidue);
		}

		retStatus = TRUE;
		BOTFSMstate=USBFSM4BOT_DATAIN;// Goto USBFSM4BOT_DATAIN
	}
	else
	{
		//retStatus = FALSE;
		TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
		TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	}

	return retStatus;
#undef cdbModeSenseSPC
}

unsigned int SPC_LockMedia(void)
{
#define cdbLockSPC RBC_CDB.SpcCdb_Remove


	RBC_PropertyData.bits.MediumRemovFlag = cdbLockSPC.Prevent;

	if (RBC_PropertyData.bits.MediumRemovFlag == 01)
			;	//enable(allow) the removal of the medium
		else
            ;	//disable(prevent)removal of the mddium
            
	TPBulksup_ErrorHandler(CASE1,0);
	TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;

#undef cdbLockSPC
}

unsigned int SPC_TestUnit(void)
{
#define cdbTestUnit RBC_CDB.SpcCdb_TestUnit
#define READY	1
/*
	if(READY)
	{
		TPBulksup_ErrorHandler(CASE1,0);
	}
	else
	{
		TPBulksup_ErrorHandler(CASECMDFAIL,0);
	}
*/
	TPBulksup_ErrorHandler(CASE1,0);
	TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;
#undef READY
#undef cdbTestUnit
}


unsigned int SPC_RequestSense(void)
{
#define cdbRequestSenseSPC RBC_CDB.SpcCdb_RequestSense

	/*
	// Adjust TPBulkXfer Paras
	*/
    BOTXfer_atROMorRAM = TRUE;

	BOTXfer_pData =(unsigned int)&Req_SenseData ;
	BOTXfer_wResidue = sizeof(Req_SenseData);
	
	TPBulksup_ErrorHandler(CASE6,BOTXfer_wResidue);
	BOTFSMstate=USBFSM4BOT_DATAIN;
	return TRUE;
#undef cdbRequestSenseSPC
}

//Optional
unsigned int RBC_Format(void)
{
	TPBulksup_ErrorHandler(CASECMDFAIL,0);
	TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;

}

unsigned int SPC_Reserve6(void)
{
	TPBulksup_ErrorHandler(CASECMDFAIL,0);
	TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;
}

unsigned int SPC_Release6(void)
{
	TPBulksup_ErrorHandler(CASECMDFAIL,0);
	TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;
}

unsigned int SPC_PersisReserveIn(void)
{
	TPBulksup_ErrorHandler(CASECMDFAIL,0);
	TPBulk_CSWHandler();// Goto USBFSM4BOT_CSWPROC;
	return TRUE;

}

unsigned int SPC_PersisReserveOut(void)
{

	//Just Retrieve and discard data from USB FIFO
	
    BOTXfer_atROMorRAM = TRUE;

    BOTXfer_pData = (unsigned int)0;
	BOTXfer_wResidue = CBW_wXferLen;

	TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);
	
//	BOTFSM_DataOut=TRUE;
	return TRUE;
}

unsigned int SPC_WriteBuff(void)
{
#define cdbWriteBuff RBC_CDB.SpcCdb_WriteBuffer

	//Just Retrieve and discard data from USB FIFO

    BOTXfer_atROMorRAM = TRUE;

    BOTXfer_pData = (unsigned  int)0;
	BOTXfer_wResidue = CBW_wXferLen;

	TPBulksup_ErrorHandler(CASECMDFAIL,BOTXfer_wResidue);

//	BOTFSM_DataOut=TRUE;

	return TRUE;
#undef cdbWriteBuff
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -