📄 externint.c
字号:
//====================================================================================//
// 文件名: ExterInt.asm
// 描 述: 该文件的程序主要用于处理PDIUSBD12中断
// 日 期: 2003/04/03
//====================================================================================//
#include "..\\d12\\D12CI.h"
#include "chap9.h"
#include "..\\spce061\\061reg.h"
#include "..\\usb\\TPBulk.h"
#include "..\\Uart\\Uart.h"
extern unsigned int *BOTXfer_pData; //global variable
extern unsigned int BOTXfer_wResidue;
extern unsigned long int LBA_Write;
extern unsigned long int g_RWaddress; //global read/write address
extern unsigned int *g_pRWaddr; //global Read/Write Addr Point
extern unsigned int g_RWBuf[512];
// New Add Global Value
extern unsigned long int Start_LBA;
extern unsigned long int End_LBA;
extern unsigned long int Current_LBA;
extern unsigned int SectorCount;
extern BIT_STATUS bFlags;
extern unsigned int BOTFSMstate;
extern CONTROL_TRANSFERS ControlData;
extern void F_Ep0_RxDone_Detail(void);
extern void F_Ep0_TxDone_Detail(void);
extern EPPFLAGS bEPPflags;
void F_USB_Isr(void);
void F_Ep0_TxDone(void);
void F_Ep0_RxDone(void);
void F_Ep1_TxDone(void);
void F_Ep1_RxDone(void);
void F_Main_TxDone(void);
void F_Main_RxDone(void);
void F_DMA_Eot(void);
unsigned int i_st;
unsigned int ep_last;
//=====================================================================
// 函数: F_USB_Isr
// 语法: void F_USB_Isr(void)
// 描述: PDIUSBD12中断的各个中断源的处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_USB_Isr(void)
{
do{
bEPPflags.bits.in_isr = 1;
i_st = F_D12_ReadInterruptRegister();
if(i_st != 0)
{
if(i_st & D12_INT_BUSRESET)
{
bEPPflags.bits.bus_reset = 1;
}
if(i_st & D12_INT_EOT)
{
F_DMA_Eot();
}
if(i_st & D12_INT_SUSPENDCHANGE)
{
bEPPflags.bits.suspend = 1;
}
if(i_st & D12_INT_ENDP0IN)
{
F_Ep0_TxDone();
}
if(i_st & D12_INT_ENDP0OUT)
{
F_Ep0_RxDone();
}
if(i_st & D12_INT_ENDP1IN)
{
F_Ep1_TxDone();
}
if(i_st & D12_INT_ENDP1OUT)
{
F_Ep1_RxDone();
}
if(i_st & D12_INT_ENDP2IN)
{
// F_Main_RxDone();
}
if(i_st & D12_INT_ENDP2OUT)
{
F_Main_RxDone();
}
}
bEPPflags.bits.in_isr = 0;
*P_Watchdog_Clear=0x0001;
}
while(!(*P_IOB_Data & 0x08));
}
//=====================================================================
// 函数: F_DMA_Eot
// 语法: void F_DMA_Eot(void)
// 描述: PDIUSBD12的DMA处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_DMA_Eot(void)
{
}
//=====================================================================
// 函数: F_Ep0_RxDone
// 语法: void F_Ep0_RxDone(void)
// 描述: 端点0,接收数据处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_Ep0_RxDone(void)
{
ep_last = F_D12_ReadLastTransactionStatus(0); // Clear interrupt flag
F_Ep0_RxDone_Detail();
}
//=====================================================================
// 函数: F_Ep0_TxDone
// 语法: void F_Ep0_TxDone(void)
// 描述: 端点0,发送数据处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_Ep0_TxDone(void)
{
F_D12_ReadLastTransactionStatus(1);
F_Ep0_TxDone_Detail();
}
//=====================================================================
// 函数: F_Ep1_TxDone
// 语法: void F_Ep1_TxDone(void)
// 描述: 端点1,发送数据处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_Ep1_TxDone(void)
{
bEPPflags.bits.Ep1_SendDataFlag=1;
F_D12_ReadLastTransactionStatus(3); //Clear interrupt flag
}
//=====================================================================
// 函数: F_Ep1_RxDone
// 语法: void F_Ep1_RxDone(void)
// 描述: 端点1,接收数据处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_Ep1_RxDone(void)
{
unsigned int EP2Len,tBuf[16],i;
bEPPflags.bits.Ep1_ReceiveDataFlag=1;
EP2Len=F_D12_ReadEndpoint(2, 16,tBuf);
// F_D12_WriteEndpoint(3,EP2Len,tBuf);//回送数据
F_D12_ReadLastTransactionStatus(2); // Clear interrupt flag
}
//=====================================================================
// 函数: F_Main_TxDone (Device -> Host)
// 语法: void F_Main_TxDone(void)
// 描述: 端点1,发送数据处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_Main_TxDone(void)
{
unsigned int EP2Len;
bEPPflags.bits.Ep2_SendDataFlag=1;
//F_D12_ReadLastTransactionStatus(5); // Clear D12 interrupt flag
/*** Data In Stage ***/
if (BOTFSM_DataIn)//BOTFSM_DataIn = BOTFSMstate^2
{
if(BOTXfer_wResidue>64)
{
EP2Len=F_D12_WriteEndpointAndClrD12Int(5,64,BOTXfer_pData);//回送数据
BOTXfer_pData+=EP2Len;
BOTXfer_wResidue-=EP2Len;
}
else
{
EP2Len=F_D12_WriteEndpointAndClrD12Int(5,BOTXfer_wResidue,BOTXfer_pData);//回送数据
BOTXfer_pData+=EP2Len;
BOTXfer_wResidue-=EP2Len;
if(BOTXfer_wResidue==0)
TPBulk_CSWHandler();
}
}//Data In Stage End
/*** CSW Stage ***/
if(BOTFSM_CSW) //BOTFSM_CSW = BOTFSMstate^5
{
EP2Len=F_D12_WriteEndpointAndClrD12Int(5,13,BOTXfer_pData);//回送数据
BOTXfer_pData += EP2Len;
BOTXfer_wResidue -= EP2Len;
if(BOTXfer_wResidue==0x00)
BOTFSMstate=USBFSM4BOT_IDLE;
}//CSW Stage End */
}
//=====================================================================
// 函数: F_Main_RxDone (Host -> Device)
// 语法: void F_Main_RxDone(void)
// 描述: 端点2,接收数据处理
// 参数: 无
// 返回: 无
//=====================================================================
void F_Main_RxDone(void)
{
unsigned int EP2Len;
//F_D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
/*** CBW ***/
if( BOTFSM_IDLE) //BOTFSM_IDLE = BOTFSMstate^0
{
TPBulk_CBWHandler(); // Goto BOTFSMstate_CBWProc
// F_Single_Transmit(5, 0);
} /* CBW Proc End */
/*** Data Out Stage ***/
while(BOTFSM_DataOut) //BOTFSM_DataOut = BOTFSMstate^3
{
F_InitWriteD12();
F_WriteCmdToD12(0x04); //Select EP BulkOut
F_InitReadD12();
if(!(F_ReadD12() & 0x01)) // if fifo is empty
continue; //continue; */
EP2Len=F_D12_ReadEndpointAndClrD12Int(4, 64,BOTXfer_pData);
BOTXfer_pData += EP2Len;
BOTXfer_wResidue -= EP2Len;
if( (BOTXfer_wResidue%0x200) == 0x00)
{
BOTXfer_pData=g_RWBuf;
if(BOTXfer_atNF)
{//在NandFalsh
NF_PageProgram(0x00,0xffe0 + (Current_LBA & 0x1f), g_RWBuf);
Current_LBA++;
if(--SectorCount !=0)
{//没有到最后的扇区
if((Current_LBA&0x1f)==0)
{//新块
//UartSendData(0x3A);
NF_ResumeBlock(Current_LBA-1);
NF_EraseBackBlock();
if((SectorCount +(Current_LBA & 0x1f)) < 0x20 )
{
NF_BackBlockTail(Current_LBA);
}
}
}
else
{//到了最后的扇区
// UartSendData(0x39);
NF_ResumeBlock(Current_LBA-1);
BOTXfer_wResidue=0;
TPBulk_CSWHandler();
}
}
else if (BOTXfer_wResidue == 0x00)
{//在ROM/RAM
TPBulk_CSWHandler();
}
}
} /* Data Out Stage End */
/*** Data In Stage ***/
while (BOTFSM_DataIn)//BOTFSM_DataIn = BOTFSMstate^2
{
F_InitWriteD12();
F_WriteCmdToD12(0x05); //Select EP BulkOut
F_InitReadD12();
if((F_ReadD12() & 0x01)) // if fifo is full
continue; //continue; */
if(BOTXfer_wResidue>64)
{
EP2Len=F_D12_WriteEndpointAndClrD12Int(5,64,BOTXfer_pData);//回送数据
BOTXfer_pData+=EP2Len;
BOTXfer_wResidue-=EP2Len;
if( ( BOTXfer_wResidue > 0 ) && ( (BOTXfer_wResidue%0x200)==0x00) )
{
NF_PageRead(0x0000,++g_RWaddress, g_RWBuf);
BOTXfer_pData = g_RWBuf;
}
}
else
{
EP2Len=F_D12_WriteEndpointAndClrD12Int(5,BOTXfer_wResidue,BOTXfer_pData);//回送数据
BOTXfer_pData+=EP2Len;
BOTXfer_wResidue-=EP2Len;
if(BOTXfer_wResidue==0)
TPBulk_CSWHandler();
}
} //DataIn Stage End
/*** CSW Stage ***/
if(BOTFSM_CSW) //BOTFSM_CSW = BOTFSMstate^5
{
EP2Len=F_D12_WriteEndpointAndClrD12Int(5,13,BOTXfer_pData);//回送数据
BOTXfer_wResidue=0x00;
BOTFSMstate=USBFSM4BOT_IDLE;
} // CSW PROC END
} /* Main Rx Handler */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -