CH552芯片汇编编程时USB设备地址设置失败求助
CH552汇编实现USB功能时设备地址设置异常排查求助
我正在用汇编语言给CH552芯片编程实现USB功能,遇到设备地址设置异常问题:usbmon日志显示设备可正常响应首次GET_DESCRIPTOR(设备)请求,但无法响应新地址的请求。以下是相关日志、系统输出及汇编代码,恳请协助排查。
1. usbmon日志(通过grep "80 06" -A1获取)
ffffa0bf9a27f8c0 416853100 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 416853225 C Ci:1:000:0 0 18 = 12010002 ffffff40 34127856 01000102 0301 -- ffffa0bf9a27f8c0 416979126 S Ci:1:073:0 s 80 06 0100 0000 0012 18 < ffffa0bf9a27f8c0 416979360 C Ci:1:073:0 -71 0 ffffa0bf9a27f8c0 416979386 S Ci:1:073:0 s 80 06 0100 0000 0012 18 < ffffa0bf9a27f8c0 416979618 C Ci:1:073:0 -71 0 ffffa0bf9a27f8c0 416979645 S Ci:1:073:0 s 80 06 0100 0000 0012 18 < ffffa0bf9a27f8c0 416979813 C Ci:1:073:0 -71 0 -- ffffa0bf9a27f8c0 417094197 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 417094349 C Ci:1:000:0 0 0 ffffa0bf9a27f8c0 417094372 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 417094481 C Ci:1:000:0 0 18 = 80060001 00004000 dd947856 01000102 0301 ffffa0bf9a27f8c0 417094489 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 417094648 C Ci:1:000:0 -71 0 -- ffffa0bf9a27f8c0 417313132 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 417313357 C Ci:1:000:0 -71 0 ffffa0bf9a27f8c0 417313384 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 417313581 C Ci:1:000:0 -71 0 ffffa0bf9a27f8c0 417313608 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < ffffa0bf9a27f8c0 417313777 C Ci:1:000:0 -71 0
2. dmesg输出片段(dmesg | tail)
[ 4512.616604] usb 1-2: new full-speed USB device number 73 using xhci_hcd [ 4512.743379] usb 1-2: device descriptor read/all, error -71 [ 4512.857686] usb 1-2: new full-speed USB device number 74 using xhci_hcd [ 4512.972745] usb 1-2: device descriptor read/64, error -71 [ 4513.190744] usb 1-2: device descriptor read/64, error -71 [ 4513.292877] usb usb1-port2: attempt power cycle [ 4513.680700] usb 1-2: new full-speed USB device number 75 using xhci_hcd [ 4513.680890] usb 1-2: Device not responding to setup address. [ 4513.885901] usb 1-2: Device not responding to setup address. [ 4514.092785] usb 1-2: device not accepting address 75, error -71 [ 4514.092896] usb 1-2: WARN: invalid context state for evaluate context command. [ 4514.206755] usb 1-2: new full-speed USB device number 76 using xhci_hcd [ 4514.206901] usb 1-2: Device not responding to setup address. [ 4514.412865] usb 1-2: Device not responding to setup address. [ 4514.620786] usb 1-2: device not accepting address 76, error -71 [ 4514.620908] usb 1-2: WARN: invalid context state for evaluate context command. [ 4514.620990] usb usb1-port2: unable to enumerate USB device
3. 汇编代码
b0 EQU 00000001b b1 EQU 00000010b b2 EQU 00000100b b3 EQU 00001000b b4 EQU 00010000b b5 EQU 00100000b b6 EQU 01000000b b7 EQU 10000000b ; GPIO p1_mod_oc EQU 092h p1_dir_pu EQU 093h p3_mod_oc EQU 096h p3_dir_pu EQU 097h ; SFRs dp EQU 082h ; Interrupts ; ie e_dis EQU b6 ie_ex EQU 0E8h ie_usb BIT ie_ex.2 ; Interrupt vectors int_no_usb EQU 043h ; USB usb_int_fg EQU 0D8h uif_transfer BIT usb_int_fg.1 usb_int_st equ 0D9h buis_token1 EQU b5 buis_token0 EQU b4 mask_uis_token EQU b5 OR b4 mask_uis_endp EQU b3 OR b2 OR b1 OR b0 usb_int_en EQU 0E1h buie_transfer EQU b1 usb_ctrl EQU 0E2h buc_sys_ctrl1 EQU b5 buc_sys_ctrl0 EQU b4 buc_dma_en EQU b0 usb_dev_ad EQU 0E3h udev_ctrl EQU 0D1h bud_port_en EQU b0 uep0_ctrl EQU 0DCh buep_r_tog EQU b7 buep_t_tog EQU b6 buep_r_res1 EQU b3 buep_r_res0 EQU b2 buep_t_res1 EQU b1 buep_t_res0 EQU b0 uep0_t_len EQU 0DDh uep0_dma_h EQU 0EDh uep0_dma_l EQU 0ECh uep0_dma EQU 0ECh ; Custom USB ; r0 buep0_stage EQU b0 ; r5 used to store tx length ; ============== MACROS ============== MOVW MACRO dest, src MOV dest, src MOV dest+1, src+1 ENDM MOVSX MACRO src MOV a, src MOVX @dptr, a INC dptr ENDM ADDBW MACRO dest, src MOV a, src ADD a, dest MOV dest, a JNC #2d INC dest+1 ENDM ; ============== CODE ============== vectors: ORG 000h LJMP start ORG int_no_usb LJMP usb_isr start: MOV p1_mod_oc, #00000000b MOV p1_dir_pu, #11110011b MOV p3_mod_oc, #00000000b MOV p3_dir_pu, #00000011b MOV r0, #0d MOV p1, #00000000b MOV p3, #00000000b SETB ea CLR e_dis SETB ie_usb ORL usb_int_en, #buie_transfer MOV usb_ctrl, #(buc_sys_ctrl1 OR buc_dma_en) MOV udev_ctrl, #bud_port_en loop: SJMP loop usb_isr: MOV a, usb_int_st ANL a, #mask_uis_token SWAP a RL a MOV dptr, #packet_type_jmptbl JMP @a+dptr packet_type_jmptbl: AJMP packet_out AJMP over AJMP packet_in AJMP packet_setup packet_out: MOV uep0_t_len, #0b AJMP over packet_in: MOV a, r0 JZ old_address MOV usb_dev_ad, a MOV a, usb_dev_ad old_address: AJMP over packet_setup: MOVW dp, uep0_dma INC dptr MOVX a, @dptr RL a MOV dptr, #brequest_jmptbl JMP @a+dptr brequest_jmptbl: AJMP over AJMP over AJMP over AJMP over AJMP over AJMP brequest_set_address AJMP brequest_get_descriptor AJMP over AJMP over AJMP over AJMP over AJMP over AJMP over brequest_get_descriptor: MOV a, #(NOT buep0_stage) ANL a, r0 XCH a, r0 MOV uep0_ctrl, #11000000b MOV uep0_t_len, #18d MOVW dp, uep0_dma MOVSX #18d MOVSX #1d MOVSX #000h MOVSX #002h MOVSX #0FFh MOVSX #0FFh MOVSX #0FFh MOVSX #64d MOVSX #034h MOVSX #012h MOVSX #078h MOVSX #056h MOVSX #001h MOVSX #000h MOVSX #1d MOVSX #2d MOVSX #3d MOVSX #1d AJMP over brequest_set_address: MOVW dp, uep0_dma INC dptr INC dptr MOVX a, @dptr MOV r0, a MOV uep0_ctrl, #11000000b MOV uep0_t_len, #0b AJMP over over: CLR uif_transfer RETI END
内容的提问来源于stack exchange,提问作者Boris Kaptsanov
相关产品推荐
相关产品推荐

