📄 fw_chap9.lst
字号:
\ 00000044 21D1 BNE ??fw_setConfiguration_5
411 {
412 /* status phase */
413 fw_singleTransmit(0, 0);
\ 00000046 0021 MOV R1,#+0
\ 00000048 201C MOV R0,R4
\ 0000004A ........ BL fw_singleTransmit
414
415 while( !( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_TXCOMP )
416 && (_i++ < 10));
\ ??fw_setConfiguration_6:
\ 0000004E 3868 LDR R0,[R7, #+0]
\ 00000050 C007 LSL R0,R0,#+31
\ 00000052 03D4 BMI ??fw_setConfiguration_7
\ 00000054 201C MOV R0,R4
\ 00000056 641C ADD R4,R4,#+1
\ 00000058 0A28 CMP R0,#+10
\ 0000005A F8DB BLT ??fw_setConfiguration_6
417
418 #ifndef AT91SAM9265
419 USBDEV_BASE_UDP->UDP_GLBSTATE |= USBDEV_UDP_CONFG;
\ ??fw_setConfiguration_7:
\ 0000005C 3068 LDR R0,[R6, #+0]
\ 0000005E 0221 MOV R1,#+2
\ 00000060 0143 ORR R1,R0
\ 00000062 3160 STR R1,[R6, #+0]
420 #else
421 USBDEV_BASE_UDP->UDPHS_CTRL |= AT91C_EN_USB;
422 #endif
423 /* Configure device if it's not already the case */
424 if(!(fw_deviceState & FW_DS_CONFIG))
\ 00000064 2878 LDRB R0,[R5, #+0]
\ 00000066 C007 LSL R0,R0,#+31
\ 00000068 09D4 BMI ??fw_setConfiguration_8
425 {
426 /* Enable all endpoints */
427 fw_activateEP(FW_EP_BULK_IN);
\ 0000006A 0120 MOV R0,#+1
\ 0000006C ........ _BLF fw_activateEP,??fw_activateEP??rT
428 fw_activateEP(FW_EP_BULK_OUT);
\ 00000070 0220 MOV R0,#+2
\ 00000072 ........ _BLF fw_activateEP,??fw_activateEP??rT
429
430 /* mark the device as configured */
431 fw_deviceState |= FW_DS_CONFIG;
\ 00000076 2878 LDRB R0,[R5, #+0]
\ 00000078 0121 MOV R1,#+1
\ 0000007A 0143 ORR R1,R0
\ 0000007C 2970 STRB R1,[R5, #+0]
432 }
433
434 /* The device is plugged and enumerated */
435 USB_EVENT |= USB_EVENT_MASK_PLUG;
\ ??fw_setConfiguration_8:
\ 0000007E .... LDR R0,??DataTable14 ;; USB_EVENT
\ 00000080 0178 LDRB R1,[R0, #+0]
\ 00000082 0422 MOV R2,#+4
\ 00000084 0A43 ORR R2,R1
\ 00000086 0270 STRB R2,[R0, #+0]
\ 00000088 03E0 B ??fw_setConfiguration_4
436 }
437 else
438 {
439 TRACE_DEBUG_H( "STALL\n\r");
440 fw_stallEp0();
\ ??fw_setConfiguration_5:
\ 0000008A 0121 MOV R1,#+1
\ 0000008C 0020 MOV R0,#+0
\ 0000008E ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
441 }
442 }
443 }
\ ??fw_setConfiguration_4:
\ 00000092 F0BC POP {R4-R7}
\ 00000094 01BC POP {R0}
\ 00000096 0047 BX R0 ;; return
\ ??fw_setConfiguration_0:
\ 00000098 ........ DC32 fw_controlData + 2
\ 0000009C 0400FBFF DC32 0xfffb0004
\ 000000A0 3000FBFF DC32 0xfffb0030
444
445
446 /*****************************************************************
447 *
448 * ROUTINE fw_setFeature
449 *
450 *-----------------------------------------------------------------
451 *
452 * Purpose :
453 * 9.4.9 Set Feature ( SET_FEATURE )
454 * This request is used to set or enable a specific feature.
455 *
456 * Input parameters : NONE
457 *
458 * Output parameters : NONE
459 *
460 * Global data : fw_controlData : request to be processed
461 *
462 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
463 void fw_setFeature(void)
464 {
\ fw_setFeature:
\ 00000000 30B5 PUSH {R4,R5,LR}
465 EPx _endp;
466 UCHAR _bRecipient = fw_controlData.DeviceRequest.bmRequestType & FW_USB_RECIPIENT;
467
468 TRACE_DEBUG_H( "fsetFeature\n\r");
469 if (_bRecipient == FW_USB_RECIPIENT_ENDPOINT
470 && fw_controlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_HALT)
\ 00000002 .... LDR R0,??DataTable12 ;; fw_controlData
\ 00000004 4188 LDRH R1,[R0, #+2]
\ 00000006 .... LDR R4,??DataTable11 ;; stallEndpointStatus
\ 00000008 0278 LDRB R2,[R0, #+0]
\ 0000000A D206 LSL R2,R2,#+27
\ 0000000C D20E LSR R2,R2,#+27
\ 0000000E 022A CMP R2,#+2
\ 00000010 12D1 BNE ??fw_setFeature_0
\ 00000012 0029 CMP R1,#+0
\ 00000014 10D1 BNE ??fw_setFeature_0
471 {
472 _endp = (EPx)(fw_controlData.DeviceRequest.wIndex & (FW_EP_CTRL | FW_EP_BULK_IN | FW_EP_BULK_OUT));
\ 00000016 8088 LDRH R0,[R0, #+4]
\ 00000018 8507 LSL R5,R0,#+30
\ 0000001A AD0F LSR R5,R5,#+30
473 /* set TX stall for IN on EPn. */
474 fw_setEndpointStatus(_endp, 1);
\ 0000001C 0121 MOV R1,#+1
\ 0000001E 281C MOV R0,R5
\ 00000020 ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
475 stallEndpointStatus |= (1<<_endp);
\ 00000024 2078 LDRB R0,[R4, #+0]
\ 00000026 0121 MOV R1,#+1
\ 00000028 A940 LSL R1,R5
\ ??fw_setFeature_1:
\ 0000002A 0143 ORR R1,R0
\ 0000002C 2170 STRB R1,[R4, #+0]
476 fw_singleTransmit(0, 0);
\ 0000002E 0021 MOV R1,#+0
\ 00000030 0020 MOV R0,#+0
\ 00000032 ........ BL fw_singleTransmit
\ 00000036 0CE0 B ??fw_setFeature_2
477 }
478 else
479 {
480 if(fw_controlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
\ ??fw_setFeature_0:
\ 00000038 0129 CMP R1,#+1
\ 0000003A 02D1 BNE ??fw_setFeature_3
481 {
482 stallEndpointStatus |= (1<<4);
\ 0000003C 2078 LDRB R0,[R4, #+0]
\ 0000003E 1021 MOV R1,#+16
\ 00000040 F3E7 B ??fw_setFeature_1
483 fw_singleTransmit(0, 0);
484 }
485 else
486 {
487 TRACE_DEBUG_H( "setFeat stall\n\r");
488 fw_stallEp0();
\ ??fw_setFeature_3:
\ 00000042 0121 MOV R1,#+1
\ 00000044 0020 MOV R0,#+0
\ 00000046 ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
489 stallEndpointStatus |= (1<<FW_EP_CTRL);
\ 0000004A 2078 LDRB R0,[R4, #+0]
\ 0000004C 0121 MOV R1,#+1
\ 0000004E 0143 ORR R1,R0
\ 00000050 2170 STRB R1,[R4, #+0]
490 }
491 }
492 }
\ ??fw_setFeature_2:
\ 00000052 30BC POP {R4,R5}
\ 00000054 01BC POP {R0}
\ 00000056 0047 BX R0 ;; return
493
494
495
496 /*****************************************************************
497 *
498 *
499 * ROUTINE fw_setInterface
500 *
501 *-----------------------------------------------------------------
502 *
503 * Purpose :
504 * 9.4.10 Set Interface ( SET_INTERFACE )
505 * This request allows the host to select an alternate setting for the specified interface.
506 *
507 * Input parameters : NONE
508 *
509 * Output parameters : NONE
510 *
511 * Global data : fw_controlData : request to be processed
512 *
513 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
514 void fw_setInterface(void)
515 {
\ fw_setInterface:
\ 00000000 00B5 PUSH {LR}
516 TRACE_DEBUG_H( "setInt\n\r");
517 if (fw_controlData.DeviceRequest.wValue == 0 && fw_controlData.DeviceRequest.wIndex == 0)
\ 00000002 .... LDR R0,??DataTable12 ;; fw_controlData
\ 00000004 4188 LDRH R1,[R0, #+2]
\ 00000006 0029 CMP R1,#+0
\ 00000008 07D1 BNE ??fw_setInterface_0
\ 0000000A 8088 LDRH R0,[R0, #+4]
\ 0000000C 0028 CMP R0,#+0
\ 0000000E 04D1 BNE ??fw_setInterface_0
518 {
519 fw_singleTransmit(0, 0);
\ 00000010 0021 MOV R1,#+0
\ 00000012 0020 MOV R0,#+0
\ 00000014 ........ BL fw_singleTransmit
\ 00000018 03E0 B ??fw_setInterface_1
520 }
521 else
522 {
523 TRACE_DEBUG_H( "stall\n\r");
524 fw_stallEp0();
\ ??fw_setInterface_0:
\ 0000001A 0121 MOV R1,#+1
\ 0000001C 0020 MOV R0,#+0
\ 0000001E ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
525 }
526 }
\ ??fw_setInterface_1:
\ 00000022 01BC POP {R0}
\ 00000024 0047 BX R0 ;; return
527
528
529 /*****************************************************************
530 *
531 * ROUTINE fw_reserved
532 *
533 *-----------------------------------------------------------------
534 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -