📄 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
* 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 + -