📄 fw_chap9.lst
字号:
283 * Input parameters : NONE
284 *
285 * Output parameters : NONE
286 *
287 * Global data : fw_controlData : request to be processed
288 *
289 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
290 void fw_getStatus(void)
291 {
\ fw_getStatus:
\ 00000000 11B5 PUSH {R0,R4,LR}
292 UCHAR _endp = 0, _txdat[2];
293 UCHAR _bRecipient = fw_controlData.DeviceRequest.bmRequestType & FW_USB_RECIPIENT;
294 /* UCHAR _c = 0; */
295
296 TRACE_DEBUG_H( "fw_getStatus\n\r");
297 switch(_bRecipient)
\ 00000002 .... LDR R0,??DataTable11 ;; stallEndpointStatus
\ 00000004 0078 LDRB R0,[R0, #+0]
\ 00000006 0021 MOV R1,#+0
\ 00000008 0322 MOV R2,#+3
\ 0000000A .... LDR R3,??DataTable12 ;; fw_controlData
\ 0000000C 1C78 LDRB R4,[R3, #+0]
\ 0000000E E406 LSL R4,R4,#+27
\ 00000010 E40E LSR R4,R4,#+27
\ 00000012 04D0 BEQ ??fw_getStatus_0
\ 00000014 012C CMP R4,#+1
\ 00000016 0ED0 BEQ ??fw_getStatus_1
\ 00000018 022C CMP R4,#+2
\ 0000001A 0FD0 BEQ ??fw_getStatus_2
\ 0000001C 1BE0 B ??fw_getStatus_3
298 {
299 case FW_USB_RECIPIENT_DEVICE:
300 // A GetStatus() request to a device returns the information shown in Figure 9-4.
301 // DO=1 : Self powered
302 // D1=1 : Remote Wakeup
303 _txdat[0] = 0; /* bus powered */
\ ??fw_getStatus_0:
\ 0000001E 6B46 MOV R3,SP
\ 00000020 1970 STRB R1,[R3, #+0]
304 if( (stallEndpointStatus&(1<<4)) == (1<<4) )
\ 00000022 C006 LSL R0,R0,#+27
\ 00000024 01D5 BPL ??fw_getStatus_4
305 {
306 _txdat[0] = 3; /* remote wakeup */ // jcb
\ 00000026 6846 MOV R0,SP
\ ??fw_getStatus_5:
\ 00000028 0270 STRB R2,[R0, #+0]
307 }
308 _txdat[1] = 0;
\ ??fw_getStatus_4:
\ 0000002A 6846 MOV R0,SP
\ 0000002C 4170 STRB R1,[R0, #+1]
309 fw_singleTransmit(_txdat, 2);
\ 0000002E 0221 MOV R1,#+2
\ 00000030 ........ BL fw_singleTransmit
\ 00000034 13E0 B ??fw_getStatus_6
310 break;
311
312 case FW_USB_RECIPIENT_INTERFACE:
313 // A GetStatus() request to an interface returns the information shown in Figure 9-5.
314 // All are set to 0
315 _txdat[0]=0;
\ ??fw_getStatus_1:
\ 00000036 6846 MOV R0,SP
\ 00000038 0170 STRB R1,[R0, #+0]
\ 0000003A F6E7 B ??fw_getStatus_4
316 _txdat[1]=0;
317 fw_singleTransmit(_txdat, 2);
318 break;
319
320 case FW_USB_RECIPIENT_ENDPOINT:
321 // A GetStatus() request to an endpoint returns the information shown in Figure 9-6.
322 // D0=1 : HALT
323 _endp = (UCHAR)(fw_controlData.DeviceRequest.wIndex & (FW_EP_CTRL | FW_EP_BULK_IN | FW_EP_BULK_OUT));
\ ??fw_getStatus_2:
\ 0000003C 9B88 LDRH R3,[R3, #+4]
\ 0000003E 1A40 AND R2,R3
324 _txdat[0] = 0;
\ 00000040 6B46 MOV R3,SP
\ 00000042 1970 STRB R1,[R3, #+0]
325 if( (1<<_endp) == (stallEndpointStatus&(1<<_endp)) )
\ 00000044 0123 MOV R3,#+1
\ 00000046 9340 LSL R3,R2
\ 00000048 1A1C MOV R2,R3
\ 0000004A 0240 AND R2,R0
\ 0000004C 9342 CMP R3,R2
\ 0000004E ECD1 BNE ??fw_getStatus_4
326 {
327 _txdat[0] = 1;
\ 00000050 6846 MOV R0,SP
\ 00000052 0122 MOV R2,#+1
\ 00000054 E8E7 B ??fw_getStatus_5
328 }
329 _txdat[1] = 0;
330 fw_singleTransmit(_txdat, 2);
331 break;
332
333 default:
334 TRACE_DEBUG_H( "getSt:default\n\r");
335 fw_stallEp0();
\ ??fw_getStatus_3:
\ 00000056 0121 MOV R1,#+1
\ 00000058 0020 MOV R0,#+0
\ 0000005A ........ _BLF fw_setEndpointStatus,??fw_setEndpointStatus??rT
336 }
337 }
\ ??fw_getStatus_6:
\ 0000005E 18BC POP {R3,R4}
\ 00000060 01BC POP {R0}
\ 00000062 0047 BX R0 ;; return
338
339
340 /*****************************************************************
341 *
342 * ROUTINE fw_setAddress
343 *
344 *-----------------------------------------------------------------
345 *
346 * Purpose :
347 * 9.4.6 Set Address ( SET_ADDRESS )
348 * This request sets the device address for all future device accesses.
349 *
350 * Input parameters : NONE
351 *
352 * Output parameters : NONE
353 *
354 * Global data : fw_controlData : request to be processed
355 *
356 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
357 void fw_setAddress(void)
358 {
\ fw_setAddress:
\ 00000000 00B5 PUSH {LR}
359 fw_singleTransmit(0,0);
\ 00000002 0021 MOV R1,#+0
\ 00000004 0020 MOV R0,#+0
\ 00000006 ........ BL fw_singleTransmit
360
361 fw_AskValidateAddress = fw_controlData.DeviceRequest.wValue & FW_DEVICE_ADDRESS_MASK;
\ 0000000A 0448 LDR R0,??fw_setAddress_0 ;; fw_AskValidateAddress
\ 0000000C .... LDR R1,??DataTable7 ;; fw_controlData + 2
\ 0000000E 0988 LDRH R1,[R1, #+0]
\ 00000010 4906 LSL R1,R1,#+25
\ 00000012 490E LSR R1,R1,#+25
\ 00000014 0170 STRB R1,[R0, #+0]
362 }
\ 00000016 01BC POP {R0}
\ 00000018 0047 BX R0 ;; return
\ 0000001A C046 NOP
\ ??fw_setAddress_0:
\ 0000001C ........ DC32 fw_AskValidateAddress
363
364
365 /*****************************************************************
366 *
367 * ROUTINE fw_setConfiguration
368 *
369 *-----------------------------------------------------------------
370 *
371 * Purpose :
372 * 9.4.7 Set Configuration ( SET_CONFIGURATION )
373 * This request sets the device configuration.
374 *
375 * Input parameters : NONE
376 *
377 * Output parameters : NONE
378 *
379 * Global data : fw_controlData : request to be processed
380 * fw_device_state : bitmap for different device caracteristics
381 *
382 *****************************************************************/
\ In segment CODE, align 4, keep-with-next
383 void fw_setConfiguration(void)
384 {
\ fw_setConfiguration:
\ 00000000 F0B5 PUSH {R4-R7,LR}
385 int _i = 0;
\ 00000002 0024 MOV R4,#+0
\ 00000004 2448 LDR R0,??fw_setConfiguration_0 ;; fw_controlData + 2
\ 00000006 0088 LDRH R0,[R0, #+0]
\ 00000008 .... LDR R5,??DataTable13 ;; fw_deviceState
\ 0000000A 244E LDR R6,??fw_setConfiguration_0+0x4 ;; 0xfffb0004
\ 0000000C 244F LDR R7,??fw_setConfiguration_0+0x8 ;; 0xfffb0030
\ 0000000E 0028 CMP R0,#+0
\ 00000010 17D1 BNE ??fw_setConfiguration_1
386
387 if (fw_controlData.DeviceRequest.wValue == 0)
388 {
389 /* status phase */
390 fw_singleTransmit(0, 0);
\ 00000012 0021 MOV R1,#+0
\ 00000014 201C MOV R0,R4
\ 00000016 ........ BL fw_singleTransmit
391
392 while( !( AT91F_UDP_EpStatus( USBDEV_BASE_UDP, FW_EP_CTRL ) & USBDEV_UDP_TXCOMP )
393 && (_i++ < 10));
\ ??fw_setConfiguration_2:
\ 0000001A 3868 LDR R0,[R7, #+0]
\ 0000001C C007 LSL R0,R0,#+31
\ 0000001E 03D4 BMI ??fw_setConfiguration_3
\ 00000020 201C MOV R0,R4
\ 00000022 641C ADD R4,R4,#+1
\ 00000024 0A28 CMP R0,#+10
\ 00000026 F8DB BLT ??fw_setConfiguration_2
394
395 #ifndef AT91SAM9265
396 USBDEV_BASE_UDP->UDP_GLBSTATE &= ~USBDEV_UDP_CONFG;
\ ??fw_setConfiguration_3:
\ 00000028 3068 LDR R0,[R6, #+0]
\ 0000002A 0221 MOV R1,#+2
\ 0000002C 8843 BIC R0,R1
\ 0000002E 3060 STR R0,[R6, #+0]
397 #else
398 USBDEV_BASE_UDP->UDPHS_CTRL &= ~AT91C_EN_USB;
399 #endif
400
401 /* mark the device as unconfigured */
402 fw_deviceState = (UCHAR)~FW_DS_CONFIG;
\ 00000030 FE20 MOV R0,#+254
\ 00000032 2870 STRB R0,[R5, #+0]
403
404 /* Disable all endpoints but EPP0. */
405 fw_resetEP(FW_EP_BULK_IN);
\ 00000034 0120 MOV R0,#+1
\ 00000036 ........ _BLF fw_resetEP,??fw_resetEP??rT
406 fw_resetEP(FW_EP_BULK_OUT);
\ 0000003A 0220 MOV R0,#+2
\ 0000003C ........ _BLF fw_resetEP,??fw_resetEP??rT
\ 00000040 27E0 B ??fw_setConfiguration_4
407 }
408 else
409 {
410 if (fw_controlData.DeviceRequest.wValue == 1)
\ ??fw_setConfiguration_1:
\ 00000042 0128 CMP R0,#+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -