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

📄 usb_int.asm

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

include         ht82k96e.inc
include         usbFIFO.inc

;"FIFO_type"
@Setup_D                EQU     7       ;direction
@INTERFACE              EQU     0
Setup_Type              EQU     60H     ;Type
Setup_Rev               EQU     1FH     ;Recipient  (Just use 2 bits)
wValueH_Typ             EQU     60H     ;D6..5  Type: 0-Standard, 1-Class, 2-Vendor
wValueH_Dst             EQU     1FH     ;

MOUSE_STATUS_SIZE       EQU     4       ;

extern          bFLAG_SndFC             :bit                    ;has control pipe data to transmitter
extern          bFLAG_Setup             :bit
extern          bFLAG_FIFO_REDY         :bit
extern          bFLAG_RsqF              :bit
extern          bFLAG_AdrF              :bit
extern          bRmtWakeup              :bit 
extern          bhas_data_out_previous  :bit
extern          bhas_data_out_previous1 :bit
extern          bhas_data_out_previous2 :bit
extern          bsetup_flag             :bit                    ;there are setup cmd received   
extern          bCMD_INDEX              :bit
extern          baddr_state             :bit
extern          F_MouseChange           :bit
extern          btime_out_KB            :bit
extern          breseume_s              :bit
extern          bwait_setup             :bit
extern          fifo_out1               :byte
extern          fifo_out2               :byte
extern          fifo_out3               :byte
extern          fifo_out4               :byte
extern          fifo_out5               :byte
extern          fifo_out6               :byte
extern          fifo_out7               :byte
extern          fifo_out8               :byte
extern          stall                   :byte

extern          FIFO0_Wr_Check          :near
extern          FIFO0_Rd_Check          :near
extern          FIFO1_Rd_Check          :near
extern          FIFO2_Rd_Check          :near
extern          LEN0_Rd_Check           :near
extern          LEN0_Wr_Check           :near
extern          ReadLen0                :near
extern          WriteLen0               :near
extern          ReadFIFO0               :near
extern          ReadFIFO1               :near
extern          ReadFIFO2               :near
extern          WriteFIFO0              :near
extern          FIFO1_Wr_Check          :near
extern          WriteFIFO1              :near
extern          FIFO2_Wr_Check          :near
extern          WriteFIFO2              :near
extern          GetPipeBit              :near
extern          clearstall              :near
extern          setstall                :near
extern          GetEnd                  :near
extern          StandardRequest         :near
extern          ClassRequest            :near
extern          ReadNextCnf             :near
extern          MoveMouseData           :near

extern          ReturnAddr              :byte
extern          FIFO_SendLen            :byte
extern          FIFO_Type               :byte
extern          TempKBTime              :byte
extern          TempKBTime_L            :byte
extern          CMD_ADDR                :byte
extern          int_temp1               :byte

FIFO_addr       equ             int_temp1

usbint_var      .section        'data'
isr_usb_acc     db              ?
isr_usb_status  db              ?
isr_usb_mp1     db              ?
isr_usb_mp0     db              ?
isr_usb_tblp    db              ?
int_reg_temp    db              ?                               ;for store USB pipe int register

;**************************************************************************
;*                      External INT subroutine
;**************************************************************************
usbExt          .Section         AT 500H 'code'
;External interrupt service routine
EXT_START:
        clr     wdt                     ;
        MOV     ISR_USB_ACC,A           ; Save ACC
        MOV     A,STATUS                ; Save STATUS
        MOV     isr_usb_status,A        ;

        MOV     A,USB_REG_BANK          ; Set bank pointer to USB control
        MOV     BP,A                    ; register bank

        MOV     A,MP1                   ;
        MOV     isr_usb_mp1,A           ;
        mov     a,mp0                   ;
        mov     isr_USB_mp0,a           ;
        mov     a,tblp                  ;
        mov     isr_usb_tblp,a          ;

        clr     intc.1                  ;
        set     intc.0                  ;

        clr     FIFO_w_c_b              ; use in Bread Board only
;-----------------------------------------------------------------------------------
        snz     suspend_line            ;
        jmp     check_Access_FIFO       ;

        mov     a,11110000b             ; clear Int_reg within suspend state
        andm    a,Int_reg               ;

        sz      resume_line             ;
        jmp     turn_on_usb             ;

        jmp     Exit_of_Ext_start       ;

turn_on_usb:
        set     breseume_s              ;
        set     on_usb_clk              ; turn on USB CLK
        clr     regulator_off           ;
;-----------------------------------------------------------------------------------
;ExitExt:
Exit_of_Ext_start:
        mov     a,isr_usb_tblp          ;
        mov     tblp,a                  ;
        mov     a,isr_usb_mp0           ;
        mov     mp0,a                   ;
        MOV     A,isr_usb_mp1           ;
        MOV     MP1,A                   ;

        MOV     A,0                     ; Set bank pointer to UC
        MOV     BP,A                    ; register bank

        MOV     A,Isr_usb_status        ; Restore STATUS
        MOV     STATUS,A                ;
        MOV     A,isr_usb_acc           ; Restore ACC
        clr     intc.0                  ;
        set     intc.1                  ;
        RETI                            ;
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
check_Access_FIFO:
        clr     breseume_s              ;
        set     on_usb_clk              ; turn on USB CLK
        clr     regulator_off           ;

        sz      Int_reg.@int0           ;
        jmp     AccessFIFO0             ;

        ;other pipe except pipe0 interrupt
        mov     a,Int_reg               ;
        sz      Int_reg_temp            ;
        jmp     examine_int123          ;

        and     a,00001110b             ;
        mov     Int_reg_temp,a          ;
examine_int123: 
        sz      Int_reg_temp.@int1      ;
        jmp     AccessFIFO1             ;
        sz      Int_reg_temp.@int2      ;
        jmp     AccessFIFO2             ;
        sz      Int_reg_temp.@int3      ;
        jmp     AccessFIFO3             ;
        jmp     Exit_of_Ext_start       ;
;-----------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------
Check_Pipe0:                            
AccessFIFO0:
        set     chk_usb_reset_event     ; set usb mode flag
        clr     Int_reg.@int0           ; clr pipe0 int flag

        MOV     A,USB_MISC              ; MP1 point to Misc. register
        MOV     MP1,A                   ;
;------------------------------------------------------------------------------------
        sz      bwait_setup             ; (bwait_setup=0,代表可能刚刚收到Setup command,但还未收进来)
        jmp     wait_next_setup         ; (bwait_setup=1,代表目前正等待接收新的Setup command)

        snz     r1.@usb_len0            ; 检查是否收到Zero-length packet
        jmp     AccessFIFO0_cont        ; 可能收到OUT或IN packet
;------------------------------------------------------------------------------------
        ;----------------------------------------------------------------------
        ; Remark : 只检查接收Setup command,其它不管
        ;----------------------------------------------------------------------
wait_next_setup:
        MOV     A,USB_MISC              ; MP1 point to Misc. register
        MOV     MP1,A                   ;
        nop                             ;
        nop                             ;
        sz      r1.@USB_Setup           ; 检查是否收到SETUP command
        jmp     AccessFIFO0_cont        ; 收到SETUP command

        JMP     ExitExt0                ;

;-------------------------------------------------------------------------------------- 
AccessFIFO0_cont:
;examine FIFO0 IN, SETUP, OUT Interrupt
        snz     bhas_data_out_previous1 ;
        jmp     AccessFIFO0_cont1       ;
        clr     bhas_data_out_previous1 ;
        jmp     ExitExt0                ;
;-------------------------------------------------------------------------------
AccessFIFO0_cont1:                              
        snz     bhas_data_out_previous2 ;
        jmp     AccessFIFO0_cont11      ;
        clr     bhas_data_out_previous2 ;
        jmp     ExitExt0                ;

;-------------------------------------------------------------------------------
AccessFIFO0_cont11:                             
        set     bFLAG_Setup             ; 预设有收到Setup command
CheckSetup:
        MOV     A,USB_MISC              ; MP1 point to Misc. register
        MOV     MP1,A                   ;
        nop                             ;
        nop                             ;
        snz     r1.@USB_Setup           ;
        clr     bFLAG_Setup             ; 代表没有收到Setup command(或前次INT已经将r1.@USB_Setup清掉)

        snz     bFLAG_Setup             ;
        JMP     AccessFIFO0_cont2       ; No,收到一个IN, (data stage(Host to device)

Setup_stage:
        clr     r1.@USB_Setup           ; 清除USB setup bit
        clr     r1.@USB_Len0            ; 清除USB_Len0 bit
        clr     bwait_setup             ; 清除bwait_setup(代表这次INT收到Setup command)
        set     bsetup_flag             ; 设定bsetup_flag=1(代表下次的IN进来的时候,要把这次的Setup command收进来)
        jmp     Exitext0                ; 收到Setup command先离开USB_INT,下次收到IN的时候再将command收进来
;-------------------------------------------------------------------------------
AccessFIFO0_cont2:
        CALL    FIFO0_Rd_Check          ; Any data in FIFO 0 ?
        CLR     R1.@USB_Req             ; No: Clear request for FIFO0_Rd_Check
        SNZ     Z                       ;
        JMP     HaveDataInFIFO0         ; Yes

        ;----------------------------------------------------------------------
        ; Remark : Host已经读走了8-byte的data,在收到IN之後,要将下一批data送到Host
        ;----------------------------------------------------------------------
        JMP     SendFIFO0               ; 送出下一批data到Host

⌨️ 快捷键说明

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