📄 fw_chap9.lst
字号:
535 * Purpose :
536 *
537 *
538 * Input parameters : NONE
539 *
540 * Output parameters : NONE
541 *
542 * Global data :
543 *
544 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
545 void fw_reserved(void)
546 {
\ fw_reserved:
\ 00000000 00B5 PUSH {LR}
547 TRACE_DEBUG_H( "fw_reserved\n\r");
548 fw_stallEp0();
\ 00000002 .... B ?Subroutine16
549 }
\ In segment CODE, align 4, keep-with-next
\ ?Subroutine16:
\ 00000000 0121 MOV R1,#+1
\ 00000002 0020 MOV R0,#+0
\ 00000004 ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
\ 00000008 01BC POP {R0}
\ 0000000A 0047 BX R0 ;; return
550
551
552 /*****************************************************************
553 *
554 * ROUTINE fw_busReset
555 *
556 *-----------------------------------------------------------------
557 *
558 * Purpose :
559 * called when a bus reset occured,re-init of global variables
560 *
561 * In parameters : NONE
562 *
563 * Out parameters : NONE
564 *
565 * Global data :
566 * fw_controlData : structure that contains info for control transfer
567 * fw_device_state : bit map for different device states
568 * fw_fifoId : Id of the IN FIFO
569 *
570 *****************************************************************/
571 #ifdef ADS_COMPIL
572 void fw_busReset(void)
573 #else
\ In segment CODE_I, align 4, keep-with-next
574 __ramfunc void fw_busReset(void)
575 #endif
576 {
\ fw_busReset:
\ 00000000 00B5 PUSH {LR}
577 // empty the endpoint buffers
578 fw_resetEP(FW_EP_BULK_IN);
\ 00000002 0120 MOV R0,#+1
\ 00000004 ........ _BLF fw_resetEP,??fw_resetEP??rT?CODE_I
579 fw_resetEP(FW_EP_BULK_OUT);
\ 00000008 0220 MOV R0,#+2
\ 0000000A ........ _BLF fw_resetEP,??fw_resetEP??rT?CODE_I
580
581 // made as if a bus reset occured and reset all
582 fw_controlData.DeviceRequest.bmRequestType = 0x00;
\ 0000000E 0748 LDR R0,??fw_busReset_0 ;; fw_controlData
\ 00000010 0021 MOV R1,#+0
\ 00000012 0160 STR R1,[R0, #+0]
583 fw_controlData.DeviceRequest.bRequest = 0x00;
584 fw_controlData.DeviceRequest.wValue = 0x0000;
585 fw_controlData.DeviceRequest.wIndex = 0x0000;
\ 00000014 4160 STR R1,[R0, #+4]
586 fw_controlData.DeviceRequest.wLength = 0x0000;
587 fw_controlData.state = FW_STATE_END;
\ 00000016 0173 STRB R1,[R0, #+12]
588 fw_controlData.pData = NULL;
\ 00000018 0161 STR R1,[R0, #+16]
589 fw_deviceState = 0;
\ 0000001A 0548 LDR R0,??fw_busReset_0+0x4 ;; fw_deviceState
\ 0000001C 0170 STRB R1,[R0, #+0]
590 fw_databk = 0;
\ 0000001E 0548 LDR R0,??fw_busReset_0+0x8 ;; fw_databk
\ 00000020 0160 STR R1,[R0, #+0]
591
592 po_rngFlush(&fw_fifoId);
\ 00000022 0548 LDR R0,??fw_busReset_0+0xC ;; fw_fifoId
\ 00000024 ........ _BLF po_rngFlush,??po_rngFlush??rT?CODE_I
593 }
\ 00000028 01BC POP {R0}
\ 0000002A 0047 BX R0 ;; return
\ ??fw_busReset_0:
\ 0000002C ........ DC32 fw_controlData
\ 00000030 ........ DC32 fw_deviceState
\ 00000034 ........ DC32 fw_databk
\ 00000038 ........ DC32 fw_fifoId
594
595 /*****************************************************************
596 *
597 * ROUTINE fw_suspendChange
598 *
599 *-----------------------------------------------------------------
600 *
601 * Purpose :
602 * called when a suspend change occured
603 *
604 * In parameters : NONE
605 *
606 * Out parameters : NONE
607 *
608 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
609 void fw_suspendChange(void)
610 {
611 TRACE_DEBUG_H( "suspend\n\r");
612 if(!(fw_deviceState & FW_DS_COMHANG))
\ fw_suspendChange:
\ 00000000 8020 MOV R0,#+128
\ 00000002 .... LDR R1,??DataTable13 ;; fw_deviceState
\ 00000004 0A78 LDRB R2,[R1, #+0]
\ 00000006 0242 TST R2,R0
\ 00000008 07D1 BNE ??fw_suspendChange_0
613 {
614 fw_deviceState |= FW_DS_COMHANG;
\ 0000000A 0A78 LDRB R2,[R1, #+0]
\ 0000000C 1043 ORR R0,R2
\ 0000000E 0870 STRB R0,[R1, #+0]
615 USB_EVENT |= USB_EVENT_MASK_SUSPEND;
\ 00000010 .... LDR R0,??DataTable14 ;; USB_EVENT
\ 00000012 0178 LDRB R1,[R0, #+0]
\ 00000014 0122 MOV R2,#+1
\ 00000016 0A43 ORR R2,R1
\ 00000018 0270 STRB R2,[R0, #+0]
616 // fw_IsrCount = 0;
617 }
618 }
\ ??fw_suspendChange_0:
\ 0000001A 7047 BX LR ;; return
619
620 /*****************************************************************
621 *
622 * ROUTINE fw_stallEp0
623 *
624 *-----------------------------------------------------------------
625 *
626 * Purpose :
627 * set the EP0 STALL
628 *
629 * In parameters : NONE
630 *
631 * Out parameters : NONE
632 *
633 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
634 void fw_stallEp0(void)
635 {
\ fw_stallEp0:
\ 00000000 00B5 PUSH {LR}
\ 00000002 C046 NOP
636 fw_setEndpointStatus(FW_EP_CTRL, 1);
\ 00000004 REQUIRE ?Subroutine16
\ 00000004 ;; // Fall through to label ?Subroutine16
637 }
638
639
640 /*****************************************************************
641 *
642 * ROUTINE fw_singleTransmit
643 *
644 *-----------------------------------------------------------------
645 *
646 * Purpose :
647 * transmit a single packet of data from EP0
648 *
649 * In parameters : buf : data buffer to transmit
650 * len : length of the data
651 *
652 * Out parameters : NONE
653 *
654 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
655 void fw_singleTransmit(UCHAR * buf, UCHAR len)
656 {
\ fw_singleTransmit:
\ 00000000 00B5 PUSH {LR}
657 if( len <= FW_EP0_MAXPACKET_SIZE)
\ 00000002 0929 CMP R1,#+9
\ 00000004 04D2 BCS ??fw_singleTransmit_0
658 {
659 fw_writeEndpoint(FW_EP_CTRL, buf, len);
\ 00000006 0A1C MOV R2,R1
\ 00000008 011C MOV R1,R0
\ 0000000A 0020 MOV R0,#+0
\ 0000000C ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
660 }
661 else
662 {
663 TRACE_ERROR( "singleTr error\n\r");
664 }
665 }
\ ??fw_singleTransmit_0:
\ 00000010 01BC POP {R0}
\ 00000012 0047 BX R0 ;; return
666
667 /*****************************************************************
668 *
669 * ROUTINE fw_codeTransmit
670 *
671 *-----------------------------------------------------------------
672 *
673 * Purpose :
674 * transmit a buffer of data from EP0
675 *
676 * In parameters : pData : data buffer to transmit
677 * len : length of the data
678 *
679 * Out parameters : NONE
680 *
681 * Global data : fw_controlData : request to be processed
682 *
683 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
684 void fw_codeTransmit(UCHAR * pData, USHORT len)
685 {
\ fw_codeTransmit:
\ 00000000 10B5 PUSH {R4,LR}
686 fw_controlData.wCount = 0;
\ 00000002 .... LDR R4,??DataTable15 ;; fw_controlData
\ 00000004 0022 MOV R2,#+0
\ 00000006 6281 STRH R2,[R4, #+10]
687 if(fw_controlData.wLength > len)
\ 00000008 2289 LDRH R2,[R4, #+8]
\ 0000000A 9142 CMP R1,R2
\ 0000000C 00D2 BCS ??fw_codeTransmit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -