www.pudn.com > Isr_wince.rar > Isr.c
#include#include #include /* special function register declarations */ #include "epphal.h" #include "d12ci.h" #include "mainloop.h" #include "usb100.h" extern void bus_reset(void); extern void ep0_txdone(void); extern void ep0_rxdone(void); extern void ep1_txdone(void); extern void ep1_rxdone(void); extern void main_txdone(void); extern void main_rxdone(void); extern void dma_eot(void); /* //************************************************************************* // Public static data //************************************************************************* */ EPPFLAGS bEPPflags; /* Control endpoint TX/RX buffers */ extern CONTROL_XFER ControlData; /* ISR static vars */ unsigned char idata GenEpBuf[EP1_PACKET_SIZE]; unsigned char idata EpBuf[EP2_PACKET_SIZE]; IO_REQUEST idata ioRequest; unsigned char ioSize, ioCount; unsigned long ClockTicks = 0; extern BOOL bNoRAM; //定时器0中断处理 timer_isr() interrupt 1 { DISABLE; ClockTicks++; bEPPflags.bits.timer = 1; ENABLE; } //USB中断处理 usb_isr() interrupt 0 { DISABLE; fn_usb_isr(); ENABLE; } //USB中断服务子程序 void fn_usb_isr() { unsigned int i_st; bEPPflags.bits.in_isr = 1; i_st = D12_ReadInterruptRegister();//读取中断寄存器 if(i_st != 0) { if(i_st & D12_INT_BUSRESET) { bus_reset();//USB总线服务 bEPPflags.bits.bus_reset = 1; } if(i_st & D12_INT_EOT) dma_eot();//DMA传输结束 if(i_st & D12_INT_SUSPENDCHANGE) bEPPflags.bits.suspend = 1;//挂起改变 if(i_st & D12_INT_ENDP0IN) ep0_txdone();//端点0IN中断 if(i_st & D12_INT_ENDP0OUT) ep0_rxdone();//端点0OUT中断 if(i_st & D12_INT_ENDP1IN) ep1_txdone();//端点1IN中断 if(i_st & D12_INT_ENDP1OUT) ep1_rxdone();//端点1OUT中断 if(i_st & D12_INT_ENDP2IN) main_txdone();//端点2IN中断 if(i_st & D12_INT_ENDP2OUT) main_rxdone();//端点2OUT中断 } bEPPflags.bits.in_isr = 0; } //总线复位处理子程序 void bus_reset(void) { } //端点0OUT中断 void ep0_rxdone(void) { unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); //清中断标志 if (ep_last & D12_SETUPPACKET) { //接收到SETUP包 ControlData.wLength = 0; ControlData.wCount = 0; if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) { //SETUP包出错,返回 D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); bEPPflags.bits.control_state = USB_IDLE; return; } ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue); ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex); ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength); //对控制端点的输入/输出进行应答 D12_AcknowledgeEndpoint(0); D12_AcknowledgeEndpoint(1); ControlData.wLength = ControlData.DeviceRequest.wLength; ControlData.wCount = 0; if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) { //从主机传输数据 bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */ } else { if (ControlData.DeviceRequest.wLength == 0) { bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; /* set command */ } else { if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) { //接收数据长度为0 bEPPflags.bits.control_state = USB_IDLE; D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); } else { bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态 } } // set command with data } // else set command } // if setup packet else if (bEPPflags.bits.control_state == USB_RECEIVE) { //接收数据 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE, ControlData.dataBuffer + ControlData.wCount); ControlData.wCount += i; if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) { //数据接收完毕 bEPPflags.bits.setup_packet = 1; bEPPflags.bits.control_state = USB_IDLE; } } else { bEPPflags.bits.control_state = USB_IDLE;//进入等待状态 } } //端点0IN处理 void ep0_txdone(void) { short i = ControlData.wLength - ControlData.wCount; D12_ReadLastTransactionStatus(1); //清中断标志位 if (bEPPflags.bits.control_state != USB_TRANSMIT) return;//非发送状态,返回 if( i >= EP0_PACKET_SIZE) { //剩下数据大于16字节,发送16字节 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount); ControlData.wCount += EP0_PACKET_SIZE; bEPPflags.bits.control_state = USB_TRANSMIT; } else if( i != 0) { //发送剩下数据 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount); ControlData.wCount += i; bEPPflags.bits.control_state = USB_IDLE; } else if (i == 0){ D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节 bEPPflags.bits.control_state = USB_IDLE; } } //DMA结束处理 void dma_eot(void) { } //端点1OUT处理 void ep1_txdone(void) { D12_ReadLastTransactionStatus(3); //清中断标志位 } //端点1IN处理 void ep1_rxdone(void) { unsigned char len; D12_ReadLastTransactionStatus(2); //清中断标志位 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据 if(len != 0) bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据 } //主端点OUT控制 void main_txdone(void) { // unsigned char len,epstatus; D12_ReadLastTransactionStatus(5); //清中断标志位 } //主端点IN控制 void main_rxdone(void) { unsigned char len,epstatus; D12_ReadLastTransactionStatus(4); //清中断标志位 //接收数据 len = D12_ReadEndpoint(4, 64, EpBuf); epstatus=D12_ReadEndpointStatus(4); epstatus &= 0x60; if (epstatus == 0x60) len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据 }