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

📄 gfd_usb_hl.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
unsigned char Ucode_15[]= {
	0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x02, 0x00, 0x1c, 0x0a, 0x80, 0x04,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
	
unsigned char Ucode_1A[]= {
	0x0b, 0x00, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x05,
	0x00, 0x00, 0x00, 0x00};
/*-------------------------------------------------------------------*
 *	define declarations
 *-------------------------------------------------------------------*/


/*-------------------------------------------------------------------*
 *				extern variable declerations
 *-------------------------------------------------------------------*/	
 extern UINT8  *rd_pages[NUM_RAMDISK_PAGES];
 extern UINT8	g_nor_buf[256*1024];
 extern int g_nor_blknum;
/*-------------------------------------------------------------------*
 *				extern	function	decleratios			
 *-------------------------------------------------------------------*/
extern  ER usb_write_reg(U32 reg, U32 val);
extern  ER usb_read_reg(U32 reg); 
extern  U8 usb_chang_reg32_to_reg8(U32 reg);
extern  U16 usb_change_reg32_to_reg16(U32 reg);
extern  U8 usb_get_regbit15_to_8(U32 reg);
extern  ER USB_DMA_TRANS_RX(U32 srcadd, U32 destadd, U32 srcwidth, U32 destwidth, U32 srcsize, U32 channelnum, U32 transnum);
extern  ER USB_DMA_TRANS_TX(U32 srcadd, U32 destadd, U32 srcwidth, U32 destwidth, U32 srcsize, U32 channelnum, U32 transnum);
extern  ER usb_lock_readreg(U32 reg);
extern  ER usb_RMW_reg(U32 reg, U32 val);
extern  ER usb_RMW_clrreg(U32 reg, U32 val); 
extern  INT nor_rd_io(UINT16 driveno, UINT32 page, VOID FAR *buffer, UINT16 count, INT do_read);
/*-------------------------------------------------------------------*
 * 				local	function	definitions
 *-------------------------------------------------------------------*/
 
/*
 *bulk transmit: command block wrapper
 */
U32 usb_bulk(void)
{
	U8 k;
	
	for(k=0; k<31; k++)
		cbw[k] = RX[k];
	if(blt <120)
	{
		for(k=0;k<31;k++)
		{
			analys[blt][k] = RX[k];
		}

		blt++;
	}
#if 0
	blt--;
	if(analys[blt][19]  == 0x02)
	{
		while(1);
	}
	blt++;
#endif
	if(cbw[0] != 0x55)
		return -1;
	if(cbw[1] != 0x53)
		return -1;
	if(cbw[2] != 0x42)
		return -1;
	if(cbw[3] == 0x43)
		usb_bulk_cbw();
	return 0;
}

U32 usb_bulk_cbw(void)
{
	U32 cbwtag;
	U8 cbw_len;			//the valid length of the cbw in bytes
	U8 ti;

	cbwtag = ((cbw[7]<<24)|(cbw[6]<<16)|(cbw[5]<<8)|(cbw[4]));
	cbw_dtl = ((cbw[11]<<24)|(cbw[10]<<16)|(cbw[9]<<8)|(cbw[8]));
	cbw_direct = cbw[12];
	cbw_len = cbw[14];
	for(ti=0; ti<12; ti++)
		ufi_cmd[ti] = 0;
	for(ti=0; ti<cbw_len; ti++)
		ufi_cmd[ti] = cbw[15+ti];
	bulk_commmand();
	return cbwtag;	
} 

/*
 * UFI COMMAND FUNCTION
 */
void bulk_commmand(void)
{
	U8 command;
	U16 translen;

	command  = ufi_cmd[0];
       /*if((ufi_cmd[0] == 0x28) && (ufi_cmd[4] ==0x40) )
	{
		while(1);
	}*/

	lblkaddr = (((U32)ufi_cmd[2]) << 24) | (((U32)ufi_cmd[3]) << 16) | (((U32)ufi_cmd[4]) << 8) | ((U32)ufi_cmd[5]);
	translen = (((U16)ufi_cmd[7]) << 8) | ((U16)ufi_cmd[8]); 

	switch(command)
	{
		case 	INQUIRY:
			desc_len = 0x24;//sizeof (UInquiry);modified
			head_temp = UInquiry;
			descactu_len = 0x24;//sizeof (UInquiry);
			requlen = cbw_dtl;
			blktrasstate = BULKIN;
			break;
		case 	READ:
			blktrasstate = BULKIN;
			temblklen = translen;
			if(temblklen > LENGH)
			{
				longblk = LONGBLK;
				blktmp = LENGH;
				desc_len = LENGH*512;
			}
			else
			{
				longblk = SHORTBLK;
				blktmp = temblklen;
				desc_len = temblklen*512;
			}
			/*read from flush*/
			/*
			if(lblkaddr==0x8)
			{
				while(1);
			}
			*/
#ifdef USBNORFLASH
			dev_io_proc(1, (UINT32)lblkaddr, bulkindatebuf, (UINT16)blktmp, 1);
#endif
#ifdef USBRAMDISK
			usbpc_rd_io(0,(UINT32)lblkaddr, bulkindatebuf,(UINT32)blktmp,1);
#endif
#ifdef USBMMC
	 		mmc_io(2,(UINT32)lblkaddr, bulkindatebuf, (UINT32)blktmp,1);
#endif
			/*invert order*/
			//usbswap_data(bulkindatebuf,blktmp);
			head_temp = bulkindatebuf;
		
			descactu_len = translen*512;//sizeof (URead20);
			requlen = translen*512;//sizeof (URead20);
			break;
		case 	READ_CAPACITY:
			blktrasstate = BULKIN;
			desc_len = 0x8;//sizeof (URead_capacity);
			head_temp = URead_capacity;
			descactu_len = 0x8;//sizeof (URead_capacity);
			requlen = cbw_dtl;
			break;
		case 	READ_FORMAT_CAPACITY:
			blktrasstate = BULKIN;
			desc_len = 0x14;//sizeof (URead_format_capacity);
			head_temp = URead_format_capacity;
			descactu_len = 0x14;//sizeof (URead_format_capacity);
			requlen = cbw_dtl;
			break;
		case 	REQUEST_SENSE:
			blktrasstate = BULKIN;
			desc_len = 0x12;//sizeof (URequest_sense);
			head_temp = URequest_sense;
			descactu_len = 0x12;//sizeof (URequest_sense);
 			requlen = cbw_dtl;
			break;
		case 	CODE_1A:
			blktrasstate = BULKIN;
			desc_len = sizeof (Ucode_1A);
  			head_temp = (U32 *)Ucode_1A;
  			descactu_len = sizeof (Ucode_1A);
			requlen = cbw_dtl;
			break;
		case 	CODE_15:
			blktrasstate = BULKIN;
			desc_len = sizeof (Ucode_15);
			head_temp = (U32 *)Ucode_15;
			descactu_len = sizeof (Ucode_15);
			requlen = cbw_dtl;
			break;
		case 	WRITE2:
			blktrasstate = BULKOUT;
			//if(lblkaddr == 0)
			//{
			//	while(1);
			//}
			temblklen = translen;                      
			if(temblklen > LENGH)                          
			{                                          
				longblk = LONGBLK;                     
				blktmp = LENGH;                            
				desc_len = LENGH*512;                      
			}                                          
			else                                       
			{  
				longblk = SHORTBLK;                                        
				blktmp = temblklen;                    
				desc_len = temblklen*512;              
			}                                          
			head_temp = bulkindatebuf;
			descactu_len = translen*512;//sizeof (URead20);
			requlen = translen*512;//sizeof (URead20);
			break;
		case 	TESTUNITREADY :
			unsinglepocket = SINGLE;
			break;
		case	PREVENT :
			unsinglepocket = SINGLE;	
			sing = SI;
			break;
	}	    
}           
            
void usb_bulk_csw(void)
{
	U32 residue;

	csw[0] = 0x53425355;
	csw[1] = usb_bulk_cbw();
	residue = requlen - descactu_len;
    csw[2] = residue;
      if(sing == UNSI)
    {
    	csw[4] = 0x00;
   	}
   	else
   	{
   		timen++;
   		sing = UNSI;
   		csw[4] = 0x01;
   	}
	tlengh = 13;
	head_temp = csw;
}

/*DATA TRANSFER*/
U32 transbulk(unsigned char *head)
{
	unsigned char *urb;
	int j, ti,j1;
	U32 P2;
	volatile U32 i;
	U32 stat,temp = 0;
	U32 t;
	
	if(blktrasstate == BULKIN)
	{
		/*in transfer*/
		ti = desc_len;
		urb = head;
		if(ti < 64)
		{
			*(RP)(USB_TXLENGTH) = ti;//the pocket, less than 8 bytes
		}
		else
		{
			*(RP)(USB_TXLENGTH) = 64;
		}
		j = ti/64;
		usbmod = ti%64;
		if(desc_len < 64)
		{
			//USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,0x10);
			USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,0x10);
		}
		else
		{
			longpk = LONGPKSTATE;
			//usbdmapp = APP;
			lstate=1;
			//USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,0x0,j*0x10);
			USB_DMA_TRANS_TX((U32)urb,(U32)USB_TXFIFO,0x32,0x32,0x16,CHAN,j*0x10);
			longurb = head + j*64;
		}
		i = *(volatile U32 *)DMACCConfiguration;
		while((i & 0x1) != 0)
		{
			i = *(volatile U32 *)DMACCConfiguration;
		}
	}
	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);
			USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,CHAN,0x10);
		}
		else
		{
			longpk = LONGPKSTATE;
			//USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,0x0,j*0x10);
			USB_DMA_TRANS_RX((U32)USB_RXFIFO,(U32)urb,0x32,0x32,0x16,CHAN,j*0x10);
			longurb = head + j*64;
		}
		//for(i=0;i<10000;i++);

		i = *(volatile U32 *)DMACCConfiguration;
		while((i & 0x1) != 0)
		{
			i = *(volatile U32 *)DMACCConfiguration;
		}
#ifdef USBNORFLASH
		dev_io_proc(1,(UINT32)lblkaddr, bulkindatebuf,(UINT16)blktmp,0);
#endif 
#ifdef USBRAMDISK
		usbpc_rd_io(0,(UINT32)lblkaddr, bulkindatebuf,(UINT32)blktmp,0);
#endif
#ifdef USBMMC
		//if(lblkaddr == 0)
		//{
		//	while(1);
		//}
		mmc_io(0, (UINT32)lblkaddr, bulkindatebuf, (UINT32)blktmp,0);
#endif
	}
}

/*
 * 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((unsigned char *)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 = (unsigned char *)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 = device_desc;
			 root = (unsigned char *)device_desc;
			 desc_len = 0x12;//sizeof(device_desc);
			 break;
			
		case PDC_CONFIG_DESC_TYPE:
			 head_temp = conf_desc;
			 root = (unsigned char *)conf_desc;
			 des_tmp = command[6]|(command[7]<<8);

⌨️ 快捷键说明

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