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

📄 drv_usb_main.c

📁 sparc硬件平台上的usb驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************* 
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 + -