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

📄 gfd_dma_usbhl.c

📁 东芯IVSEP3203F50移动终端应用处理器usb驱动程序
💻 C
字号:
/**************************************************************************************
 *
 *  (c) 2004 ASIC,all rights reserved
 *         
 *           
 *	This source code and any compilation or derivative thereof 
 *is proprietary information and is confidential in nature.
 *	Under no circumstance is this software to be exposed or placed
 *under an open source License of any type without expressed
 *written permission of ASIC.  
 *
 *filename:	usbdma.c          
 *history:
 *
 *    Version         Date            Author            Comments
 *------------------------------------------------------------------------------------    
 *     1.0          2004.9.24           lmq             Initial Creation
 *   	  1.1         2005.3.24		 	xl		      	delelte the global var,use the global struct MSDevice 
 														instead of all global var	
 **************************************************************************************/
#include "HA_TypeDef.h"
#include "gfd_usb_irq.h"
#include "gfd_dmac.h"
#include "hardware_reg.h"
#include "hardware.h"
#include "debug.h"




//***************************************************************************************************************
//E X T E R N     F U N C T I O N      P R O T O T Y P E S
//***************************************************************************************************************
extern ER HA_DMA_TRANS_test(U32 souadress, U32 destadress, U32 datawidth, U32 datalength, U32 tansnum);
extern U32 usb_bulk(void);
extern U32 transbulk(unsigned char *head);
extern U32 usb_bulk_cbw(void);
extern void usb_bulk_csw(void);
extern ER USB_DMA_TRANS_TX(U32 srcadd, U32 destadd, U32 srcwidth, U32 destwidth, U32 srcsize, U32 channelnum, U32 transnum);
extern ER usb_RMW_reg(U32 reg, U32 val);
extern struct USBDevice MSDevice;

//***************************************************************************************************************
// L O C A T I O N      F U N C T I O N 
//***************************************************************************************************************
/* USBDMA  HANDLE */
ER usbdma(void)
{
	U32 t;
	*(RP)DMACIntTCClear |= (0X1 << CHAN);
	*(RP)DMACIntTCClear &= ~(0X1 << CHAN);

	if(MSDevice.dUSBStat.epstate == EPCL)
	{
		t = *(RP)USB_RECEIVETYPE;
		while(!(t & 0x2))
		{
			t = *(RP)USB_RECEIVETYPE;
		}
		MSDevice.dUSBTrans.longpk = SHORTPK;
		if(MSDevice.dCtrlTrans.statempty == EMPTY)
		{
			MSDevice.dUSBStat.usbdmapp = NAPP;
			/*发送一个空包*/
			 usb_RMW_reg(USB_EP0OUTSTAT,0x2a);
			 MSDevice.dCtrlTrans.statempty = NEMPTY;
		}
		else if(MSDevice.dUSBTrans.usbmod)
		{
			*(RP)(USB_TXLENGTH) = MSDevice.dUSBTrans.usbmod;
			MSDevice.dUSBStat.usbdmapp = NAPP;
			USB_DMA_TRANS_TX((U32)MSDevice.dUSBTrans.longurb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
		}
	}
	else if(MSDevice.dUSBStat.epstate == EPBULK)
	{
		switch(MSDevice.dBulkStat.blkstate)
		{
			case BLKCMD :
				/*数据传输--data-in 或者data-out*/
				usb_bulk();
				if(MSDevice.dBulkStat.unsinglepocket == UNSINGLE)//UNSINGLE 标识需要中间数据传输阶段
				{
					transbulk((unsigned char *)MSDevice.dUSBTrans.head_temp);
					if((MSDevice.dBulkData.longblk == SHORTBLK)|| (MSDevice.dUSBTrans.longpk == SHORTPK))
					{
						MSDevice.dBulkStat.blkstate = BLKEND;
					}
					else
					{
						MSDevice.dBulkStat.blkstate = BLKPRO;
					}
				}
				else		//不需要中间数据传输阶段
				{
					MSDevice.dUSBTrans.longpk = SHORTPK;
					usb_bulk_csw();/*填充CSW封包*/
					MSDevice.dBulkStat.unsinglepocket = UNSINGLE;
					t = *(RP)USB_RECEIVETYPE;
					while(!(t & 0x2))
					{
						t = *(RP)USB_RECEIVETYPE;
					}
					*(RP)(USB_TXLENGTH) = 0xd;
					MSDevice.dUSBStat.usbdmapp = NAPP;
	                            USB_DMA_TRANS_TX((U32)MSDevice.dUSBTrans.head_temp,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
					MSDevice.dBulkStat.blkstate = BLKCMD;
					usb_RMW_clrreg(USB_INTR,0x7ffffffb);
					usb_write_reg((U32)USB_INTRMASK, 0x172);
				}
				break;
			case BLKPRO :
				if(MSDevice.dBulkStat.blktrasstate == BULKIN)
				{
					t = *(RP)USB_RECEIVETYPE;
					while(!(t & 0x2))
					{
						t = *(RP)USB_RECEIVETYPE;
					}
					MSDevice.dBulkData.temblklen -= LENGH;
					if(MSDevice.dBulkData.temblklen > LENGH)
					{
						MSDevice.dBulkData.longblk = LONGBLK;
						MSDevice.dBulkData.blktmp = LENGH;
						MSDevice.dUSBTrans.desc_len = LENGH*512;
						MSDevice.dBulkData.lblkaddr += LENGH; 
					}
					else
					{
						MSDevice.dBulkData.longblk = SHORTBLK;
						MSDevice.dBulkData.blktmp = MSDevice.dBulkData.temblklen;
						MSDevice.dUSBTrans.desc_len = MSDevice.dBulkData.temblklen*512;
						MSDevice.dBulkData.lblkaddr += LENGH;
					}

#ifdef 	USBNORFLASH				
					dev_io_proc(1,(UINT32)MSDevice.dBulkData.lblkaddr, MSDevice.dUSBTrans.bulkindatebuf,(UINT16)MSDevice.dBulkData.blktmp,1);
#endif

#ifdef	USBRAMDISK
					usbpc_rd_io(0,(UINT32)MSDevice.dBulkData.lblkaddr,MSDevice.dUSBTrans.bulkindatebuf,(UINT32)MSDevice.dBulkData.blktmp,1);
#endif

#ifdef	USBMMC
					 mmc_io(2, (UINT32)MSDevice.dBulkData.lblkaddr,MSDevice.dUSBTrans.bulkindatebuf,(UINT32)MSDevice.dBulkData.blktmp,1);
#endif

#ifdef	USBNANDFLASH
					 nand_rd_io(3, (UINT32)MSDevice.dBulkData.lblkaddr,MSDevice.dUSBTrans.bulkindatebuf,(UINT32)MSDevice.dBulkData.blktmp,1);
#endif

					MSDevice.dUSBTrans.head_temp = MSDevice.dUSBTrans.bulkindatebuf;
					transbulk((unsigned char *)MSDevice.dUSBTrans.head_temp);
					if(MSDevice.dBulkData.longblk == SHORTBLK)
					{
						MSDevice.dBulkStat.blkstate = BLKEND;
					}
				}
				else if(MSDevice.dBulkStat.blktrasstate == BULKOUT)
				{ 
					MSDevice.dBulkData.temblklen -= LENGH;
					if(MSDevice.dBulkData.temblklen > LENGH)
					{
						MSDevice.dBulkData.longblk = LONGBLK;
						MSDevice.dBulkData.blktmp = LENGH;
						MSDevice.dUSBTrans.desc_len = LENGH*512;
						MSDevice.dBulkData.lblkaddr += LENGH; 
					}
					else
					{
						MSDevice.dBulkData.longblk = SHORTBLK;
						MSDevice.dBulkData.blktmp = MSDevice.dBulkData.temblklen;
						MSDevice.dUSBTrans.desc_len = MSDevice.dBulkData.temblklen*512;
						MSDevice.dBulkData.lblkaddr += LENGH;
						usb_RMW_clrreg(USB_INTR,0x7ffffffb);
						usb_write_reg((U32)USB_INTRMASK, 0x172);
					}
					MSDevice.dUSBTrans.head_temp = MSDevice.dUSBTrans.bulkindatebuf;
					transbulk((unsigned char *)MSDevice.dUSBTrans.head_temp);
				}
				if(MSDevice.dBulkData.longblk == SHORTBLK)
				{
					MSDevice.dBulkStat.blkstate = BLKEND;
				}
				break;
			case BLKEND :
				/*   CSW    */
				MSDevice.dUSBTrans.longpk = SHORTPK;
				usb_RMW_clrreg(USB_INTR,0x7ffffffb);
				usb_write_reg((U32)USB_INTRMASK, 0x172);
				usb_bulk_csw();
				t = *(RP)USB_RECEIVETYPE;
				while(!(t & 0x2))
				{
					t = *(RP)USB_RECEIVETYPE;
				}
				*(RP)(USB_TXLENGTH) = MSDevice.dCSW.tlengh;
				MSDevice.dUSBStat.usbdmapp = NAPP;
				USB_DMA_TRANS_TX((U32)MSDevice.dUSBTrans.head_temp,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
				MSDevice.dBulkStat.blkstate = BLKCMD;
				break;
			default :
				break;
		}
	}
}

⌨️ 快捷键说明

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