📄 mscuser.lst
字号:
595
596 void MSC_BulkIn (void) {
597 1
598 1 switch (BulkStage) {
599 2 case MSC_BS_DATA_IN:
600 2 switch (CBW.CB[0]) {
601 3 case SCSI_READ10:
602 3 MSC_MemoryRead();
603 3 break;
604 3 }
605 2 break;
606 2 case MSC_BS_DATA_IN_LAST:
607 2 MSC_SetCSW();
608 2 break;
609 2 case MSC_BS_DATA_IN_LAST_STALL:
610 2 USB_SetStallEP(MSC_EP_IN);
611 2 MSC_SetCSW();
612 2 break;
613 2 case MSC_BS_CSW:
614 2 BulkStage = MSC_BS_CBW;
615 2 break;
616 2 }
617 1 }
618
619
620 /*
621 * MSC Bulk Out Callback
622 * Parameters: None (global variables)
623 * Return Value: None
624 */
625
626 void MSC_BulkOut (void) {
627 1
628 1 BulkLen = USB_ReadEP(MSC_EP_OUT, BulkBuf);
629 1 switch (BulkStage) {
630 2 case MSC_BS_CBW:
631 2 MSC_GetCBW();
632 2 break;
633 2 case MSC_BS_DATA_OUT:
634 2 switch (CBW.CB[0]) {
635 3 case SCSI_WRITE10:
636 3 MSC_MemoryWrite();
637 3 break;
638 3 case SCSI_VERIFY10:
639 3 MSC_MemoryVerify();
640 3 break;
641 3 }
642 2 break;
643 2 default:
644 2 USB_SetStallEP(MSC_EP_OUT);
645 2 CSW.bStatus = CSW_PHASE_ERROR;
646 2 MSC_SetCSW();
647 2 break;
648 2 }
649 1 }
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 11
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (USB_SetStallEP?T)
EXTERN CODE16 (USB_ReadEP?T)
EXTERN CODE16 (USB_WriteEP?T)
EXTERN DATA (EP0Buf)
*** PUBLICS:
PUBLIC MSC_Reset?T
PUBLIC MSC_GetMaxLUN?T
PUBLIC MSC_GetCBW?T
PUBLIC MSC_SetCSW?T
PUBLIC MSC_BulkIn?T
PUBLIC MSC_BulkOut?T
PUBLIC MSC_MemoryRead?T
PUBLIC MSC_MemoryWrite?T
PUBLIC MSC_MemoryVerify?T
PUBLIC MSC_RWSetup?T
PUBLIC DataInFormat?T
PUBLIC DataInTransfer?T
PUBLIC MSC_TestUnitReady?T
PUBLIC MSC_RequestSense?T
PUBLIC MSC_Inquiry?T
PUBLIC MSC_ModeSense6?T
PUBLIC MSC_ModeSense10?T
PUBLIC MSC_ReadCapacity?T
PUBLIC MSC_ReadFormatCapacity?T
PUBLIC Memory
PUBLIC MemOK
PUBLIC Offset
PUBLIC Length
PUBLIC BulkStage
PUBLIC BulkBuf
PUBLIC BulkLen
PUBLIC CBW
PUBLIC CSW
*** DATA SEGMENT '?DT0?AT_202000_?1?mscuser':
00202000 Memory:
00202000 DS 8192
*** DATA SEGMENT '?DT0?mscuser':
00000000 MemOK:
00000000 DS 4
00000004 Offset:
00000004 DS 4
00000008 Length:
00000008 DS 4
0000000C CBW:
0000000C DS 31
0000002B ALIGN 4
0000002C CSW:
0000002C DS 13
00000039 BulkStage:
00000039 DS 1
0000003A BulkBuf:
0000003A DS 64
0000007A BulkLen:
0000007A DS 1
*** CODE SEGMENT '?PR?MSC_Reset?T?mscuser':
56: AT91C_BASE_PIOA->PIO_SODR = LED1 | LED2; /* Turn Off R/W LED */
00000000 2103 MOV R1,#0x3
00000002 4800 LDR R0,=0xFFFFF430
00000004 6001 STR R1,[R0,#0x0]
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 12
57: BulkStage = MSC_BS_CBW;
00000006 2100 MOV R1,#0x0
00000008 4800 LDR R0,=BulkStage ; BulkStage
0000000A 7001 STRB R1,[R0,#0x0] ; BulkStage
58: return (TRUE);
0000000C 2001 MOV R0,#0x1
59: }
0000000E 4770 BX R14
00000010 ENDP ; 'MSC_Reset?T'
*** CODE SEGMENT '?PR?MSC_GetMaxLUN?T?mscuser':
71: EP0Buf[0] = 0; /* No LUN associated with this device */
00000000 2100 MOV R1,#0x0
00000002 4800 LDR R0,=EP0Buf ; EP0Buf
00000004 7001 STRB R1,[R0,#0x0] ; EP0Buf
72: return (TRUE);
00000006 2001 MOV R0,#0x1
73: }
00000008 4770 BX R14
0000000A ENDP ; 'MSC_GetMaxLUN?T'
*** CODE SEGMENT '?PR?MSC_MemoryRead?T?mscuser':
83: void MSC_MemoryRead (void) {
00000000 B510 PUSH {R4,LR}
00000002 ---- Variable 'n' assigned to Register 'R4' ----
00000002 ; SCOPE-START
86: if (Length > MSC_MAX_PACKET) {
00000002 4800 LDR R0,=Length ; Length
00000004 6800 LDR R0,[R0,#0x0] ; Length
00000006 2840 CMP R0,#0x40
00000008 D901 BLS L_3 ; T=0x0000000E
87: n = MSC_MAX_PACKET;
0000000A 2440 MOV R4,#0x40
88: } else {
0000000C E000 B L_4 ; T=0x00000010
0000000E L_3:
89: n = Length;
0000000E 1C04 MOV R4,R0 ; n
90: }
00000010 L_4:
92: if ((Offset + n) > MSC_MemorySize) {
00000010 1C22 MOV R2,R4 ; n
00000012 4800 LDR R0,=Offset ; Offset
00000014 6801 LDR R1,[R0,#0x0] ; Offset
00000016 188A ADD R2,R1,R2 ; n
00000018 4800 LDR R0,=0x2000
0000001A 4282 CMP R2,R0
0000001C D903 BLS L_5 ; T=0x00000026
93: n = MSC_MemorySize - Offset;
0000001E 1A44 SUB R4,R0,R1
94: BulkStage = MSC_BS_DATA_IN_LAST_STALL;
00000020 2204 MOV R2,#0x4
00000022 4800 LDR R0,=BulkStage ; BulkStage
00000024 7002 STRB R2,[R0,#0x0] ; BulkStage
95: }
00000026 L_5:
97: USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + Offset), n);
00000026 4800 LDR R0,=0x202000
00000028 1809 ADD R1,R0
0000002A 1C22 MOV R2,R4 ; n
0000002C 2081 MOV R0,#0x81
0000002E F7FF BL USB_WriteEP?T ; T=0x0001 (1)
00000030 FFE7 BL USB_WriteEP?T ; T=0x0001 (2)
98: Offset += n;
00000032 1C20 MOV R0,R4 ; n
00000034 4800 LDR R1,=Offset ; Offset
00000036 6809 LDR R1,[R1,#0x0] ; Offset
00000038 1809 ADD R1,R0 ; n
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 13
0000003A 4800 LDR R0,=Offset ; Offset
0000003C 6001 STR R1,[R0,#0x0] ; Offset
99: Length -= n;
0000003E 1C20 MOV R0,R4 ; n
00000040 4800 LDR R1,=Length ; Length
00000042 6809 LDR R1,[R1,#0x0] ; Length
00000044 1A09 SUB R1,R0 ; n
00000046 4800 LDR R0,=Length ; Length
00000048 6001 STR R1,[R0,#0x0] ; Length
101: CSW.dDataResidue -= n;
0000004A 1C22 MOV R2,R4 ; n
0000004C 4800 LDR R3,=CSW + 0x8 ; CSW+8
0000004E 7819 LDRB R1,[R3,#0x0] ; CSW+8
00000050 7858 LDRB R0,[R3,#0x1] ; CSW+8
00000052 0200 LSL R0,R0,#0x8
00000054 4301 ORR R1,R0
00000056 7898 LDRB R0,[R3,#0x2] ; CSW+8
00000058 0400 LSL R0,R0,#0x10
0000005A 4301 ORR R1,R0
0000005C 78D8 LDRB R0,[R3,#0x3] ; CSW+8
0000005E 0600 LSL R0,R0,#0x18
00000060 4301 ORR R1,R0
00000062 1A89 SUB R1,R2 ; n
00000064 4800 LDR R0,=CSW + 0x8 ; CSW+8
00000066 7001 STRB R1,[R0,#0x0] ; CSW+8
00000068 0A09 LSR R1,R1,#0x8
0000006A 7041 STRB R1,[R0,#0x1] ; CSW+8
0000006C 0A09 LSR R1,R1,#0x8
0000006E 7081 STRB R1,[R0,#0x2] ; CSW+8
00000070 0A09 LSR R1,R1,#0x8
00000072 70C1 STRB R1,[R0,#0x3] ; CSW+8
103: if (Length == 0) {
00000074 4800 LDR R0,=Length ; Length
00000076 6800 LDR R0,[R0,#0x0] ; Length
00000078 2800 CMP R0,#0x0
0000007A D102 BNE L_6 ; T=0x00000082
104: BulkStage = MSC_BS_DATA_IN_LAST;
0000007C 2103 MOV R1,#0x3
0000007E 4800 LDR R0,=BulkStage ; BulkStage
00000080 7001 STRB R1,[R0,#0x0] ; BulkStage
105: }
00000082 L_6:
107: if (BulkStage != MSC_BS_DATA_IN) {
00000082 4800 LDR R0,=BulkStage ; BulkStage
00000084 7800 LDRB R0,[R0,#0x0] ; BulkStage
00000086 2802 CMP R0,#0x2
00000088 D005 BEQ L_7 ; T=0x00000096
108: AT91C_BASE_PIOA->PIO_SODR = LED1; /* Turn Off Read LED */
0000008A 2101 MOV R1,#0x1
0000008C 4800 LDR R0,=0xFFFFF430
0000008E 6001 STR R1,[R0,#0x0]
109: CSW.bStatus = CSW_CMD_PASSED;
00000090 2100 MOV R1,#0x0
00000092 4800 LDR R0,=CSW + 0xC ; CSW+12
00000094 7001 STRB R1,[R0,#0x0] ; CSW+12
110: }
00000096 L_7:
00000096 ; SCOPE-END
111: }
00000096 BC10 POP {R4}
00000098 BC08 POP {R3}
0000009A 4718 BX R3
0000009C ENDP ; 'MSC_MemoryRead?T'
*** CODE SEGMENT '?PR?MSC_MemoryWrite?T?mscuser':
121: void MSC_MemoryWrite (void) {
00000000 B500 PUSH {LR}
ARM COMPILER V2.53, mscuser 24/09/06 22:23:19 PAGE 14
00000002 ; SCOPE-START
124: if ((Offset + BulkLen) > MSC_MemorySize) {
00000002 4800 LDR R0,=BulkLen ; BulkLen
00000004 7800 LDRB R0,[R0,#0x0] ; BulkLen
00000006 1C02 MOV R2,R0
00000008 4800 LDR R0,=Offset ; Offset
0000000A 6800 LDR R0,[R0,#0x0] ; Offset
0000000C 1882 ADD R2,R0,R2
0000000E 4800 LDR R1,=0x2000
00000010 428A CMP R2,R1
00000012 D90A BLS L_13 ; T=0x0000002A
125: BulkLen = MSC_MemorySize - Offset;
00000014 1A09 SUB R1,R0
00000016 0609 LSL R1,R1,#0x18
00000018 0E09 LSR R1,R1,#0x18
0000001A 4800 LDR R0,=BulkLen ; BulkLen
0000001C 7001 STRB R1,[R0,#0x0] ; BulkLen
126: BulkStage = MSC_BS_CSW;
0000001E 2105 MOV R1,#0x5
00000020 4800 LDR R0,=BulkStage ; BulkStage
00000022 7001 STRB R1,[R0,#0x0] ; BulkStage
127: USB_SetStallEP(MSC_EP_OUT);
00000024 2002 MOV R0,#0x2
00000026 F7FF BL USB_SetStallEP?T ; T=0x0001 (1)
00000028 FFEB BL USB_SetStallEP?T ; T=0x0001 (2)
130: for (n = 0; n < BulkLen; n++) {
0000002A L_13:
0000002A 2000 MOV R0,#0x0
0000002C ---- Variable 'n' assigned to Register 'R0' ----
0000002C E009 B L_11 ; T=0x00000042
0000002E L_12:
131: Memory[Offset + n] = BulkBuf[n];
0000002E 1C02 MOV R2,R0 ; n
00000030 4800 LDR R1,=BulkBuf ; BulkBuf
00000032 5C89 LDRB R1,[R1,R2]
00000034 1C02 MOV R2,R0 ; n
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -