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

📄 gfd_usb_hl.c.bak

📁 这时linux下的usb的代码
💻 BAK
📖 第 1 页 / 共 2 页
字号:
		}
	}
	else
	{
		/*out transfer*/
		ti = desc_len;
		urb = head;
		j=ti/64;
		usbmod = ti%64;
		if(desc_len <= 64)
		{
			USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,0x0,0x10);
		}
		else
		{
			longpk = LONGPKSTATE;
			USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,0x0,j*0x10);
			longurb = head + j*64;
		}
	}
}

/*
 * H A _ I N T _ H A N D L E R _ U S B       S E R V I C E
 */       	         
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(setconstate == SETCONFIG)
	{
		setconstate = NSETCONFIG;
	}
	else
	{
		transcl(head_temp);
	}
	return;
}
	
	
U32 pdc_bus_ctrl_pipe_notificaion(unsigned long notif_type, unsigned char *cmd)
{
	U8	RequestType;
	U8	bmRequest ;

	if(notif_type == PDC_SETUP_COMMAND)
	{
		/* SETUP Command from the control pipe */
		RequestType = cmd[0] & 0x60;
		switch(RequestType)
		{
			case STANDARD_REQUEST:
				/* Process USB Standrad request */
   				bmRequest = cmd[1];
				switch (bmRequest)
				{
					case GET_DESCRIPTOR:
						usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
						stat_des = 1;
						pdc_bus_get_descriptor(cmd);
						break;
										
					case SET_CONFIGURATION:
						usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
						stat_conf = 1;
						pdc_bus_SET_CONFIGURATION();
						setconstate = SETCONFIG;
						break;
					default:
						usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
						stat_defa = 1;
						break;
				}
			case CLASS_REQUEST:
	        case VENDOR_REQUEST:
	        		usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
	              	bmRequest = cmd[1];
	              	if(bmRequest == 0xFE)
	              	{
	              		head_temp = empty;
	              		desc_len = 1;
				    }
				    break;
			default:
				 usb_RMW_reg(USB_EP0OUTSTAT,0x0a);
				 stat_defa1 = 1;
				 break;
		}
	}			
	return 0;
}


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

	switch( command[3])
	{
		case PDC_DEV_DESC_TYPE:
			 head_temp = (unsigned char *)device_desc;
			 root = (unsigned char *)device_desc;
			 desc_len = 0x12;//sizeof(device_desc);
			 break;
			
		case PDC_CONFIG_DESC_TYPE:
			 head_temp = (unsigned char *)conf_desc;
			 root = (unsigned char *)conf_desc;
			 des_tmp = command[6]|(command[7]<<8);
			 desc_len = (des_tmp > 0x20)? 0x20 : des_tmp;
			 if(des_tmp > 0x20)
				statempty = EMPTY;		
			 break;
		case PDC_STRING_DESC_TYPE:
			 switch(command[2])
			 {
				case 0:
					head_temp = unicode_string;
					root = unicode_string;
					desc_len = sizeof(unicode_string);
					break;
				case 1:
					head_temp = mfg_string;
					root = mfg_string;
					desc_len = sizeof(mfg_string);
					break;
				case 2:
					head_temp = product_string;
					root = product_string;
					desc_len = sizeof(product_string);					
					break;
				case 3:
					head_temp = serial_string;
					root = serial_string;
					desc_len = sizeof(serial_string);
					break;
				default:
					break;
			 }
			 break;
		default:
		    break;
	}
	//urb
	if(head_temp)
	{
		/* Get max length that remote end wants */
		req_len =command[6]|(command[7]<<8);
		if (desc_len > req_len )
		{
			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 = desc_len;
	urb = head;
	if(ti < 8)
	{
		*(RP)(USB_TXLENGTH) = ti;//the pocket, less than 8 bytes
	}
	else
	{
		*(RP)(USB_TXLENGTH) = 8;
	}
	j=ti/8;
	usbmod = ti%8;
	if(usbstate == USBCG)
	{
		if(desc_len <= 8)
		{
			USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
		}
		else
		{
			longpk = LONGPKSTATE;
			longurb = head + j*64;
			USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,j*0x10);
		}
	}
	else
	{
		/*the first pocket*/
		usbstate = USBCG;//modified
		USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10); 
	}
}
		
ER  HA_GFDUSB_INTHANDLE(void)  //;when there is usb interrupt,the process starts 
{   
    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))
    {
 		epstate = EPCL;  
		while(1)
		{	
			/* Read IRQ status*/
			evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR|RESET) & (~imask);
			/* No irq? */
			if (evnt==0)
			{
				return 0;
			}
			if(evnt & RESET)
			{
				//for(i;i<21;i++);
		  		head_temp = NULL;
				desc_len = 1;
				state1 = 1;
				urb_num = 0;
				stat_des = 0; 
				stat_add = 0;
				stat_conf = 0;
				stat_defa = 0;
				stat_out1 = 0;
				stat_defa1 =0;
				stat_ack = 0;
				stat_in = 0;
				statep1 = 0;
				state_in = 0;
				state3 = 0;
				stateep1 = 0;
				descactu_len = 0;
				requlen = 0;
				//usbstate = USBDEF;     
				bulkstat = BULKOUTSTAT;
				transstat = TRANSBG; 
				bulkinepstat = BULKINDO;
				longpk = SHORTPK;
				statempty = NEMPTY;
				setconstate = NSETCONFIG;
				blkstate = BLKCMD;
				usbmod = 0;   
				unsinglepocket = UNSINGLE;
				sing = UNSI;
				timen = 0;
                
				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_RMW_clrreg(USB_INTR,0x7ffffdff);           
		  	}	
			if(evnt & out)
			{
    			OUTINTR();
	    	 	usb_RMW_clrreg(USB_INTR,0x7ffffffb);
				evnt = usb_lock_readreg(USB_INTR);
			}
       		if( evnt & setup)
       		{     
			    usb_irq_setup();
	     		usb_RMW_clrreg(USB_INTR,0x7ffffffe);
	     		evnt = usb_lock_readreg(USB_INTR);
			}		
    		if(evnt & ping)
    		{
       	   		usb_RMW_clrreg(USB_INTR,0x7ffffff7);
        		evnt = usb_lock_readreg(USB_INTR);
			}
    	 	if(evnt & traerr)
    	 	{
    	 		usb_RMW_clrreg(USB_INTR,0x7fffffef);
    			evnt = usb_lock_readreg(USB_INTR);
    			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);
				evnt = usb_lock_readreg(USB_INTR);
		 	}
			if(evnt & ctraerr)
			{
				usb_RMW_clrreg(USB_INTR,0x7fffff7f);; 
				evnt = usb_lock_readreg(USB_INTR);	
        	}
			intr  =  usb_lock_readreg(USB_INTR);
        	imask =  usb_read_reg(USB_INTRMASK);
  	 	}
  }
  else
  {
  	  epstate = EPBULK;
  	  evnt = intr & (SETUP|IN|OUT|PING|TRAERR|ACK|STCOV|CTRAERR) & (~imask);
 	  if(evnt & OUT)
 	  {
   	  	  OUTINTR();
   	  	  usb_RMW_clrreg(USB_INTR,0x7ffffffb);
   	  }
  }
 
}

/*OUT POCKET HANDLE*/
ER OUTINTR(void)
{
	U32 t,t1,t2,outtime=0;
	int ti,j;
	ER stat;
	
	stat_out1++ ;
	stat = usb_lock_readreg(USB_EPINFO);
	if((stat &= 0x1f) != 0x0)
	{
		/* NON0EDNP HANDLE*/
		state_in = 0;
		statep1 = 1;//endp1 transport
		/*BLK CMD  STATE*/
		if(blkstate == BLKCMD)
		{
			usb_write_reg((U32)USB_INTRMASK, 0x126);
			t2 = *(RP)(USB_RECEIVETYPE) & 0x4;
			while((t2 == 0x0)  && (outtime < 1000))
			{
		  		 t2 = *(RP)(USB_RECEIVETYPE) & 0X4;
			 	outtime++;
			}
			if(outtime < 1000)
			{
				if(t2 == 0x4)
				{
					R = RX;
					/*CBW STATE*/
					USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)R,0x32,0x32,0x16,0x0,0x10);
					R = R + 64;
					t = usb_read_reg(USB_RXLENGTH);
					if(t != 64)
					{
						t = 64 - t;
						R = R - t;
					}
					
				}
			}
		}
	}
	else
	{
	  statep1 = 0;
	  *(RP)USB_RECEIVETYPE &= 0x07;
	}
	return(0);
}
	
void ENT_INT_USB(void)
{
	ent_int();
	mask_irq(INT_USB);
	HA_GFDUSB_INTHANDLE();
	unmask_irq(INT_USB);
	ret_int();
}

#if 0
INT nor_rd_io(UINT16 driveno, UINT32 page, VOID FAR *buffer, UINT16 count, INT do_read)
{
	
	UINT8       *p;
	UINT32      ltemp,tempblknum;
	UINT32      page_number;
	UINT32      byte_number;
	INT16       i;
	UINT8       *pbuffer, *ptempbuffer;
	INT			flag;
	
    /* We don't use drive no. You could have multiple drives if wanted */
    driveno = driveno;
    pbuffer = (UINT8 *)buffer;
    
    flag = do_read;
    flag &= 1;

    while (count)
    {
      	byte_number = 512*(page & 0x1ff);
		tempblknum = (page >> 9);
	
        /* Check. This shouldn't happen */
        //if ( (page_number >= NUM_RAMDISK_PAGES) || !nor_rd_pages[page_number] )
        //    return(NO);
	
        if(tempblknum != g_nor_blknum)	
        {
        	if (flag)
        	{	
        		p = (UINT8 *)(FAT_FLASH_STARTADD + page * 512);
        		drv_flash_read(( unsigned char *)pbuffer, (unsigned int *)p, 512 );
       	 	}
        	else
        	{	
    			drv_flash_write (( unsigned char *) g_nor_buf,( unsigned int *) (g_nor_blknum*512*512 + FAT_FLASH_STARTADD), FLASH_AREA_SIZE );
				drv_flash_read(( unsigned char *)g_nor_buf, (unsigned int *)(tempblknum*512*512 + FAT_FLASH_STARTADD), FLASH_AREA_SIZE);
			
				for (i = 0; i < 512; i++)
					g_nor_buf[byte_number+i] = *pbuffer++;

				g_nor_blknum = 	tempblknum;
			}
		}
		else
		{
			if (flag)
			{
				for (i = 0; i < 512; i++)\
				{
					*pbuffer++ = g_nor_buf[byte_number+i];
				}
			}	
			else
			{
				for (i = 0; i < 512; i++)
				{
					g_nor_buf[byte_number+i] = *pbuffer++;
				}
			}
		}
		count--;
    	page++;
    }
    if(do_read&FLUSH)
		drv_flash_write (( unsigned char *) g_nor_buf,( unsigned int *) (g_nor_blknum*512*512 + FAT_FLASH_STARTADD), FLASH_AREA_SIZE );

    return(YES);

}
#endif

void usbswap_data(U32 *src, U16 len)
{
	char *psrc, *pdst, tmp;
	int i;
	

	psrc = (char *)src;
	
	for(i = 0; i < len*128; i++)
	{
		tmp = *psrc+3;
		*(psrc+3) = *psrc;
		*psrc = tmp;
		tmp = *(psrc+2);
		*(psrc+2) = *(psrc+1);
		*(psrc+1) = tmp;
		src++;
		psrc = (char *)src;
	}
}

⌨️ 快捷键说明

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