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

📄 gfd_usb_hl.c

📁 这时linux下的usb的代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		}
	}			
	return 0;
}


void pdc_bus_get_descriptor(U8 *command)
{
	U16	 req_len;
	U8 	des_tmp;

	switch( command[3])
	{
		case PDC_DEV_DESC_TYPE:
			 MSDevice.dUSBTrans.head_temp = device_desc;
			 MSDevice.dUSBTrans.desc_len = 0x12;
			 break;
			
		case PDC_CONFIG_DESC_TYPE:
			 MSDevice.dUSBTrans.head_temp = conf_desc;
			 des_tmp = command[6]|(command[7]<<8);
			 MSDevice.dUSBTrans.desc_len = (des_tmp > 0x20)? 0x20 : des_tmp;
			 if(des_tmp > 0x20)
				MSDevice.dCtrlTrans.statempty = EMPTY;		
			 break;
		case PDC_STRING_DESC_TYPE:
			 switch(command[2])
			 {
				case 0:
					MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)unicode_string;
					MSDevice.dUSBTrans.desc_len = sizeof(unicode_string);
					break;
				case 1:
					MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)mfg_string;
					MSDevice.dUSBTrans.desc_len = sizeof(mfg_string);
					break;
				case 2:
					MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)product_string;
					MSDevice.dUSBTrans.desc_len = sizeof(product_string);					
					break;
				case 3:
					MSDevice.dUSBTrans.head_temp = (U32*)(unsigned char *)serial_string;
					MSDevice.dUSBTrans.desc_len = sizeof(serial_string);
					break;
				default:
					break;
			 }
			 break;
		default:
		    break;
	}
	//urb
	if(MSDevice.dUSBTrans.head_temp)
	{
		/*传输所要求的长度的数据 */
		req_len =command[6]|(command[7]<<8);
		if (MSDevice.dUSBTrans.desc_len > req_len )
		{
			MSDevice.dUSBTrans.desc_len = req_len ;    
		}
	}
}

void pdc_bus_SET_CONFIGURATION(void)
{
	return;
}
 
U32 transcl(unsigned char *head)
{
	unsigned char *urb;
	int j, ti;
	U32 t;
		
	ti = MSDevice.dUSBTrans.desc_len;
	urb = head;
	if(ti < 8)
	{
		*(RP)(USB_TXLENGTH) = ti;//SETUP事务的数据包长度每次不超过8个字节--由硬件决定
	}
	else
	{
		*(RP)(USB_TXLENGTH) = 8;
	}
	j=ti/8;
	MSDevice.dUSBTrans.usbmod = ti%8;
	if(MSDevice.dUSBStat.usbstate == USBCG)
	{
		if(MSDevice.dUSBTrans.desc_len <= 8)
		{
			USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
		}
		else
		{
			MSDevice.dUSBTrans.longpk = LONGPKSTATE;
			MSDevice.dUSBTrans.longurb = head + j*64;
			if(MSDevice.dUSBTrans.usbmod ||(MSDevice.dCtrlTrans.statempty == EMPTY))
			{
				MSDevice.dUSBStat.usbdmapp = APP;
			}
			else if (!MSDevice.dUSBTrans.usbmod)
			{
				MSDevice.dUSBTrans.longpk = SHORTPK;
			}
			USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,j*0x10);
		}
	}
	else		//第一个包传输
	{
		MSDevice.dUSBStat.usbstate = USBCG;//标志配置主机
		USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10); 
	}
}
		
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)
			{
		  		MSDevice.dUSBTrans.head_temp = (U32*)NULL;
				MSDevice.dUSBTrans.desc_len = 1;
				MSDevice.dBulkStat.descactu_len = 0;
				MSDevice.dCBW.requlen = 0;
				MSDevice.dUSBTrans.longpk = SHORTPK;
				MSDevice.dCtrlTrans.statempty = NEMPTY;
				MSDevice.dUSBStat.setconstate = NSETCONFIG;
				MSDevice.dBulkStat.blkstate = BLKCMD;
				MSDevice.dUSBTrans.usbmod = 0;   
				MSDevice.dBulkStat.unsinglepocket = UNSINGLE;
				MSDevice.dCSW.sing = UNSI;
				MSDevice.dBulkData.longblk = SHORTBLK;
				MSDevice.dUSBStat.usbdmapp = NAPP;
				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
  {
  	  MSDevice.dUSBStat.epstate = EPBULK;
  	  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);	
  } 
 
}

/*响应主机的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);
}
	

#ifdef OS_LIB_DEBUG
/*USB中断响应程序*/
void ENT_INT_USB(void)
{
	ent_int();
	mask_irq(INT_USB);
	HA_GFDUSB_INTHANDLE();
	unmask_irq(INT_USB);
	ret_int();
}

#endif 

/*ramdisk驱动程序*/

INT usbpc_rd_io(int  driveno, int block, void *buffer, int count,
              INT reading) 
{
#ifdef WORDWRITE
	UINT32       *p;
	UINT32      ltemp;
	UINT16      page_number;
	UINT32      byte_number;
	INT16       i;
	UINT32       *pbuffer;
#else
	UINT8       *p;
	UINT32      ltemp;
	UINT16      page_number;
	UINT16      byte_number;
	INT16       i;
	UINT8       *pbuffer;
#endif

#ifdef WORDWRITE
    // We don't use drive no. You could have multiple drives if wanted 
    driveno = driveno;
    pbuffer = (UINT32 *)buffer;

    while (count)
    {
        // Get the page number
        ltemp = block / RAMDISK_PAGE_SIZE;
        page_number = (UINT16) ltemp;

        // Check. This shouldn't happen 
        if ( (page_number >= NUM_RAMDISK_PAGES) || !rd_pages[page_number] )
            return(NO);

        // Get the offset 
        ltemp = block % RAMDISK_PAGE_SIZE;
        byte_number = (UINT32) (ltemp*128);

        p = (UINT32  *)rd_pages[page_number];
        p += byte_number;

        if (reading&0x01)			// &0x01 for flash flush. 
        {
                 for (i = 0; i < 128; i++)
                *pbuffer++ = *p++;
        }
        else
        {
                 for (i = 0; i < 128; i++)
                *p++ = *pbuffer++;
        }
        count--;
        block++;
    }
	
#else
    // We don't use drive no. You could have multiple drives if wanted 
    driveno = driveno;
    pbuffer = (UINT8 *)buffer;

    while (count)
    {
        // Get the page number 
        ltemp = block / RAMDISK_PAGE_SIZE;
        page_number = (UINT16) ltemp;

        // Check. This shouldn't happen 
        if ( (page_number >= NUM_RAMDISK_PAGES) || !rd_pages[page_number] )
            return(NO);

        // Get the offset 
        ltemp = block % RAMDISK_PAGE_SIZE;
        byte_number = (UINT16) (ltemp*512);

        p = rd_pages[page_number];
        p += byte_number;

        if (reading&0x01)			// &0x01 for flash flush. 
        {
            for (i = 0; i < 512; i++)
                *pbuffer++ = *p++;
        }
        else
        {
            for (i = 0; i < 512; i++)
                *p++ = *pbuffer++;
        }
        count--;
        block++;
    }
#endif
    return(YES);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -