📄 fw_epmg.lst
字号:
\ 00000074 0828 CMP R0,#+8
\ 00000076 04D1 BNE ??fw_ep0RxDone_6
\ 00000078 2089 LDRH R0,[R4, #+8]
\ 0000007A 0904 LSL R1,R1,#+16
\ 0000007C 090C LSR R1,R1,#+16
\ 0000007E 8142 CMP R1,R0
\ 00000080 06D3 BCC ??fw_ep0RxDone_2
112 {
113 fw_writeEndpoint(FW_EP_BULK_IN, 0, 0); /* Send zero packet at the end */
\ ??fw_ep0RxDone_6:
\ 00000082 0022 MOV R2,#+0
\ 00000084 0021 MOV R1,#+0
\ 00000086 0120 MOV R0,#+1
\ 00000088 ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
114 fw_controlData.state = FW_STATE_END;
115 }
116 }
117 else
118 {
119 fw_controlData.state = FW_STATE_END;
\ ??fw_ep0RxDone_5:
\ 0000008C 0020 MOV R0,#+0
\ 0000008E 2073 STRB R0,[R4, #+12]
\ ??fw_ep0RxDone_2:
\ 00000090 10BC POP {R4}
\ 00000092 01BC POP {R0}
\ 00000094 0047 BX R0 ;; return
120 }
121 }
122 }
123
124
125 /*****************************************************************
126 *
127 * ROUTINE fw_processCommand
128 *
129 *-----------------------------------------------------------------
130 *
131 * Purpose :
132 * called by the task when a setup packet is received
133 *
134 * Input parameters : NONE
135 *
136 * Output parameters : NONE
137 *
138 * Global data : fw_controlData : request to be processed
139 *
140 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
141 void fw_processCommand(void)
142 {
\ fw_processCommand:
\ 00000000 11B5 PUSH {R0,R4,LR}
143 UCHAR _type, _req;
144
145 if(fw_controlData.DeviceRequest.bmRequestType & 0x80)
\ 00000002 .... LDR R4,??DataTable4 ;; fw_controlData
\ 00000004 2078 LDRB R0,[R4, #+0]
\ 00000006 0006 LSL R0,R0,#+24
\ 00000008 01D5 BPL ??fw_processCommand_0
146 {
147 fw_changedir(FW_DEVICE_TO_HOST);
\ 0000000A 0120 MOV R0,#+1
\ 0000000C 00E0 B ??fw_processCommand_1
148 }
149 else
150 {
151 fw_changedir(FW_HOST_TO_DEVICE);
\ ??fw_processCommand_0:
\ 0000000E 0020 MOV R0,#+0
\ ??fw_processCommand_1:
\ 00000010 ........ _BLF fw_changedir,??fw_changedir??rT
152 }
153
154 _type = fw_controlData.DeviceRequest.bmRequestType & FW_USB_REQUEST_TYPE_MASK;
\ 00000014 2178 LDRB R1,[R4, #+0]
\ 00000016 6020 MOV R0,#+96
\ 00000018 0840 AND R0,R1
155 /* take only the first four bits of the request */
156 _req = fw_controlData.DeviceRequest.bRequest & FW_USB_REQUEST_MASK;
157
158 /* process the rigth command */
159 if (_type == FW_USB_STANDARD_REQUEST)
\ 0000001A 08D1 BNE ??fw_processCommand_2
160 {
161 TRACE_DEBUG_L( "DeviceRequest:%d\n\r", _req );
162 (*StandardDeviceRequest[_req])();
\ 0000001C 6078 LDRB R0,[R4, #+1]
\ 0000001E 0007 LSL R0,R0,#+28
\ 00000020 000F LSR R0,R0,#+28
\ 00000022 8000 LSL R0,R0,#+2
\ 00000024 1449 LDR R1,??fw_processCommand_3 ;; StandardDeviceRequest
\ 00000026 0858 LDR R0,[R1, R0]
\ 00000028 ........ BL ??rT_BX_R0
\ 0000002C 21E0 B ??fw_processCommand_4
163 /* fw_getStatus, fw_clearFeature, fw_reserved, fw_setFeature, */
164 /* fw_reserved, fw_setAddress, fw_getDescriptor, fw_reserved, */
165 /* fw_getConfiguration, fw_setConfiguration, fw_getInterface, */
166 /* fw_setInterface, fw_reserved */
167 }
168 else
169 {
170 if (_type == FW_USB_CLASS_REQUEST)
\ ??fw_processCommand_2:
\ 0000002E 2028 CMP R0,#+32
\ 00000030 1BD1 BNE ??fw_processCommand_5
171 {
172 UCHAR _pBuff;
173 UCHAR _dataSize;
174 /* !!!! point entree driver: ms_classRequest */
175 if( USBMS_OK == ms_classRequest( fw_controlData.DeviceRequest, &_pBuff, &_dataSize ) )
\ 00000032 6846 MOV R0,SP
\ 00000034 01B4 PUSH {R0}
\ 00000036 401C ADD R0,R0,#+1
\ 00000038 01B4 PUSH {R0}
\ 0000003A 82B0 SUB SP,#+8
\ 0000003C 6946 MOV R1,SP
\ 0000003E 2068 LDR R0,[R4, #0]
\ 00000040 0860 STR R0,[R1, #0]
\ 00000042 6068 LDR R0,[R4, #+4]
\ 00000044 4860 STR R0,[R1, #+4]
\ 00000046 0FBC POP {R0-R3}
\ 00000048 ........ _BLF ms_classRequest,??ms_classRequest??rT
\ 0000004C 0028 CMP R0,#+0
\ 0000004E 0CD1 BNE ??fw_processCommand_5
176 {
177 if( _dataSize != 0 )
\ 00000050 6846 MOV R0,SP
\ 00000052 0078 LDRB R0,[R0, #+0]
\ 00000054 0028 CMP R0,#+0
\ 00000056 05D0 BEQ ??fw_processCommand_6
178 {
179 /* we suppose that answer is always shorter than 1 packet */
180 fw_singleTransmit( &_pBuff, _dataSize );
\ 00000058 6846 MOV R0,SP
\ 0000005A 0178 LDRB R1,[R0, #+0]
\ 0000005C 401C ADD R0,R0,#+1
\ ??fw_processCommand_7:
\ 0000005E ........ _BLF fw_singleTransmit,??fw_singleTransmit??rT
\ 00000062 06E0 B ??fw_processCommand_4
181 }
182 else
183 {
184 fw_singleTransmit(0,0);
\ ??fw_processCommand_6:
\ 00000064 0021 MOV R1,#+0
\ 00000066 0020 MOV R0,#+0
\ 00000068 F9E7 B ??fw_processCommand_7
185 }
186 }
187 else
188 {
189 fw_controlData.state = FW_STATE_END;
\ ??fw_processCommand_5:
\ 0000006A 0020 MOV R0,#+0
\ 0000006C 2073 STRB R0,[R4, #+12]
190 fw_stallEp0();
\ 0000006E ........ _BLF fw_stallEp0,??fw_stallEp0??rT
191 }
192 }
193 else
194 {
195 fw_controlData.state = FW_STATE_END;
196 fw_stallEp0();
197 }
198 }
199 }
\ ??fw_processCommand_4:
\ 00000072 18BC POP {R3,R4}
\ 00000074 01BC POP {R0}
\ 00000076 0047 BX R0 ;; return
\ ??fw_processCommand_3:
\ 00000078 ........ DC32 StandardDeviceRequest
200
201
202 /*****************************************************************
203 *
204 * ROUTINE fw_ep0TxDone
205 *
206 *-----------------------------------------------------------------
207 *
208 * Purpose :
209 * called when something is transmitted by EP0
210 *
211 * Input parameters : NONE
212 *
213 * Output parameters : NONE
214 *
215 * Global data : fw_controlData : request to be processed
216 *
217 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
218 void fw_ep0TxDone(void)
219 {
\ fw_ep0TxDone:
\ 00000000 70B5 PUSH {R4-R6,LR}
220 USHORT _i = fw_controlData.wLength - fw_controlData.wCount;
\ 00000002 .... LDR R4,??DataTable4 ;; fw_controlData
\ 00000004 6089 LDRH R0,[R4, #+10]
\ 00000006 2189 LDRH R1,[R4, #+8]
\ 00000008 0D1A SUB R5,R1,R0
\ 0000000A 2D04 LSL R5,R5,#+16
\ 0000000C 2D0C LSR R5,R5,#+16
221
222 /* if the command is not finish */
223 if( fw_controlData.state != FW_STATE_END)
\ 0000000E 217B LDRB R1,[R4, #+12]
\ 00000010 0029 CMP R1,#+0
\ 00000012 1ED0 BEQ ??fw_ep0TxDone_0
224 {
225 /* if the size of the transfer is longer than the max packet */
226 if( _i >= FW_EP0_MAXPACKET_SIZE)
\ 00000014 2169 LDR R1,[R4, #+16]
\ 00000016 0918 ADD R1,R1,R0
\ 00000018 082D CMP R5,#+8
\ 0000001A 07D3 BCC ??fw_ep0TxDone_1
227 {
228 fw_writeEndpoint(FW_EP_CTRL, fw_controlData.pData + fw_controlData.wCount, FW_EP0_MAXPACKET_SIZE);
\ 0000001C 0822 MOV R2,#+8
\ 0000001E 0020 MOV R0,#+0
\ 00000020 ........ _BLF fw_writeEndpoint,??fw_writeEndpoint??rT
229 fw_controlData.wCount += FW_EP0_MAXPACKET_SIZE;
\ 00000024 6089 LDRH R0,[R4, #+10]
\ 00000026 0830 ADD R0,#+8
\ 00000028 6081 STRH R0,[R4, #+10]
\ 0000002A 12E0 B ??fw_ep0TxDone_0
230 }
231 /* else if there are something to send */
232 else
233 {
234 if( _i != 0)
\ ??fw_ep0TxDone_1:
\ 0000002C 0026 MOV R6,#+0
\ 0000002E 281C MOV R0,R5
\ 00000030 08D0 BEQ ??fw_ep0TxDone_2
235 {
236 fw_writeEndpoint(FW_EP_CTRL, fw_controlData.pData + fw_controlData.wCount, _i);
\ 00000032 2A06 LSL R2,R5,#+24
\ 00000034 120E LSR R2,R2,#+24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -