📄 mainloop.lst
字号:
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 V7.06 MAINLOOP 04/14/2004 12:09:05 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 V7.06 MAINLOOP 04/14/2004 12:09:05 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 V7.06 MAINLOOP 04/14/2004 12:09:05 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 V7.06 MAINLOOP 04/14/2004 12:09:05 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 + -