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

📄 drv_usb_bo.c

📁 sparc硬件平台上的usb驱动
💻 C
字号:

/*************************************************
  Copyright (C), 2008, DTK Computer.
  File name:       BulkOnly.c
  Author:           lihai
  Version:          1.0
  Date:              2008.04.28
  Description:     实现USB驱动Bulk-Only批量传输协议相关函数功能
  Others:           无
  Function List:   
             Bulk_CBWHandler(void):    接收、处理输出端点(EP2)的传输命令
             
             Bulk_CSWHandler():          发送执行状态CSW
             
             Bulk_code_transmit(unsigned char * pRomData,unsigned short len):     批量发送
             
             IsCBWValid():     判断是否CBW数据包
             
             Bulk_ErrorHandler(unsigned char Status,unsigned int wByteCount):     处理状态控制
             
             ChangeEndian(D_UINT8* num): 转换4字节数据字节序

  History:         初稿
*************************************************/
//#include <reg51.h>
#include "drv_usb_bo.h"

/*bulk传输控制数据*/
extern CONTROL_XFER ControlData;
extern EPPFLAGS bEPPflags;
/* cbw & csw - union  数据*/
BULK_STRUCT Bulk_Block;
/* CSW status */
unsigned char CSWStatus = 0;
/*
   extern BULK_CONTROL   Bulk_Control_r;
   extern BULK_CONTROL   Bulk_Control_w;
   extern unsigned char  DataBuf[512*32];
   */
#define Bulk_CBW  Bulk_Block.cbw
#define Bulk_CSW  Bulk_Block.csw
#define CBW_bCBWCBLength Bulk_Block.cbw.dCBWDataTransferLength
#define CSW_dCSWDataResidue Bulk_Block.csw.dCSWDataResidue


/*************************************************
  函数名称:           void Bulk_CBWHandler( void )
  函数功能:           接收、处理输出端点(EP2)的传输命令
  被本函数调用的函数: 
                      USB_ReadEndpoint:读取USB端点数据
                      ChangeEndian:转换4字节数据的字节序
                      IsCBWValid:判断全局变量Bulk_CBW是否正确的CBW
                      RBC_Hander:处理批量传输命令
                      USB_SetEndpointReady:设置USB端点的控制寄存器
                      Bulk_ErrorHandler:CBW处理状态控制
                      Bulk_CSWHandler:发送执行状态CSW
                      USB_Clear_FIFO:将端点数据写入USB
  调用本函数的函数:   
  访问到的全局变量:   Bulk_CBW:CBW数据包
  被修改的全局变量:   Bulk_CBW:CBW数据包
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*************************************************/
void Bulk_CBWHandler( void )
{
    /*读取CBW数据*/
    D_UINT32 iDataLen = USB_ReadEndpoint(2, sizeof(Bulk_CBW), (D_UINT8 *)&Bulk_CBW);
    /*转换Bulk_CBW.dCBWSignature字节序*/
    ChangeEndian((D_UINT8 *)&Bulk_CBW.dCBWSignature);    
	/*转换Bulk_CBW.dCBWDataTransferLength字节序*/
    ChangeEndian((D_UINT8 *)&Bulk_CBW.dCBWDataTransferLength);
    
    /*处理批量传输命令*/
    if(sizeof(CBW) == iDataLen && IsCBWValid()) 
    {
        RBC_Hander();
        USB_SetEndpointReady(2,1);
        return;
    }
    /*批量传输命令数据错误的处理*/
    else
    {
        /*设置应答信息CSW,状态CSW_PHASE_ERROR*/
        Bulk_ErrorHandler(CSW_PHASE_ERROR,0);
        Bulk_CSWHandler();        
        USB_Clear_FIFO(2);
        USB_SetEndpointReady(2,1);
    }
}

/*************************************************
  函数名称:           void Bulk_ CSWHandler ( void )
  函数功能:           发送执行状态CSW
  被本函数调用的函数: 
                      ChangeEndian:转换4字节数据的字节序
                      USB_WriteEndpoint:向端点写入数据
  调用本函数的函数:   
  访问到的全局变量:   
                      bEPPflags :USB事件标志变量
                      Bulk_CBW:CBW数据包
  被修改的全局变量:   
                      bEPPflags :USB事件标志变量
                      Bulk_CBW:CBW数据包
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*************************************************/
void Bulk_CSWHandler( void )
{
    /*转换Bulk_CSW.dCSWDataResidue字节序*/
    ChangeEndian((D_UINT8 *)&Bulk_CSW.dCSWDataResidue);
    /*将CSW写入端点*/
    USB_WriteEndpoint(1, sizeof(CSW), (unsigned char *)&Bulk_CSW);  
    bEPPflags.bits.bulk_state = BULK_IDLE;  
}

/*************************************************
  函数名称:           void Bulk_code_transmit (unsigned char * pRomData,
                                                                          unsigned short len)
  函数功能:           批量发送
  被本函数调用的函数: 
                      Bulk_ErrorHandler:CBW处理状态控制
                      USB_WriteEndpoint:向端点写入数据
  调用本函数的函数:   
  访问到的全局变量:   ControlData:控制传输结构变量
  被修改的全局变量:   ControlData:控制传输结构变量
  输入参数:           pRomData:发送的数据指针
                      Len:发送的数据长度
  输出参数:           无
  函数返回值:         无
  其它:               无
*************************************************/
void Bulk_code_transmit(unsigned char * pRomData,unsigned short len)
{
    ControlData.wCount = 0; 
    ControlData.pData = pRomData;
    ControlData.wLength = len;

    /*如果要发送的数据大于主机要求的数据,只发送主机要求的数据长度*/
    if(ControlData.wLength >= CBW_bCBWCBLength)
    {
        ControlData.wLength = CBW_bCBWCBLength; 
    }

       /*设置CSW应答状态:CSW_GOOD,CSW包在pRomData数据发送完毕后才发送*/
    Bulk_ErrorHandler(CSW_GOOD, ControlData.wLength);

    /*发送pRomData数据*/
    if(ControlData.wLength >= EP1_PACKET_SIZE) 
    {
        USB_WriteEndpoint(1, EP1_PACKET_SIZE, ControlData.pData);
        ControlData.wCount += EP1_PACKET_SIZE;
        bEPPflags.bits.bulk_state = BULK_REQEST_TRANS;    
    }
    else 
    {     
        USB_WriteEndpoint(1, ControlData.wLength, pRomData);
        ControlData.wCount += ControlData.wLength;
        bEPPflags.bits.bulk_state = BULK_DATA_END;
    }
}

/*************************************************
  函数名称:           D_BOOL IsCBWValid(void)
  函数功能:           判断是否CBW数据包
  被本函数调用的函数: 无
  调用本函数的函数:   
  访问到的全局变量:   Bulk_CBW:CBW数据包
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         是:返回true
                             否:返回false
  其它:               无
*************************************************/
D_BOOL IsCBWValid(void)
{
    if((Bulk_CBW.dCBWSignature == CBW_SIGNATURE)
            && (Bulk_CBW.bCBWLUN <= 1)
            && (Bulk_CBW.bCBWCBLength <= MAX_CDBLEN))
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/*************************************************
  函数名称:           void Bulk_ ErrorHandler (unsigned char Status,
                                                                         unsigned int wByteCount)
  函数功能:           处理状态控制
  被本函数调用的函数: 无
  调用本函数的函数:   
  访问到的全局变量:   Bulk_CSW:CSW数据包
  被修改的全局变量:   Bulk_CSW:CSW数据包
  输入参数:           Status:命令执行情况
                                    wByteCount:实际发送的数据长度
  输出参数:           无
  函数返回值:         无
  其它:               无
*************************************************/
void Bulk_ErrorHandler(unsigned char Status,unsigned int wByteCount)
{
    Bulk_CSW.dCSWSignature=CSW_SIGNATURE;
    Bulk_CSW.dCSWDataResidue=Bulk_CBW.dCBWDataTransferLength-wByteCount;
    Bulk_CSW.bCSWStatus=CSWStatus|Status;    
    if (Status)
    {
        CSWStatus = 1;
    }
}

/*************************************************
  函数名称:           void ChangeEndian(D_UINT8* num)
  函数功能:           转换4字节数据字节序
  被本函数调用的函数: 无
  调用本函数的函数:   
  访问到的全局变量:   无
  被修改的全局变量:   无
  输入参数:           无
  输出参数:           无
  函数返回值:         无
  其它:               无
*************************************************/
void ChangeEndian(D_UINT8* num)
{
    D_UINT8 i, temp;
    for(i = 0; i < 2; i++) {
        temp       = *(num+i);
        *(num+i)   = *(num+3-i);
        *(num+3-i) = temp;
    }
}

⌨️ 快捷键说明

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