?? usbisr.c
字號:
/************************************************************************
*File : Usbisr.c *
*By : hugang, hgx2000@mail.china.com *
************************************************************************/
#include "armusb.h"
#include "..\inc\44blib.h"
#include <string.h>
/**************************************************************************
*Public static data
**************************************************************************/
extern ARMUSBFLAGS bUSBFlags;
/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;
/* ISR static vars */
extern unsigned char Ep1Buf[EP1_PACKET_SIZE];
extern unsigned char Ep2Buf[EP2_PACKET_SIZE];
extern unsigned char Ep1Len, Ep2Len;
/************************************************************************************************
*USB中斷服務程序 *
*區分中斷源,并執行相應的程序 *
************************************************************************************************/
void fn_usb_isr()
{
unsigned int i_st;
bUSBFlags.bits.bIn_ISR = 1;
i_st = UsbReadInterruptRegister();
if(i_st != 0) {
DEBUGF(USB_ISR_DEBUG,("isr = %x\n", i_st));
if(i_st & USB_D12_INT_BUSRESET) {
bus_reset();
bUSBFlags.bits.bBus_Reset = 1;
}
else {
if(i_st & USB_D12_INT_EOT) dma_eot();
if(i_st & USB_D12_INT_SUSPENDCHANGE) bUSBFlags.bits.bSuspend = 1;
if(i_st & USB_D12_INT_ENDP0IN) ep0_txdone();
if(i_st & USB_D12_INT_ENDP0OUT) ep0_rxdone();
if(i_st & USB_D12_INT_ENDP1IN) ep1_txdone();
if(i_st & USB_D12_INT_ENDP1OUT) ep1_rxdone();
if(i_st & USB_D12_INT_ENDP2IN) main_txdone();
if(i_st & USB_D12_INT_ENDP2OUT) main_rxdone();
}
}
bUSBFlags.bits.bIn_ISR = 0;
}
void bus_reset(void)
{
}
/************************************************************************************************
*端點0接收中斷處理程序 *
*提取setup包 *
*接收主機發往設備的數據 *
*程序首先判斷是否為setup包,如果是則讀取設備請求,并進一步判斷設備請求的方向, *
*和設備請求是否帶有數據,及數據的長度 *
************************************************************************************************/
void ep0_rxdone(void)
{
unsigned char ep_last;
unsigned char i;
ep_last = UsbReadLastTransactionStatus(0); // 清端點0中斷標志
DEBUGF(USB_EP0_DEBUG,("LastEP0RxStatus = %x\n",ep_last));
if (ep_last & USB_D12_SETUPPACKET)
{ // 判斷是否為setup包
ControlData.wLength = 0;
ControlData.wCount = 0;
if( UsbReadEndpoint(0, (unsigned char *)(&(ControlData.DeviceRequest)),
sizeof(ControlData.DeviceRequest)) != sizeof(DEVICE_REQUEST) )
{ // setup包出錯,返回
UsbSetEndpointStatus(0, 1);
UsbSetEndpointStatus(1, 1);
bUSBFlags.bits.bControl_State = USB_IDLE;
return;
}
UsbAcknowledgeEndpoint(0); // 端點應答,釋放端點
UsbAcknowledgeEndpoint(1);
ControlData.wLength = ControlData.DeviceRequest.wLength; // 設備請求的數據長度
ControlData.wCount = 0;
if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
{ // 設備->主機
bUSBFlags.bits.bSetup_Packet = 1;
bUSBFlags.bits.bControl_State = USB_TRANSMIT; // 設置為發送狀態
}
else
{ // 主機->設備
if (ControlData.DeviceRequest.wLength == 0)
{ // 無數據的設備請求
bUSBFlags.bits.bSetup_Packet = 1;
bUSBFlags.bits.bControl_State = USB_IDLE;
}
else
{ // 有數據的設備請求
if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
{ // 設備請求出錯
bUSBFlags.bits.bControl_State = USB_IDLE;
UsbSetEndpointStatus(0, 1);
UsbSetEndpointStatus(1, 1);
}
else
{
bUSBFlags.bits.bControl_State = USB_RECEIVE; // 設置為接收狀態
}
}
}
}
else if (bUSBFlags.bits.bControl_State == USB_RECEIVE)
{ // 處于接收狀態
i = UsbReadEndpoint(0, ControlData.dataBuffer + ControlData.wCount,EP0_PACKET_SIZE);
ControlData.wCount += i; // 數據計數指針增加
if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
{ // 設備請求的數據接收完畢
bUSBFlags.bits.bSetup_Packet = 1;
bUSBFlags.bits.bControl_State = USB_IDLE;
}
}
else
{
bUSBFlags.bits.bControl_State = USB_IDLE;
}
}
/************************************************************************************************
*端點0發送中斷處理程序 *
*將設備請求所需數據發給主機 *
************************************************************************************************/
void ep0_txdone(void)
{
unsigned char ep_last;
short i = ControlData.wLength - ControlData.wCount; // 計算剩下的數據的長度
ep_last = UsbReadLastTransactionStatus(1); // 清端點0中斷標志
DEBUGF(USB_EP0_DEBUG,("LastEP0TxStatus = %x\n",ep_last));
if (bUSBFlags.bits.bControl_State != USB_TRANSMIT) return; // 非發送狀態,返回
if( i >= EP0_PACKET_SIZE)
{ // 剩下數據大于16B,先發送前16B
UsbWriteEndpoint(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
ControlData.wCount += EP0_PACKET_SIZE;
bUSBFlags.bits.bControl_State = USB_TRANSMIT;
}
else if( i != 0)
{ // 發送剩下的數據
UsbWriteEndpoint(1, ControlData.pData + ControlData.wCount, i);
ControlData.wCount += i;
bUSBFlags.bits.bControl_State = USB_IDLE;
}
else if (i == 0){
UsbWriteEndpoint(1, 0, 0); // 發送零數據包
bUSBFlags.bits.bControl_State = USB_IDLE; // 發送結束
}
}
void dma_eot(void)
{
if(bUSBFlags.bits.bDMA_State == DMA_PENDING)
bUSBFlags.bits.bSetup_DMA = 1;
else
bUSBFlags.bits.bDMA_State = DMA_IDLE;
}
/************************************************************************************************
*端點1接收中斷處理程序 *
* *
************************************************************************************************/
void ep1_rxdone(void)
{
unsigned char ep_last;
static unsigned char i;
DEBUGF(USB_EP1_DEBUG, ("\nep1_rxdone %d\n",i));
i++;
ep_last = UsbReadLastTransactionStatus(2); // 清端點1中斷標志
DEBUGF(USB_EP1_DEBUG,("LastEP1RxStation = %x\n",ep_last));
if (ep_last & USB_D12_SUCCESS)
{
memset(Ep1Buf, 0, sizeof(Ep1Buf));
Ep1Len = UsbReadEndpoint(2, Ep1Buf, sizeof(Ep1Buf)); // 讀取數據
}
bUSBFlags.bits.bEP1_RxDone = 1; // 標志接收到數據
}
/************************************************************************************************
*端點1發送中斷處理程序 *
* *
************************************************************************************************/
void ep1_txdone(void)
{
unsigned char ep_last;
DEBUGF(USB_EP1_DEBUG, ("\nep1_txdone\n"));
ep_last = UsbReadLastTransactionStatus(3); // 請端點1中斷標志
DEBUGF(USB_EP1_DEBUG,("LastEP1TxStation = %x\n",ep_last));
}
/************************************************************************************************
*主端點(端點2)接收中斷處理程序 *
* *
************************************************************************************************/
void main_rxdone(void)
{
static unsigned char i;
unsigned char ep_last;
DEBUGF(USB_EP2_DEBUG, ("\nep2_rxdone %d\n",i));
i++;
ep_last = UsbReadLastTransactionStatus(4); /* Clear interrupt flag */
DEBUGF(USB_EP2_DEBUG,("LastEP2RxStation = %x\n",ep_last));
if (ep_last & USB_D12_SUCCESS)
{
memset(Ep2Buf, 0, sizeof(Ep2Buf));
Ep2Len = UsbReadEndpoint(4, Ep2Buf, sizeof(Ep2Buf)); // 讀取數據
}
bUSBFlags.bits.bEP2_RxDone = 1; // 標志接收到數據
}
/************************************************************************************************
*主端點(端點2)發送中斷處理程序 *
* *
************************************************************************************************/
void main_txdone(void)
{
unsigned char ep_last;
DEBUGF(USB_EP2_DEBUG, ("\nep2_txdone\n"));
ep_last = UsbReadLastTransactionStatus(5); /* Clear interrupt flag */
DEBUGF(USB_EP2_DEBUG,("LastEP2TxStation = %x\n",ep_last));
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -