📄 bol.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 + -