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

📄 tpbulk.c

📁 smartARM2400 USB OTG例程
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************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 + -