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

📄 gfd_dma_usbhl.c

📁 最近在國外網站抓到的作業系統 以Arm為基礎去開發的
💻 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
 *     
 **************************************************************************************/
#include "HA_TypeDef.h"
#include "gfd_usb_irq.h"
#include "gfd_dmac.h"
#include "hardware_reg.h"
#include "hardware.h"
#include "itron.h"
#include "pcdisk.h"
//********************
//	Global variable
//********************
//
//extern variable
//
extern U32 usbmod;
extern U32 longpk;
extern U8 *longurb;
extern U32 statempty;
extern U32 epstate;
extern U32 blkstate;
extern 	U32 *head_temp;
extern U32 blktrasstate;
extern U32 tlengh;
extern U32 unsinglepocket;
extern U32 timen;
extern U32 longblk;
extern U32 temblklen;
extern S32 desc_len;
extern U32 lblkaddr;
extern U32 *bulkindatebuf;
extern U16 blktmp;
U32 time = 0;
extern U32 usbdmapp;
U32 timerr=0;
extern U32 lstate;

//***************************************************************************************************************
//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 HA_DMA_TRANS_TX1(U32 srcadd, U32 destadd, U32 srcwidth, U32 destwidth, U32 srcsize, U32 channelnum, U32 transnum);
extern INT nor_rd_io(UINT16 driveno, UINT32 page, VOID FAR *buffer, UINT16 count, INT do_read);
extern void usbswap_data(U32 *src, U16 len);
//***************************************************************************************************************
// L O C A T I O N      F U N C T I O N 
//***************************************************************************************************************
/* USBDMA  HANDLE */
ER usbdma(void)
{
	U32 t;
	int i;
	
	timerr++;
	*(RP)DMACIntTCClear |= 0X1;
	*(RP)DMACIntTCClear &= 0Xfffffffe;
	if(timerr == 8)
	{

		for(i=0;i<90;i++);
	}
	if(epstate == EPCL)
	{
		time = 0;
		timen = 0;
		t = *(RP)USB_RECEIVETYPE;
		while(!(t & 0x2))
		{
			t = *(RP)USB_RECEIVETYPE;
		}
		longpk = SHORTPK;
		if(statempty == EMPTY)
		{
			usbdmapp = NAPP;
			/*EMPTY POCKET*/
			 usb_RMW_reg(USB_EP0OUTSTAT,0x2a);
			 statempty = NEMPTY;
		}
		else if(usbmod)
		{
			*(RP)(USB_TXLENGTH) = usbmod;
			//for(i=0;i<=500;i++);
			usbdmapp = NAPP;
			USB_DMA_TRANS_TX((U32)longurb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
		}
	}
	else if(epstate == EPBULK)
	{
		switch(blkstate)
		{
			case BLKCMD :
				/*transfer data*/
				usb_bulk();
				/*CHANGE INTO BLKIN OR BLKOUT STATE*/
				if(unsinglepocket == UNSINGLE)
				{
					transbulk((unsigned char *)head_temp);
#if 0
					if(lstate ==1)
					{
						while(1);
					}
#endif
					if((longblk == SHORTBLK) || (longpk == SHORTPK))
					{
						blkstate = BLKEND;
					}
					else
					{
						blkstate = BLKPRO;
					}
				}
				else
				{
					/*SINGLE STATE*/
					time++;
					longpk = SHORTPK;
					usb_bulk_csw();
					unsinglepocket = UNSINGLE;
					t = *(RP)USB_RECEIVETYPE;
					while(!(t & 0x2))
					{
						t = *(RP)USB_RECEIVETYPE;
					}
					*(RP)(USB_TXLENGTH) = 0xd;
					usbdmapp = NAPP;
					HA_DMA_TRANS_TX1((U32)head_temp,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
					blkstate = BLKCMD;
					usb_RMW_clrreg(USB_INTR,0x7ffffffb);
					usb_write_reg((U32)USB_INTRMASK, 0x122);
				}
				break;
			case BLKPRO : 
				/*LONG  AND NO FULL POCKET */
				if(blktrasstate == BULKIN)
				{
					t = *(RP)USB_RECEIVETYPE;
					while(!(t & 0x2))
					{
						t = *(RP)USB_RECEIVETYPE;
					}
					temblklen -= 8;
					if(temblklen > 8)
					{
						longblk = LONGBLK;
						blktmp = 8;
						desc_len = 8*512;
						lblkaddr += 8; 
					}
					else
					{
						longblk = SHORTBLK;
						blktmp = temblklen;
						desc_len = temblklen*512;
						lblkaddr += 8;
					}
					/*read from flush*/
#ifdef 	USBNORFLASH				
					dev_io_proc(1,(UINT32)lblkaddr, bulkindatebuf,(UINT16)blktmp,1);
#endif
#ifdef	USBRAMDISK
					usbpc_rd_io(0,(UINT32)lblkaddr, bulkindatebuf,(UINT32)blktmp,1);
#endif				
					/*invert order*/
					//usbswap_data(bulkindatebuf,blktmp);
					head_temp = bulkindatebuf;
					transbulk((unsigned char *)head_temp);
					if(longblk == SHORTBLK)
					{
						blkstate = BLKEND;
					}
				}
				else if(blktrasstate == BULKOUT)
				{ 
					/*OUTPOCKET*/
					temblklen -= 8;
					if(temblklen > 8)
					{
						longblk = LONGBLK;
						blktmp = 8;
						desc_len = 8*512;
						lblkaddr += 8; 
					}
					else
					{
						longblk = SHORTBLK;
						blktmp = temblklen;
						desc_len = temblklen*512;
						lblkaddr += 8;
					}
					head_temp = bulkindatebuf;
					transbulk((unsigned char *)head_temp);
				}
				if(longblk == SHORTBLK)
				{
					blkstate = BLKEND;
				}
				break;
			case BLKEND :
				/*   CSW    */
				usb_RMW_clrreg(USB_INTR,0x7ffffffb);
				usb_write_reg((U32)USB_INTRMASK, 0x122);
				longpk = SHORTPK;
				usb_bulk_csw();
				t = *(RP)USB_RECEIVETYPE;
				while(!(t & 0x2))
				{
					t = *(RP)USB_RECEIVETYPE;
				}
				*(RP)(USB_TXLENGTH) = tlengh;
				usbdmapp = NAPP;
				USB_DMA_TRANS_TX((U32)head_temp,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
				blkstate = BLKCMD;
				break;
			default :
				break;
		}
	}
}

⌨️ 快捷键说明

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