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