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

📄 mainloop.lst

📁 USB 驱动源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 261   4      					else if(bEPPflags.bits.dma_state == DMA_RUNNING)
 262   4      						printf("DMA_State = DMA_RUNNING.\n");
 263   4      					else if(bEPPflags.bits.dma_state == DMA_PENDING)
 264   4      						printf("DMA_State = DMA_PENDING.\n");
 265   4      
 266   4      					printf("Last Device Request: bmRequestType = 0x%bx, bRequest= 0x%bx, wValue = 0x%x, wLength = 0x%x, w
             -Index = 0x%x.\n",
 267   4      
 268   4      						ControlData.DeviceRequest.bmRequestType,
 269   4      						ControlData.DeviceRequest.bRequest,
 270   4      						ControlData.DeviceRequest.wValue,
 271   4      						ControlData.DeviceRequest.wLength,
 272   4      						ControlData.DeviceRequest.wIndex);
 273   4      
 274   4      					printf("Data: ");
 275   4      					for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
 276   4      						printf("0x%bx, ", *((ControlData.dataBuffer)+i));
 277   4      					printf("\n");
 278   4      
 279   4      					break;
 280   4      				case '\r':
 281   4      					reconnect_USB();
 282   4      					break;
 283   4      
 284   4      				case 'v':
 285   4      					if(bEPPflags.bits.verbose == 0) {
 286   5      						printf("Verbose Mode = ON.\n");
 287   5      						DISABLE;
 288   5      						bEPPflags.bits.verbose = 1;
 289   5      						ENABLE;
 290   5      					}
 291   4      					else {
 292   5      						printf("Verbose Mode = OFF.\n");
 293   5      						DISABLE;
 294   5      						bEPPflags.bits.verbose = 0;
 295   5      						ENABLE;
 296   5      					}
 297   4      					break;
 298   4      				default:
 299   4      					break;
 300   4      			}
 301   3      		}
 302   2      
C51 COMPILER V6.14  MAINLOOP                                                               10/12/2002 08:40:08 PAGE 6   

 303   2      		if (bEPPflags.bits.bus_reset) {//设备复位处理
 304   3      			DISABLE;
 305   3      			bEPPflags.bits.bus_reset = 0;
 306   3      			ENABLE;
 307   3      			// Release D12's SUSPEND pin after bus reset
 308   3      			// Enable 74HCT123 pulse generation before disconnect
 309   3      			D12SUSPD = 1;
 310   3      		} // if bus reset
 311   2      
 312   2      		if (bEPPflags.bits.suspend) {//挂起改变处理
 313   3      			DISABLE;
 314   3      			bEPPflags.bits.suspend= 0;
 315   3      			ENABLE;
 316   3      
 317   3      			if(D12SUSPD == 1) {//挂起处理
 318   4      				D12SUSPD = 0;
 319   4      				P0 = 0xFF;
 320   4      				P1 = 0xFF;
 321   4      				P2 = 0xFF;
 322   4      				P3 = 0xFF;
 323   4      				D12_SetDMA(0xC3);
 324   4      				D12SUSPD = 1;
 325   4      				PCON |= 0x02;
 326   4      				while (1);
 327   4      			}
 328   3      		} // if suspend change
 329   2      
 330   2      		if (bEPPflags.bits.setup_packet){//Setup包处理
 331   3      			DISABLE;
 332   3      			bEPPflags.bits.setup_packet = 0;
 333   3      			ENABLE;
 334   3      			control_handler();//调用请求处理子程序
 335   3      			D12SUSPD = 1;
 336   3      		} // if setup_packet
 337   2      
 338   2      		if(bEPPflags.bits.setup_dma != 0) {//DMA状态改变处理
 339   3      			DISABLE;
 340   3      			bEPPflags.bits.setup_dma --;
 341   3      			ENABLE;
 342   3      			setup_dma();
 343   3      		} // if setup_dma
 344   2      
 345   2      	} // Main Loop
 346   1      }
 347          
 348          //返回stall应答
 349          void stall_ep0(void)
 350          {
 351   1      	D12_SetEndpointStatus(0, 1);
 352   1      	D12_SetEndpointStatus(1, 1);
 353   1      }
 354          
 355          //断开USB总线
 356          void disconnect_USB(void)
 357          {
 358   1      	// Initialize D12 configuration
 359   1      	D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
 360   1      }
 361          
 362          //连接USB总线
 363          void connect_USB(void)
 364          {
C51 COMPILER V6.14  MAINLOOP                                                               10/12/2002 08:40:08 PAGE 7   

 365   1      	// reset event flags
 366   1      	DISABLE;
 367   1      	bEPPflags.value = 0;//清除所有状态
 368   1      	ENABLE;
 369   1      
 370   1      	// V2.1 enable normal+sof interrupt
 371   1      	D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
 372   1      
 373   1      	// Initialize D12 configuration
 374   1      	D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
 375   1      }
 376          
 377          //重新连接到USB总线
 378          void reconnect_USB(void)
 379          {
 380   1      	unsigned long clk_cnt;
 381   1      
 382   1      	MCU_LED0 = 0;
 383   1      	MCU_LED1 = 0;
 384   1      
 385   1      	// Pull-down D12's SUSPEND pin
 386   1      	// Disable 74HCT123 pulse generation before disconnect
 387   1      	// Release D12's SUSPEND pin after receiving bus reset from host
 388   1      	D12SUSPD = 0;
 389   1      	disconnect_USB();
 390   1      
 391   1      	printf("Wait for 1 second ...\n");
 392   1      
 393   1      	clk_cnt = ClockTicks;
 394   1      	while(ClockTicks < clk_cnt + 20)
 395   1      		;
 396   1      
 397   1      	connect_USB();
 398   1      
 399   1      	MCU_LED0 = 1;
 400   1      	MCU_LED1 = 1;
 401   1      }
 402          
 403          //恢复到未配置状态
 404          void init_unconfig(void)
 405          {
 406   1      //	unsigned char i;
 407   1      
 408   1      	D12_SetEndpointEnable(0);	/* Disable all endpoints but EPP0. */
 409   1      }
 410          
 411          //设置配置状态
 412          void init_config(void)
 413          {
 414   1      	D12_SetEndpointEnable(1);	/* Enable  generic/iso endpoints. */
 415   1      }
 416          
 417          //从端点号1发送数据
 418          void single_transmit(unsigned char * buf, unsigned char len)
 419          {
 420   1      	if( len <= EP0_PACKET_SIZE) {
 421   2      		D12_WriteEndpoint(1, len, buf);
 422   2      	}
 423   1      }
 424          
 425          //发送端点号1建立代码
 426          void code_transmit(unsigned char code * pRomData, unsigned short len)
C51 COMPILER V6.14  MAINLOOP                                                               10/12/2002 08:40:08 PAGE 8   

 427          {
 428   1      	ControlData.wCount = 0;
 429   1      	if(ControlData.wLength > len)
 430   1      		ControlData.wLength = len;
 431   1      
 432   1      	ControlData.pData = pRomData;
 433   1      	if( ControlData.wLength >= EP0_PACKET_SIZE) {
 434   2      		D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
 435   2      		ControlData.wCount += EP0_PACKET_SIZE;
 436   2      		DISABLE;
 437   2      		bEPPflags.bits.control_state = USB_TRANSMIT;
 438   2      		ENABLE;
 439   2      	}
 440   1      	else {
 441   2      		D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
 442   2      		ControlData.wCount += ControlData.wLength;
 443   2      		DISABLE;
 444   2      		bEPPflags.bits.control_state = USB_IDLE;
 445   2      		ENABLE;
 446   2      	}
 447   1      }
 448          
 449          //LED和按键处理子程序
 450          void check_key_LED(void)
 451          {
 452   1      	static unsigned char c, last_key = 0xf;
 453   1      
 454   1      	c = MCU_SWM0 & MCU_SWM1;
 455   1      	c &= 0x0f;
 456   1      	if (c != last_key) {
 457   2      		D12_WriteEndpoint(3, 1, &c);//发送按键状态
 458   2      	}
 459   1      
 460   1      	last_key = c;
 461   1      
 462   1      	if(bEPPflags.bits.ep1_rxdone) {
 463   2      		DISABLE;
 464   2      		bEPPflags.bits.ep1_rxdone = 0;
 465   2      		ENABLE;
 466   2      		MCU_LED0 = !(GenEpBuf[3] & 0x1);//改变LED状态
 467   2      		MCU_LED1 = !(GenEpBuf[3] & 0x2);
 468   2      	}
 469   1      }
 470          
 471          //DMA建立子程序
 472          void setup_dma()
 473          {
 474   1      	ioSize = ioRequest.uSize;
 475   1      	ioCount = 0;
 476   1      
 477   1      	DISABLE;
 478   1      	bEPPflags.bits.dma_state = DMA_RUNNING;
 479   1      	ENABLE;
 480   1      
 481   1      	single_transmit(0, 0);
 482   1      
 483   1      	if(ioRequest.bCommand & 0x1) {
 484   2      		if(ioSize > 64 || ioSize == 0) {
 485   3      			//传输大于64字节数据
 486   3      			D12_WriteEndpoint(5, 64, EpBuf);
 487   3      			ioCount += 64;
 488   3      		}
C51 COMPILER V6.14  MAINLOOP                                                               10/12/2002 08:40:08 PAGE 9   

 489   2      		else {
 490   3      			//传输64字节数据
 491   3      			D12_WriteEndpoint(5, ioSize, EpBuf);
 492   3      			ioCount += ioSize;
 493   3      		}
 494   2      	}
 495   1      }
 496          
 497          //请求处理子程序
 498          void control_handler()
 499          {
 500   1      	unsigned char type, req;
 501   1      
 502   1      	type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
 503   1      	req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
 504   1      
 505   1      	help_devreq(type, req); //显示设备请求
 506   1      
 507   1      	if (type == USB_STANDARD_REQUEST)
 508   1      		(*StandardDeviceRequest[req])();//调用标准请求
 509   1      	else if (type == USB_VENDOR_REQUEST)
 510   1      		(*VendorDeviceRequest[req])();//调用厂商请求
 511   1      	else
 512   1      		stall_ep0();
 513   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1324    ----
   CONSTANT SIZE    =    919    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     26      18
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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