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

📄 test02.c

📁 ps2 to ubs bridge sourc for 8051e code
💻 C
📖 第 1 页 / 共 5 页
字号:
	if(USB_STA0 & 0x01) { //ep0 rx packet		
		if(USB_STA1 & 0x80) { //setup packet	
			//disable further interrupt
			USB_CTL4 = USB_CTL4 & 0xFE; //clear rxd0ie=0		
			USB_STA0 = USB_STA0 | 0x01; //clear rxd0f
			SETUP_PROC();
			USB_CTL4 = USB_CTL4 | 0x01; //set rxd0ie=1
			return;
		}
		else { // out data packet
			USB_STA0 = USB_STA0 | 0x01; //clear rxd0f
			return;
		}	
	}
	
}



void SETUP_PROC(void)
{
	unsigned char UADDR;
	
	if((USB_STA1 & 0x1F) != 0x08) return;
	else {
		USB_EPP = 0;
		SETUPR0 = USB_EP0;
		SETUPR1 = USB_EP0;
		SETUPR2 = USB_EP0;
		SETUPR3 = USB_EP0;
		SETUPR4 = USB_EP0;
		SETUPR5 = USB_EP0;
		SETUPR6 = USB_EP0;
		SETUPR7 = USB_EP0;
		
	     //b6-b5=(00)=standard, (01)=class
	     if((SETUPR0 & 0x60)==0){
		
		switch (SETUPR1) {
			case SET_ADDRESS: {
				if((SETUPR0 == 0) & (SETUPR6 == 0) & (SETUPR7 == 0)) {
					UADDR = SETUPR2;
					in_status();
					USB_CTL5 = UADDR;	
				}
				else {
					USB_CTL1 = USB_CTL1 | 0x20;  //ostall0=1
					USB_CTL2 = USB_CTL2 | 0x40;  //istall0=1
				}
				break;
			}
			case GET_DESCRIPTOR:    
			 switch(SETUPR3){
				case  DEVICE_DESC:
					//if((SETUPR7==0) & (SETUPR6 < dev_desc_table[0])) len = SETUPR6;
					//else len = dev_desc_table[0];	
					if((SETUPR7==0) & (SETUPR6 < 0x12)) len = SETUPR6;
					else len = 0x12;			
					toggle = 1;
					j=0;
					USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
					while(len){
						if(len > 0x08) len1 = 0x08;
						else len1 = len;
						USB_EPP = 0;	
						for(i=0;i<len1;i++,j++) USB_EP0 = dev_desc_table[j];
						
						if(len1 >= 0x08) {
							if(toggle) USB_CTL1 = 0xd8;
							else USB_CTL1 = 0xc8;						
						}
						else {
							USB_CTL1 = 0x40;
							USB_CTL1 = USB_CTL1 | len1;
							if(toggle) USB_CTL1 = USB_CTL1 | 0xd0;	
							else USB_CTL1 = USB_CTL1 | 0xc0;						
						}
						
						len -= len1;
						
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						toggle = ~toggle;
						
						if((len1==8) & (len==0)) {
							if(toggle) USB_CTL1 = USB_CTL1 | 0xd0;
							else USB_CTL1 = USB_CTL1 | 0xc0;
							while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
							USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
							USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						}							
					}					
  					out_status();
					break;
					
				case CONFIGURATION_DESC: 
                    		
                    			if((SETUPR7==0) & (SETUPR6 < conf_desc_table[2])) len = SETUPR6;
                    			else len = conf_desc_table[2];
                                 			
                    			toggle = 1;
                    			j=0;
                    			USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
                    			while(len){
                    				if(len > 0x08) len1 = 0x08;
                    				else len1 = len;
                    				USB_EPP = 0;
                    				for(i=0;i<len1;i++,j++) USB_EP0 = conf_desc_table[j];
						if(len >= 0x08) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
							else USB_CTL1 = USB_CTL1 | 0x88;							
						}
						else {
							USB_CTL1 = 0x40;
							USB_CTL1 = USB_CTL1 | len;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
							else USB_CTL1 = USB_CTL1 | 0x80;
						}
						
						len -= len1;
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						toggle = ~toggle;
						
						if((len1==8) & (len==0)) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
							USB_CTL1 = USB_CTL1 | 0x80;
							while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
							USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
							USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						}
					}
  					out_status();
					break;
                    			
                    		case STRING_DESC:
                    		 if(SETUPR2==0){ 		
                    			if((SETUPR7==0) & (SETUPR6 < str0_table[0])) len = SETUPR6;
                    			else len = str0_table[0];
                    		 }                        
                    		 else if(SETUPR2==1){ 		
                    			if((SETUPR7==0) & (SETUPR6 < str1_table[0])) len = SETUPR6;
                    			else len = str1_table[0];
                    		 }
                    		 else if(SETUPR2==2){ 		
                    			if((SETUPR7==0) & (SETUPR6 < str2_table[0])) len = SETUPR6;
                    			else len = str2_table[0];
                    		 }
                    		 else {
                    			USB_CTL1 = USB_CTL1 | 0x20;
                    			USB_CTL2 = USB_CTL2 | 0x40;
                    			len = 0;
                    			return;
                    		 }
                    		 toggle = 1;
                    		 j=0;
                    		 USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
                    		 while(len){
                    			   if(len > 0x08) len1 = 0x08;
                    			   else len1 = len;
                                	  
                                           USB_EPP = 0;
                                           for(i=0;i<len1;i++,j++) {
                                           		if(SETUPR2==0)      USB_EP0 = str0_table[j];
                                           		else if(SETUPR2==1) USB_EP0 = str1_table[j];
                                           		else 
                                           		      USB_EP0 = str2_table[j];
                                           		                                          		  
                                           }            
                                           if(len >= 0x08) {
                                           	USB_CTL1 = 0x40;
						if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
						USB_CTL1 = USB_CTL1 | 0x88;
                                           }
                                           else {
						USB_CTL1 = 0x40;
						USB_CTL1 = USB_CTL1 | len;
						if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
						else USB_CTL1 = USB_CTL1 | 0x80;
					   }
                                           
                                           while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
                                           USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
					   USB_STA0 = USB_STA0 | 0x02; //txd0f=0
					   toggle = ~toggle;
                                           
                                           len -= len1;
                                           if((len1==8) & (len==0)) {
                                           	USB_CTL1 = 0x40;
						if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
						USB_CTL1 = USB_CTL1 | 0x80;
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
                                           }
                                 }                                 
  				 out_status();
                                 break; 
                                 
                                case CLASS_HID_DESC:
                                 
                                 if((SETUPR0 == 0x81) & (SETUPR4==0)){//interface0
                                	//assume intf0_hid_len=0x09
                                	if((SETUPR7==0) & (SETUPR6 < 0x09)) len = SETUPR6;
                    			else len = 0x09;
                                 			
                    			toggle = 1;
                    			j=18;
                    			USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
                    			while(len){
                    				if(len > 0x08) len1 = 0x08;
                    				else len1 = len;
                    				USB_EPP = 0;
                    				for(i=0;i<len1;i++,j++) USB_EP0 = conf_desc_table[j];
						if(len >= 0x08) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
							else USB_CTL1 = USB_CTL1 | 0x88;							
						}
						else {
							USB_CTL1 = 0x40;
							USB_CTL1 = USB_CTL1 | len;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
							else USB_CTL1 = USB_CTL1 | 0x80;
						}
						
						len -= len1;
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						toggle = ~toggle;
						
						if((len1==8) & (len==0)) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
							USB_CTL1 = USB_CTL1 | 0x80;
							while(!(USB_STA0 & 0x02));
							USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
							USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						}
					}
  					out_status();	
                                 }
                                 else if((SETUPR0 == 0x81) & (SETUPR4==1)){//interface1
                                	//assume intf1_hid_len=0x09
                                	if((SETUPR7==0) & (SETUPR6 < 0x09)) len = SETUPR6;
                    			else len = 0x09;
                                 			
                    			toggle = 1;
                    			j=43;
                    			USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
                    			while(len){
                    				if(len > 0x08) len1 = 0x08;
                    				else len1 = len;
                    				USB_EPP = 0;
                    				for(i=0;i<len1;i++,j++) USB_EP0 = conf_desc_table[j];
						if(len >= 0x08) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
							else USB_CTL1 = USB_CTL1 | 0x88;							
						}
						else {
							USB_CTL1 = 0x40;
							USB_CTL1 = USB_CTL1 | len;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
							else USB_CTL1 = USB_CTL1 | 0x80;
						}
						
						len -= len1;
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						toggle = ~toggle;
						
						if((len1==8) & (len==0)) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
							USB_CTL1 = USB_CTL1 | 0x80;
							while(!(USB_STA0 & 0x02));
							USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
							USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						}
					}
  					out_status();	
                                 }
                                 else {
                                	USB_CTL2 = USB_CTL2 | 0x40; // Invalid request  
                        		USB_CTL1 = USB_CTL1 | 0x20;
                                 }	
                                 break;
                                
                                case CLASS_REPORT_DESC:
                                 
                                 if((SETUPR0 == 0x81) & (SETUPR4==0)){//interface 0
                                	//
                                	if((SETUPR7==0)& (SETUPR6 < 64)) len = SETUPR6;
                    			else len = 64;
                                 			
                    			toggle = 1;
                    			j=0;
                    			USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
                    			while(len){
                    				if(len > 0x08) len1 = 0x08;
                    				else len1 = len;
                    				USB_EPP = 0;
                    				for(i=0;i<len1;i++,j++) USB_EP0 = keyboard_report[j];
						if(len >= 0x08) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
							else USB_CTL1 = USB_CTL1 | 0x88;							
						}
						else {
							USB_CTL1 = 0x40;
							USB_CTL1 = USB_CTL1 | len;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
							else USB_CTL1 = USB_CTL1 | 0x80;
						}
						
						len -= len1;
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						toggle = ~toggle;
						
						if((len1==8) & (len==0)) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
							USB_CTL1 = USB_CTL1 | 0x80;
							while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
							USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
							USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						}
					}
  					out_status();	
                                 }
                                 else if((SETUPR0 == 0x81) & (SETUPR4==1)){//interface 1
                                	//
                                	if((SETUPR7==0)& (SETUPR6 < 0x66)) len = SETUPR6;
                    			else len = 0x66;
                                 			
                    			toggle = 1;
                    			j=0;
                    			USB_CTL1 = USB_CTL1 | 0x40; //enable rxd0e
                    			while(len){
                    				if(len > 0x08) len1 = 0x08;
                    				else len1 = len;
                    				USB_EPP = 0;
                    				for(i=0;i<len1;i++,j++) USB_EP0 = mouse_report[j];
						if(len >= 0x08) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x98;
							else USB_CTL1 = USB_CTL1 | 0x88;							
						}
						else {
							USB_CTL1 = 0x40;
							USB_CTL1 = USB_CTL1 | len;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x90;
							else USB_CTL1 = USB_CTL1 | 0x80;
						}
						
						len -= len1;
						while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
						USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
						USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						toggle = ~toggle;
						
						if((len1==8) & (len==0)) {
							USB_CTL1 = 0x40;
							if(toggle) USB_CTL1 = USB_CTL1 | 0x10;
							USB_CTL1 = USB_CTL1 | 0x80;
							while(!(USB_STA0 & 0x02)) if(USB_STA0 & 0x01) {out_status(); return;}
							USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
							USB_STA0 = USB_STA0 | 0x02; //txd0f=0
						}
					}
  					out_status();	
                                 }
                                 else {
                                	USB_CTL2 = USB_CTL2 | 0x40; // Invalid request  
                        		USB_CTL1 = USB_CTL1 | 0x20;
                                 }	
                                 break;
                                	 
                                default:  
                        	 	USB_CTL2 = USB_CTL2 | 0x40; // Invalid request  
                        		USB_CTL1 = USB_CTL1 | 0x20;
                        		break;
                } //get descriptor case
                break;
            
        case SET_CONFIGURATION: 
        	if((SETUPR6==0) & (SETUPR7==0)){
            		configuration = SETUPR2;
            		if(configuration==0) configured = 0;
            		else configured = 1;            
            		if(configured==1){
            			//enable endpoint 1, 2
            			USB_CTL0 = 0xf0;
            			//
            		}
	    		else {
	    			//disable endpoint 1, 2
				USB_CTL0 = 0x90;			
				//USB_CTL4 = USB_CTL4 & 0xe3;  						
	    		}  
	    		//
	    		USB_CTL2 = USB_CTL2 & 0x40;
	    		ep1toggle = 0;   
	    		ep2toggle = 0; 
	   		in_status();	
	   	}
	   	else {
	   		USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
                        USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
                }
           	break;
            
        case GET_CONFIGURATION:    
        	if((SETUPR6==1) & (SETUPR7==0)){
            		USB_EPP = 0;
            		USB_EPP = configuration;
            		USB_CTL1 = 0x91;
            		while(!(USB_STA0 & 0x02)); //wait until txd0f=1
            		USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
	    		USB_STA0 = USB_STA0 | 0x02; //txd0f=0
	    		out_status();
	    	}
	    	else {
	   		USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
                        USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
                }
            	break;
            
        case GET_STATUS:         
                switch(SETUPR0)
                {
                    case 0x80:                         // Device rmwake=0, selpower=0
                     if((SETUPR6==2) & (SETUPR7==0)){
                    	USB_EPP = 0;
            		USB_EP0 = (unsigned char) remote_wku_enable;
            		USB_EP0 = 0;		//bus powered
            		USB_CTL1 = 0x92;
            		while(!(USB_STA0 & 0x02));
            		USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
	    		USB_STA0 = USB_STA0 | 0x02; //txd0f=0
	    		out_status();
                      }
                      else {
	   		USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
                        USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
                      }
                      break;
                    case 0x81:                         // Interface 
                    case 0x82:                         // End Point halt
                     if((SETUPR6==2) & (SETUPR7==0)){
                    	USB_EPP = 0;
            		USB_EP0 = 0;
            		USB_EP0 = 0;
            		USB_CTL1 = 0x92;
            		while(!(USB_STA0 & 0x02));
            		USB_CTL1 = USB_CTL1 & 0x7F; //clear tx0e
	    		USB_STA0 = USB_STA0 | 0x02; //txd0f=0
	    		out_status();
                      }
                      else {
	   		USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
                        USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
                      }
                      break;
                    default:                        // Invalid Command
                    	USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
                        USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
                        break;
                }
                break;
                
        case CLEAR_FEATURE:      
                switch(SETUPR0)
                {
                    case 0x00:                      // Device
                        if((SETUPR2 == 1) & (SETUPR6==0) & (SETUPR7==0)) {
                            remote_wku_enable = 0;  // Disable Remote Wakeup
                            in_status();
                        }
                        else {
                            USB_CTL1 = USB_CTL1 | 0x20; //ostall0 = 1
                            USB_CTL2 = USB_CTL2 | 0x40; //istall0 = 1
                        }
                        break;

⌨️ 快捷键说明

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