📄 tpbulk.c
字号:
__GtpbulkCSW.bCSWStatus = __CSW_GOOD;
break;
case __CASE2: /* Hn<Di */
case __CASE3: /* Hn<Do */
/*
* GbitBOTStallAtBulkIn = 1; // may or may-not
*/
__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
break;
case __CASE4: /* Hi>Dn */
case __CASE5: /* Hi>Di */
__GbitBOTStallAtBulkIn = 1;
__GtpbulkCSW.bCSWStatus = __CSW_FAIL; /* CSW_GOOD or CSW_FAIL */
break;
case __CASE7: /* Hi<Di */
case __CASE8: /* Hi<>Do */
/*
* __GbitBOTStallAtBulkIn = 1; // may or may-not
*/
__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
break;
case __CASE9: /* Ho>Dn */
case __CASE11: /* Ho>Do */
/*
* __GbitBOTStallAtBulkOut = 1; // may or may-not
*/
__GtpbulkCSW.bCSWStatus = __CSW_FAIL; /* CSW_GOOD or CSW_FAIL */
break;
case __CASE10: /* Ho<>Di */
case __CASE13: /* Ho<Do */
/*
* __GbitBOTStallAtBulkIn = 1;// may or may-not
* __GbitBOTStallAtBulkOut = 1;// may or may-not
*/
__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
break;
case __CASECBW: /* invalid CBW */
/*
* __GbitBOTStallAtBulkIn = 1;// may or may-not
* __GbitBOTStallAtBulkOut = 1;// may or may-not
*/
__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
break;
case __CASECMDFAIL:
__GbitBOTStallAtBulkIn = 1;
__GtpbulkCSW.bCSWStatus = __CSW_FAIL;
break;
default:
break;
}
__GtpbulkCSW.dwCSWSignature = __CSW_SIGNATURE; /* 0x55534253 CSW后固有的特征码*/
}
/*********************************************************************************************************
** Function name: __tpbulkCSWHandler
**
** Descriptions: USB批量传输的命令状态处理阶段
**
** input parameters: 无
**
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkCSWHandler ( void )
{
if (__GbitBOTStallAtBulkIn){
/*
* 停止批量输入端点的处理
*/
__BIEPStall(); /* 设置Bulk-In端点状态为停止 */
__GtpbulkCSW.dwCSWDataResidue += __GdwBOTXferResidue;
__GcBOTXferSpace &= __BOTXFERSPACE_MASK;
__GbitBOTXferatRAM = 1; /* 从RAM传输数据 */
__GpucBOTXferData = (__uint8*) &__GtpbulkCSW; /* CSW数据指针 */
__GdwBOTXferResidue = 13; /* CSW包的数据长度 (13B) */
/* 不要用sizeof(__CSW),可能!=13*/
__GcBOTFsmState = __USBFSM4BOT_CSW; /* 设置CSW包传输标志位 */
}else if(__GbitBOTStallAtBulkOut){
/*
* 停止批量输出端点的处理
*/
__BOEPStall(); /* 设置Bulk-Out端点状态为停止 */
__GcBOTFsmState = __USBFSM4BOT_STALL; /* 设置端点空闲标志位 */
}else{
__GtpbulkCSW.dwCSWDataResidue += __GdwBOTXferResidue; /* 设置设备未处理的数据量 */
__GcBOTXferSpace &= __BOTXFERSPACE_MASK; /* 清各传输地址标志位0x0F */
__GbitBOTXferatRAM = 1; /* 从RAM传输数据 */
__GpucBOTXferData = (__uint8*) &__GtpbulkCSW; /* 设置CSW包数据指针 */
__GdwBOTXferResidue = 13; /* CSW包数据长度 */
/* 不要用sizeof(__CSW) */
__GcBOTFsmState = __USBFSM4BOT_CSW; /* 设置CSW包传输标志位 */
}
}
/*********************************************************************************************************
Bulk-Only TP - Class Request Handler
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __tpbulkResetATA
**
** Descriptions: 批量传输的大容量存储器复位
**
** input parameters: 无
**
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkResetATA (void)
{
msReset(); /* 存储器复位,初始化 */
__singleTransmit(0, 0);
}
/*********************************************************************************************************
** Function name: __tpbulkGetMaxLUN
**
** Descriptions: 设备支持的最大逻辑单元数目
**
** input parameters: 无
**
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkGetMaxLUN (void)
{
__uint8 c = __MAXLUN;
__singleTransmit(&c, 1);
}
/*********************************************************************************************************
Bulk Only Transport support functions
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __tpbulkRead
**
** Descriptions: 批量读取数据
**
** input parameters:
** global parameters: __GdwBOTXferResidue 批量传输数据剩余字节数,函数内会减去传送字节数
** __GpucBOTXferData 批量传输的数据指针,函数内会调整指针
** output parameters: 无
** Returned value: 实际读入的数据量或__BULKEP_RW_ERR
**
*********************************************************************************************************/
__uint16 __tpbulkRead (void)
{
__uint16 usLen;
if (__GdwBOTXferResidue == 0){
return 0;
}
if (__GdwBOTXferResidue >= __BULK_PACKET_SIZE){ /* 每次最多只能读取1包数据 */
usLen = __BULK_PACKET_SIZE;
}else{
usLen = (__uint16)__GdwBOTXferResidue;
}
usLen = __bulkRead(usLen, __GpucBOTXferData); /* 读取数据到指定地址 */
if (usLen != __BULKEP_RW_ERR){
__GdwBOTXferResidue -= usLen;
__GpucBOTXferData += usLen; /* 调整批量传输指针 */
}
return usLen; /* 返回已读数据长度 */
}
/*********************************************************************************************************
** Function name: __tpbulkWrite
**
** Descriptions: 批量发送数据
**
** input parameters: 无
** global parameters: __GdwBOTXferResidue 批量传输数据剩余字节数,函数内会减去传送字节数
** __GpucBOTXferData 批量传输的数据指针,函数内会调整指针
** output parameters: 无
** Returned value: 实际发送的数据量或__BULKEP_RW_ERR
**
*********************************************************************************************************/
__uint16 __tpbulkWrite (void)
{
__uint16 usLen;
if (__GdwBOTXferResidue == 0){
return 0;
}
if (__GdwBOTXferResidue >= __BULK_PACKET_SIZE){ /* 每次最多只能发送1包数据 */
usLen = __BULK_PACKET_SIZE;
}else{
usLen = (__uint16)__GdwBOTXferResidue;
}
usLen = __bulkWrite(usLen, __GpucBOTXferData); /* 发送指定地址的数据 */
if (usLen != __BULKEP_RW_ERR){
__GdwBOTXferResidue -= usLen;
__GpucBOTXferData += usLen; /* 调整批量传输指针 */
}
return usLen; /* 返回已读数据长度 */
}
/*********************************************************************************************************
** Function name: __tpbulkIsCBWValid
**
** Descriptions: 效检CBW是否有效
**
** input parameters: 无
** output parameters: 无
** Returned value: 有效返回1, 无效返回0
**
*********************************************************************************************************/
__uint8 __tpbulkIsCBWValid ( void)
{
if( __GtpbulkCBW.dwCBWSignature == __CBW_SIGNATURE &&
__GtpbulkCBW.bCBWLUN < (__MAXLUN+1) &&
__GtpbulkCBW.bCBWCDBLen <= __MAX_CDBLEN ){ /* 0x55534243,MAX_CDBLEN=0x10 */
__GbCurLun = __GtpbulkCBW.bCBWLUN; /* 设置当前逻辑单元 */
return(1);
}else{
return(0);
}
}
/*********************************************************************************************************
** Function name: __tpbulkSendSetting
**
** Descriptions: 设置设备到主机的批量数据传输参数
**
** input parameters: ucXferSpace 传输数据的存储类型
** pucXferData 传输数据的指针
** uiXferLen 准备传输的字节数
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkSendSetting ( __uint8 ucXferSpace,
__uint8 *pucXferData,
__uint32 uiXferLen
)
{
__GcBOTXferSpace &= __BOTXFERSPACE_MASK;
__GcBOTXferSpace = (__uint8)(__GcBOTXferSpace | ucXferSpace); /* 设置传输数据的存储类型 */
__GdwBOTXferResidue = uiXferLen; /* 设置批量传输数据剩余字节数 */
__GpucBOTXferData = pucXferData; /* 设置批量传输的数据指针 */
__GcBOTFsmState = __USBFSM4BOT_DATAIN; /* 设置状态机为DATAIN */
}
/*********************************************************************************************************
** Function name: __tpbulkRecvSetting
**
** Descriptions: 设置主机到设备的批量数据传输参数
**
** input parameters: ucXferSpace 传输数据的存储类型
** pucXferData 传输数据的指针
** uiXferLen 准备传输的字节数
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkRecvSetting ( __uint8 ucXferSpace,
__uint8 *pucXferData,
__uint32 uiXferLen
)
{
__GcBOTXferSpace &= __BOTXFERSPACE_MASK;
__GcBOTXferSpace = (__uint8)(__GcBOTXferSpace | ucXferSpace); /* 设置传输数据的存储类型 */
__GdwBOTXferResidue = uiXferLen; /* 设置批量传输数据剩余字节数 */
__GpucBOTXferData = pucXferData; /* 设置批量传输的数据指针 */
__GcBOTFsmState = __USBFSM4BOT_DATAOUT; /* 设置状态机为DATAOUT */
}
/*********************************************************************************************************
End of file
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -