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

📄 u_atapicmd.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
 * File name   : atapicmd.c
 * Module name : ATAPI Command Check module
 * Author	   : Hiromichi Kondo
 *---------------------------------------------------------------------------
 * $Id: atapicmd.c,v 1.3 2003/05/13 11:00:30 9551619 Exp $
 ****************************************************************************/

#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_value.h"
#include "u_com_fp.h"
#include "u_macro.h"
#include "u_dev_fp.h"

#include    <stdio.h>
#include    <string.h>
//#include    "sysdef.h"
#include    "usbfw_if.h"

#include 	"drvFS.h"


extern  STG_MEDIA_INFO  g_StgMediaInfo;
extern	USBFW_IF_ANS	g_UsbIFAns ;

/*--- Function Prototype ---------------------------------------------------*/
int IsCommonErrorFound(int dir);
int IsUnitAttention(void);
int IsLUNFieldValid(void);
void SetSenseKey_000000(void);
void SetSenseKey_030200(void);
void SetSenseKey_031100(void);
void SetSenseKey_040000(void);
void SetSenseKey_040803(void);
void SetSenseKey_051A00(void);
void SetSenseKey_052000(void);
void SetSenseKey_052100(void);
void SetSenseKey_052400(void);
void SetSenseKey_052500(void);
void SetSenseKey_052600(void);
void SetSenseKey_053900(void);
void SetSenseKey_062800(void);
void SetSenseKey_062900(void);

int TestUnitReady(void);
int RequestSense(void);
int Inquiry(void);
int ReadCapacity(void);
int ReadFormatCapacity(void);
int ModeSelect(void);
int ModeSelectPara(void);
void MSelFindPage(BYTE page);
int IsMSelRcvParaInvalid(void);
int ModeSense(void);
int Prevent(void);
int CBIReset(void);
int CmdError(void);
int FormatUnitCmd(void);
int FormatUnitPara(void);
int Read10(void);
int Read12(void);
int Seek(void);
int StartStopUnit(void);
int Verify(void);
int Write10(void);
int Write12(void);
int WriteAndVerify(void);

/*****************************************************************************
 *
 *     CBWCBIATAPI
 *     dir:
 *   
 * bulk_total_tran_cnt 
 *****************************************************************************/
int IsCommonErrorFound(int dir)
{
	int ret = RC_ERROR;

	if( tran_protocol == CBI ){
		/* CBI */

		/* CBI */
		if( dir != DIR_NONE ){
			/*  */
			tran_flag.Direction = dir;
		}
		/* CBI */
		bulk_req_tran_cnt = bulk_total_tran_cnt;
	}else{
		/* BulkOnly */
		if( bulk_req_tran_cnt != bulk_total_tran_cnt ){
			cmd_status = PHASE_ERROR;
			return ret;
		}
		if( bulk_req_tran_cnt != 0x00 && tran_flag.Direction != dir ){
			cmd_status = PHASE_ERROR;
			return ret;
		}
	}
	
	if( cmd_block[0] != 0x03 && cmd_block[0] != 0x12 ){
		/* Request SenseInquiry */

		if( atten_flag.PowerOnReset ){
			/*  */

			atten_flag.PowerOnReset = 0;			/*  */
			
			SetSenseKey_062900();
			return ret;
		}

	}

	if ((cmd_block[1] & 0xE0) == 0x00) {
		/* LUN 000b */
		ret = RC_NO_ERROR;
	}else{
		SetSenseKey_052500();
	}
	
	return ret;
}

/*****************************************************************************
 *
 *     SenseKey()
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_000000(void)
{
	sense_data[0] = 0x00;
	sense_data[1] = 0x00;
	sense_data[2] = 0x00;
	cmd_status = COMMAND_SUCCESS;
}

/*****************************************************************************
 *
 *     SenseKey(NO SEEK COMPLETE)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_030200(void)
{
	sense_data[0] = 0x03;
	sense_data[1] = 0x02;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(Unrecovered Read Error)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_031100(void)
{
	sense_data[0] = 0x03;
	sense_data[1] = 0x11;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(Hardware Error)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_040000(void)
{
	sense_data[0] = 0x04;
	sense_data[1] = 0x00;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(Logical Unit Communication Error)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_040803(void)
{
	sense_data[0] = 0x04;
	sense_data[1] = 0x08;
	sense_data[2] = 0x03;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(Parameter List Length Error)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_051A00(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x1A;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(INVALID COMMAND OPERATION CODE)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_052000(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x20;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(LOGICAL BLOCK ADDRESS OUT OF RANGE)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_052100(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x21;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(INVALID FIELD IN COMMAND PACKET)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_052400(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x24;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(LOGICAL UNIT NOT SUPPORTED)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_052500(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x25;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(INVALID FIELD IN PARAMETER LIST)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_052600(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x26;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(SAVING PARAMETERS NOT SUPPORTED)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_053900(void)
{
	sense_data[0] = 0x05;
	sense_data[1] = 0x39;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(MEDIA CHANGED)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_062800(void)
{
	sense_data[0] = 0x06;
	sense_data[1] = 0x28;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     SenseKey(POWER ON RESET OR BUS DEVICE RESET OCCURRED)
 *     
 *   
 * sense_data 	   
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
void SetSenseKey_062900(void)
{
	sense_data[0] = 0x06;
	sense_data[1] = 0x29;
	sense_data[2] = 0x00;
	cmd_status	  = COMMAND_FAILED;
}

/*****************************************************************************
 *
 *     Test Unit Ready
 *     
 *   OK:NG:
 * bulk_total_tran_cnt 
 *****************************************************************************/
int TestUnitReady(void)
{
	int ret = RC_NG;				/*  */

	/* CBWCBIATAPI */
	bulk_total_tran_cnt = 0;
	if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
		/*  */

		test_unit_ready_cnt++;
		if( test_unit_ready_cnt > 3 ){
			/* OS *
			 * Test Unit Ready    *
			 *        *
			 * 昡壙帪埲奜偼偙偺張棟偼昁梫側偄                     */

			test_unit_ready_cnt = 0;
			SetSenseKey_062800();
		}else{
			/*  */
			SetSenseKey_000000();
		}
		ret = RC_OK;

	}
	
	return ret;
}

/*****************************************************************************
 *
 *     Request Sense
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_flag			
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 wk_data			ATA 
 *****************************************************************************/
int RequestSense(void)
{
	int i;
	int ret = RC_NG;			/*  */
	
	/* CBWCBIATAPI */
	bulk_total_tran_cnt = MKDWORD(0x00,0x00,0x00,cmd_block[4]);

	if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
		/*  */

		bulk_tran_start_addr = wk_data;

		/* Sense Data */
		for (i = 0;i < 18;i++) {
			wk_data[i] = 0x00;
		}
		
		wk_data[ 0] = 0x70;
		wk_data[ 7] = 0x0A;
		wk_data[ 2] = sense_data[0];
		wk_data[12] = sense_data[1];
		wk_data[13] = sense_data[2];
			
		/*  */
		if (bulk_total_tran_cnt > 18) {
			bulk_total_tran_cnt = 18;
		}
			
		/*  */
		SetSenseKey_000000();
		ret = RC_OK;
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     Inquiry
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 wk_data			ATA 
 *****************************************************************************/
int Inquiry(void)
{
	int i,ret = RC_NG;				/*  */
	
	/* CBWCBIATAPI */
	bulk_total_tran_cnt = MKDWORD(0x00,0x00,0x00,cmd_block[4]);

	if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
		/*  */

		bulk_tran_start_addr = (BYTE *)&inquiry_data[0];	/*  */
			
		/*  */
		if (bulk_total_tran_cnt > 36) {
			bulk_total_tran_cnt = 36;
		}
			
		/*  */
		SetSenseKey_000000();
		ret = RC_OK;
	}
	
	return ret;
}

/*****************************************************************************
 *
 *     ReadCapacity
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_flag			
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 wk_data			LBA
 *****************************************************************************/
int ReadCapacity(void)
{
	int ret = RC_NG;				/*  */
	DWORD total_sec_cnt;

	/* CBWCBIATAPI */
	bulk_total_tran_cnt = 0x08;
	if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
		/*  */

		/*  */
		bulk_tran_start_addr = wk_data;
		
		/* Read Capacity */


		/*  */
		wk_data[0]	= DWORD2BYTE_HH(last_lba);
		wk_data[1]	= DWORD2BYTE_HL(last_lba);
		wk_data[2]	= DWORD2BYTE_LH(last_lba);
		wk_data[3]	= DWORD2BYTE_LL(last_lba);

		/*  */
		wk_data[4] = DWORD2BYTE_HH(block_size);
		wk_data[5] = DWORD2BYTE_HL(block_size);
		wk_data[6] = DWORD2BYTE_LH(block_size);
		wk_data[7] = DWORD2BYTE_LL(block_size);
				
		/*  */
		SetSenseKey_000000();
		ret = RC_OK;
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     ReadFormatCapacity
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 wk_data			ATA 
 *****************************************************************************/
int ReadFormatCapacity(void)
{
	int i;
	int ret = RC_NG;				/*  */
	DWORD total_sec_cnt;
	
	/* CBWCBIATAPI */
	bulk_total_tran_cnt = MKDWORD(0x00,0x00,cmd_block[7],cmd_block[8]);

	if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
		/*  */

		/*  */
		bulk_tran_start_addr = wk_data;

		/* Read Format Capacity  */
		wk_data[0] = 0x00;
		wk_data[1] = 0x00;
		wk_data[2] = 0x00;
		wk_data[3] = 0x10;
				
		/* -- Current/Maximum Capacity Descriptor -- */

		total_sec_cnt = last_lba + 1;

		/*  */
		wk_data[4]	= DWORD2BYTE_HH(total_sec_cnt);
		wk_data[5]	= DWORD2BYTE_HL(total_sec_cnt);
		wk_data[6]	= DWORD2BYTE_LH(total_sec_cnt);
		wk_data[7]	= DWORD2BYTE_LL(total_sec_cnt);

		/*  */
		wk_data[8]	= 0x03;	/*  */

		/*  */
		wk_data[9] = DWORD2BYTE_HL(block_size);
		wk_data[10] = DWORD2BYTE_LH(block_size);
		wk_data[11] = DWORD2BYTE_LL(block_size);

		/* -- Formattable Capacity Descriptor -- */

		/*  */
		wk_data[12] = DWORD2BYTE_HH(total_sec_cnt);
		wk_data[13] = DWORD2BYTE_HL(total_sec_cnt);
		wk_data[14] = DWORD2BYTE_LH(total_sec_cnt);
		wk_data[15] = DWORD2BYTE_LL(total_sec_cnt);

		/* Reserved  */
		wk_data[16] = 0x00;

		/*  */
		wk_data[17] = DWORD2BYTE_HL(block_size);
		wk_data[18] = DWORD2BYTE_LH(block_size);
		wk_data[19] = DWORD2BYTE_LL(block_size);

		/*  */
		if (bulk_total_tran_cnt > 20) {
			bulk_total_tran_cnt = 20;
		}

		/*  */
		SetSenseKey_000000();
		ret = RC_OK;
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     Mode Select
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_flag			
 *			 atten_flag 		
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 wk_data			ATA 
 *****************************************************************************/
int ModeSelect(void)
{
	int ret = RC_NG;				/*  */
	
	bulk_total_tran_cnt = MKDWORD(0x00,0x00,cmd_block[7],cmd_block[8]);
	
	/* CBWCBIATAPI */
	if (IsCommonErrorFound(DIR_OUT) == RC_NO_ERROR) {
		/*  */

		if ((cmd_block[1] & 0x01) == 0x01) {	/* SP */
			/*  */
			SetSenseKey_052400();
		} else {
			/*  */

			/* ModeSelect */
			bulk_tran_start_addr = wk_data;

			/*  */
			ret = RC_OK;
		}

⌨️ 快捷键说明

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