⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 std1.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
📖 第 1 页 / 共 4 页
字号:
        MOV     A,LOW EndSend                   ;
        MOV     ReturnAddr,A                    ; 设定ReturnAddr=EndSend
        JMP     ReadEntityAndSendCnf            ; 读取Report table

        ;----------------------------------------------------------------------
        ; Remark : FIFO_OUTx被填满或某一个Descriptor被读完之後要做的动作
        ;----------------------------------------------------------------------
ReadTASTag:
        SET     bFLAG_RsqF                      ; 若是FIFO_OUTx被填满,则设定bFLAG_RsqF=1(代表Send Request)

ReadNextCnfLp:
        CLR     bFLAG_SndFC                     ; 设定bFLAG_SndFC=0(代表clear continue send flag)
        SZ      TableLength                     ; 检查是否Finished read某一Descriptor?
        JMP     ReadAgain                       ; No,跳到ReadAgain

        MOV     A,ReturnAddr                    ; Yes,跳到先前设定的ReturnAddr
std_des_end_pcl:
        MOV     PCL,A                           ; Return

;----------------------------------------------------------------------------------------------
; Remark : 不作处理的STD command
;----------------------------------------------------------------------------------------------
GetInterface:
        JMP     ToStallPipe0                    ; 不作处理
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetInterface:
        jmp     TOstallpipe0                    ; 不作处理
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SynchFrame:     ;No support
        JMP     ToStallPipe0                    ; 不作处理
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

;------------------------------------------------------------------------------
; Remark : Get configuration(属於Standard request)--回传一个byte显示device是否SetConfiguration过
;------------------------------------------------------------------------------
GetConfiguration:
        SNZ     FIFO_Type.@Setup_D              ; 检查是否FIFO_Type.Setup_D=1(device to host)?
        JMP     ToStallPipe0                    ; No:Error

        SZ      FIFO_wLengthH                   ; 检查是否wLengthH == 0 ?
        JMP     ToStallPipe0                    ; No:Error

        MOV     A,01H                           ;
        XOR     A,FIFO_wLengthL                 ; 检查是否wLengthL == 1 ?
        SNZ     Z                               ;
        JMP     ToStallPipe0                    ; No:Error

        clr     FIFO_out1                       ; 设定FIFO_OUT1=00
        sz      bcfgvalue                       ; 检查是否bCfgValue=0(若SetConfiguration过,则bCfgValue=1)
        set     FIFO_OUT1.0                     ; 设定FIFO_OUT1=01
        MOV     A,01H                           ; 设定FIFO_SendLen=1
        MOV     FIFO_SendLen,A                  ;
        jmp     RequestResponse                 ; 送出固定长度(FIFO_SendLen)的data到Host

;------------------------------------------------------------------------------
; Remark : Set feature(属於Standard request)
;------------------------------------------------------------------------------
SetFeature:
        SZ      FIFO_wValueH                    ; 检查是否wValueH == 0 ?
        JMP     ToStallPipe0                    ; No, Error

        SZ      FIFO_wIndexH                    ; 检查是否wIndexH == 0 ?
        JMP     ToStallPipe0                    ; No, Error

        MOV     A,FIFO_Type                     ; Type (Device, Interface or Endpoint)
        AND     A,Setup_Rev                     ; 取出RequestType的Recipient栏位
        MOV     TEMP,A                          ; TEMP=RequestType的Recipient栏位
        SUB     A,04H                           ; 检查是否Over 4 item?
        SZ      Z                               ; No: Continue
        JMP     ToStallPipe0                    ; Yes: Error
        ;!!!!! Need in same page
        MOV     A,TEMP                          ;
set_feature_pcl_5:
        ADDM    A,PCL                           ;
        JMP     DeviceStatusSF                  ; 处理Recipient=Device
        JMP     TostallPipe0                    ; 不处理Recipient=Interface
        JMP     EndpointStatusSF                ; 处理Recipient=Endpoint
        JMP     ToStallPipe0                    ; 不处理Recipient=Other

        ;----------------------------------------------------------------------
        ; Remark : Set endpoint feature(属於Standard request)--针对Endpoint来设定remote wakeup(clear stall flag)
        ;----------------------------------------------------------------------
EndpointStatusSF:                               ;
        SZ      FIFO_wValueL                    ; 检查是否FeatureSelector=(ENDPOINT_HALT=0)?
        JMP     ToStallPipe0                    ; No, Error

        MOV     A,FIFO_wIndexL                  ; 取出endpoint number
        and     a,01111111b                     ;
        SUB     A,FIFO_temp                     ; 检查是否合法(Endpoint number不得大於ENDPOINT_NO)
        SZ      C                               ;
        JMP     ToStallPipe0                    ; No, Error

        MOV     A,FIFO_wIndexL                  ;Get endpoint number
        AND     A,0FH                           ;  Ignore direction
        call    GetPipeBit                      ;
        CALL    SetStall                        ;Set endpoint stall
        JMP     SendHandshake                   ;send handshake flag

        ;----------------------------------------------------------------------
        ; Remark : Set device feature(属於Standard request)--针对device设定remote wakeup
        ;----------------------------------------------------------------------
DeviceStatusSF:                                 ;
        MOV     A,FIFO_wValueL                  ; 检查是否FeatureSelector=(DEVICE_REMOTE_WAKEUP=1)?
        XOR     A,01H                           ;
        SNZ     Z                               ;
        JMP     ToStallPipe0                    ; No, Error

        SZ      FIFO_wIndexL                    ; 检查是否wIndex == 0(代表device) ?
        JMP     ToStallPipe0                    ; No, Error

        ;enable remote wakeup                   ; Yes
        SET     bRmtWakeup                      ; 设定bRmtWakeup=1(enable remote wakeup flag)
        rla     cmd_addr                        ;
        and     a,11111110b                     ;
        mov     fifo_addr,a                     ; (ADDR_Wake=fifo_addr.0) Set remote wakeup flag
        SET     fifo_addr.0                     ; 设定fifo_addr=USB device address,和remote wake flag状态

        ;----------------------------------------------------------------------
        ; Remark : 将fifo_addr写入USB_ADDR_WAKE Register
        ;----------------------------------------------------------------------
SetAddrWake:
        MOV     A,USB_ADDR_WAKE                 ; Address & Remote wakeup address
        MOV     MP1,A                           ; MP1=USB_ADDR_WAKE
        MOV     A,fifo_addr                     ; 写入USB_ADDR_WAKE Register
        MOV     R1,A                            ;
        JMP     SendHandshake                   ; 送出一个Zero-length packet到Host

;------------------------------------------------------------------------------
; Remark : Set configuration(属於Standard request)
;------------------------------------------------------------------------------
SetConfiguration:
        mov     a,1                             ;
        sub     a,FIFO_wValueL                  ; FIFO_wValueL=Configuration value
        snz     c                               ;
        jmp     ToStallPipe0                    ; Configuration value不是0(处於AddressState),就是1(ConfigurationDescriptor中的ConfiguraitonValue)

        clr     baddr_state                     ;
        snz     z                               ; 检查fifo_wvalueL=1(SetConfiguration的期待值)?
        set     baddr_state                     ; No,若没有收到SetConfiguration的期待值1,则将baddr_state=1

        mov     a,11110000b                     ;
        mov     STALL,a                         ; 清除所有STALL变数
        MOV     A,USB_STALL                     ;
        MOV     MP1,A                           ; 清除所有USB_STALL bit
        CLR     R1                              ;
        CLR     bFLAG_HvRpt                     ; 设定bFLAG_HvRpt=0(reset to nonreport)

        sz      FIFO_wValueL                    ; 检查fifo_wvalueL=0?
        jmp     set_cfg                         ;

        clr     bcfgvalue                       ; 清除bCfgValue=0,代表SetConfiguration尚未完成
        JMP     SendHandShake                   ; 送出一个Zero-length packet到Host

set_cfg:
        set     bcfgvalue                       ; 设定bCfgValue=1,代表SetConfiguration已经完成
        JMP     SendHandShake                   ; 送出一个Zero-length packet到Host

;------------------------------------------------------------------------------
; Remark : Get descriptor(属於Standard request)
;------------------------------------------------------------------------------
GetDescriptor:  ;No check bmRequestType D4..0
        SNZ     FIFO_Type.@Setup_D              ; 检查是否device to host?
        JMP     ToStallPipe0                    ; No:Error

        MOV     A,FIFO_Type                     ; only (device,interface & endpoint)
        AND     A,Setup_Rev                     ; 取出RequestType的Recipient栏位(Setup_Rev=00011111B)
        SUB     A,03H                           ;
        SZ      C                               ; 检查是否Over 3 item?
        JMP     ToStallPipe0                    ; Yes, Error

        mov     a,fifo_wlengthh                 ; fifo_wLengthH=Host所要求的Descriptor length High
        mov     lengthh,a                       ; lengthh=Host所要求的Descriptor length High
        mov     a,fifo_wlengthl                 ; fifo_wLengthL=Host所要求的Descriptor length Low
        mov     lengthl,a                       ; lengthl=Host所要求的Descriptor length Low

        MOV     A,LOW EndSend                   ;
        MOV     ReturnAddr,A                    ; 设定ReturnAddr=EndSend

        MOV     A,FIFO_Type                     ; RequestType的Recipient只允许Device(for standard request)
        and     a,00011110b                     ; 和Interface(for HID-class request)
        snz     z                               ; 检查是否为Device和Interface
        jmp     Tostallpipe0                    ; No, Error

        clr     brd_h_table                     ; 清除brd_h_table=0
        clr     des_count                       ; 清除des_count=0,用作descriptor的index
        sz      fifo_type.0                     ; 检查是否fifo_type.0=0(Recipient为Device)
        JMP     ClassDst_Interface              ; No(Recipient为Interface),跳到ClassDst_Interface(去处理GetHIDDescriptor和GetEntityDescriptor,
                                                ; (03-09-2004)因为HID和Entity(或称Report) descriptor是隶属於Interface阶层下的descriptor)
        ;----------------------------------------------------------------------
        ; Remark : GetDescriptor命令的Recipient若为Device,则要处理的descriptor
        ;          是Device, Configuration, String叁种descriptor(03-09-2004)
        ;----------------------------------------------------------------------
StandardDst:                                    ; 在Standard request中,只回应3种descriptor(DEVICE,CONFIGURATION,STRING)
        MOV     A,FIFO_wValueH                  ; Descriptor type(DEVICE,CONFIGURATION,STRING)
        AND     A,wValueH_Dst                   ; 取出Descriptor type(wValueH_Dst=00011111B)
        MOV     TEMP,A                          ;
        SUB     A,04H                           ; 检查是否Over 4 item ?
        SZ      C                               ;
        JMP     ToStallPipe0                    ; Yes, Error

        MOV     A,TEMP                          ; No
std_device_pcl_5:
        ADDM    A,PCL                           ;
        JMP     ToStallPipe0                    ; 不处理
        JMP     GetDeviceDes                    ; 处理Device descriptor
        JMP     GetConfigurationDes             ; 处理Configuration descriptor
        JMP     GetstringDes                    ; 处理String descriptor

;----------------------------------------------------------------------------------------------
; Remark : 将descriptor的内容读出来放到FIFO_OUTx,直到内容读完,或FIFO_OUTx空间填满为止
;----------------------------------------------------------------------------------------------
GetTableBeg:
        MOV     A,OFFSET FIFO_OUT1              ; Let MP0 pointer to FIFO_OUT1
        MOV     MP0,A                           ; MP0=FIFO_OUT1
        CLR     FIFO_SendLen                    ; 将FIFO_SendLen设为0
;Check whether all data is written
GetTableLp:
        sz      tablelength                     ; 检查是否TableLength=0
        jmp     read_data_again                 ; No

        MOV     A,LOW EndSend                   ;
        MOV     ReturnAddr,A                    ; 设定ReturnAddr=EndSend
        ret                                     ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -