📄 usb_intr.c
字号:
#include "HA_typedef.h"
#include "hardware.h"
#include "hardware_reg.h"
/*USB中断响应程序*/
void ENT_INT_USB(void)
{
//ent_int();
mask_irq(INT_USB);
HA_GFDUSB_INTHANDLE();
unmask_irq(INT_USB);
//ret_int();
}
ER HA_GFDUSB_INTHANDLE(void) //USB 中断处理程序
{
ER Epstat;
U32 evnt,intr,imask;
int i;
intr = usb_lock_readreg(USB_INTR);
imask = usb_read_reg(USB_INTRMASK);
Epstat = usb_lock_readreg(USB_EPINFO);
if(((Epstat &= 0x1f)== 0) || ((Epstat &= 0x1f)== 1))
{
MSDevice.dUSBStat.epstate = EPCL;
while(1)
{
/* 读中断寄存器*/
evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR|RESET) & (~imask);
/* 判断是否有中断 */
if (evnt==0)
{
return 0;
}
if(evnt & RESET)
{
usb_write_reg((U32)USB_EP0OUTSTAT, 0x02);
usb_write_reg((U32)USB_EP1OUTSTAT, 0x02);
usb_write_reg((U32)USB_EP2INSTAT, 0x02);
usb_write_reg((U32)USB_INTR, 0x0);
usb_write_reg((U32)USB_INTRMASK, 0x172);
usb_RMW_clrreg(USB_INTR,0x7ffffdff);
}
if(evnt & out)
{
OUTINTR();
usb_RMW_clrreg(USB_INTR,0x7ffffffb);
}
if( evnt & setup)
{
usb_irq_setup();
usb_RMW_clrreg(USB_INTR,0x7ffffffe);
}
if(evnt & ping)
{
usb_RMW_clrreg(USB_INTR,0x7ffffff7);
while(1);
}
if(evnt & traerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffffef);
while(1);
}
if (evnt & stcov)
{
usb_write_reg(USB_PKTPASSEDCTRL,0x00);
usb_write_reg(USB_PKTDROPPEDCTRL,0x00);
usb_write_reg(USB_CRCERRCTRL,0x00);
usb_write_reg(USB_BITSTUFFERRCTRL,0x00);
usb_write_reg(USB_PIDERRCTRL,0x00);
usb_write_reg(USB_FRAMINGERrCTRL,0x00);
usb_write_reg(USB_TXPKTCTRL,0x00);
usb_RMW_clrreg(USB_INTR,0x7fffffbf);
}
if(evnt & ctraerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffff7f);
}
intr = usb_lock_readreg(USB_INTR);
imask = usb_read_reg(USB_INTRMASK);
}
}
else
{
evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR|RESET) & (~imask);
if(evnt & OUT)
{
OUTINTR();
usb_RMW_clrreg(USB_INTR,0x7ffffffb);
}
}
if(evnt & RESET)
{
usb_RMW_clrreg(USB_INTR,0x7ffffdff);
}
if (evnt & stcov)
{
usb_write_reg(USB_PKTPASSEDCTRL,0x00);
usb_write_reg(USB_PKTDROPPEDCTRL,0x00);
usb_write_reg(USB_CRCERRCTRL,0x00);
usb_write_reg(USB_BITSTUFFERRCTRL,0x00);
usb_write_reg(USB_PIDERRCTRL,0x00);
usb_write_reg(USB_FRAMINGERrCTRL,0x00);
usb_write_reg(USB_TXPKTCTRL,0x00);
usb_RMW_clrreg(USB_INTR,0x7fffffbf);
while(1);
}
if(evnt & traerr)
{
usb_RMW_clrreg(USB_INTR,0x7fffffef);
while(1);
}
}
U8 *get_irq_request_cmd(void)
{
static U8 command[8];
command[0] = usb_chang_reg32_to_reg8(USB_EP0OUTBMREQTYPE);
command[1] = usb_chang_reg32_to_reg8(USB_EP0OUTBREQUEST);
command[2] = usb_chang_reg32_to_reg8(USB_EP0OUTWVALUE);
command[3] = usb_get_regbit15_to_8(USB_EP0OUTWVALUE);
command[4] = usb_chang_reg32_to_reg8(USB_EP0OUTWINDEX);
command[5] = usb_get_regbit15_to_8(USB_EP0OUTWINDEX);
command[6] = usb_chang_reg32_to_reg8(USB_EP0OUTWLENGTH);
command[7] = usb_get_regbit15_to_8(USB_EP0OUTWLENGTH);
return command;
}
void usb_irq_setup(void)
{
U8* command_request;
command_request = get_irq_request_cmd();
pdc_bus_ctrl_pipe_notificaion(PDC_SETUP_COMMAND, command_request);
if(MSDevice.dUSBStat.setconstate == SETCONFIG)
{
MSDevice.dUSBStat.setconstate = NSETCONFIG;
}
else
{
transcl((unsigned char *)MSDevice.dUSBTrans.head_temp);
}
return;
}
/*响应主机的OUT 请求*/
ER OUTINTR(void)
{
U32 t1,t2;
int ti,j;
ER stat;
volatile U32 i;
stat = usb_lock_readreg(USB_EPINFO);
if((stat &= 0x1f) != 0x0)
{
/*BLKCMD 阶段*/
if(MSDevice.dBulkStat.blkstate == BLKCMD)
{
usb_write_reg((U32)USB_INTRMASK, 0x176);
t2 = *(RP)(USB_RECEIVETYPE) & 0x4;
while((t2 == 0x0))
{
t2 = *(RP)(USB_RECEIVETYPE) & 0X4;
}
if(t2 == 0x4)
{
/*CBW 阶段*/
MSDevice.dUSBStat.usbdmapp = APP;
USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)MSDevice.dCBW.RX,0x32,0x32,0x16,CHAN,0x10);
i = *(volatile U32 *)DMACCConfiguration;
while((i & 0x1) != 0)
{
i = *(volatile U32 *)DMACCConfiguration;
}
}
}
}
else
{
*(RP)USB_RECEIVETYPE &= 0x07;
}
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -