📄 tpbulk.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: Tpbulk.c
** Latest modified Date: 2007-10-8
** Latest Version: 1.0
** Descriptions: 这部分代码实现大容量类USB批量传输规范
**
**--------------------------------------------------------------------------------------------------------
** Created by: Lizhenming
** Created date: 2007-09-17
** Version: 1.0
** Descriptions: The original version
**
*********************************************************************************************************/
#include "RbcBasicType.h"
#include "Hal4Rbc.h"
#include "RBCCmd.h"
#include "RBC.h"
#include "tpbulk.h"
#include "massStorage.h"
#include "usbdevconfig.h"
__TPBULK_PARA __tpbulkPara[__MAXLUN+1]; /* 批量传输参数 */
/*********************************************************************************************************
批量传输端点标志
*********************************************************************************************************/
__char_bit __GcbitTpbulkFlags;
/*********************************************************************************************************
大容量存储类USB批量传输的命令块数据包和命令状态包
*********************************************************************************************************/
__TPBLK_STRUC __GtpbulkBlock; /* 大容量存储类命令块数据包和 */
/* 命令状态包共用同一片RAM */
volatile INT8U __GucDevMsServerPrio = 0;
/*********************************************************************************************************
是否退出大容量存储类USB批量传输操作的标志
*********************************************************************************************************/
volatile INT8U __GucDevMsExitOpera = 0;
OS_STK __taskMassDevServerStk[512];
/*********************************************************************************************************
大容量类批量传输处理主函数,初始化函数等
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: massDevInit
**
** Descriptions: 大容量类初始化函数。对批量传输相关参数初始化,初始化储存器。
**
** input parameters: ucPrio 大容量类处理任务的优先级
** output parameters: 无
** Returned value: 初始化成功的储存器单元数目
**
*********************************************************************************************************/
__uint8 massDevInit (__uint8 ucPrio)
{
__uint8 ucCnt = 0;
USBDEBUG_SENDSTR("\r\nmassDevInit...\r\n");
__GucDevMsExitOpera = FALSE;
__GucDevMsServerPrio = 0;
__GcbitTpbulkFlags.char_ = 0; /* 初始化端点标志 */
for (__GbCurLun=0; __GbCurLun<(__MAXLUN+1); __GbCurLun++){
__GcBOTFsmState = __USBFSM4BOT_IDLE; /* 初始化状态机 */
__GdwBOTXferResidue = 0; /* 初始化传输参数 */
__GpucBOTXferData = __MASS_NULL;
__GcBOTXferSpace = 0;
if (msInit() == __MASS_SUCCESS){ /* 大容量储存器初始化 */
ucCnt++;
}
}
__GbCurLun = 0; /* 必须初始化为0 */
if (OSTaskCreate(massDevServer, (void *)0, &__taskMassDevServerStk[511], ucPrio) == OS_NO_ERR) {
__GucDevMsServerPrio = ucPrio;
return 1;
} else {
USBDEBUG_SENDSTR("\r\nCreate massDevServer task failed\r\n");
}
return 0;
}
/*********************************************************************************************************
** Function name: massDeInit
**
** Descriptions: 大容量类停止处理函数。对储存器下电/关闭。
**
** input parameters: 无
** output parameters: 无
** Returned value: 下电/关闭成功的储存器单元数目
**
*********************************************************************************************************/
__uint8 massDevDeInit (void)
{
__uint8 ucCnt = 0;
USBDEBUG_SENDSTR("\r\nmassDevDeInit...\r\n");
OS_ENTER_CRITICAL();
__GucDevMsExitOpera = 1;
OS_EXIT_CRITICAL();
if (__GucDevMsServerPrio) {
while (OSTCBPrioTbl[__GucDevMsServerPrio] != NULL) {
OSTimeDly(1);
}
__GucDevMsServerPrio = 0;
}
for (__GbCurLun=0; __GbCurLun<(__MAXLUN+1); __GbCurLun++){
if (msDeInit != 0 && msDeInit() == __MASS_SUCCESS){ /* 大容量储存器下电/关闭 */
ucCnt++;
}
}
__GbCurLun = 0; /* 必须初始化为0 */
return ucCnt;
}
/*********************************************************************************************************
** Function name: massDevServer
**
** Descriptions: 大容量类服务函数。
** input parameters: pdata uCOS要求的参数
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void massDevServer (void *pdata)
{
while (1) {
if (__GbitBOTFsmIdle){
if (__GucDevMsExitOpera) { /* 系统要求退出操作状态 */
USBDEBUG_SENDSTR("\r\ndelete massDevServer task\r\n");
OSTaskDel(OS_PRIO_SELF);
}
__tpbulkCBWHandler(); /* 转到批量传输命令数据包处理 */
}
while (__GbitBOTFsmDataOut){ /* 接收数据阶段 */
if (__GbitBOTXferatATA){
/* 传输数据到储存器 */
if (__msXferPktFrUSB() == __MASSSTORAGE_ERROR){
__tpbulkErrorHandler(__CASECMDFAIL, 0); /* 命令失败 */
__tpbulkCSWHandler();
}
}else if (__GbitBOTXferatRAM || __GbitBOTXferatROM){
__tpbulkRead(); /* 传输数据到RAM/ROM */
}
if (__GdwBOTXferResidue == 0){
__tpbulkCSWHandler(); /* 传输完成,转到命令状态处理 */
}
}
while (__GbitBOTFsmDataIn) {
if (__GbitBOTXferatATA){ /* 传输储存器数据 */
if (__msXferPkt2USB() == __MASSSTORAGE_ERROR){
__tpbulkErrorHandler(__CASECMDFAIL, 0); /* 命令失败 */
__tpbulkCSWHandler();
}
} else if(__GbitBOTXferatRAM || __GbitBOTXferatROM){
__tpbulkWrite(); /* 传输RAM/ROM数据 */
}
if(__GdwBOTXferResidue == 0){
__tpbulkCSWHandler(); /* 传输完成,转到命令状态处理 */
}
}
if (__GbitBOTFsmCSW || __GbitBOTFsmStall) { /* 批量传输命令状态处理 */
if (__tpbulkWrite() != __BULKEP_RW_ERR){ /* 传输命令状态包 */
__GcBOTFsmState = __USBFSM4BOT_IDLE; /* 转到空闲状态 */
} else {
OSTimeDly(1);
}
}
}
}
/*********************************************************************************************************
** Function name: massResetSoft
**
** Descriptions: 大容量类软件层复位
** input parameters: None
** output parameters: None
** Returned value: None
**
*********************************************************************************************************/
void massResetSoft (void)
{
OS_ENTER_CRITICAL();
__GcBOTFsmState = __USBFSM4BOT_IDLE;
__GdwBOTXferResidue = 0;
__GbCurLun = 0;
__GucDevMsExitOpera = 0;
OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** Function name: usbFunBusRestDeal
**
** Descriptions: 供USB底层驱动在总线复位时调用
** input parameters: None
** output parameters: None
** Returned value: None
**
*********************************************************************************************************/
void usbFunBusRestDeal (void)
{
massResetSoft();
}
/*********************************************************************************************************
Bulk-Only TP-Bulk Hanlder
*********************************************************************************************************/
/*********************************************************************************************************
** Function name: __tpbulkCBWHandler
**
** Descriptions: USB批量传输命令数据包处理
**
** input parameters: 无
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkCBWHandler ( void )
{
__uint16 usErr;
/*
* 如果接收到的数据的长度与CBW长度一致.不要用sizeof(CBW),可能因为对齐而不等于0x1f
*/
usErr = __bulkRead(0x1f, (__uint8 *)&(__GtpbulkCBW));
if (usErr == __BULKEP_RW_ERR){
return;
}
if( usErr == 0x1f ){
if(__tpbulkIsCBWValid()){
__rbcHandler(); /* 有效CBW,命令处理 */
return;
}
}
__tpbulkErrorHandler(__CASECBW, 0); /* 无效CBW,错误处理 */
__tpbulkCSWHandler(); /* 进入批量传输的状态处理阶段 */
}
/*********************************************************************************************************
** Function name: __tpbulkErrorHandler
**
** Descriptions: USB批量传输的错误检查和处理
**
** input parameters: ucHostDevCase 主机/设备数据传输的13种情况及4种错误类型
** dwByteCounterDevWillXfer 将要传输的字节数
** output parameters: 无
** Returned value: 无
**
*********************************************************************************************************/
void __tpbulkErrorHandler (__uint8 ucHostDevCase, __uint32 dwByteCounterDevWillXfer)
{
/*
* 设置设备未处理的数据量
*/
__GtpbulkCSW.dwCSWDataResidue = __GtpbulkCBW.dwCBWDataXferLen - dwByteCounterDevWillXfer;
/*
* Hn--主机不请求数据传输;
* Hi--主机请求从设备接收数据;
* Ho--主机请求向设备发送数据;
*
* Dn--设备要求不进行数据传输;
* Di--设备要求发送数据到主机;
* Do--设备要求从主机接收数据;
* CSW_GOOD 命令通过
* CSW_FAIL 命令失败
* CSW_PHASE_ERROR 命令有误
*/
__GbitBOTStallAtBulkIn = 0;
__GbitBOTStallAtBulkOut = 0;
switch(ucHostDevCase){
case __CASEOK:
case __CASE1: /* Hn=Dn */
case __CASE6: /* Hi=Di */
__GtpbulkCSW.bCSWStatus = __CSW_GOOD;
break;
case __CASE12: /* Ho=Do */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -