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

📄 usb_int.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:

        ;----------------------------------------------------------------------
        ; Remark : 前次USB_INT已经收到Setup command,这次的IN要把command接收进来
        ;----------------------------------------------------------------------
HaveDataInFIFO0:
        JMP     DataStage               ; No (data stage(Host to device)

;-----------------------------------------------------------------------------------------
        ;----------------------------------------------------------------------
        ; Remark : 将Setup command的资料接收进来
        ;----------------------------------------------------------------------
get_cmd_data:
        clr     bsetup_flag             ; 清除bsetup_flag=0
        CALL    FIFO0_Rd_Check          ; Any data in FIFO 0 ?
        CALL    ReadFIFO0               ; 资料接进来Read FIFO 0

        clr     acc                     ;
        call    GetPipeBit              ;
        call    clearstall              ; clear pipe0 stall status

        CLR     bFLAG_SndFC             ; No Continue Send(ReadNextCnf)
        CLR     bFLAG_RsqF              ; Clear re_send Flag
        CLR     bCMD_INDEX              ; set Return address to 0
        clr     bhas_data_out_previous  ;
        clr     bhas_data_out_previous1 ;
        clr     bhas_data_out_previous2 ;

        MOV     A,LOW GetEnd            ; Set Defaut Return Address
        MOV     ReturnAddr,A            ; to ReturnAddr
;parsing request command & set command index
        MOV     A,08H                   ; Request structure == 8 bytes ?
        XOR     A,FIFO_SendLen          ;
        SNZ     Z                       ;
        JMP     ToStallPipe0            ; No: data length is invalid

        ;----------------------------------------------------------------------
        ; Remark : 分析Setup command    ; Yes: Parsing  command
        ;----------------------------------------------------------------------
        MOV     A,Setup_Type            ; Type
        AND     A,FIFO_Type             ; Request Type
;!!!!! Need in same page
        SWAP    ACC                     ; Need be change when Setup_Type
        RR      ACC                     ; changed
usb_request_pcl_5:
        ADDM    A,PCL                   ;
        JMP     StandardRequest         ; Standard Request
        JMP     ClassRequest            ; Class Specific Request
        JMP     ToStallPipe0            ; No support Vendor Request
        JMP     ToStallPipe0            ; Illegal
;----------------------------------------------------------------------------
;Host has read data out from FIFO 0
SendFIFO0:
        sz      bsetup_flag             ; 若前次USB_INT看到了Setup command,则放弃Send_FIFO0
        JMP     ExitExt0                ;

        ;----------------------------------------------------------------------
        ; Remark : 检查FIFO0是否ready可以写资料出去
        ;----------------------------------------------------------------------
        CALL    FIFO0_Wr_Check          ; examine whether FIFO0 has data?
        clr     r1.@USB_Req             ;
        SZ      Z                       ; FIFO0 ready
        JMP     ExitExt0                ; Not ready,则ExitExt0

        ;----------------------------------------------------------------------
        ; Remark : FIFO0 ready可以写data出去,检查是否有data要送出出去
        ;----------------------------------------------------------------------
NoneTag:
        SnZ     bFLAG_SndFC             ; Continue Send (ReadNextCnf)
        JMP     ExitExt0                ;

        snz     bhas_data_out_previous  ; 检查前一批data是否已经被Host拿走了(bhas_data_out_previous=0)
        JMP     ReadNextCnf             ; 读取下一批data

        clr     bhas_data_out_previous  ; 确定前一批data真的被Host拿走了(将bhas_data_out_previous=0)
        jmp     ExitExt0                ;
;----------------------------------------------------------------------------
DataStage:
        ;----------------------------------------------------------------------
        ; Remark : 可能前次USB_INT收到了Setup command
        ;----------------------------------------------------------------------
        sz      bsetup_flag             ; 判断前次是否收到了Setup command
        JMP     get_cmd_data            ; 若有,则跳到get_cmd_data将Setup command收进来

        ;----------------------------------------------------------------------
        ; Remark : 可能前次USB_INT收到了SetupReport的命令
        ;----------------------------------------------------------------------
        CALL    FIFO0_Rd_Check          ; Any data in FIFO 0 ?
        CALL    ReadFIFO0               ; Read FIFO 0
        sz      bCMD_INDEX              ; (若前次USB_INT收到了SetReport的命令,则会将bCMD_INDEX设为1)
        jmp     Set_SetOutput           ; 若前次USB_INT收到了SetupReport的命令,则跳到Set_SetOutput把SetReport的命令收进来
        jmp     RedundantData           ; 若前次USB_INT没有收到了SetupReport的命令,则不须理会收到的data

RedundantData:
        JMP     ExitExt0                ;

Set_SetOutput:
        JMP     ToStallPipe0            ; No
;----------------------------------------------------------------------------
RequestResponse:
        CLR     bFLAG_RsqF              ;
        CALL    FIFO0_Wr_Check          ; Ready to response ?
        SNZ     Z                       ;
        JMP     CanResponse

        clr     r1.@USB_Req             ;
        sz      r1.@usb_len0            ;
        JMP     ExitExt0                ; continue to scan keyboard
        sz      r1.@USB_Setup           ;
        jmp     ExitExt0                ; continue to scan keyboard
        jmp     RequestResponse         ;

CanResponse:
        CALL    WriteFIFO0              ;
        set     bhas_data_out_previous  ;
        set     bhas_data_out_previous1 ;
        set     bhas_data_out_previous2 ;
        jmp     ExitExt0                ;

;----------------------------------------------------------------------------
SendHandShake:
        CALL    LEN0_Wr_Check           ; FIFO0 ready ?
        SnZ     Z                       ;
        jmp     sendHandShake_continue  ;

        clr     r1.@USB_Req             ;
        sz      r1.@usb_len0            ;
        JMP     ExitExt0                ; continue to scan keyboard

        sz      r1.@USB_Setup           ;
        jmp     ExitExt0                ; continue to scan keyboard
        jmp     sendHandshake           ;

sendHandshake_continue:
        CALL    WriteLen0               ; ACK (Write 0 length)
;        SZ      bFLAG_FIFO_REDY         ;
;        SET     bFLAG_AdrF              ; the address response is written to FIFO
;        CLR     bFLAG_FIFO_REDY         ;
        set     bwait_setup             ;
        JMP     ExitExt0                ; continue to scan keyboard

;----------------------------------------------------------------------------
SendFIFOOut:
        MOV     FIFO_SendLen ,A         ; data length to send
        set     bwait_setup             ;
        jmp     RequestResponse         ;
;----------------------------------------------------------------------------
ToStallPipe0:
;------------------------------------------------------------------------------
        clr     acc                     ;
        call    GetPipeBit              ; 使得ACC的bit 0设成1(ACC=00000001B)
        call    setstall                ; 设STALL.0=0,将Endpoint 0 STALL住
ExitExt:
ExitExt0:
        clr     Int_reg.@int0           ;clr pipe0 int flag
        jmp     Exit_of_Ext_start       ;
;------------------------------------------------------------------------------
;        MOV     A,USB_STALL             ; MP1 point to Stall register (Read Only)
;        MOV     MP1,A                   ; MP1=USB_STALL address
;        clr     Int_reg.@int0           ; 清除Int_reg.@int0=0
;
;wait_Int0_int0:
;        clr     wdt                     ;
;        snz     Int_reg.@int0           ; 等到下一次Int_reg.@int0=1
;        jmp     wait_Int0_int0          ;
;
;        set     stall.0                 ;
;        set     r1.0                    ; 将Endpoint 0 STALL住
;
;        clr     Int_reg.@int0           ; 清除Int_reg.@int0=0
;
;wait_Int0_int1:
;        clr     wdt                     ;
;        snz     Int_reg.@int0           ; 等到下一次Int_reg.@int0=1
;        jmp     wait_Int0_int1          ;
;
;        clr     stall.0                 ;
;        clr     r1.0                    ; 将Endpoint 0 STALL打开
;ExitExt:
;ExitExt0:
;        clr     Int_reg.@int0           ;clr pipe0 int flag
;        jmp     Exit_of_Ext_start       ;
;----------------------------------------------------------------------------
Check_Pipe1:
AccessFIFO1:
        sz      bCMD_INDEX              ;Reset to 0
        jmp     ExitExt1

        CALL    FIFO1_Wr_Check          ;FIFO0 ready ?
        clr     r1.@USB_Req
        SZ      Z                       ;
        JMP     ExitExt1

        sz      F_MouseChange
        jmp     report_pipe1_data
        jmp     ExitExt1

report_pipe1_data:
        clr     F_MouseChange
        Call    MoveMouseData

out_fifo1_data:
        CALL    FIFO1_Wr_Check          ;FIFO0 ready ?
        mov     a, MOUSE_STATUS_SIZE    ;
        mov     FIFO_SendLen,a
        CALL    WriteFIFO1

        clr     btime_out_KB
        clr     TempKBTime
        clr     tempkbtime_L

ExitExt1:
        clr     int_reg.@int1
        clr     int_reg_temp.@int1
        JMP     Exit_of_Ext_start

;----------------------------------------------------------------------------
Check_Pipe2:
AccessFIFO2:
        sz      bCMD_INDEX              ;Reset to 0
        jmp     ExitExt2

ExitExt2:
        clr     int_reg.@int2
        clr     int_reg_temp.@int2
        JMP     Exit_of_Ext_start

;----------------------------------------------------------------------------
Check_Pipe3:
AccessFIFO3:
        clr     int_reg.@int3
        clr     int_reg_temp.@int3
        JMP     Exit_of_Ext_start
;----------------------------------------------------------------------------
public  ToStallPipe0
public  SendFIFOOut
public  SendHandShake
public  RequestResponse
public  usb_request_pcl_5
public  ext_start
public  ExitExt
        END

⌨️ 快捷键说明

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