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

📄 function.c

📁 本电子词典是名人928的学习机代码,主要是电子学习机AP,其他还没有传
💻 C
📖 第 1 页 / 共 2 页
字号:
			unReadBlockNum = wOffset;
			
		dwCount = HAL_Read(dwBlock, unReadBlockNum, g_pData);
		if (dwCount != (DWORD)unReadBlockNum * BlockLen)
		{
                    Req_SenseData.SenseKey = 0;
                    Req_SenseData.ASC = 0x30;       // CANNOT FORMAT MEDIUM - INCOMPATIBLE MEDIUM
                    Req_SenseData.ASCQ = 0x06;
			return CHECK_CONDITION;
		}

		dwSend = BOL_BulkIn(dwCount, g_pData);
		*g_pdwResidue -= dwSend;
		if (dwSend != dwCount)
		{
                    Req_SenseData.SenseKey = 0;
                    Req_SenseData.ASC = 0x04;       // LOGICAL UNIT NOT READY, OPERATION IN PROGRESS
                    Req_SenseData.ASCQ = 0x07;
			return CHECK_CONDITION;
		}            
            dwBlock += unReadBlockNum;
	}
#endif
        Req_SenseData.SenseKey = 0;
        Req_SenseData.ASC = 0;
        Req_SenseData.ASCQ = 0;
	return GOOD;
}

MS_STATUS cmd_rcChkCmd(void)
{
	//NU_Printf("READ CAPACITY - Check command\n\r");
	return GOOD;
}

MS_STATUS cmd_rcBuildResponse(void)
{
	BYTE bSendData[] = {0,0x03,0xD2,0, 0,0,0x02,0};
	DWORD dwLBA, dwBlockLen;
	MFlashInfo FlashInfo;

#ifndef	SYS_UPDATE
	FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &FlashInfo);	//取得块大小和块数
	dwLBA = FlashInfo.uPageSum - 1;
	dwBlockLen = FlashInfo.uPageSize;
	dwLBA += SEC_PER_TRACK;			
	if (g_bCardConnect) {
		dwLBA += USB_PTABLE[1].p_size;
	}
	dwLBA = SWAP4(dwLBA);
	dwBlockLen = SWAP4(dwBlockLen);
	WRITE_DWORD(bSendData, dwLBA);
	WRITE_DWORD(bSendData + 4, dwBlockLen);
#endif
	
	BOL_BulkIn(sizeof(bSendData), bSendData);
	*g_pdwResidue = g_dwXansfer - sizeof(bSendData);
        Req_SenseData.SenseKey = 0;
        Req_SenseData.ASC = 0;
        Req_SenseData.ASCQ = 0;

	return GOOD;
}

MS_STATUS cmd_rsChkCmd(void)
{
	//NU_Printf("REQUEST SENSE - Check command\n\r");
	return GOOD;
}

MS_STATUS cmd_rsBuildResponse(void)
{
	BOL_BulkIn(sizeof(Req_SenseData)<*((UINT32 *)((UINT8 *)g_pCDB-15+8))?sizeof(Req_SenseData):*((UINT32 *)((UINT8 *)g_pCDB-15+8)), (BYTE *)&Req_SenseData);
	*g_pdwResidue = g_dwXansfer - sizeof(Req_SenseData);	
        Req_SenseData.SenseKey = 0;
        Req_SenseData.ASC = 0;
        Req_SenseData.ASCQ = 0;
	return GOOD;
}

MS_STATUS cmd_turChkCmd()
{
	//NU_Printf("TEST UNIT READY - Check command\n\r");
	return GOOD;
}

MS_STATUS cmd_turBuildResponse(void)
{
    //检测逻辑块是否已经准备好
    *g_pdwResidue = 0;
    Req_SenseData.SenseKey = 0;
    Req_SenseData.ASC = 0;
    Req_SenseData.ASCQ = 0;
    return GOOD;
}

MS_STATUS cmd_wriChkCmd(void)
{
	//NU_Printf("WRITE - Check command\n\r");
	return GOOD;
}

#ifdef USB_EVALUATE
#define EVALUATE_NUM		20
extern UINT8 g_nEvaluateFlag;
UINT8 g_nEvaluateTimes = 0;		// counter for received package

#endif

MS_STATUS cmd_wriBuildResponse(void)
{
//	READ10_CMD WriteCmd;
	DWORD dwBlock;	//, LBA_Addr;
//	DWORD dwCount;
	WORD wBlocks, i, BlockLen, wOffset;
	MFlashInfo FlashInfo;


	
//	WriteCmd.dwLBA = READ_DWORD(g_pCDB + 2);
//	WriteCmd.wBlockNum = READ_WORD(g_pCDB + 7);

#ifdef	SYS_UPDATE
	BlockLen = 512;
#else
	FlashIoCtrl(NULL, FLASH_COMMAND_GETINFO, &FlashInfo);	//取得块大小和块数
//	LBA_Addr = FlashInfo.uPageSum - 1;
	BlockLen = FlashInfo.uPageSize;
//        BlockLen = 512;
#endif
	
	*g_pdwResidue = g_dwXansfer;
	wOffset = (UINT16)(g_BufferSize/ BlockLen);
	
	dwBlock = SWAP4(READ_DWORD(g_pCDB + 2));
	wBlocks = SWAP2(READ_DWORD(g_pCDB + 7));
	
//	if (LBA_Addr < (dwBlock + wBlocks))
//		return CHECK_CONDITION;
	
	for (i=0; i < wBlocks; i += wOffset)
	{
		DWORD unReadBlockNum;
		DWORD dwNeedRead;

		unReadBlockNum = wBlocks - i;
		if(unReadBlockNum > wOffset)
			unReadBlockNum = wOffset;
		
		dwNeedRead = unReadBlockNum * BlockLen;
		
		if (BOL_BulkOut(dwNeedRead, g_pData) != dwNeedRead)
		{
                      Req_SenseData.SenseKey = 0x0b;       //ABORTED COMMAND.
                      Req_SenseData.ASC = 0x08;             // LOGICAL UNIT COMMUNICATION TIME-OUT
                      Req_SenseData.ASCQ = 0x01;
                      return CHECK_CONDITION;
		}
                *g_pdwResidue -= dwNeedRead;

#ifdef USB_EVALUATE

		if(dwNeedRead > 10*1024)
		{
			if(g_nEvaluateTimes++ == EVALUATE_NUM && g_nEvaluateFlag == USB_EVALUATE_RING0)
			{
				g_nEvaluateTimes = 0;
				g_nEvaluateFlag = USB_EVALUATE_RING1; // CHECK receive & write TIME
			}
		}

		if(g_nEvaluateFlag != USB_EVALUATE_RING0)	// do not actully write to flash when evaluate ring0
		{
#endif
                
		if (HAL_Write(dwBlock, (UINT16)unReadBlockNum, g_pData) != dwNeedRead)
		{
                    Req_SenseData.SenseKey =0x0b;   //NOT READY
                    Req_SenseData.ASC = 0x04;          // LOGICAL UNIT NOT READY, OPERATION IN PROGRESS
                    Req_SenseData.ASCQ = 0x07; 
                    return CHECK_CONDITION;
		}
		
#ifdef USB_EVALUATE
 		}
 #endif
		
		dwBlock += unReadBlockNum;
	}
	Req_SenseData.SenseKey = 0; //No sense
	Req_SenseData.ASC = 0;
       Req_SenseData.ASCQ = 0;
	return GOOD;
}

MS_STATUS cmd_UnknownChkCmd(void)
{
    //NU_Printf("Unknown(23H) - Check command\n\r");
    //	return GOOD;
    Req_SenseData.SenseKey = 0x05;  //ILLEGAL REQUEST
    Req_SenseData.ASC = 0x24;   // INVALID FIELD IN CDB
    Req_SenseData.ASCQ = 0x0;  
    return  GOOD;
}

MS_STATUS cmd_UnknownBuildResponse(void)
{
	//NU_Printf("Unknown(23h) - Build response\n\r");

//	BOL_BulkIn(sizeof(UnknownCommand), (BYTE*)UnknownCommand);
	BOL_BulkIn(sizeof(UnknownCommand)<*((UINT32 *)((UINT8 *)g_pCDB-15+8))?sizeof(UnknownCommand):*((UINT32 *)((UINT8 *)g_pCDB-15+8)), (BYTE *)&UnknownCommand);
	*g_pdwResidue = g_dwXansfer - sizeof(UnknownCommand);
//	return GOOD;
	return GOOD;			
	
}

MS_STATUS cmd_VerifyChkCmd(void)
{
/*    //NU_Printf("Unknown(2FH) - Check command\n\r");
    //  return GOOD;
    Req_SenseData.SenseKey = 0x05;  //ILLEGAL REQUEST
    Req_SenseData.ASC = 0x24;   // INVALID FIELD IN CDB
    Req_SenseData.ASCQ = 0x0;  
    return  CHECK_CONDITION;
*/    
    return GOOD;
}

MS_STATUS cmd_VerifyBuildResponse(void)
{
    //NU_Printf("Unknown(2Fh) - Build response\n\r");
    Req_SenseData.SenseKey = 0;
    Req_SenseData.ASC = 0;
    Req_SenseData.ASCQ = 0;
    return GOOD;    
}

MS_STATUS cmd_ModeSenseChkCmd(void)
{
    //return GOOD;
/*
    Req_SenseData.SenseKey = 0x05;  //ILLEGAL REQUEST
    Req_SenseData.ASC = 0x24;   // INVALID FIELD IN CDB
    Req_SenseData.ASCQ = 0x0;  
    return  CHECK_CONDITION;
*/    
    Req_SenseData.SenseKey = 0;  //ILLEGAL REQUEST
    Req_SenseData.ASC = 0;   // INVALID FIELD IN CDB
    Req_SenseData.ASCQ = 0x0;  
    return  GOOD;
}

MS_STATUS cmd_ModeSenseBuildResponse(void)
{
	//NU_Printf("Mode Sense - Build response\n\r");

	if (g_dwXansfer <= sizeof(ModeSenseData))
	{
		BOL_BulkIn(g_dwXansfer, (BYTE*)ModeSenseData);
		*g_pdwResidue = 0;
	}
	else
	{
		BOL_BulkIn(sizeof(ModeSenseData), (BYTE*)ModeSenseData);
		*g_pdwResidue = g_dwXansfer - sizeof(ModeSenseData);
	}
	return GOOD;
//        return CHECK_CONDITION;
}

MS_STATUS cmd_MediumRemoveChkCmd(void)
{
    Req_SenseData.SenseKey = 0x05;
    Req_SenseData.ASC = 0x24;   // INVALID FIELD IN CDB
    Req_SenseData.ASCQ = 0x0;  
    return  CHECK_CONDITION;        
}
MS_STATUS cmd_MediumRemoveBuildResponse()
{
    return CHECK_CONDITION;
}
#endif

⌨️ 快捷键说明

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