亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? scsi.c

?? 基于ADSP-BF535 USB驅(qū)動應(yīng)用程序
?? C
字號:
/*----------------------------------------------------------------------------------
*
* COPYRIGHT (c) 2001 by Singing Electrons, Inc. All rights reserved.
*
*
* Module Name			: C:\se\adi\msclass\vdsp\scsi.c
*
* Description			: The SCSI implementation
*
*
* Revision History	: At bottom of the file.
*
*---------------------------------------------------------------------------------*/

/** include files **/
#include <defBF535.h>
#include "dtype.h"
#include "register.h"
#include "scsi.h"
#include "dprintf.h"
#include "formatted_16MB.h"
//#include "formatted_8MB.h"

/** local definitions **/


#define SCSI_SENSE_DATA_VALID 0x80
#define SCSI_SENSE_DATA_CURRENT_ERROR 0x70

#define EndianSwap(someVal) \
	(ULONG)(((someVal & 0xff000000) >> 24) | ((someVal & 0x00ff0000) >> 8) | ((someVal & 0x0000ff00) << 8) | ((someVal & 0x000000ff) << 24))

//Let's do a 2048 x 512 bytes device = 1 MB
#define MAX_BLOCKS (ULONG)32768
#define BLOCK_SIZE (ULONG)512

#define SCSI_INQUIRY_REPORT_SIZE 36
#define SCSI_READ_CAPACITY_REPORT_SIZE 8
#define SCSI_REQUEST_SENSE_REPORT_SIZE 18
#define SCSI_MODE_SENSE_REPORT_SIZE 0xc0

const UCHAR VID[] = "ADI\0";
const UCHAR PID[] = "MSClass\0";
const UCHAR REV[] = "1.0\0";






/* default settings */

/** external functions **/

/** external data **/

/** internal functions **/

/** public data **/

/** private data **/
UCHAR *gpDataBlock;

UCHAR gInquiryReport[SCSI_INQUIRY_REPORT_SIZE];
UCHAR gpDataSaveLocation;
UCHAR gReadCapacityReport[SCSI_READ_CAPACITY_REPORT_SIZE];
UCHAR gRequestSenseReport[SCSI_REQUEST_SENSE_REPORT_SIZE];
UCHAR gModeSenseReport[SCSI_MODE_SENSE_REPORT_SIZE];
ULONG gCurrentDataWriteLocation;

/** public functions **/

/** private functions **/
static void initExtL2SDRAM(void);




/*------------------------------------------------------------
*	SCSI_Init
*
*	Parameters:  
*		None.
*
*	Globals Used:
*		gpDataBlock, gInquiryReport, gReadCapacityReport,
*		
*
*	Description:
*		Initializes SDRAM access, and also initializes other
*		globals. It also initializes the data block to contain
*		an initialized copy of a FAT formatted disk!
*
*	Returns:
*		Nothing.
*
*------------------------------------------------------------*/
void SCSI_Init (void)
	{
		initExtL2SDRAM ();
		gpDataBlock = (PUCHAR)START_EXT_L2SDRAM;

		memset (&gInquiryReport[0], 0, SCSI_INQUIRY_REPORT_SIZE);
		memset (gpDataBlock, 0, MAX_BLOCKS * BLOCK_SIZE);

		//The following will make this look like a FAT formatted disk
		memcpy (gpDataBlock, &gInitialData[0], sizeof (gInitialData));

    gInquiryReport[0] = SCSI_DEVICE_DIRECT_ACCESS; // Direct-access device
    gInquiryReport[1] = 0x80; //Removable

		
    // Vendor ID string
    strcpy(&gInquiryReport[8], &VID[0]);
    // Product ID string
    strcpy(&gInquiryReport[16], &PID[0]);
    // Rev string
    strcpy(&gInquiryReport[32], &REV[0]);

		*(PULONG)(&gReadCapacityReport[0]) = EndianSwap ((MAX_BLOCKS-1));
		*(PULONG)(&gReadCapacityReport[4]) = EndianSwap (BLOCK_SIZE);
		gCurrentDataWriteLocation = 0;
		

	}



/*------------------------------------------------------------
*	initExtL2SDRAM
*
*	Parameters:  
*
*	Globals Used:
*		None
*
*	Description:
*		Initializes the SDRAM registers for access to SDRAM
*
*	Returns:
*		nothing.
*
*------------------------------------------------------------*/
static void initExtL2SDRAM(void) { 

  // set up SDRAM registers

  *(volatile USHORT *)EBIU_SDRRC = kSDRRC;
  asm("ssync;");
  *(volatile ULONG *)EBIU_SDBCTL = kSDBCTL;
  asm("ssync;");
  *(volatile ULONG *)EBIU_SDGCTL = kSDGCTL;
  asm("ssync;");
  
}



/*------------------------------------------------------------
*	IsValidCommandBlock
*
*	Parameters:  
*		pCommandBlock - pointer to the CDB.
*		len - length of the CDB
*
*	Globals Used:
*		gRequestSenseReport
*
*	Description:
*		Determines if the command data block received is
*		vaild or not. Accordinly it updates the request sense data.
*
*	Returns:
*
*
*------------------------------------------------------------*/
bool SCSI_IsValidCommandBlock (PUCHAR pCommandBlock, UCHAR len)
	{
		switch (pCommandBlock[0])
			{
				case SCSI_INQUIRY:
				case SCSI_READ_CAPACITY:
				case SCSI_READ10:
				case SCSI_WRITE10:
				case SCSI_REQUEST_SENSE:
				case SCSI_MODE_SENSE6:
				case SCSI_TEST_UNIT_READY:
				case SCSI_START_STOP:
				case SCSI_MEDIUM_REMOVAL:
				case SCSI_VERIFY:
					memset (&gRequestSenseReport[0], 0, SCSI_REQUEST_SENSE_REPORT_SIZE);
					gRequestSenseReport[0] = SCSI_SENSE_DATA_VALID | SCSI_SENSE_DATA_CURRENT_ERROR;
					gRequestSenseReport[2] = SENSE_NONE; //Sense key
					return (true);
					
				default:
					memset (&gRequestSenseReport[0], 0, SCSI_REQUEST_SENSE_REPORT_SIZE);
					gRequestSenseReport[0] = SCSI_SENSE_DATA_VALID | SCSI_SENSE_DATA_CURRENT_ERROR;
					gRequestSenseReport[2] = SENSE_ILLEGAL_REQUEST; //Sense key
					gRequestSenseReport[12] =  ASC_INVALID_COMMAND;//Additional Sense Code

					return(false);
			}
	}




/*------------------------------------------------------------
*	SCSI_ProcessCDB
*
*	Parameters:  
*
*	Globals Used:
*		gModeSenseReport, gpDataBlock, gCurrentDataWriteLocation
*		gInquiryReport, gReadCapacityReport, gRequestSenseReport
*
*	Description:
*		This routine processes the SCSI command data block received by
*		the Mass storage protocol handler.
*
*	Returns:
*		True if the commnad was handled successfully, false otherwise.
*
*------------------------------------------------------------*/
bool SCSI_ProcessCDB (PUCHAR pCommandBlock, UCHAR len, ULONG datalen, void **ppBuffer, ULONG *pActualBytesToReturn)
	{
		//By default return the same number of bytes as requested

		*pActualBytesToReturn = datalen;
		switch (pCommandBlock[0])
			{
				case SCSI_INQUIRY:
					if (datalen  == sizeof (gInquiryReport))
						{
							*ppBuffer = &gInquiryReport;
							return (true);
						}
					break;

				case SCSI_READ_CAPACITY:
					if (datalen  == sizeof (gReadCapacityReport))
						{
							*ppBuffer = &gReadCapacityReport;
							return (true);
						}
					break;
				case SCSI_REQUEST_SENSE:
					if (datalen  == sizeof (gRequestSenseReport))
						{
							*ppBuffer = &gRequestSenseReport;
							return (true);
						}
					break;
				case SCSI_TEST_UNIT_READY:
					return (true);
				case SCSI_START_STOP:
					return (true);
				case SCSI_MEDIUM_REMOVAL:
					return (true);
				case SCSI_VERIFY:
					return (true);
				case SCSI_MODE_SENSE6:
					Dprintf1 ("Mode Sense, Code Page: %02x", pCommandBlock[2]);
					if (datalen  >= 4)
						{
							memset (&gModeSenseReport[0], 0, SCSI_MODE_SENSE_REPORT_SIZE);
	            gModeSenseReport[0] = 4; // mode data length
	            gModeSenseReport[1] = 0; // medium type (current)
	            gModeSenseReport[2] = 0; // device-specific
	            gModeSenseReport[3] = 0; // block descriptor length
							*ppBuffer = &gModeSenseReport;
							*pActualBytesToReturn = 4;
							return(true);
							
						}
					break;
				case SCSI_READ10:
					{
						ULONG startingBlock, blocksToRead;
						startingBlock = (pCommandBlock[2] << 24) + (pCommandBlock[3] << 16) + (pCommandBlock[4] << 8) + pCommandBlock[5];
						blocksToRead = (pCommandBlock[7] << 8) + pCommandBlock[8];
						Dprintf2 ("Read: offset: %04x, len: %04x", startingBlock, blocksToRead);
						*ppBuffer = gpDataBlock + (startingBlock * BLOCK_SIZE);
						return (true);
					}
				case SCSI_WRITE10:
					{
						ULONG startingBlock, blocksToWrite;
						startingBlock = (pCommandBlock[2] << 24) + (pCommandBlock[3] << 16) + (pCommandBlock[4] << 8) + pCommandBlock[5];
						blocksToWrite = (pCommandBlock[7] << 8) + pCommandBlock[8];
						gCurrentDataWriteLocation = startingBlock * BLOCK_SIZE;
						Dprintf2 ("Write: offset: %04x, len: %04x", startingBlock, blocksToWrite);
						return (true);
					}
			}

		memset (&gRequestSenseReport[0], 0, SCSI_REQUEST_SENSE_REPORT_SIZE);
		gRequestSenseReport[0] = SCSI_SENSE_DATA_VALID | SCSI_SENSE_DATA_CURRENT_ERROR;
		gRequestSenseReport[2] = SENSE_ILLEGAL_REQUEST; //Sense key
		gRequestSenseReport[12] =  ASC_INVALID_COMMAND;//Additional Sense Code

		return(false);
	}



/*------------------------------------------------------------
*	SCSI_ProcessData
*
*	Parameters:  
*		pBuffer -pointer to the data to process.
*		len - total number of bytes to process.
*
*	Globals Used:
*		gpDataBlock, gCurrentDataWriteLocation
*
*	Description:
*		Processes data associated with a SCSI_WRITE operation.
*
*	Returns:
*		Nothing
*
*------------------------------------------------------------*/
void SCSI_ProcessData (void *pBuffer, ULONG len)
	{
		//Need to save the data, somewhere?
		memcpy (gpDataBlock + gCurrentDataWriteLocation, pBuffer, len);
		gCurrentDataWriteLocation += len;
	}

/*----------------------------------------------------------------------------------
* $Log: scsi.c,v $
* Revision 1.3  2003/03/03 22:37:10  Devendra
* - Added documentation.
* - Some code cleanup.
*
* Revision 1.2  2003/03/03 21:26:41  Devendra
* - BugFix: Writes were not working correctly.
* - Changed to using the SDRAM for disk data storage.
* - Increased the disk capacity to 16MB.
* - Added disk init. routine to make it look like a FAT formatted 16MB disk.
*
* Revision 1.1  2003/03/03 18:13:47  Devendra
* First Rev, the device enumerates as Mass Storage Class
*
*
*---------------------------------------------------------------------------------*/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女免费视频一区| 精品福利av导航| 美女视频黄 久久| 国产精品婷婷午夜在线观看| 在线观看不卡视频| 九一九一国产精品| 亚洲精品国产精品乱码不99| 26uuu欧美日本| 欧美日韩视频在线第一区 | 久久久777精品电影网影网 | 国产精品91一区二区| 一区二区高清免费观看影视大全| 精品99999| 欧美另类z0zxhd电影| 99久久99久久综合| 国内精品国产成人| 秋霞午夜鲁丝一区二区老狼| 一区二区久久久| 中文字幕亚洲一区二区av在线| 精品美女一区二区| 69堂精品视频| 欧美三级乱人伦电影| 日本乱码高清不卡字幕| 成人av在线一区二区三区| 九九九久久久精品| 青青草原综合久久大伊人精品| 亚洲图片自拍偷拍| 亚洲欧洲三级电影| 国产日韩欧美一区二区三区乱码| 日韩免费电影网站| 欧美精品 日韩| 欧美人xxxx| 欧美日韩国产经典色站一区二区三区 | 国产精品亚洲第一区在线暖暖韩国| 丝袜脚交一区二区| 亚洲成人你懂的| 自拍偷拍国产精品| 国产精品人成在线观看免费| 国产日韩欧美综合在线| 久久精品在这里| 国产女同性恋一区二区| 久久精品欧美一区二区三区麻豆| 亚洲精品一区二区精华| 欧美一卡2卡3卡4卡| 91精品国产综合久久精品性色| 777久久久精品| 欧美一区二区三区电影| 欧美一区二区播放| 91精品国产色综合久久不卡蜜臀| 91精品国产综合久久久久| 日韩三级视频中文字幕| 欧美大胆一级视频| wwww国产精品欧美| 久久久国产午夜精品| 日本一区二区免费在线观看视频 | 秋霞国产午夜精品免费视频| 久久草av在线| 国产黄人亚洲片| 成人自拍视频在线观看| 99精品视频一区| 欧美日韩一区二区三区视频| 欧美一区二区三区日韩视频| 精品国产制服丝袜高跟| 国产亚洲污的网站| 国产精品久久久久久久久免费樱桃| 最新热久久免费视频| 一区二区三区丝袜| 日韩电影免费一区| 国产精品一区一区| 99vv1com这只有精品| 欧美日韩国产高清一区二区三区 | 国产精选一区二区三区| 国产 欧美在线| 欧美性大战xxxxx久久久| 日韩视频免费观看高清完整版 | 91色porny| 欧美日韩精品一区二区三区蜜桃| 欧美mv日韩mv亚洲| 亚洲国产成人在线| 亚洲制服丝袜av| 蜜臀va亚洲va欧美va天堂| 岛国av在线一区| 欧美日韩免费一区二区三区| 2020国产成人综合网| 1000部国产精品成人观看| 日本不卡在线视频| 国产91富婆露脸刺激对白| 91精品1区2区| 欧美一区二区三区啪啪| 国产精品免费网站在线观看| 五月天国产精品| 成人精品小蝌蚪| 日韩一级黄色大片| 亚洲欧洲精品成人久久奇米网| 污片在线观看一区二区| 国产成人综合网站| 欧美日韩国产免费一区二区 | 国产精品色婷婷久久58| 亚洲午夜成aⅴ人片| 国产91清纯白嫩初高中在线观看 | 欧美日韩激情一区二区| 欧美精彩视频一区二区三区| 亚洲777理论| 91免费观看视频| 久久精品亚洲国产奇米99| 亚洲国产裸拍裸体视频在线观看乱了 | 激情六月婷婷综合| 在线观看免费一区| 国产三级精品三级在线专区| 天天免费综合色| 91论坛在线播放| 中文字幕欧美日韩一区| 精品一区二区三区蜜桃| 欧美日韩激情一区二区三区| 亚洲精品自拍动漫在线| 成人一区二区三区中文字幕| 精品国精品国产| 免费的国产精品| 7777女厕盗摄久久久| 亚洲亚洲精品在线观看| 色哟哟欧美精品| 国产精品素人视频| 国内精品伊人久久久久影院对白| 777久久久精品| 石原莉奈在线亚洲二区| 欧美这里有精品| 亚洲激情成人在线| 一本到不卡免费一区二区| 中文字幕亚洲区| 成人午夜电影久久影院| 国产拍揄自揄精品视频麻豆| 国产久卡久卡久卡久卡视频精品| 久久综合狠狠综合久久激情| 人妖欧美一区二区| 欧美肥大bbwbbw高潮| 亚洲bt欧美bt精品777| 欧美日韩亚洲丝袜制服| 亚洲电影一级黄| 欧美日韩国产成人在线91| 五月激情六月综合| 欧美精品777| 蓝色福利精品导航| 精品国产一区二区亚洲人成毛片| 麻豆精品蜜桃视频网站| 日韩你懂的电影在线观看| 久久精品国产色蜜蜜麻豆| 日韩欧美一级二级| 精品一区二区三区久久| 国产视频911| 成人黄色免费短视频| 中文字幕亚洲欧美在线不卡| 色天天综合久久久久综合片| 亚洲国产视频一区| 欧美日韩在线播| 美女一区二区视频| 日韩免费电影一区| 国产成+人+日韩+欧美+亚洲| 国产精品久久久久久久久快鸭 | 99国产一区二区三精品乱码| 亚洲精品免费播放| 欧美色窝79yyyycom| 免费久久99精品国产| 久久久99免费| 91麻豆精品秘密| 丝袜诱惑亚洲看片| 日韩你懂的在线播放| 成人午夜看片网址| 亚洲曰韩产成在线| 欧美一级二级三级蜜桃| 国产美女精品人人做人人爽| 成人免费在线视频| 69av一区二区三区| 国产精品一区二区免费不卡| 亚洲视频1区2区| 欧美精品丝袜中出| 国产毛片精品视频| 亚洲免费av观看| 日韩欧美国产不卡| 9i在线看片成人免费| 午夜亚洲福利老司机| 久久精品无码一区二区三区| 欧美做爰猛烈大尺度电影无法无天| 美女视频黄免费的久久| 日韩理论在线观看| 欧美一级日韩一级| 北岛玲一区二区三区四区| 日韩一区精品字幕| 中文字幕成人网| 51精品久久久久久久蜜臀| 成人手机电影网| 舔着乳尖日韩一区| 中文字幕va一区二区三区| 欧美日韩午夜在线视频| 成人免费视频免费观看| 日韩高清在线观看| 17c精品麻豆一区二区免费| 欧美不卡在线视频| 欧美性猛交xxxxxx富婆| 成人做爰69片免费看网站| 日韩不卡一二三区|