亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb_ch9.asm

?? USB HID mouse device firmware source code using PIC s MCU
?? ASM
?? 第 1 頁 / 共 4 頁
字號:
    call    USBActivity
    pagesel ServiceUSBInt
    goto    ServiceUSBInt
ExitServiceUSBInt
    banksel PIR1
    bcf     PIR1,USBIF
    return

; ******************************************************************
; USB Reset interrupt triggered (SE0)
; initialize the Buffer Descriptor Table,
; Transition to the DEFAULT state,
; Set address to 0
; enable the USB
; ******************************************************************
USBReset    ; START IN BANK2

    clrf    USB_Curr_Config
    clrf    IS_IDLE
    bsf     STATUS, RP0     ; bank 3

    bcf     UIR,TOK_DNE     ; hit this 4 times to clear out the
    bcf     UIR,TOK_DNE     ; USTAT FIFO
    bcf     UIR,TOK_DNE    
    bcf     UIR,TOK_DNE    

    movlw   0x88            ; set owns bit (SIE can write)
    movwf   BD0OST
    movlw   USB_Buffer      ; Endpoint 0 OUT gets a buffer
    movwf   BD0OAL          ; set up buffer address
    movlw   0x8
    movwf   BD0OBC

    movlw   0x08            ; Clear owns bit (PIC can write)
    movwf   BD0IST
    movlw   USB_Buffer+8    ; Endpoint 0 IN gets a buffer
    movwf   BD0IAL          ; set up buffer address

    clrf    UADDR           ; set USB Address to 0
    clrf    UIR             ; clear all the USB interrupt flags
    banksel PIR1            ; switch to bank 0
    bcf     PIR1,USBIF

; Set up the Endpoint Control Registers.  The following patterns are defined
; ENDPT_DISABLED - endpoint not used
; ENDPT_IN_ONLY  - endpoint supports IN transactions only
; ENDPT_OUT_ONLY - endpoint supports OUT transactions only
; ENDPT_CONTROL     - Supports IN, OUT and CONTROL transactions - Only use with EP0
; ENDPT_NON_CONTROL - Supports both IN and OUT transactions

    banksel UEP0
    movlw   ENDPT_CONTROL
    movwf   UEP0            ; endpoint 0 is a control pipe and requires an ACK

    movlw   0x3B            ; enable all interrupts except activity
    movwf   UIE

    movlw   0xFF            ; enable all error interrupts
    movwf   UEIE

    movlw   DEFAULT_STATE
    movwf   USWSTAT

    bcf     STATUS,RP0      ; select bank 2
    movlw   0x00
    movwf   USB_status_device ; Self powered, remote wakeup disabled
    bcf     STATUS,RP1      ; bank 0
#ifdef SHOW_ENUM_STATUS
    bsf     PORTB,1         ; set bit one to indicate Reset status
#endif
    bsf     STATUS,RP1
    return                  ; to keep straight with host controller tests

; ******************************************************************
; Enable Wakeup on interupt and Activity interrupt then put the 
; device to sleep to save power.  Activity on the D+/D- lines will
; set the ACTIVITY interrupt, waking up the part.
; ******************************************************************
USBSleep    ; starts from bank2
    bsf     STATUS, RP0     ; up to bank 3
    bcf     UIE,UIDLE
    bcf     UIR,UIDLE
    bcf     UIE,ACTIVITY
    bcf     UIR,ACTIVITY
    banksel PIR1            ; switch to bank 0
    bcf     PIR1,USBIF

    banksel IS_IDLE         ; switch to bank 2
    bsf     IS_IDLE, 0

    return

; ******************************************************************
; This is activated by the STALL bit in the UIR register.  It really
; just tells us that the SIE sent a STALL handshake.  So far, Don't 
; see that any action is required.  Clear the bit and move on.
; ******************************************************************
USBStall    ; starts in bank 2
    bsf     STATUS, RP0     ; bank 3
    bcf     UIR, STALL      ; clear STALL

    banksel PIR1            ; switch to bank 0
    bcf     PIR1,USBIF
    bsf     STATUS,RP1      ; bank 2    
    return

 
; ******************************************************************
; The SIE detected an error.  This code increments the appropriate 
; error counter and clears the flag.
; ******************************************************************
USBError    ; starts in bank 2
    bsf     STATUS, RP0     ; bank 3
    bcf     UIR,UERR
    banksel PIR1            ; switch to bank 0
    bcf     PIR1,USBIF      ; clear the USB interrupt flag.
    bsf     STATUS,RP1      ; switch to bank 2
    
#ifdef COUNTERRORS
    banksel UEIR
    movf    UEIR,w          ; get the error register
    andwf   UEIE,w          ; mask with the enables
    clrf    UEIR
    bcf     STATUS, RP0     ; Bank 2
    movwf   USBMaskedErrors ; save the masked errors

    btfss   USBMaskedErrors,PID_ERR
    goto    CRC5Error
    INCREMENT16 USB_PID_ERR
CRC5Error
    btfss   USBMaskedErrors,CRC5
    goto    CRC16Error
    INCREMENT16 USB_CRC5_ERR
CRC16Error
    btfss   USBMaskedErrors,CRC16
    goto    DFN8Error
    INCREMENT16 USB_CRC16_ERR
DFN8Error
    btfss   USBMaskedErrors,DFN8
    goto    BTOError
    INCREMENT16 USB_DFN8_ERR
BTOError
    btfss   USBMaskedErrors,BTO_ERR
    goto    WRTError
    INCREMENT16 USB_BTO_ERR
WRTError
    btfss   USBMaskedErrors,WRT_ERR
    goto    OWNError
    INCREMENT16 USB_WRT_ERR
OWNError
    btfss   USBMaskedErrors,OWN_ERR
    goto    BTSError
    INCREMENT16 USB_OWN_ERR
BTSError
    btfss   USBMaskedErrors,BTS_ERR
    goto    EndError
    INCREMENT16 USB_BTS_ERR
EndError
#endif
    banksel USBMaskedInterrupts 
    return

; ******************************************************************
; Service the Activity Interrupt.  This is only enabled when the
; device is put to sleep as a result of inactivity on the bus.  This
; code wakes up the part, disables the activity interrupt and reenables
; the idle interrupt.
; ******************************************************************
USBActivity     ; starts in bank 2
    bsf     STATUS, RP0     ; Bank 3
    bcf     UIE,ACTIVITY    ; clear the Activity and Idle bits
    bcf     UIR,ACTIVITY
    bcf     UIE,UIDLE
    bcf     UIR,UIDLE

    banksel PIR1            ; switch to bank 0
    bcf     PIR1,USBIF      ; clear the USB interrupt flag.
    bsf     STATUS,RP1      ; switch to bank 2
    
    clrf    IS_IDLE

    return

; ******************************************************************
; Process token done interrupt...  Most of the work gets done through
; this interrupt.  Token Done is signaled in response to an In, Out,
; or Setup transaction.
; ******************************************************************
TokenDone       ; starts in bank 2
    COPYBUFFERDESCRIPTOR    ; copy BD from dual port to unbanked RAM
    banksel USTAT
    movf    USTAT,w         ; copy USTAT register before...
    bcf     UIR,TOK_DNE     ; clearing the token done interrupt.

    banksel PIR1            ; switch to bank 0
    bcf     PIR1,USBIF      ; clear the USB interrupt flag.
    bsf     STATUS,RP1      ; switch to bank 2

    movwf   USB_USTAT       ; Save USTAT in bank 2

#ifdef SHOW_ENUM_STATUS
; This toggles the activity bits on portB  (EP0 -> Bit 5; EP1 -> bit 6; EP2 -> bit 7)
    bcf     STATUS,RP1      ; bank 0
    andlw   0x18            ; save endpoint bits
    btfss   STATUS,Z        ; is it EP0?
    goto    tryEP1activity
    movlw   0x20
    goto    maskport
tryEP1activity
    xorlw   0x08            ; is it bit one?
    btfss   STATUS,Z
    movlw   0x80            ; No, It's not EP0, nor 1 so it must be EP2.  toggle bit 7
    btfsc   STATUS,Z    
    movlw   0x40            ; Yes, toggle bit 6 to Show EP1 activity
maskport
    xorwf   PORTB,f
    bsf     STATUS,RP1      ; bank 2
#endif

; check UOWN bit here if desired
    movf    BufferDescriptor,w    ; get the first byte of the BD
    andlw   0x3c            ; save the PIDs
    movwf   PIDs

    xorlw   TOKEN_IN
    btfsc   STATUS,Z
    goto    TokenInPID    

    movf    PIDs,w
    xorlw   TOKEN_OUT
    btfsc   STATUS,Z    
    goto    TokenOutPID

    movf    PIDs,w
    xorlw   TOKEN_SETUP
    btfsc   STATUS,Z    
    goto    TokenSetupPID

    return                  ; should never get here...

; ******************************************************************
; Process out tokens
; For EP0, just turn the buffer around.  There should be no EP0 
; tokens to deal with.
; EP1 and EP2 have live data destined for the application
; ******************************************************************
TokenOutPID    ; STARTS IN BANK2
    movf    USB_USTAT,w     ; get the status register
    btfss   STATUS,Z        ; was it EP0?
    goto    tryEP1          ; no, try EP1

    movf    USB_dev_req,w
    xorlw   HID_SET_REPORT
    btfss   STATUS,Z
    goto    ResetEP0OutBuffer

HIDSetReport
;   Copy buffer to EP1 Out so it looks like it was received from an EP1 OUT
    movlw   0xFF
    movwf   USB_dev_req     ; clear the request type
    banksel BD1IST
    movf    BD0OST,w
    movwf   BD1OST          ; Copy status register to EP1 Out
    movf    BD0OAL,w        ; get EP0 Out buffer address
    bcf     STATUS,RP0      ; bank 2
    movwf   hid_source_ptr
    bsf     STATUS,RP0      ; bank 3
    movf    BD1OAL,w        ; get EP1 Out Buffer Address
    bcf     STATUS,RP0      ; bank 2
    movwf   hid_dest_ptr
    bsf     STATUS,RP0      ; bank 3
    movf    BD0OBC,w        ; Get byte count
    movwf   BD1OBC          ; copy to EP1 Byte count
    bcf     STATUS,RP0      ; bank 2
    movwf   counter

    bankisel BD1IST         ; indirectly to bank 3
HIDSRCopyLoop
    movf    hid_source_ptr,w
    movwf   FSR
    movf    INDF,w
    movwf   temp
    movf    hid_dest_ptr,w
    movwf   FSR
    movf    temp,w
    movwf   INDF
    incf    hid_source_ptr,f
    incf    hid_dest_ptr,f
    decfsz  counter,f
    goto    HIDSRCopyLoop

    bsf     STATUS,RP0      ; bank 3
    movlw   0x08
    movwf   BD0OST          ; REset EP0 Status back to SIE

ResetEP0OutBuffer
    bsf     STATUS,RP0      ; no, just reset buffer and move on.

    movlw   0x08            ; it's EP0.. buffer already copied,
    movwf   BD0OBC          ; just reset the buffer
    movlw   0x88        
    movwf   BD0OST          ; set OWN and DTS Bit
    bcf     STATUS,RP0      ; bank 2
    goto    Send_0Len_pkt
    return

tryEP1  ; bank 3
    xorlw   0x08            ; was it EP1?
    btfss   STATUS,Z    
    goto    tryEP2

; **** Add Callout here to service EP1 in transactions.  ****

    return

tryEP2  ; bank 3
    movf    USB_USTAT,w
    xorlw   0x10            ; was it EP2?
    btfsc   STATUS,Z    
    return                  ; unrecognized EP (Should never take this exit)

; **** Add Callout here to service EP2 in transactions.  ****
    return

; ******************************************************************
; Process in tokens
; ******************************************************************
TokenInPID      ; starts in bank2
; Assumes EP0 vars are setup in a previous call to setup.  
EP0_in
    movf    USB_USTAT,w     ; get the status register
    andlw   0x18            ; save only EP bits (we already know it's an IN)
    btfss   STATUS,Z        ; was it EP0?
    goto    tryEP1in        ; no, try EP1

    movf    USB_dev_req,w
    xorlw   GET_DESCRIPTOR
    btfss   STATUS,Z
    goto    check_GSD
    pagesel copy_descriptor_to_EP0
    call    copy_descriptor_to_EP0
    goto    exitEP0in

; Check for Get String Descriptor
check_GSD
    movf    USB_dev_req,w
    xorlw   GET_STRING_DESCRIPTOR
    btfss   STATUS,Z
    goto    check_SA
    call    copy_descriptor_to_EP0
    goto    exitEP0in

; Check for Set Address
check_SA
    movf    USB_dev_req,w
    xorlw   SET_ADDRESS
    btfss   STATUS,Z
    goto    check_SF
    call    finish_set_address
    goto    exitEP0in

check_SF
    movf    USB_dev_req,w
    xorlw   SET_FEATURE
    btfss   STATUS,Z
    goto    check_CF
    goto    exitEP0in

check_CF
    movf    USB_dev_req,w
    xorlw   CLEAR_FEATURE
    btfss   STATUS,Z
    goto    Class_Specific
    goto    exitEP0in

Class_Specific
    pagesel Check_Class_Specific_IN
    goto    Check_Class_Specific_IN

exitEP0in
    return


; ******************************************************************
; though not required, it might be nice to have a callback function here
; that would take some action like setting up the next buffer when the
; previous one is complete.  Not necessary because the same functionality
; can be provided through the PutUSB call.  
; ******************************************************************
tryEP1in        ; starts in bank 2
    xorlw   0x08            ; was it EP1?
    btfss   STATUS,Z    
    goto    tryEP2in
; **** Add Callout here to service EP1 in transactions.  ****
    return

tryEP2in        ; starts in bank 2
; **** Add Callout here to service EP2 in transactions.  ****
    return
; ******************************************************************
; Return a zero length packet on EP0 In
; ******************************************************************
Send_0Len_pkt
    global  Send_0Len_pkt

    banksel BD0IBC
    clrf    BD0IBC          ; set byte count to 0
    movlw   0xc8
    movwf   BD0IST          ; set owns bit
    bcf     STATUS,RP0      ; back to bank 2
    clrf    USB_dev_req
    return

; ********************************************************************
; process setup tokens
; ******************************************************************
TokenSetupPID    ; starts in bank 2
    bsf     STATUS,IRP      ; indirectly to pages 2/3
    movf    BufferDescriptor+ADDRESS,w ; get the status register
    movwf   FSR             ; save in the FSR.
    movf    INDF,w
    movwf   BufferData      ; in shared RAM
    incf    FSR,f
    movf    INDF,w
    movwf   BufferData+1
    incf    FSR,f
    movf    INDF,w
    movwf   BufferData+2
    incf    FSR,f
    movf    INDF,w
    movwf   BufferData+3
    incf    FSR,f
    movf    INDF,w
    movwf   BufferData+4
    incf    FSR,f
    movf    INDF,w

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品欧美久久久久一区二区 | 欧美精品一区视频| 亚洲精品高清在线| av在线不卡观看免费观看| 国产精品久久久久一区| 色综合中文字幕| 午夜天堂影视香蕉久久| 日韩精品一区二区在线| 国产一区二区成人久久免费影院 | 97精品国产露脸对白| 亚洲日本va在线观看| 欧美剧在线免费观看网站| 蜜臀久久久久久久| 久久久久97国产精华液好用吗| 成人爽a毛片一区二区免费| 中文字幕亚洲区| 欧美日韩五月天| 国产在线播放一区| 综合久久久久久| 在线电影欧美成精品| 岛国av在线一区| 亚洲午夜激情av| 久久久久99精品一区| 欧美怡红院视频| 国产成人一区在线| 亚洲电影欧美电影有声小说| 精品福利在线导航| 在线观看免费亚洲| 精品亚洲免费视频| 亚洲精品日韩一| 精品国产91洋老外米糕| 91理论电影在线观看| 美腿丝袜亚洲综合| 日韩伦理av电影| 欧美精品一区二区三区久久久 | 中文字幕免费不卡在线| 欧美日韩电影在线| 白白色 亚洲乱淫| 久久97超碰色| 午夜精品久久久久久久久久久| 日本一区二区三级电影在线观看| 91精品国产欧美一区二区成人| 高清不卡一二三区| 美女一区二区久久| 亚洲国产另类av| 综合欧美一区二区三区| 欧美精品一区二区三区在线播放 | 一区二区久久久| 久久久久久久综合狠狠综合| 欧美久久免费观看| 91女厕偷拍女厕偷拍高清| 精品亚洲porn| 欧美a一区二区| 亚洲成人综合网站| 亚洲欧美激情小说另类| 国产午夜亚洲精品午夜鲁丝片| 欧美一级二级三级乱码| 欧美三级电影在线看| 成人国产精品视频| 成人午夜视频福利| 国产一区二区三区免费看| 奇米精品一区二区三区四区| 丝袜诱惑亚洲看片| 亚洲一区二区三区小说| 综合久久国产九一剧情麻豆| 中文子幕无线码一区tr| 国产日韩成人精品| 久久久另类综合| 欧美成人bangbros| 欧美一区二区久久| 欧美日韩国产乱码电影| 色悠久久久久综合欧美99| 91丨porny丨最新| 色婷婷精品大视频在线蜜桃视频| 欧美日韩国产综合草草| 在线视频亚洲一区| 欧美色中文字幕| 欧美日韩综合一区| 欧美日韩国产天堂| 日韩免费成人网| 2022国产精品视频| 久久精品欧美日韩精品| 国产亚洲一区二区三区| 国产精品无人区| 亚洲手机成人高清视频| 亚洲精品菠萝久久久久久久| 一区二区三区在线观看视频| 亚洲福利电影网| 蜜桃久久久久久| 国产剧情在线观看一区二区| 成人免费三级在线| 色综合天天性综合| 精品视频一区三区九区| 日韩女优毛片在线| 国产日韩欧美精品在线| 中文字幕日韩av资源站| 亚洲最大成人网4388xx| 奇米综合一区二区三区精品视频| 国产一区二区伦理片| 91丨porny丨最新| 欧美精品日韩精品| 国产偷v国产偷v亚洲高清| 中文字幕在线播放不卡一区| 亚洲国产精品一区二区www| 极品少妇xxxx偷拍精品少妇| 成人午夜在线免费| 欧美日韩一区二区三区四区| 久久婷婷一区二区三区| 亚洲丝袜自拍清纯另类| 男女激情视频一区| 99国产精品久久久久久久久久久| 亚洲人成影院在线观看| 亚洲福利视频一区| 国产成人精品影视| 欧美视频一二三区| 久久青草欧美一区二区三区| 亚洲一级片在线观看| 国产在线播精品第三| 欧美视频一区二| 日本一区二区三区在线观看| 偷拍一区二区三区| av在线不卡电影| 精品国内片67194| 亚洲一区二区三区国产| 国产精品一区二区x88av| 在线成人av网站| 国产精品动漫网站| 久久国产精品色婷婷| 色婷婷香蕉在线一区二区| 26uuu精品一区二区| 一个色妞综合视频在线观看| 成人小视频在线| 日韩精品一区二区三区视频| 亚洲一区二区三区中文字幕| va亚洲va日韩不卡在线观看| 欧美大片拔萝卜| 午夜精品久久久久久久| 91免费国产在线观看| 26uuu亚洲| 日本不卡高清视频| 色一情一伦一子一伦一区| 久久久.com| 国产一二精品视频| 日韩欧美国产精品| 亚洲国产日韩a在线播放| 暴力调教一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av | 日本不卡中文字幕| 色一情一伦一子一伦一区| 亚洲国产精品黑人久久久| 黑人精品欧美一区二区蜜桃| 666欧美在线视频| 婷婷久久综合九色综合绿巨人| av不卡免费在线观看| 国产精品三级av| 粉嫩蜜臀av国产精品网站| 精品99999| 久久99精品国产.久久久久 | 91国产成人在线| 亚洲婷婷综合久久一本伊一区| 顶级嫩模精品视频在线看| www国产成人免费观看视频 深夜成人网| 日韩国产欧美三级| 欧美一区欧美二区| 免费看日韩精品| 日韩你懂的在线播放| 蜜臀久久99精品久久久久宅男| 91麻豆精品国产91久久久使用方法 | 亚洲激情欧美激情| 在线亚洲+欧美+日本专区| 亚洲影视在线播放| 欧美三级午夜理伦三级中视频| 午夜亚洲福利老司机| 欧美一级一区二区| 久久精品国产精品青草| 精品国产自在久精品国产| 国产老妇另类xxxxx| 欧美国产日本韩| 97久久超碰精品国产| 亚洲国产综合在线| 91麻豆精品久久久久蜜臀| 麻豆91免费观看| 久久久噜噜噜久噜久久综合| 成人黄动漫网站免费app| 亚洲欧美经典视频| 这里只有精品99re| 国产乱对白刺激视频不卡| **欧美大码日韩| 91麻豆精品国产91久久久使用方法| 精彩视频一区二区三区| 国产日韩欧美精品一区| 色94色欧美sute亚洲线路一ni| 午夜电影一区二区三区| 亚洲精品一区二区三区精华液| 波多野洁衣一区| 午夜激情一区二区| 久久久精品黄色| 在线观看国产91| 国产综合色精品一区二区三区| 国产精品视频一二|