📄 drv_usb_main.c
字号:
/*************************************************
Copyright (C), 2007, DTK Computer.
File name: drv_usb_irq.c
Author: MMI Group Version: 1.0 Date: 2008.04.30
Description: usb module for usb event handle
Others:
Function List:
History:
<author> <time> <version > <desc>
Bosco Lee 08/30/04 1.0 build this moudle
*************************************************/
#include "drv_usb_main.h"
//D_UINT8 xdata GenEpBuf[EP1_PACKET_SIZE]; //端点1接收缓冲区
//D_UINT8 xdata EpBuf[EP2_PACKET_SIZE]; //端点2接收缓冲区
extern BULK_STRUCT Bulk_Block;
/*
extern BULK_CONTROL xdata Bulk_Control_r;
extern BULK_CONTROL xdata Bulk_Control_w;
extern unsigned char xdata DataBuf[512];
*/
/*********************************************************************
** 函数名称: Init_USB()
** 功能描述: 设置USB与硬件的连接, 初始化USB, 复位USB
** 输 入: 无
** 输 出: 0: 初始化成功 1: 初始化失败
**********************************************************************/
/*void Init_USB(void)
{
Init_MCU(); //初始化PDIUSBUSB与51单片机连接的端口
Rst_USB(); //复位PDIUSBUSB
Init_Interrupt();
USB_SetEndpointReady(0,1);
}*/
/*******************************************************************
** 函数名称: usb_busreset()
** 功能描述: USB总线复位处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
void usb_busreset(void)
{
//init_usb_descriptor ();
frm_printf("init_usb_descriptor");
}
/*******************************************************************
** 函数名称: usb_suspend()
** 功能描述: 总线挂起改变处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
void usb_suspend(void)
{
frm_printf("init_usb_descriptor");
//在此添加总线挂起改变代码
}
void trans_done()
{
D_UINT8 num, ep_last,s;
USB_ClearInterruptRegister(SC_TRANS_DONE_BIT);
//查看时哪个端点引起trans_done的
num = USB_ReadNumRegister();
if (num == 0)
{ // 0端口引起的
s = USB_ReadEndpointStatus(num);// 端点的状态
/* SC_CRC_ERROR_BIT
SC_PID_ERROR_BIT
SC_RX_TIME_OUT_BIT
SC_OVERFLOW_BIT
SC_NAK_SENT_BIT
SC_NYET_SENT_BIT
SC_STALL_SENT_BIT
SC_ACK_RXED_BIT
*/
if (s&SC_NAK_SENT_BIT)
{ //NAK
USB_SetEndpointReady(0, 1);
return;
}
else
{ //NAK以外
//端点最后处理的状态setup,in,out??
ep_last = USB_ReadLastTransactionStatus(num, 0);
//00: SC_SETUP_TRANS
//01: SC_IN_TRANS
//10: SC_OUTDATA_TRANS
if ((ep_last == SC_SETUP_TRANS) || (ep_last == SC_OUTDATA_TRANS))
{ //如果接收到的数据有CRC或者位填充错,那么不返回任何握手。
if ((s&SC_CRC_ERROR_BIT) || (s&SC_PID_ERROR_BIT)
|| (s&SC_STALL_SENT_BIT) || (s&SC_RX_TIME_OUT_BIT)) //错误
{
USB_Clear_FIFO(0);
USB_SetEndpointReady(0,1);
return;
}
else
{
if (ep_last == SC_SETUP_TRANS)
{
ep0_setupdone();
return;
}
else
{// ep_last == SC_OUTDATA_TRANS
ep0_outdone();//收数据或继续收数据
return;
}
}
}
else if(ep_last == SC_IN_TRANS)
{
if ((s&SC_CRC_ERROR_BIT) || (s&SC_STALL_SENT_BIT))
{
USB_Clear_FIFO(0);
USB_SetEndpointReady(0,1);
return;
}
else if(s&SC_RX_TIME_OUT_BIT) //host 端没有响应
{
if (ControlData.wCount>EP0_PACKET_SIZE)//wCount 是什么
ControlData.wCount -= EP0_PACKET_SIZE;
else
ControlData.wCount = 0;
bEPPflags.bits.control_state = USB_TRANSMIT;
ep0_indone();
return;
}
else { // if(s&SC_ACK_RXED_BIT)
ep0_indone();
return;
}
}
}//ACK
}
else if (num == 1) {
ep1_txdone();
return;
}
else if(num == 2) {
ep2_rxdone();
return;
}
return;
}
/*******************************************************************
** 函数名称: ep1_txdone()
** 功能描述: 端点1 IN(发送)处理函数
** 输 入: 无
** 输 出: 无
********************************************************************/
// 端点EP1发送数据的函数(收到IN命令) -- 数据输入
void ep1_txdone(void)
{
D_UINT16 usDataLen;
/* 发送响应主机命令的应答信息 */
if (bEPPflags.bits.bulk_state == BULK_REQEST_TRANS)
{
/* 将需要传输的数据ControlData.pData通过EP1的FIFO发送给主机Host */
usDataLen = ControlData.wLength - ControlData.wCount;
if (usDataLen >= EP1_PACKET_SIZE)
{
USB_WriteEndpoint(USB_ENDPOINT_TYPE_ISOCHRONOUS, EP1_PACKET_SIZE,
ControlData.pData + ControlData.wCount);
ControlData.wCount += EP1_PACKET_SIZE;
bEPPflags.bits.bulk_state = BULK_REQEST_TRANS;
}
else
{
USB_WriteEndpoint(USB_ENDPOINT_TYPE_ISOCHRONOUS, usDataLen,
ControlData.pData + ControlData.wCount);
ControlData.wCount += usDataLen;
bEPPflags.bits.bulk_state = BULK_DATA_END;
}
}
/* 数据发送完毕,发送CSW应答包 */
else if (bEPPflags.bits.bulk_state == BULK_DATA_END)
{
// 将_COMMAND_STATUS_WRAPPER通过EP1的FIFO发送给主机
Bulk_CSWHandler();
}
/* 发送主机要求的数据,Data In */
else if (bEPPflags.bits.bulk_state == BULK_DATA_TRANS)
{
/* 缓冲区中还有数据,发送缓冲区数据 */
if (Bulk_Control_r.BufCount < PAGESIZE - EP1_PACKET_SIZE)
{
Bulk_Control_r.BufCount += EP1_PACKET_SIZE;
USB_WriteEndpoint(USB_ENDPOINT_TYPE_ISOCHRONOUS, EP1_PACKET_SIZE,
DataBuf + Bulk_Control_r.BufCount);
}
/* 缓冲区数据发送完毕,如果还有需要发送的数据,从U盘中读数据至缓冲区 */
else if (Bulk_Control_r.Transfer_Length > 0)
{
/* 将U盘上的数据写入DataBuf缓冲区(一次读取一页)*/
drv_sd_read(Bulk_Control_r.LogicalBlockAddress,
(D_INT32*)DataBuf, 1);
/*每次读U盘后,更新Transfer_Length、LogicalBlockAddress*/
Bulk_Control_r.Transfer_Length--;
Bulk_Control_r.LogicalBlockAddress++;
Bulk_Control_r.BufCount = 0;
bEPPflags.bits.bulk_state = BULK_DATA_TRANS;
USB_WriteEndpoint(USB_ENDPOINT_TYPE_ISOCHRONOUS, EP1_PACKET_SIZE,
DataBuf + Bulk_Control_r.BufCount);
}
/* 数据发送完毕,发送CSW包 */
else
{
Bulk_CSWHandler();
}
}
}
/*******************************************************************
** 函数名称: ep2_rxdone()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -