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

📄 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 页
字号:
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     Mode Select
 *     
 *   OK:NG:
 * bulk_total_tran_cnt 
 *			 mode_data_cnt		Mode Data
 *			 mode_work			Mode Data
 *			 wk_cnt 			
 *			 wk_data			ATA 
 *			 wk_ptr 			
 *****************************************************************************/
int ModeSelParaCheck(void)
{
	int ret = RC_OK;		/*  */
	
	/*  */
	wk_cnt = bulk_total_tran_cnt;
	
	if (wk_cnt < 8) {
		/*  */
		SetSenseKey_051A00();	/* Parameter List Length Error */
		ret = RC_NG;
	} else {
		/*  */
		wk_cnt -= 8;
		wk_ptr = wk_data + 8;
		while (wk_cnt > 0) {
			/*  */
			MSelFindPage(wk_ptr[0]);
			if (mode_data_cnt == 0) {
				/*  */
				SetSenseKey_052600();
				ret = RC_NG;
				break;
			} else if (wk_cnt < mode_data_cnt) {
				/*  */
				SetSenseKey_051A00();	/* Parameter List Length Error */
				ret = RC_NG;
				break;
			} else {
				/* Changeable */
				if (IsMSelRcvParaInvalid() == RC_NG) {
					/*  */
					SetSenseKey_052600();
					ret = RC_NG;
					break;
				}
			}
			/*  */
			wk_cnt	-= mode_data_cnt;
			wk_ptr += mode_data_cnt;
		}
	}
	
	if (ret == RC_OK) {
		/*  */
		SetSenseKey_000000();
	}

	return ret;
}
/*****************************************************************************
 *
 *     Mode Select
 *     page				
 *   
 * mode_pages 	   Mode Data
 *			 mode_data_cnt	   Mode Data
 *			 mode_data_addr    Mode Data
 *			 mode_chg_addr	   Mode DataChangeable Page Data
 *							   
 *****************************************************************************/
void MSelFindPage(BYTE page)
{
	int i;
	
	mode_data_addr = (BYTE *)&mode_data[0];		/* Mode Page */
	mode_data_cnt = 0;				/*  */
	
	for (i = 0;i < MODE_PAGE_CNT;i++) {	/*  */
		if (mode_data_addr[0] == page) {
			/*  */

			/*  */
			mode_data_cnt = mode_data_addr[1] + 2;
			
			/* Changeable */
			mode_chg_addr = mode_data_addr + MODE_PAGES_LEN;
			break;
		}
		mode_data_addr += mode_data_addr[1] + 2;
	}
}
/*****************************************************************************
 *
 *     Mode Select
 *     
 *   
 * wk_ptr 		   
 *			 mode_data_cnt	   Mode Data
 *			 mode_data_addr    Mode Data
 *			 mode_chg_addr	   Changeable Data
 *****************************************************************************/
int IsMSelRcvParaInvalid(void)
{
	BYTE chg;
	int i,ret = RC_NG;		/*  */
	
	/* Changeable
	 * 
	 * XOR
	 * ChangeableAND
	 * 
	 */
	
	chg = wk_ptr[0] ^ mode_data_addr[0];
	if (chg == 0x00) {
		/* Page Code  */
		chg = wk_ptr[1] ^ mode_data_addr[1];
		if (chg == 0x00) {
			/* 
			 * Page Length 
			 * 
			 */
			for (i = 2;i < mode_data_cnt;i++) {
				chg = wk_ptr[i] ^ mode_data_addr[i];
				if (chg != 0x00) {
					if ((chg & ~mode_chg_addr[i]) != 0x00) {
						/*  */
						break;
					}
				}
			}
			if (i == mode_data_cnt) {
				/*  */
				ret = RC_OK;
			}
		}
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     Mode Sense
 *     
 *   OK:NG:
 * tran_flag			
 *			 atten_flag 		
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 wk_data			ATA 
 *			 mode_data_cnt		Mode Data
 *			 mode_data_addr 	Mode Data
 *			 mode_chg_addr		Changeable Data
 *****************************************************************************/
int ModeSense(void)
{
	BYTE page;
	int i,ret = RC_NG;				/*  */
	
	/* CBWCBIATAPI */
	bulk_total_tran_cnt = MKDWORD(0x00,0x00,cmd_block[7],cmd_block[8]);

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

		if ((cmd_block[2] & 0xC0) == 0xC0) {
			/* Saved Value */

			SetSenseKey_053900();
		} else {
			page = cmd_block[2] & 0x3F;
			MSelFindPage(page);
			if (page != 0x3F && mode_data_cnt == 0) {
				/*  */
				SetSenseKey_052400();
			} else {

				if (page == 0x3F) {
					/* 
					 * Mode
					 * Current/Default Page
					 */
					mode_data_cnt  = MODE_PAGES_LEN;
					mode_data_addr = (BYTE *)&mode_data[0];
					mode_chg_addr  = (BYTE *)(&mode_data[0] + MODE_PAGES_LEN);
				}

				/*  */
				bulk_tran_start_addr = wk_data;
						
				/* ModeSense */
						
				/*  */
				for (i = 0;i < 8;i++) {
					wk_data[i] = 0x00;
				}
				wk_data[1] = mode_data_cnt + 6;
						
				if ((cmd_block[2] & 0xC0) != 0x40) {
					/* Default,Current Value */
					for (i = 0;i < mode_data_cnt;i++) {
						wk_data[i + 8] = mode_data_addr[i];
					}
				} else {
					/* Changeable Value */
					for (i = 0;i < mode_data_cnt;i++) {
						wk_data[i + 8] = mode_chg_addr[i];
					}
				}
						
				/*  */
				if (bulk_total_tran_cnt > mode_data_cnt + 8) {
					bulk_total_tran_cnt = mode_data_cnt + 8;
				}
						
				/*  */
				SetSenseKey_000000();
				ret = RC_OK;
			}
		}
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     PREVENT/ALLOW MEDIUM REMOVAL
 *     
 *   OK:NG:
 * atacmd_flag	   ATAPIATA
 *			 atten_flag 	   
 *****************************************************************************/
int Prevent(void)
{
	int ret = RC_NG;				/*  */

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

		/*
		 * 
		 * 
		 */
		SetSenseKey_052400();	/* INVALID FIELD IN COMMAND PACKET */
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     CBI 
 *     
 *   OK:NG:
 * atacmd_flag	   ATAPIATA
 *			 cmd_block		   ATAPI
 *			 cmd_status 	   CBW,CBI
 *****************************************************************************/
int CBIReset(void)
{
	int ret = RC_NG;			/*  */
	
	if (cmd_block[1] == 0x04 &&
		cmd_block[2] == 0xFF &&
		cmd_block[3] == 0xFF &&
		cmd_block[4] == 0xFF &&
		cmd_block[5] == 0xFF &&
		cmd_block[6] == 0xFF &&
		cmd_block[7] == 0xFF &&
		cmd_block[8] == 0xFF &&
		cmd_block[9] == 0xFF &&
		cmd_block[10] == 0xFF &&
		cmd_block[11] == 0xFF) {
		/* CBI Reset  */

		InitDeviceWorkArea();

		ControlLED(PORT_TURN_OFF);						/* PORTLED */

		if( rDMA_Control_BP.DMA_Running ){
			/* DMA */

			MasterDMAStop();							/* DMA*/

			di();
		
			rDMA_Control_BP.DMA_Stop = 1;
			while(rDMA_Control_BP.DMA_Running);

			rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
			rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;

			rDMA_IntStat = 0x01;					/* DMA_Cmp,FIFO_IN_Cmp,FIFO_OUT_Cmp
			rFIFO_IntStat = 0x03;					 *  
													 */
			ei();
		}else{
			rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;
			rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
		}
		rEPbControl_BP.ForceNAK = 1;

		bulk_in_state  = BULK_IN_IDLE;
		bulk_out_state = BULK_OUT_IDLE;
		protocol_phase = COMMAND_PHASE;


		/*  */
		SetSenseKey_000000();
		ret = RC_OK;
	} else {
		SetSenseKey_052000();
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     
 *     
 *   NG:
 * atacmd_flag	   ATAPIATA
 *
 *			 atten_flag 	   
 *****************************************************************************/
int CmdError(void)
{
	int ret = RC_NG;			/*  */

	bulk_total_tran_cnt = 0x00;
	if( atten_flag.PowerOnReset ){
		/*  */

		atten_flag.PowerOnReset = 0;			/*  */

		SetSenseKey_062900();
		return ret;
	}else{
		SetSenseKey_052000();	/*  */
	}

	return ret;

}

/*****************************************************************************
 *
 *     Read 10
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_protocol		BulkOnlyCBI
 *			 tran_flag			
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 ata_cmd_block		ATA
 *			 ata_lba			ATA LBA
 *			 ata_remain_sector	
 *****************************************************************************/
int Read10(void)
{
	int ret = RC_NG;				/*  */
	WORD sec_cnt;
	long	retCode;				/*   */

	/* CBWCBIATAPI */
	sec_cnt = MKWORD(cmd_block[7], cmd_block[8]);
	bulk_total_tran_cnt = sec_cnt * block_size;
	if (IsCommonErrorFound(DIR_IN) == RC_NO_ERROR) {
		/*  */

		ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);

		if (last_lba < ata_lba + sec_cnt - 1 ){
			/* LBA */

			SetSenseKey_052100();	/* LOGICAL BLOCK ADDRESS OUT OF RANGE */
		} else {
			/*  */
			SetSenseKey_000000();
			ret = RC_OK;

			/*  */
			if( bulk_total_tran_cnt != 0 ) {
				/* Bulk */

				tran_flag.DMA = 1;				/* DMA */
				
#if 0		/* 03/09/07 Endo :DTQ */

//				SysCnvLendian( &usbReqData.dCbwTag[0], 0x04d45fc1, 4 );
//				SysCnvLendian( &usbReqData.dCbwDataLength[0], 0x00000002, 4 );
//				usbReqData.dCbwFlags     = 0x80;
//				usbReqData.bCbwCblLength = 0x0a;
				usbReqData.cbwcb         = PCIF_USB_CMD_READ;

				readReq = (READ_REQ *)&usbReqData.detail;

				SysCnvLendian( &readReq->logBlkAddr[0], ata_lba, 4 );
				SysCnvLendian( &readReq->transLen[0]  , sec_cnt, 2 );
				
				pc_rslt.result_cmplt = 0 ;		// flag clear
				pc_rslt.cmd = 0xff ;
				retCode = 0;					// 

				plc_IO = (struct c_IOtag *)0x40000 ;		// append Endo

				//  1. Read10 Request Send
				retCode = UsbPcIf_PutReqData( (CHAR *)&usbReqData,
									(ULONG )sizeof( PCIF_USB_REQ_DATA ),
									(CHAR *)&usb_wk_buf[0],
									(ULONG )LBA_DATA_BUFF_MAX );
										/* USB Driver Put Request Data      */

				//  2. Command Error check
				if( retCode == 0 ){
						// nothing
				}

#else		/* 03/09/07 Endo :DTQ */
//----------------------------------------------------------------------------------------------
//	enum{
//		DRV_RAM,						// RAM Disk
//		DRV_ROM,						// ROM Disk
//		DRV_SM,							// 
//		DRV_MMC							// MMC/SD
//	};
//----------------------------------------------------------------------------------------------
// int DRV_ReadSec(enDrvNum DrvNum, unsigned long StrSec, unsigned long SecNum, unsigned char *Buf)
//----------------------------------------------------------------------------------------------

//				retCode = DRV_ReadSec(DRV_RAM, ata_lba, sec_cnt, &usb_wk_buf[0]);
				retCode = DrvFS_ReadSec(g_StgMediaInfo.type, ata_lba, sec_cnt, &usb_wk_buf[0]);

				//  2. Command Error check
				if( retCode != 0 ){
						panic(40);	// nothing
				}

#endif		/* 03/09/07 Endo :DTQ */

			}
		}
	}
	return ret;
}
/*****************************************************************************
 *
 *     Seek
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 atten_flag 		
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 ata_cmd_block		ATA
 *****************************************************************************/
int Seek(void)
{
	int ret = RC_NG;			/*  */

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

		ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);

		if( last_lba < ata_lba ){
			/* LBA */
			SetSenseKey_052100();
		} else {
					
			/*  */
			SetSenseKey_000000();
			ret = RC_OK;
		}
	}
	return ret;
}
/*****************************************************************************
 *
 *     StartStopUnit
 *     
 *   OK:NG:
 * atacmd_flag	   ATAPIATA
 *			 atten_flag 	   
 *			 cmd_block		   ATAPI
 *			 ata_cmd_block	   ATA
 *****************************************************************************/
int StartStopUnit(void)
{
	int ret = RC_NG;				/*  */
	
	/* CBWCBIATAPI */
	bulk_total_tran_cnt = 0;
	if (IsCommonErrorFound(DIR_NONE) == RC_NO_ERROR) {
		/*  */

		if ((cmd_block[4] & 0x02) == 0x02) {
			/* LoEJ */
			SetSenseKey_052400();
		} else {
			/*  */
			SetSenseKey_000000();
			ret = RC_OK;
		}
	}
	return ret;
}
/*****************************************************************************
 *
 *     Verify
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_protocol		BulkOnlyCBI
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 ata_cmd_block		ATA
 *			 ata_lba			ATA LBA
 *			 ata_remain_sector	
 *
 *****************************************************************************/
int Verify(void)
{
	int ret = RC_NG;				/*  */
	WORD sec_cnt;

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

		/* LBA */
		ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);

		/* Verify */
		sec_cnt = MKWORD(cmd_block[7], cmd_block[8]);

		if( last_lba < ata_lba + sec_cnt - 1 ) {
			/* LBA */
			SetSenseKey_052100();
		} else if ((cmd_block[1] & 0x02) == 0x02) {
			/* ByteChk() */
			SetSenseKey_052400();
		} else {
				
			/*  */
			SetSenseKey_000000();
			ret = RC_OK;
		}
	}
	
	return ret;
}
/*****************************************************************************
 *
 *     Write 10
 *     
 *   OK:NG:
 * atacmd_flag		ATAPIATA
 *			 tran_protocol		BulkOnlyCBI
 *			 atten_flag 		
 *			 tran_flag			
 *			 bulk_req_tran_cnt	 
 *			 bulk_total_tran_cnt 
 *			 cmd_block			ATAPI
 *			 ata_cmd_block		ATA
 *****************************************************************************/
int Write10(void)
{
	WORD sec_cnt;
	int f,ret = RC_NG;			/*  */

	/* CBWCBIATAPI */
	sec_cnt = MKWORD(cmd_block[7], cmd_block[8]);
	bulk_total_tran_cnt = sec_cnt * block_size;
	/* CBWCBIATAPI */
	if (IsCommonErrorFound(DIR_OUT) == RC_NO_ERROR) {
		/*  */

		ata_lba = MKDWORD(cmd_block[2],cmd_block[3],cmd_block[4],cmd_block[5]);

		if (last_lba < ata_lba + sec_cnt -1){
			/* LBA */

			SetSenseKey_052100();	/* LOGICAL BLOCK ADDRESS OUT OF RANGE */
		} else {
			/*  */
			SetSenseKey_000000();
			ret = RC_OK;

			/*  */
			if( bulk_total_tran_cnt != 0 ) {
				/* Bulk */
				
				g_UsbIFAns.ata_lba = ata_lba ;
				g_UsbIFAns.sec_cnt = sec_cnt ;

				tran_flag.DMA = 1;				/* DMA */

#if 0		/* 03/09/08 Endo :u_bulkout.c fifo_out_cmp  */

				// High-speed DMA Ch.3 interrupt request flag register
				//		#define bINT_FDMA_FHDM3 fINT_FDMA.FHDM3  
				bINT_FDMA_FHDM3 = 1 ;			// clear

				// High-speed DMA Ch.3 interrupt enable register
				//		#define bINT_EDMA_EHDM3 fINT_EDMA.EHDM3  
				bINT_EDMA_EHDM3 = 1 ;			// enable

#endif		/* 03/09/08 Endo :u_bulkout.c fifo_out_cmp  */

			}
		}
	}
	return ret;

}

⌨️ 快捷键说明

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