⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_intr.c

📁 USB 软件配置的具体工程
💻 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 + -