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