📄 mainloop.lst
字号:
300 4 printf(" ControlData.wCount = %x.\n", ControlData.wCount);
301 4 printf("Endpoint 4 (Bulk Out) Status = %bx, Endpoint 5 (Bulk In) Status = %bx.\n",
302 4 D12_ReadEndpointStatus(4), D12_ReadEndpointStatus(5));
303 4 if(bEPPflags.bits.dma_state == DMA_IDLE)
304 4 printf("DMA_State = DMA_IDLE.\n");
305 4 else if(bEPPflags.bits.dma_state == DMA_RUNNING)
306 4 printf("DMA_State = DMA_RUNNING.\n");
307 4 else if(bEPPflags.bits.dma_state == DMA_PENDING)
308 4 printf("DMA_State = DMA_PENDING.\n");
309 4
310 4 printf("Last Device Request: bmRequestType = 0x%bx, bRequest= 0x%bx, wValue = 0x%x, wLength = 0x%x, w
-Index = 0x%x.\n",
311 4
312 4 ControlData.DeviceRequest.bmRequestType,
313 4 ControlData.DeviceRequest.bRequest,
314 4 ControlData.DeviceRequest.wValue,
315 4 ControlData.DeviceRequest.wLength,
316 4 ControlData.DeviceRequest.wIndex);
317 4
318 4 printf("Data: ");
319 4 for(i = 0; i < ControlData.DeviceRequest.wLength; i ++)
320 4 printf("0x%bx, ", *((ControlData.dataBuffer)+i));
321 4 printf("\n");
322 4
C51 COMPILER V4.01, MAINLOOP 07/07/01 13:16:07 PAGE 6
323 4 break;
324 4 case '\r':
325 4 reconnect_USB();
326 4 break;
327 4
328 4 case 'v':
329 4 if(bEPPflags.bits.verbose == 0) {
330 5 printf("Verbose Mode = ON.\n");
331 5 DISABLE;
332 5 bEPPflags.bits.verbose = 1;
333 5 ENABLE;
334 5 }
335 4 else {
336 5 printf("Verbose Mode = OFF.\n");
337 5 DISABLE;
338 5 bEPPflags.bits.verbose = 0;
339 5 ENABLE;
340 5 }
341 4 break;
342 4 default:
343 4 break;
344 4 }
345 3 }
346 2
347 2
348 2 if (bEPPflags.bits.bus_reset) {
349 3 DISABLE;
350 3 bEPPflags.bits.bus_reset = 0;
351 3 ENABLE;
352 3 // Release D12's SUSPEND pin after bus reset
353 3 // Enable 74HCT123 pulse generation before disconnect
354 3 D12SUSPD = 1;
355 3 } // if bus reset
356 2
357 2 if (bEPPflags.bits.suspend) { // suspend interrups status bit set
358 3 DISABLE;
359 3 bEPPflags.bits.suspend= 0;
360 3 ENABLE;
361 3
362 3 if(D12SUSPD == 1) { // In suspend state
363 4 D12SUSPD = 0;
364 4 MCU_D12CS= 0;
365 4
366 4 D12_SetDMA(Wakeup_Flag_From_Suspend); // set flag
367 4
368 4 P0 = 0xFF;
369 4 P1 = 0xFF;
370 4 P2 = 0xFF;
371 4 P3 = 0xFF;
372 4
373 4 PCON |= 0x02; //Powerdown bit set
374 4 while (1);
375 4 }
376 3 } // if suspend change
377 2
378 2 if (bEPPflags.bits.setup_packet){
379 3 DISABLE;
380 3 bEPPflags.bits.setup_packet = 0;
381 3 ENABLE;
382 3 control_handler();
383 3 D12SUSPD = 1;
384 3 } // if setup_packet
385 2
386 2 if(bEPPflags.bits.setup_dma != 0) {
387 3 DISABLE;
388 3 bEPPflags.bits.setup_dma --;
C51 COMPILER V4.01, MAINLOOP 07/07/01 13:16:07 PAGE 7
389 3 ENABLE;
390 3 setup_dma();
391 3 } // if setup_dma
392 2
393 2 } // Main Loop
394 1
395 1 on_exit();
396 1 }
397
398 void stall_ep0(void)
399 {
400 1 D12_SetEndpointStatus(0, 1);
401 1 D12_SetEndpointStatus(1, 1);
402 1 }
403
404 void disconnect_USB(void)
405 {
406 1 // Initialize D12 configuration
407 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
408 1 }
409
410 void connect_USB(void)
411 {
412 1 // reset event flags
413 1 DISABLE;
414 1 bEPPflags.value = 0;
415 1 ENABLE;
416 1
417 1 // V2.1 enable normal+sof interrupt
418 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
419 1
420 1 // Initialize D12 configuration
421 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
422 1 }
423
424
425 void reconnect_USB(void)
426 {
427 1
428 1 MCU_LED0 = 0;
429 1 MCU_LED1 = 0;
430 1
431 1 // Pull-down D12's SUSPEND pin
432 1 // Disable 74HCT123 pulse generation before disconnect
433 1 // Release D12's SUSPEND pin after receiving bus reset from host
434 1 D12SUSPD = 0;
435 1 disconnect_USB();
436 1
437 1 printf("Wait for 1 second ...\n");
438 1
439 1 clk_cnt = ClockTicks;
440 1 while(ClockTicks < clk_cnt + 20)
441 1 ;
442 1
443 1 connect_USB();
444 1
445 1 MCU_LED0 = 1;
446 1 MCU_LED1 = 1;
447 1 }
448
449 void init_unconfig(void)
450 {
451 1 unsigned char i;
452 1
453 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
454 1 }
C51 COMPILER V4.01, MAINLOOP 07/07/01 13:16:07 PAGE 8
455
456 void init_config(void)
457 {
458 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
459 1 }
460
461 void single_transmit(unsigned char * buf, unsigned char len)
462 {
463 1 if( len <= EP0_PACKET_SIZE) {
464 2 D12_WriteEndpoint(1, len, buf);
465 2 }
466 1 }
467
468 void code_transmit(unsigned char code * pRomData, unsigned short len)
469 {
470 1 ControlData.wCount = 0;
471 1 if(ControlData.wLength > len)
472 1 ControlData.wLength = len;
473 1
474 1 ControlData.pData = pRomData;
475 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
476 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);
477 2 ControlData.wCount += EP0_PACKET_SIZE;
478 2
479 2 DISABLE;
480 2 bEPPflags.bits.control_state = USB_TRANSMIT;
481 2 ENABLE;
482 2 }
483 1 else {
484 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);
485 2 ControlData.wCount += ControlData.wLength;
486 2 DISABLE;
487 2 bEPPflags.bits.control_state = USB_IDLE;
488 2 ENABLE;
489 2 }
490 1 }
491
492 void check_key_LED(void)
493 {
494 1 static unsigned char c, last_key = 0xf;
495 1
496 1 c = MCU_SWM0 & MCU_SWM1;
497 1 c &= 0x0f;
498 1 if (c != last_key) {
499 2 D12_WriteEndpoint(3, 1, &c);
500 2 }
501 1
502 1 last_key = c;
503 1
504 1 if(bEPPflags.bits.ep1_rxdone) {
505 2 DISABLE;
506 2 bEPPflags.bits.ep1_rxdone = 0;
507 2 ENABLE;
508 2 MCU_LED0 = !(GenEpBuf[3] & 0x1);
509 2 MCU_LED1 = !(GenEpBuf[3] & 0x2);
510 2 }
511 1 }
512
513 void setup_dma()
514 {
515 1 ioSize = ioRequest.uSize;
516 1 ioCount = 0;
517 1
518 1 DISABLE;
519 1 bEPPflags.bits.dma_state = DMA_RUNNING;
520 1 ENABLE;
C51 COMPILER V4.01, MAINLOOP 07/07/01 13:16:07 PAGE 9
521 1
522 1 single_transmit(0, 0);
523 1
524 1 if(ioRequest.bCommand & 0x1) {
525 2 if(ioSize > 64 || ioSize == 0) {
526 3 if(bNoRAM)
527 3 D12_WriteEndpoint(5, 64, EpBuf);
528 3 else
529 3 D12_WriteEndpoint(5, 64, MainEpBuf);
530 3 ioCount += 64;
531 3 }
532 2 else {
533 3 if(bNoRAM)
534 3 D12_WriteEndpoint(5, ioSize, EpBuf);
535 3 else
536 3 D12_WriteEndpoint(5, ioSize, MainEpBuf);
537 3 ioCount += ioSize;
538 3 }
539 2 }
540 1 }
541
542
543 void control_handler()
544 {
545 1 unsigned char type, req;
546 1
547 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
548 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
549 1
550 1 help_devreq(type, req); // print out device request
551 1
552 1 if (type == USB_STANDARD_REQUEST)
553 1 (*StandardDeviceRequest[req])();
554 1 else if (type == USB_VENDOR_REQUEST)
555 1 (*VendorDeviceRequest[req])();
556 1 else
557 1 stall_ep0();
558 1 }
C51 COMPILER V4.01, MAINLOOP 07/07/01 13:16:07 PAGE 10
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _help_devreq (BEGIN)
;---- Variable 'typ' assigned to Register 'R7' ----
;---- Variable 'req' assigned to Register 'R5' ----
; SOURCE LINE # 139
; SOURCE LINE # 140
; SOURCE LINE # 141
0000 EF MOV A,R7
0001 C4 SWAP A
0002 13 RRC A
0003 5407 ANL A,#07H
0005 FF MOV R7,A
; SOURCE LINE # 143
0006 6031 JZ ?C0004
; SOURCE LINE # 144
0008 ?C0001:
; SOURCE LINE # 145
; SOURCE LINE # 146
0008 AE00 E MOV R6,bEPPflags+01H
000A EE MOV A,R6
000B C3 CLR C
000C 13 RRC A
000D 30E029 JNB ACC.0,?C0004
; SOURCE LINE # 147
0010 EF MOV A,R7
0011 75F003 MOV B,#03H
0014 A4 MUL AB
0015 2400 R ADD A,#LOW _NAME_USB_REQUEST_TYPE
0017 F582 MOV DPL,A
0019 E4 CLR A
001A 3400 R ADDC A,#HIGH _NAME_USB_REQUEST_TYPE
001C F583 MOV DPH,A
001E E4 CLR A
001F 93 MOVC A,@A+DPTR
0020 FB MOV R3,A
0021 7401 MOV A,#01H
0023 93 MOVC A,@A+DPTR
0024 FA MOV R2,A
0025 7402 MOV A,#02H
0027 93 MOVC A,@A+DPTR
0028 8B00 E MOV ?_printf?BYTE+03H,R3
002A 8A00 E MOV ?_printf?BYTE+04H,R2
002C F500 E MOV ?_printf?BYTE+05H,A
002E 8D00 E MOV ?_printf?BYTE+06H,R5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -