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

📄 usblib1.asm

📁 Holteck HT82M9XX的USB Mouse的Firmware汇编代码
💻 ASM
字号:
include         ht82k96e.inc
;include        usbrf.inc
include         usbfifo.inc



extern          stall                   :byte
extern          FIFO_Type               :byte
extern          FIFO_OUT1               :byte
extern          int_temp1               :byte
extern          int_temp2               :byte
extern          fifo_sendlen    :byte

FIFO_temp       equ                     int_temp1
fifo_no         equ                     int_temp2



;USBlib          .Section        AT 278H 'code'   ;AT    USBlib_ADDRESS
USBlib          .Section        AT 280H 'code'   ;AT    USBlib_ADDRESS
;----------------------------------------------------------------------------
; Remark : 检查是否有Zero-length packet进来
;----------------------------------------------------------------------------
LEN0_Rd_Check:
;------- 02-06-2003 : 这一段在96E可以省略,让LEN0_Rd_Check与FIFO0_Rd_Check共用 --
;------- 02-10-2003 : 这一段是为了与980A相容,因为980A检查Zero-length必须这样做 -
;        MOV     A,USB_MISC                      ;
;        MOV     MP1,A                           ;
;        mov     a,11100000b                     ;
;        andm    a,r1                            ; ACC=读取USB_MISC的LEN0,READY,SCMD bits
;        nop                                     ;
;        nop                                     ;
;        SET     R1.@USB_Req                     ; 设定USB_MISC.REQ=1(下FIFO request)
;        nop                                     ;
;        nop                                     ;
;        nop                                     ;
;        nop                                     ;
;        nop                                     ;
;        nop                                     ;
;        MOV     A,(01H SHL @USB_Len0)           ; Len0 ready flag
;        JMP     Check                           ; Z=0:Len0 ready/1:Len0 not ready
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; Remark : 检查FIFO 0/1/2/3 READY to read ?
;----------------------------------------------------------------------------
FIFO0_Rd_Check:
        mov     a,00000000b                     ; ACC=00H(SELP1=0,SELP0=0,检查FIFO0 READ)
        jmp     FIFO_Check                      ; 跳到FIFO_Check
FIFO1_RD_check:
        mov     a,00001000b                     ; ACC=08H(SELP1=0,SELP0=1,检查FIFO1 READ)
        jmp     FIFO_Check                      ; 跳到FIFO_Check
FIFO2_RD_check:
        mov     a,00010000b                     ; ACC=10H(SELP1=1,SELP0=0,检查FIFO2 READ)
        jmp     FIFO_Check                      ; 跳到FIFO_Check
FIFO3_RD_check:
        mov     a,00011000b                     ; ACC=18H(SELP1=1,SELP0=1,检查FIFO3 READ)
        jmp     FIFO_Check                      ; 跳到FIFO_Check

;----------------------------------------------------------------------------
;Len 0 ready to write ?
LEN0_Wr_Check:
;FIFO 0 ready to write ?

;----------------------------------------------------------------------------
; Remark : 检查FIFO 0/1/2/3 READY to write ?
;----------------------------------------------------------------------------
FIFO0_Wr_Check:
        mov     a,00000010b                     ; ACC=02H(SELP1=0,SELP0=0,检查FIFO0 WRITE)
        jmp     FIFO_Check                      ; 跳到FIFO_Check
FIFO1_Wr_check:
        mov     a,00001010b                     ; ACC=0AH(SELP1=0,SELP0=1,检查FIFO1 WRITE)
        jmp     FIFO_Check                      ; 跳到FIFO_Check
FIFO2_Wr_check:
        mov     a,00010010b                     ; ACC=22H(SELP1=1,SELP0=0,检查FIFO2 WRITE)
        jmp     FIFO_Check                      ; 跳到FIFO_Check
FIFO3_Wr_check:
        mov     a,00011010b                     ; ACC=2AH(SELP1=1,SELP0=1,检查FIFO3 WRITE)
        jmp     FIFO_Check                      ; 跳到FIFO_Check

FIFO_Check:                                     ; 检查FIFO read或write的状态是否READY
        mov     FIFO_temp,a                     ; FIFO_temp=ACC
        MOV     A,USB_MISC                      ;
        MOV     MP1,A                           ;
        mov     a,r1                            ; ACC=读取USB_MISC的状态
        and     a,11100000b                     ; 取出LEN0,READY,SCMD bits
        or      a,fifo_temp                     ; 结合SELP1,SELP0的设定
        mov     r1,a                            ; 写入USB_MISC
        nop                                     ;
        nop                                     ;
        SET     R1.@USB_Req                     ; 设定USB_MISC.REQ=1(下FIFO request)
        nop                                     ;
        nop                                     ;
        MOV     A,(01H SHL @USB_Ready)          ; access ready flag
Check:
        NOP                                     ; 至少delay 3 instruction cycle
        NOP                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        AND     A,R1                            ; Z=0:FIFO ready; Z=1:FIFO not ready
        RET

;----------------------------------------------------------------------------
;----BEGIN (Read FIFO)
ReadLen0:
        MOV     A,USB_FIFO0                     ; (dummy read)
        MOV     MP1,A                           ; MP1=USB_FIFO0
        MOV     A,R1                            ; ACC=读取USB_FIFO0
        nop                                     ;
        JMP     E1ND_Request                    ; 跳到E1ND_Request

ReadFIFO0:
        MOV     A,USB_FIFO0                     ; ACC=USB_FIFO0 register
        JMP     ReadFIFO                        ; 跳到ReadFIFO
ReadFIFO1:
        MOV     A,USB_FIFO1                     ; ACC=USB_FIFO1 register
        JMP     ReadFIFO                        ; 跳到ReadFIFO
ReadFIFO2:
        MOV     A,USB_FIFO2                     ; ACC=USB_FIFO2 register
        JMP     ReadFIFO                        ; 跳到ReadFIFO
ReadFIFO3:
        MOV     A,USB_FIFO3                     ; ACC=USB_FIFO3 register
        JMP     ReadFIFO                        ; 跳到ReadFIFO

ReadFIFO:
        MOV     FIFO_NO,A                       ; FIFO_NO=欲读取的FIFO
        CLR     FIFO_SendLen                    ; 初设FIFO_SendLen=0
        MOV     A,OFFSET FIFO_Type              ; set input FIFO buffer pointer
        MOV     MP0,A                           ; MP0=USB device读取FIFO时用来存放data的buffer起始位址
ReadFIFOLoop:                                   ; 将8 bytes的data读进来
        MOV     A,FIFO_NO                       ; FIFO_NO=即将要读取的目标FIFO register
        MOV     MP1,A                           ; MP1=欲读取的FIFO
        MOV     A,R1                            ; 读取FIFO data
        nop                                     ;
        MOV     R0,A                            ;
        INC     FIFO_SendLen                    ; 累加FIFO_SendLen
        INC     MP0                             ; 累加buffer pointer
        MOV     A,FIFO_SIZE                     ; FIFO full(=8) ?
        XOR     A,FIFO_SendLen                  ; 检查FIFO_SendLen是否为8
        SZ      Z                               ;
        JMP     E1ND_Request                    ; 若FIFO_SendLen=8,表示buffer已收满,则跳到E1ND_Request
        MOV     A,USB_MISC                      ; Check ready ?
        MOV     MP1,A                           ; MP1=USB_MISC
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        SZ      R1.@USB_Ready                   ; 检查USB_MISC.USB_Ready是否ready
        JMP     ReadFIFOLoop                    ; Yes ready,继续读下一个byte

        JMP     E1ND_Request                    ; No Exit for not 8 bytes data
;----END (Read FIFO)

;----------------------------------------------------------------------------
;----BEGIN (Write FIFO)
;Write FIFO_OUT1 Data to FIFO Buffer 
WriteFIFO0:
        MOV     A,USB_FIFO0                     ; ACC=USB_FIFO0 register
        JMP     WriteFIFO                       ; 跳到WriteFIFO
WriteFIFO1:
        MOV     A,USB_FIFO1                     ; ACC=USB_FIFO1 register
        JMP     WriteFIFO                       ; 跳到WriteFIFO
WriteFIFO2:
        MOV     A,USB_FIFO2                     ; ACC=USB_FIFO2 register
        JMP     WriteFIFO                       ; 跳到WriteFIFO
WriteFIFO3:
        MOV     A,USB_FIFO3                     ; ACC=USB_FIFO3 register
        JMP     WriteFIFO                       ; 跳到WriteFIFO

WriteFIFO:
        MOV     FIFO_NO,A                       ; FIFO_NO=欲写入的FIFO
        MOV     A,OFFSET FIFO_OUT1              ; set output FIFO buffer pointer
        MOV     MP0,A                           ; MP0=USB device写入FIFO时的source buffer起始位址
WriteFIFOLoop:
        SZ      FIFO_SendLen                    ; 检查是否有Any data to write?(FIFO_SendLen=8)
        JMP     WriteFIFOTag                    ; Yes,去WriteFIFOTag
        JMP     EndWrite                        ; No,结束WriteFIFO
WriteFIFOTag:
        MOV     A,FIFO_NO                       ; FIFO NO.
        MOV     MP1,A                           ; MP1=即将要写入的目标FIFO register

        SET     FIFO_w_c_b                      ; (For ICE only,0 for FIFO read,1 for FIFO write)
        MOV     A,R0                            ; 读出data
        MOV     R1,A                            ; 写入FIFO
        CLR     FIFO_w_c_b                      ; (For ICE only,0 for FIFO read,1 for FIFO write)

        DEC     FIFO_SendLen                    ; FIFO_SendLen递减1
        INC     MP0                             ; Update to next pointer
        MOV     A,USB_MISC                      ;
        MOV     MP1,A                           ; MP1=USB_MISC
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        SZ      R1.@USB_Ready                   ; 检查USB_MISC.USB_Ready bit
        JMP     WriteFIFOLoop                   ; 若USB_MISC.USB_Ready bit=1,则继续写入下一data byte

WriteLen0:                                      ; Write一个Zero-Length packet的作法:
EndWrite:                                       ;
;----------------------------------------------------------------------------
;----BEGIN (End request)
E1ND_Request:
        MOV     A,USB_MISC                      ;
        MOV     MP1,A                           ; MP1=USB_MISC
        MOV     A,(01H SHL @USB_Tx)             ; Change Tx state
        XORM    A,R1                            ; 切换USB_MISC.USB_TX bit的值(0->1:Rx->Tx或1->0:Tx->Rx)
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        nop                                     ;
        CLR     R1.@USB_Req                     ; 结束USB request状态
        RET
;----END (End request)

;----------------------------------------------------------------------------
;----BEGIN (Clear FIFO)
ClearFIFO1:
        set     r1.@USB_Clear                   ; 清除所选定的FIFO
        clr     r1.@USB_Tx                      ;
        nop                                     ;
        nop                                     ;
        CLR     R1.@USB_Clear                   ; Disable USB_Clear
        CLR     R1.@USB_Req                     ; End request
        RET

;----------------------------------------------------------------------------
; Input : ACC pipe number
; Output: ACC pip bit (D0:pipe 0, D1:pipe 1...)
; Remark : 将指定的pipe number的bit位置mark为1
;----------------------------------------------------------------------------
GetPipeBit:
        INC     ACC                             ;
        MOV     FIFO_TEMP,A                     ;
        MOV     A,80H                           ;
GetPipeBitLoop:
        RL      ACC                             ;
        SDZ     FIFO_TEMP                       ;
        JMP     GetPipeBitLoop                  ;
        RET

;----------------------------------------------------------------------------
; Input : ACC = Pipe number
; Remark : 将指定的pipe number的bit位置设为1
;----------------------------------------------------------------------------
SetStall:
        MOV     FIFO_TEMP ,A                    ;
        MOV     A,USB_STALL                     ; MP1=USB_STALL
        MOV     MP1,A                           ;
        MOV     A,FIFO_TEMP                     ;
        OR      A,STALL                         ; Set stall bit
        JMP     SetStallTag

;----------------------------------------------------------------------------
; Input : ACC = Pipe number
; Remark : 将指定的pipe number的bit位置设为0
;----------------------------------------------------------------------------
ClearStall:
        MOV     FIFO_TEMP,A                     ;
        MOV     A,USB_STALL                     ; MP1=USB_STALL
        MOV     MP1,A                           ;
        MOV     A,FIFO_TEMP                     ;
        CPL     ACC                             ; Clear stall bit
        AND     A,STALL                         ;

SetStallTag:
        MOV     STALL,A                         ; Update Satll buffer
        MOV     R1,A                            ; Update Stall register
        RET

;----- END (USB function) --------------------------------------------------
public  LEN0_Rd_Check
public  LEN0_Wr_Check
public  FIFO0_Rd_Check
public  FIFO1_Rd_Check
public  FIFO2_Rd_Check
public  FIFO3_Rd_Check
public  FIFO0_Wr_Check
public  FIFO1_Wr_Check
public  FIFO2_Wr_Check
public  FIFO3_Wr_Check
public  ReadLen0
public  ReadFIFO0
public  ReadFIFO1
public  ReadFIFO2
public  ReadFIFO3
public  WriteLen0
public  WriteFIFO0
public  WriteFIFO1
public  WriteFIFO2
public  ClearFIFO1
public  GetPipeBit
public  SetStall
public  ClearStall
END

⌨️ 快捷键说明

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