📄 fw_chap9.lst
字号:
148 /* clear TX stall for IN on EPn. */
149 USB_EVENT |= USB_EVENT_MASK_IN_STALL_CLEARED;
\ 0000003C 2025 MOV R5,#+32
\ 0000003E 1D43 ORR R5,R3
\ 00000040 1570 STRB R5,[R2, #+0]
150 /* Reset data toggle */
151 AT91F_UDP_ResetEp( USBDEV_BASE_UDP, USBDEV_UDP_EP1 ); // FW_EP_BULK_IN
\ 00000042 0222 MOV R2,#+2
\ 00000044 03E0 B ??fw_clearFeature_3
152 }
153 else
154 {
155 /* clear RX stall for OUT on EPn. */
156 USB_EVENT |= USB_EVENT_MASK_OUT_STALL_CLEARED;
\ ??fw_clearFeature_2:
\ 00000046 1025 MOV R5,#+16
\ 00000048 1D43 ORR R5,R3
\ 0000004A 1570 STRB R5,[R2, #+0]
157 /* Reset data toggle */
158 AT91F_UDP_ResetEp( USBDEV_BASE_UDP, USBDEV_UDP_EP2 ); // FW_EP_BULK_OUT
\ 0000004C 0422 MOV R2,#+4
\ ??fw_clearFeature_3:
\ 0000004E 0A60 STR R2,[R1, #+0]
\ 00000050 0860 STR R0,[R1, #+0]
159 }
160 AT91F_UDP_EnableEp( USBDEV_BASE_UDP,_endp );
\ 00000052 A000 LSL R0,R4,#+2
\ 00000054 0F49 LDR R1,??fw_clearFeature_1+0x4 ;; 0xfffb0000
\ 00000056 0818 ADD R0,R1,R0
\ 00000058 016B LDR R1,[R0, #+48]
\ 0000005A 8022 MOV R2,#+128
\ 0000005C 1202 LSL R2,R2,#+8 ;; #+32768
\ 0000005E 0A43 ORR R2,R1
\ 00000060 0263 STR R2,[R0, #+48]
161
162 fw_singleTransmit(0, 0);
\ ??fw_clearFeature_4:
\ 00000062 0021 MOV R1,#+0
\ 00000064 0020 MOV R0,#+0
\ 00000066 ........ BL fw_singleTransmit
\ 0000006A 0EE0 B ??fw_clearFeature_5
163 }
164 else
165 {
166 if(fw_controlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
\ ??fw_clearFeature_0:
\ 0000006C 0128 CMP R0,#+1
\ 0000006E 04D1 BNE ??fw_clearFeature_6
167 {
168 stallEndpointStatus &= ~(1<<4);
\ 00000070 3078 LDRB R0,[R6, #+0]
\ 00000072 EF21 MOV R1,#+239
\ 00000074 0140 AND R1,R0
\ 00000076 3170 STRB R1,[R6, #+0]
169 fw_singleTransmit(0, 0);
\ 00000078 F3E7 B ??fw_clearFeature_4
170 }
171 else
172 {
173 TRACE_DEBUG_H( "stall\n\r");
174 fw_stallEp0();
\ ??fw_clearFeature_6:
\ 0000007A 0121 MOV R1,#+1
\ 0000007C 0020 MOV R0,#+0
\ 0000007E ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
175 stallEndpointStatus &= ~(1<<FW_EP_CTRL);
\ 00000082 3078 LDRB R0,[R6, #+0]
\ 00000084 FE21 MOV R1,#+254
\ 00000086 0140 AND R1,R0
\ 00000088 3170 STRB R1,[R6, #+0]
176 }
177 }
178 }
\ ??fw_clearFeature_5:
\ 0000008A 70BC POP {R4-R6}
\ 0000008C 01BC POP {R0}
\ 0000008E 0047 BX R0 ;; return
\ ??fw_clearFeature_1:
\ 00000090 2800FBFF DC32 0xfffb0028
\ 00000094 0000FBFF DC32 0xfffb0000
179
180
181 /*****************************************************************
182 *
183 * ROUTINE fw_getConfiguration
184 *
185 *-----------------------------------------------------------------
186 *
187 * Purpose :
188 * 9.4.2 Get Configuration ( GET_CONFIGURATION )
189 * This request returns the current device configuration value.
190 *
191 * Input parameters : NONE
192 *
193 * Output parameters : NONE
194 *
195 * Global data : fw_deviceState : bitmap for different device caracteristics
196 *
197 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
198 void fw_getConfiguration(void)
199 {
\ fw_getConfiguration:
\ 00000000 01B5 PUSH {R0,LR}
200 UCHAR _c = fw_deviceState & FW_DS_CONFIG; /* only one configuration */
\ 00000002 6846 MOV R0,SP
\ 00000004 .... LDR R1,??DataTable13 ;; fw_deviceState
\ 00000006 0978 LDRB R1,[R1, #+0]
\ 00000008 0122 MOV R2,#+1
\ 0000000A 0A40 AND R2,R1
\ 0000000C 0270 STRB R2,[R0, #+0]
201
202 TRACE_DEBUG_H( "getConf\n\r");
203 fw_singleTransmit(&_c, 1);
\ 0000000E .... B ?Subroutine15
204 }
\ In segment CODE, align 4, keep-with-next
\ ?Subroutine15:
\ 00000000 0121 MOV R1,#+1
\ 00000002 ........ BL fw_singleTransmit
\ 00000006 08BC POP {R3}
\ 00000008 01BC POP {R0}
\ 0000000A 0047 BX R0 ;; return
205
206
207 /*****************************************************************
208 *
209 * ROUTINE fw_getDescriptor
210 *
211 *-----------------------------------------------------------------
212 *
213 * Purpose :
214 * 9.4.3 Get Descriptor ( GET_DESCRIPTOR )
215 * This request returns the specified descriptor if the descriptor exists.
216 *
217 * Input parameters : NONE
218 *
219 * Output parameters : NONE
220 *
221 * Global data : fw_device
222 * fw_config
223 * fw_controlData : request to be processed
224 *
225 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
226 void fw_getDescriptor(void)
227 {
\ fw_getDescriptor:
\ 00000000 00B5 PUSH {LR}
228 UCHAR _bDescriptor = fw_controlData.DeviceRequest.wValue >> 8;
\ 00000002 .... LDR R0,??DataTable7 ;; fw_controlData + 2
\ 00000004 0088 LDRH R0,[R0, #+0]
\ 00000006 010A LSR R1,R0,#+8
229
230 if (_bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE)
\ 00000008 0848 LDR R0,??fw_getDescriptor_0 ;; fw_device
\ 0000000A 0129 CMP R1,#+1
\ 0000000C 03D1 BNE ??fw_getDescriptor_1
231 {
232 fw_codeTransmit((UCHAR *)&fw_device, sizeof(USB_DEVICE_DESCRIPTOR));
\ 0000000E 1221 MOV R1,#+18
\ ??fw_getDescriptor_2:
\ 00000010 ........ BL fw_codeTransmit
\ 00000014 08E0 B ??fw_getDescriptor_3
233 }
234 else
235 {
236 if (_bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE)
\ ??fw_getDescriptor_1:
\ 00000016 0229 CMP R1,#+2
\ 00000018 02D1 BNE ??fw_getDescriptor_4
237 {
238 fw_codeTransmit((UCHAR *)&fw_config, sizeof(FW_FULL_CONFIG_DESCRIPTOR));
\ 0000001A 2021 MOV R1,#+32
\ 0000001C 1430 ADD R0,#+20
\ 0000001E F7E7 B ??fw_getDescriptor_2
239 }
240 else
241 {
242 TRACE_ERROR( "stalled\n\r");
243 fw_stallEp0();
\ ??fw_getDescriptor_4:
\ 00000020 0121 MOV R1,#+1
\ 00000022 0020 MOV R0,#+0
\ 00000024 ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
244 }
245 }
246 }
\ ??fw_getDescriptor_3:
\ 00000028 01BC POP {R0}
\ 0000002A 0047 BX R0 ;; return
\ ??fw_getDescriptor_0:
\ 0000002C ........ DC32 fw_device
247
248
249 /*****************************************************************
250 *
251 * ROUTINE fw_getInterface
252 *
253 *-----------------------------------------------------------------
254 *
255 * Purpose :
256 * 9.4.4 Get Interface ( GET_INTERFACE )
257 * This request returns the selected alternate setting for the specified interface.
258 *
259 * Input parameters : NONE
260 *
261 * Output parameters : NONE
262 *
263 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
264 void fw_getInterface(void)
265 {
\ fw_getInterface:
\ 00000000 01B5 PUSH {R0,LR}
266 UCHAR _txdat = 0; /* Only one alternate settings per interface = 0 */
\ 00000002 6846 MOV R0,SP
\ 00000004 0021 MOV R1,#+0
\ 00000006 0170 STRB R1,[R0, #+0]
267
268 TRACE_DEBUG_H( "getInt\n\r");
269 fw_singleTransmit(&_txdat, 1);
\ 00000008 REQUIRE ?Subroutine15
\ 00000008 ;; // Fall through to label ?Subroutine15
270 }
271
272
273 /*****************************************************************
274 *
275 * ROUTINE fw_getStatus
276 *
277 *-----------------------------------------------------------------
278 *
279 * Purpose :
280 * 9.4.5 Get Status ( GET_STATUS )
281 * This request returns status for the specified recipient.
282 *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -