📄 gfd_dma_usbhl.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 + -