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

📄 drv_usb_main.c

📁 sparc硬件平台上的usb驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
 ** 功能描述: 端点2 OUT(接收)处理处理函数
 ** 输     入: 无
 ** 输     出: 无
 ********************************************************************/
// 端点EP2的接收处理函数(收到OUT包) 数据输出
void ep2_rxdone(void)
{
    D_UINT16 iReadLen;
    D_UINT32 uiResiduePage;

    /*  bulk_state为空闲,表示收到CBW包,处理CBW包  */
    if (bEPPflags.bits.bulk_state == BULK_IDLE)
    {
        Bulk_CBWHandler();
    }
    /*  bulk_state为收到数据,处理Data Out  */
    else if (bEPPflags.bits.bulk_state == BULK_DATA_RECIEVE) 
    {
        uiResiduePage = BLOCKSIZE - 
                            Bulk_Control_w.LogicalBlockAddress % BLOCKSIZE;
        if (Bulk_Control_w.BufCount + EP1_PACKET_SIZE 
                            <= PAGESIZE * Bulk_Control_w.Transfer_Length
            && Bulk_Control_w.BufCount + EP1_PACKET_SIZE
                           <= PAGESIZE * uiResiduePage)
        {
            iReadLen = USB_ReadEndpoint(USB_ENDPOINT_TYPE_BULK, 
                EP1_PACKET_SIZE, DataBuf + Bulk_Control_w.BufCount);
    
            Bulk_Control_w.BufCount += iReadLen;
            
            /*******************************************************************
            将DataBuf缓冲区上的数据写入U盘。
            因为U盘写数据以PAGESIZE*BLOCKSIZE为单位,
            每次写数据都要考虑写入起始地址以及边界问题。
            第一次写入PAGESIZE * Bulk_Control_w.Transfer_Length 和
            PAGESIZE*(BLOCKSIZE-(Bulk_Control_w.LogicalBlockAddress%BLOCKSIZE)))
            两者之间的最小值。
            如果还有剩余的数据,每次以PAGESIZE*BLOCKSIZE写入。
            最后,Bulk_Control_w.Transfer_Length < BLOCKSIZE时,
            将剩余数据PAGESIZE*Bulk_Control_w.Transfer_Length写入。
            每次写入数据都要更新Bulk_Control_w.LogicalBlockAddress 和
            Bulk_Control_w.Transfer_Length 。
            *******************************************************************/
            if (Bulk_Control_w.BufCount == PAGESIZE * uiResiduePage)
            {
                drv_sd_write(Bulk_Control_w.LogicalBlockAddress, 
                    (D_INT32*)DataBuf, (D_UINT8)uiResiduePage);
                Bulk_Control_w.LogicalBlockAddress += uiResiduePage;
                Bulk_Control_w.Transfer_Length -= uiResiduePage;
            }
            else if (Bulk_Control_w.BufCount == 
                        PAGESIZE * Bulk_Control_w.Transfer_Length)
            {
                 drv_sd_write(Bulk_Control_w.LogicalBlockAddress, 
                   (D_INT32*)DataBuf, (D_UINT8)Bulk_Control_w.Transfer_Length);
                 Bulk_Control_w.LogicalBlockAddress += 
                     Bulk_Control_w.Transfer_Length;
                 Bulk_Control_w.Transfer_Length = 0;
            }
            /* 数据写入完毕,置usb状态BULK_IDLE,发送应答CSW */
            if (Bulk_Control_w.Transfer_Length == 0)
            {
                bEPPflags.bits.bulk_state = BULK_IDLE;
                Bulk_CSWHandler();
            }
        }
        /*  U盘从端点读数据每次读的长度都是64,
        缓冲区中收到的数据长度Bulk_Control_w.BufCount不是64的整数倍,
        说明读数据的过程中出现了异常情况*/
        else
        {
            Bulk_ErrorHandler(CSW_FAIL, 
                Bulk_Block.cbw.dCBWDataTransferLength - 
                          PAGESIZE * Bulk_Control_w.Transfer_Length);
            bEPPflags.bits.bulk_state = BULK_IDLE;
            Bulk_CSWHandler();
        }
    }
}



#if 0
void timer_interrupt(void) interrupt 1
{
	DISABLE();
	TL0 = 0XB0;
	TH0 = 0X3C;  
	time_count++;

	if(time_count == 10)
	{
		time_count = 0;
		led_tem = led_tem ^ 1;
		bEPPflags.bits.timer = 1;
	}
	ENABLE();
}
#endif

/***********************************************************************
 ** 函数名称: void Usb_Exception(void)
 ** 功能描述: USB中断服务程序
 *************************************************************************/
/*
void Usb_Exception(void)  
{
	D_UINT8 i_st;

	DISABLE();					        //进入USB中断服务程序时关中断

	bEPPflags.bits.in_isr = 1;
	i_st = USB_ReadInterruptRegister();				//读取PDIUSBUSB中断寄存器值
	if(i_st != 0) {
		if(i_st & SC_TRANS_DONE_BIT)
			trans_done();
				if(i_st & SC_SUSPEND_INT_BIT)
				USB_ClearInterruptRegister(SC_SUSPEND_INT_BIT);				//挂起改变标志置1
				if(i_st & SC_RESUME_INT_BIT)
				USB_ClearInterruptRegister(SC_RESUME_INT_BIT);
				if(i_st & SC_RESET_EVENT_BIT)
				USB_ClearInterruptRegister(SC_RESET_EVENT_BIT);
				if(i_st & SC_SOF_RECEIVED_BIT)
				USB_ClearInterruptRegister(SC_SOF_RECEIVED_BIT);
				if(i_st & SC_NAK_SENT_INT_BIT)
				USB_ClearInterruptRegister(SC_NAK_SENT_INT_BIT);
				if(i_st & USB_INT_BUSRESET)
				bEPPflags.bits.bus_reset = 1;			//USB总线复位标志
				if(i_st & USB_INT_EOT)
				dma_eot();								//DMA传输技术处理
				if(i_st & USB_INT_SUSPENDCHANGE)
				bEPPflags.bits.suspend = 1;				//挂起改变标志置1
				if(i_st & USB_INT_ENDP0IN)
				ep0_txdone();							//控制端点发送数据处理
				if(i_st & USB_INT_ENDP0OUT)
				ep0_rxdone();							//控制端点接收数据处理
				if(i_st & USB_INT_ENDP1IN)
				ep1_txdone();							//端点 1发送数据处理
				if(i_st & USB_INT_ENDP1OUT)
				ep1_rxdone();							//端点 1接收数据处理
				if(i_st & USB_INT_ENDP2IN)
				ep2_txdone();							//端点 2发送数据处理
				if(i_st & USB_INT_ENDP2OUT)
				ep2_rxdone();							//端点 2接收数据处理
				
	}
	bEPPflags.bits.in_isr = 0;

	ENABLE();							//退出USB中断服务程序时开中断
}*/

#if 0
/************************************************************
 ** 函数名称: disconnect_USB() 
 ** 功能描述: 断开USB总线
 ************************************************************/
void disconnect_USB(void)
{
	// Initialize USB configuration
	USB_SetMode(USB_NOLAZYCLOCK, USB_SETTOONE | USB_CLOCK_12M);
}	//SoftConnect 断开


/************************************************************
 ** 函数名称: connect_USB()
 ** 功能描述: 连接USB总线
 ************************************************************/
void connect_USB(void)
{
	// Initialize USB configuration
	USB_SetDMA(0x00);
	USB_SetMode(USB_NOLAZYCLOCK|USB_SOFTCONNECT, USB_SETTOONE | USB_CLOCK_12M);
}	//SoftConnect 连接上,并设置为无LazyClock,模式为非同步模式


/************************************************************
 ** 函数名称: reconnect_USB()
 ** 功能描述: 重新连接USB总线
 ************************************************************/
void reconnect_USB(void)
{
	D_UINT16 clk_cnt;

	disconnect_USB();							   //断开芯片与USB总线连接
	for (clk_cnt = 0;clk_cnt<= 0x9000;clk_cnt++); //延时interrupt 0处理
	connect_USB();								   //连接到USB总线
}


/************************************************************
 ** 函数名称: Get_USB_FirmwareVer()
 ** 功能描述: 重新连接USB总线
 ** 输	 入: 无
 ** 输	 出: 16bit整数,如0x0500表示USB固件软件版本号为5.00
 ************************************************************/
D_UINT16 Get_USB_FirmwareVer(void)
{
	return 0x0100;					//USB固件软件版本号为5.00
}
#endif



/*******************************************************************
 ** 函数名称: usbserve()
 ** 功能描述: USB事件处理函数
 ** 输	 入: 无
 ** 输	 出: 无
 ********************************************************************/
void usbserve(void)
{
	
	   if (bEPPflags.bits.trans_done){		//Setup包处理
	   DISABLE();
	   bEPPflags.bits.trans_done = 0;
	   //control_handler();	
	   trans_done();				//调用请求处理子程序
	   ENABLE();
	   }//if setup_packet

	   if (bEPPflags.bits.bus_reset) {			//USB总线复位处理
	   DISABLE();
	   bEPPflags.bits.bus_reset = 0;
	   ENABLE();
	   usb_busreset();
	   } // if bus reset

	   if (bEPPflags.bits.suspend) {			//USB挂起改变处理
	   DISABLE();
	   bEPPflags.bits.suspend= 0;
	   ENABLE();
	   usb_suspend();
	   } // if suspend change
	   
	//在此添加其它usb事件处理代码
}




⌨️ 快捷键说明

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