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

📄 bol.c

📁 这个是好记星608的AP源代码,他的主要是是GUI,还有对字典的操作
💻 C
字号:
// BulkOnlyLyr.cpp: implementation of the BulkOnlyLyr class.
//
//////////////////////////////////////////////////////////////////////

#define __OS_SOURCE_FILE__

#ifndef _WIN32
#include "kernel.h"
#include "SCL.h"
#include "BOL.h"

MS_STATUS USBReadWrite(INT nOperation,BYTE *pBuffer, UNSIGNED uRequestLen, UNSIGNED *puActualLen);

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//static UINT CBWLEN = sizeof(g_stCBW);
#define	CBWLEN			31
#define	CSWLEN			13
#define	SIGNATURELEN	4
#define	DATAXFERLEN	4
#define	DATARESIDUE	4
#define	TARGETLEN		4


static CBW g_stCBW;
static CSW g_stCSW;
static BYTE g_pCSW[CSWLEN];

static ULP_ONRECEIVEDPROC g_pfnULP_OnReceived[16];

static UINT g_uMaxLUN;
static UINT g_uStatusLocal;
extern NU_DRIVER	*pndUSB;

UINT BOL_Init(UINT uMaxLUN, ULP_ONRECEIVEDPROC *pfnULP_OnReceived)
{
//	NU_Printf("Bulk-Only initing...\n\r");

	memset(&g_stCBW,0,sizeof(g_stCBW));
	memset(&g_stCSW,0,sizeof(g_stCSW));
	memset(g_pCSW,0,sizeof(g_pCSW));
	memset(g_pfnULP_OnReceived,0,sizeof(g_pfnULP_OnReceived));

	g_stCSW.dwSignature = CSW_SIGNATURE;

	g_uMaxLUN = 0;
	g_uStatusLocal = DEVICE_STALL;


	//g_pfnULP_OnReceived = pfnULP_OnReceived;
	if (uMaxLUN >= 16)
		return -1;

	g_uMaxLUN = uMaxLUN;
	memcpy(g_pfnULP_OnReceived, pfnULP_OnReceived, sizeof(ULP_ONRECEIVEDPROC) * g_uMaxLUN);
	memcpy(g_pCSW, &g_stCSW, CSWLEN);

	g_uStatusLocal = DEVICE_IDLE;
	return 0;
}

UINT BOL_BulkCtrl(UINT uCtrl, DWORD *dwParam)
{
	switch(uCtrl)
	{
	case STALL:
		{ // Stall bulk endpoint.
			g_uStatusLocal = DEVICE_STALL;
		}break;
	case GETSTATUS:
		{
			*dwParam = g_uStatusLocal;
		}break;
	}
	return 0;
}




DWORD BOL_BulkOut(DWORD uDLen, BYTE *pData)
{
	NU_DRIVER_REQUEST   ndrTemp;

	//初始化USB驱动
	ndrTemp.nu_function = NU_INPUT;
#define READWRITE_OPERATION	ndrTemp.nu_request_info.nu_input
	READWRITE_OPERATION.nu_logical_unit = 0;
	READWRITE_OPERATION.nu_buffer_ptr = pData;
	READWRITE_OPERATION.nu_request_size = uDLen;

	NU_Request_Driver(pndUSB, &ndrTemp);

	return READWRITE_OPERATION.nu_actual_size;

#undef READWRITE_OPERATION

}


DWORD BOL_BulkIn(DWORD uLen, BYTE *pData)
{
	NU_DRIVER_REQUEST   ndrTemp;

	ndrTemp.nu_function = NU_OUTPUT;

#define READWRITE_OPERATION	ndrTemp.nu_request_info.nu_output
	READWRITE_OPERATION.nu_logical_unit = 0;
	READWRITE_OPERATION.nu_buffer_ptr = pData;
	READWRITE_OPERATION.nu_request_size = uLen;

	NU_Request_Driver(pndUSB, &ndrTemp);

	return READWRITE_OPERATION.nu_actual_size;

#undef READWRITE_OPERATION

}

// LLP callback function.
UINT BOL_OnRecvCmd(UINT uLen, BYTE *pData)
{


//	NU_Printf("On Bulk-Only Receiving...\n\r");

	if (CBWLEN > uLen)
	{
		return CSW_WAITFOR_MORE_DATA;
	}
	 memcpy(&g_stCBW, pData, CBWLEN);

	  // 为了避免奇地址问题实用下述代码替代
/*	g_stCBW.dwSignature = READ_DWORD(p); p += SIGNATURELEN;
	g_stCBW.dwTaget = READ_DWORD(p); p += TARGETLEN;
	g_stCBW.dwDataXferLen = READ_DWORD(p); p += DATAXFERLEN;
	g_stCBW.uFlag = *p; p++;
	g_stCBW.uLUN = *p; p++;
	g_stCBW.uCDBLen = *p;
*/
	// 检验CBW有效性
	if (CBW_SIGNATURE != g_stCBW.dwSignature)
		return CSW_PHASE_ERROR;
	g_stCSW.dwTaget = g_stCBW.dwTaget;

	if (g_stCBW.uLUN >= g_uMaxLUN)
		return CSW_NEEDTO_STALL_BULK;
	// 在存在多个逻辑单元的情况下,要根据g_stCBW.uLUN将命令分发到指定的逻辑单元上。

	uLen -= 15;
	pData += 15;

	g_stCSW.dwDataResidue = g_stCBW.dwDataXferLen;
	g_stCSW.uStatus = (g_pfnULP_OnReceived[g_stCBW.uLUN])
					? g_pfnULP_OnReceived[g_stCBW.uLUN](uLen, pData, g_stCBW.uFlag & CBW_FLAG_IN ? 1 : 0, g_stCBW.dwDataXferLen, &g_stCSW.dwDataResidue)
					: CSW_FAIL;


	BOL_BulkIn(CSWLEN, (BYTE *)&g_stCSW);
	// 为了避免奇地址问题实用下述代码替代
/*	p = g_pCSW + SIGNATURELEN;
	WRITE_DWORD(p, g_stCSW.dwTaget); p += TARGETLEN;
	WRITE_DWORD(p, g_stCSW.dwDataResidue); p += DATARESIDUE;
	*p = g_stCSW.uStatus;
	BOL_BulkIn(CSWLEN, g_pCSW);
*/
	return g_stCSW.uStatus;
}

MS_STATUS USBReadWrite(INT nOperation,BYTE *pBuffer, UNSIGNED uRequestLen, UNSIGNED *puActualLen)
{
	STATUS sts;
	NU_DRIVER_REQUEST   ndrTemp;

	//初始化USB驱动
	ndrTemp.nu_function = nOperation;
	if(NU_INPUT == nOperation)
	{
		#define READWRITE_OPERATION	ndrTemp.nu_request_info.nu_input
		READWRITE_OPERATION.nu_logical_unit = 0;
		READWRITE_OPERATION.nu_buffer_ptr = pBuffer;
		READWRITE_OPERATION.nu_request_size = uRequestLen;

		sts = NU_Request_Driver(pndUSB, &ndrTemp);

		*puActualLen = READWRITE_OPERATION.nu_actual_size;

		#undef READWRITE_OPERATION

	}
	else
	{
#define READWRITE_OPERATION	ndrTemp.nu_request_info.nu_output
		READWRITE_OPERATION.nu_logical_unit = 0;
		READWRITE_OPERATION.nu_buffer_ptr = pBuffer;
		READWRITE_OPERATION.nu_request_size = uRequestLen;

		sts = NU_Request_Driver(pndUSB, &ndrTemp);

		*puActualLen = READWRITE_OPERATION.nu_actual_size;

#undef READWRITE_OPERATION
	}

	if(sts != NU_SUCCESS)
		return sts;

	return ndrTemp.nu_status;
}
#endif

⌨️ 快捷键说明

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