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

📄 testusb.c

📁 uCOS上移植的USB。今天终于可以使用我的了
💻 C
📖 第 1 页 / 共 5 页
字号:
    INT8U x2;
    INT8U x3;    

    x0  = (n3 % 16);
    n3 /= 16;
    x1  = (n3 % 16);
    n3 /= 16;
    x2  = (n3 % 16);
    n3 /= 16;
    x3=n3;
    
    x0=convertH(x0);
    x1=convertH(x1);
    x2=convertH(x2);
    x3=convertH(x3);

  VT102DispChar (x, y, '0', COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+1, y, 'X', COLOR_WHITE, COLOR_BLACK);     
  VT102DispChar (x+2, y, x3, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+3, y, x2, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+4, y, x1, COLOR_WHITE, COLOR_BLACK);
  VT102DispChar (x+5, y, x0, COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(x+6, y, "        ", COLOR_WHITE, COLOR_BLACK);  
}






//USB mainloop  主循环
void USB(void)
{
	int i,j,k;
	unsigned char key=0,cycle=0;
	  	
	//for(i = 0; i < 64; i ++)  EpBuf[i]=mainep.MainEpBuf[i];
			
	init_port();
	init_special_interrupts();                                         /* Initialize the AVR UART and Timer                */
  	PORTD&=~(1<<6);				/*reset d12*/
  	printf(1,11,"reset USB chip...",0);
  	PORTD|=1<<6;

	if((i = D12_GetDMA()) == 0xC3) {
		D12_SendResume();
		VT102DispStr(51, 19, "DMA is ", COLOR_WHITE, COLOR_BLACK);    
    		VT102DispNumH(60, 19, i, COLOR_WHITE, COLOR_BLACK); 
	}
	else {
		bEPPflags.value = 0;

		/*   disconnect and reconnect Soft-Connect */
  		VT102DispStr(1, 6, "PDIUSBD12 SEAPORT board firmware .", COLOR_WHITE, COLOR_BLACK);
  		VT102DispStr(1, 7, "input number 1 to see status.                      ", COLOR_WHITE, COLOR_BLACK);
  		VT102DispStr(1, 8, "input number 2 to reconect.", COLOR_WHITE, COLOR_BLACK);
  		VT102DispStr(1, 9, "input number 3 to see the state of verbose.         ", COLOR_WHITE, COLOR_BLACK);
  		printf(1, 10, "input symble  # : esc of USB                               bNoRAM= %d", bNoRAM);
        	VT102DispStr(1, 22, "     Connecting USB......                       ", COLOR_WHITE, COLOR_BLACK);
 		reconnect_USB();
	}

    /* Main program loop */
    //	for(i=0;i<64;i++) EpBuf[i]=i;
	//D12_WriteEndpoint(5,64,EpBuf);

	while(key!='#')
	{
		key=GetKeyPro();
		if(key)  { 
    		VT102DispStr(1, 20, "you have entered:", COLOR_WHITE, COLOR_BLACK); 		
  		VT102DispChar (30, 20, key, COLOR_WHITE, COLOR_BLACK);
  		VT102DispStr(31, 20, "        ", COLOR_WHITE, COLOR_BLACK);
  		//printf(1,18,"OSIntNesting :%d",OSIntNesting);
		}		
			switch(key) {
				case '1':
					if(bEPPflags.bits.control_state == USB_IDLE)
  						VT102DispStr(1, 11, "Control state = USB_IDLE.         ", COLOR_WHITE, COLOR_BLACK);
					else if(bEPPflags.bits.control_state == USB_RECEIVE)
  						VT102DispStr(1, 11, "Control state = USB_RECEIVE.         ", COLOR_WHITE, COLOR_BLACK);
					else if(bEPPflags.bits.control_state == USB_TRANSMIT)
  						VT102DispStr(1, 11, "Control state = USB_TRANSMIT.        ", COLOR_WHITE, COLOR_BLACK);
						
					printf(40,11," ControlData.wCount = %d.\n", ControlData.wCount);
					printf(1,12,"Endpoint 4 (Bulk Out) Status = %h\n", D12_ReadEndpointStatus(4));
					printf(40,12,"Endpoint 5 (Bulk In) Status = %h.\n",D12_ReadEndpointStatus(5));					   
					/*if(bEPPflags.bits.dma_state == DMA_IDLE)
						//printf(1,13,"DMA_State = DMA_IDLE.\n",0);
					else if(bEPPflags.bits.dma_state == DMA_RUNNING)
						//printf(1,13,"DMA_State = DMA_RUNNING.\n",0);
					else if(bEPPflags.bits.dma_state == DMA_PENDING)
						//printf(1,13,"DMA_State = DMA_PENDING.\n",0);*/
						printf(1,13,"Last Device Request: bmRequestType = %d",ControlData.DeviceRequest.bmRequestType);
						printf(45,13,"   bRequest= %h,",ControlData.DeviceRequest.bRequest);
						printf(1,14,"   wValue =  %h,",ControlData.DeviceRequest.wValue);
						printf(20,14,"   wLength =  %h,",ControlData.DeviceRequest.wLength);
						printf(40,14,"   wIndex  =  %h\n",ControlData.DeviceRequest.wIndex );



					printf(1,15,"Data: ",0);
					for(i = 0,j=7,k=15;i < ControlData.DeviceRequest.wLength|| i<=8; i++)  {
						printf(j,k,"%h ", *((ControlData.dataBuffer)+i));
						j+=8;
						if(j>=80) {
							if(k==19) {
								j=7;
								k=15;  
							 	}
							else  {
								j=1;
								k++;
								}
						}
						}
						break;
				
				case '2':
  VT102DispStr(1, 17, "                                                                                  ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 16, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 15, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 14, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 13, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 12, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 11, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 18, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 19, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 20, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
					reconnect_USB();
					break;

				case '3':
  VT102DispStr(1, 17, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 16, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 15, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 14, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 13, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 12, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 11, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 18, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 19, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 20, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
					if(bEPPflags.bits.verbose == 0) {
						printf(1,11,"Verbose Mode = ON.\n",0);
						DISABLE;
						bEPPflags.bits.verbose = 1;
						ENABLE;
					}
					else {
						printf(1,11,"Verbose Mode = OFF.\n",0);
						DISABLE;
						bEPPflags.bits.verbose = 0;
						ENABLE;
					}
					break;
				case '#':
  VT102DispStr(1, 17, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 16, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 15, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 14, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 13, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 12, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 11, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 18, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 19, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 20, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
					break;	
				case '4':
  VT102DispStr(1, 17, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 16, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 15, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 14, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 13, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 12, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 11, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 18, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 19, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
  VT102DispStr(1, 20, "                                                                              ", COLOR_WHITE, COLOR_BLACK);  
					  	PORTD&=~(1<<6);				/*reset d12*/
  	                                        printf(1,11,"reset USB chip...",0);
  	                                        PORTD|=1<<6;
  	DDRD = 0x7F;
        PORTD&=~(1<<4);
        DDRD&=~(1<<4) ;
        break;
				case '5':
					cycle=!cycle;
					if(cycle) printf(35,11,"Cycle.",0);
					else  printf(35,11,"      ",0);
					break;
				case '6':
					D12_SetBufEnable();
					//for(i=0;i<63;i++) EpBuf[i]=i;
					//D12_WriteEndpoint(5,63,EpBuf);
					bEPPflags.bits.ep2_txdone=1;
					break;
				default:
					break;
			}
		


		if (bEPPflags.bits.bus_reset) {
			DISABLE;
			bEPPflags.bits.bus_reset = 0;
			ENABLE;
			
			printf(1,11,"bus reset.        \n",0);
			// Release D12's SUSPEND pin after bus reset
			// Enable 74HCT123 pulse generation before disconnect
//			D12SUSPD = 1;
	DDRD = 0x7F;
        PORTD|=1<<4;
        DDRD&=~(1<<4) ;
				
		} // if bus reset

		if (bEPPflags.bits.suspend) {
			DISABLE;
			bEPPflags.bits.suspend= 0;
			ENABLE;
 			printf(20,11,"suspend.     ",0);
		} // if suspend change

		if (bEPPflags.bits.setup_packet){
			DISABLE;
			bEPPflags.bits.setup_packet = 0;
			ENABLE;
			control_handler();
//			D12SUSPD = 1;
	DDRD = 0x7F;
        PORTD|=1<<4;
        DDRD&=~(1<<4) ;
		} // if setup_packet

		if(bEPPflags.bits.setup_dma != 0) {
			DISABLE;
			bEPPflags.bits.setup_dma --;
			ENABLE;
			printf(1,11,"setup DMA.\n",0);
			setup_dma();
		}            // if setup_dma
		
		
		if(bEPPflags.bits.ep2_rxdone!= 0) {
			DISABLE;
			bEPPflags.bits.ep2_rxdone=0;
			ENABLE;
			printf(1,12,"Reveive data, endpoint 5: ",0);
			if(cycle) mainep.datacount=0;
			for(i = 0,j=27,k=12;i < 64; i++)  {
						printf(j,k,"%h ", *((EpBuf)+i));
						if(cycle) {
							mainep.MainEpBuf[mainep.datacount++]= *((EpBuf)+i);
							bEPPflags.bits.ep2_txdone=1;
							}
						j+=8;
						if(j>=80) {
							if(k==19) {
								j=27;
								k=12;  
							 	}
							else  {
								j=1;
								k++;
								}
						}
						}			
		}             //end point 2 receive data
		
		if(bEPPflags.bits.ep2_txdone != 0)   {
			DISABLE;
			bEPPflags.bits.ep2_txdone = 0; 
			ENABLE; 
			if(mainep.datacount>0)   {
				if(mainep.datacount<64)  {
					for(i=0;i<mainep.datacount;i++)   EpBuf[i]=mainep.MainEpBuf[i];           		
					D12_WriteEndpoint(5,mainep.datacount,EpBuf);
					mainep.datacount=0;
					}
				else  {
					for(i=0;i<64;i++)   EpBuf[i]=mainep.MainEpBuf[i];           		
					D12_WriteEndpoint(5,64,EpBuf);
					mainep.datacount-=64;
				}
			}
			else  printf(60,11,"no data  ",0);
		}              //end point2 transmit data
}                  // Main Loop
 
  return ;
}


//USB surport
void StandardDeviceRequest(unsigned char req)
{
	switch(req) {
		case 0:
			get_status();
			break;
		case 1:
			clear_feature();
			break;
		case 2:
			reserved();
			break;
		case 3:
			set_feature();
			break;
		case 4:
			reserved();
			break;
		case 5:
			set_address();
			break;
		case 6:
//			printf("get descriptor\n",0);
			get_descriptor();
			break;
		case 7:
			reserved();
			break;
		case 8:
			get_configuration();
			break;
		case 9:
			set_configuration();
			break;
		case 10:
			get_interface();
			break;
		case 11:
			set_interface();
			break;
		case 12:
		case 13:
		case 14:
		case 15:
			reserved();
			break;
		default:
		break;
		}
}

void VendorDeviceRequest(unsigned char req)
{
	switch(req) {
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
		case 6:
		case 7:
		case 8:
		case 9:
		case 10:
		case 11:
		case 13:
		case 14:
		case 15:
			reserved();
			break;
		case 12:
			read_write_register();
			break;
		default:
		break;				
		}
}		

void help_devreq(unsigned char typ, unsigned char req)
{
	typ >>= 5;

	if(typ == USB_STANDARD_REQUEST) {
	}
	else {
		if(bEPPflags.bits.verbose){
			printf(1,12,"Request Type =",0);
  			VT102DispStr(17,12,&_NAME_USB_REQUEST_TYPE[typ][0], COLOR_WHITE, COLOR_BLACK);  
			printf(40,12,", bRequest = %d.\n", req);
					}
	}
}


  

/* Interrupt Control Unit */
/*   ****  Enabled interrupts in Interrupt Enable Register ****
	 ****  GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
	 ****  INTERRUPT TO WORK!
*/
/*                  GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
					ARE DISABLED          */
/*                    External interrupt 0      */
/*                        Priority Level = 0    */
/*                        Timer 0 interrupt     */
/*                       Priority Level = 0     */
void init_special_interrupts(void)
{
	sei();
 	EIMSK|=0x01;
}

void init_port(void)
{
	//	D12SUSPD = 0;
	DDRD = 0x7F;
        PORTD&=~(1<<4);
        DDRD&=~(1<<4) ;
	PORTD|=1<<6;
        PORTC|=0xEF;			
}


//void on_exit(void)
//{
//}
//返回stall应答
void stall_ep0(void)
{
	D12_SetEndpointStatus(0, 1);
	D12_SetEndpointStatus(1, 1);
}

//断开USB总线
void disconnect_USB(void)
{
	// Initialize D12 configuration
	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
}
//连接USB总线
/*void connect_USB(void)
{
	// reset event flags
	DISABLE;
	bEPPflags.value = 0;
	ENABLE;

⌨️ 快捷键说明

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