📄 usbfs_1_cls_hid.asm
字号:
;;*****************************************************************************
;;*****************************************************************************
;; FILENAME: USBFS_1_cls_hid.asm
;; Version: 1.1, Updated on 2006/06/19 at 11:41:37
;; Generated by PSoC Designer ver 4.4 b1884 : 14 Jan, 2007
;;
;; DESCRIPTION: USB Human Interface Device (HID) Class request implemenatation
;; for the CY8C24090 and CY7C64215 family of devices
;;
;; NOTE: User Module APIs conform to the fastcall convention for marshalling
;; arguments and observe the associated "Registers are volatile" policy.
;; This means it is the caller's responsibility to preserve any values
;; in the X and A registers that are still needed after the API
;; function returns. Even though these registers may be preserved now,
;; there is no guarantee they will be preserved in future releases.
;;-----------------------------------------------------------------------------
;; Copyright (c) Cypress Semiconductor 2005. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************
include "m8c.inc"
include "USBFS_1_macros.inc"
include "USBFS_1.inc"
include "memory.inc"
;-----------------------------------------------
; Global Symbols
;-----------------------------------------------
EXPORT USBFS_1_UpdateHIDTimer
EXPORT _USBFS_1_UpdateHIDTimer
EXPORT USBFS_1_bGetProtocol
EXPORT _USBFS_1_bGetProtocol
;export of the following items allows an application to initialize the data
; if necessary, possibly on reboot or other programatic events (usb reset).
; USBFS_1_Protocol is the variable controling boot/report mode for
; HID devices.
EXPORT _USBFS_1_IdleReload ; Idle Timer Reload Value
EXPORT USBFS_1_IdleReload ; Idle Timer Reload Value
EXPORT _USBFS_1_Protocol ; Active Protocol
EXPORT USBFS_1_Protocol ; Active Protocol
AREA InterruptRAM (RAM,REL,CON)
;-----------------------------------------------
; Constant Definitions
;-----------------------------------------------
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
;----------------------------------------------------------------------------
; Interface Setting
;----------------------------------------------------------------------------
USBFS_1_IdleReload:
_USBFS_1_IdleReload: BLK 1h ; Idle Timer Reload Value
USBFS_1_IdleTimer: BLK 1h ; Idle Timers
USBFS_1_Protocol:
_USBFS_1_Protocol: BLK 1h ; Active Protocol
AREA UserModules (ROM, REL)
;-----------------------------------------------------------------------------
; FUNCTION NAME: USBFS_1_bGetProtocol
;
; DESCRIPTION: Returns the selected protocol value to the application
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: A: Interface number
;
; RETURNS: A: Protocol values
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
;-----------------------------------------------------------------------------
.SECTION
USBFS_1_bGetProtocol:
_USBFS_1_bGetProtocol:
RAM_PROLOGUE RAM_USE_CLASS_3
RAM_SETPAGE_IDX >USBFS_1_Protocol
mov X, A ; Argument is the index
mov A, [X + USBFS_1_Protocol] ; Return the protocol
RAM_EPILOGUE RAM_USE_CLASS_3
ret
.ENDSECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: USBFS_1_UpdateHIDTimer
;
; DESCRIPTION: Updates the HID report timer and reloads it if it expires
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: A: Interface number
;
; RETURNS: A: USB_IDLE_TIMER_EXPIRED, if the timer is running and expired
; USB_IDLE_TIMER_RUNNING, if the timer is running
; USB_IDLE_TIMER_INDEFINITE, if the report should be made on change
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
;-----------------------------------------------------------------------------
.SECTION
USBFS_1_UpdateHIDTimer:
_USBFS_1_UpdateHIDTimer:
RAM_PROLOGUE RAM_USE_CLASS_3
RAM_SETPAGE_IDX >USBFS_1_IdleReload
mov X, A ; Make the argument the index
; Flow here to check if the timer is "indefinite"
cmp [X + USBFS_1_IdleReload], 0 ; Indefinite?
jz .indefinite ; Jump if Indefinite?
; Flow here to check the timers
DEC [X + USBFS_1_IdleTimer] ; Decrement the timer
jc .expired
; Flow here if the timer has not expired
mov A, USB_IDLE_TIMER_RUNNING ; Return value (not expired)
RAM_EPILOGUE RAM_USE_CLASS_3
ret ; Quick exit
; Jump here if the timer expired
.expired:
mov A, [X + USBFS_1_IdleReload] ; Reload the timer
mov [X + USBFS_1_IdleTimer], A ;
mov A, USB_IDLE_TIMER_EXPIRED ; Return value (expired)
ret ; Quick exit
; Jump here to make return "on change/indefinite"
.indefinite:
mov A, USB_IDLE_TIMER_INDEFINITE ; Return value (change/indefinite)
RAM_EPILOGUE RAM_USE_CLASS_3
ret ; Exit
.ENDSECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: USBFS_1_CB_d2h_std_ifc_06
;
; DESCRIPTION: Get Interface Descriptor
;
;****************************************************************
; STANDARD INTERFACE IN REQUEST: Get_Interface_Descriptor
;****************************************************************
;
; bmRequestType : (IN | STANDARD | INTERFACE) = 81h
; bRequest : GET_DESCRIPTOR = 06h
; wValue : DESCRIPTOR TYPE | INDEX = xxxxh
; wIndex : INTERFACE = --xxh
; wLength : DESCRIPTOR_LENGTH = --xxh
;
; The GET_INTERFACE_DESCRIPTOR request returns the specified
; descriptor if the descriptor exists.
;
; The upper byte of request_value contains the descriptor type and
; the lower byte contains the descriptor index. request_index
; contains either 0000h or the Language ID. request_length contains
; the descriptor length. The actual descriptor information is
; transferred in subsequent data packets.
;
; USB defines only a DEVICE recipient but the HID spec added
; support for the INTERFACE recipient.
;
; Get Descriptor from an HID interface returns either HID,
; REPORT, or PHYSICAL descriptors.
;
;****************************************************************
IF (USB_CB_SRC_d2h_std_ifc_06 & USB_UM_SUPPLIED)
export USBFS_1_CB_d2h_std_ifc_06
USBFS_1_CB_d2h_std_ifc_06:
call USBFS_1_GetInterfaceLookupTable ; Point the the interface lookup table
push A ; Save the MSB
mov A, REG[USBFS_1_EP0DATA+wValueHi] ; Get descriptor type
cmp A, DESCR_TYPE_HID_CLASS ; HID Class descriptor?
jz .send_hid_class_descr
cmp A, DESCR_TYPE_HID_REPORT ; HID Report descriptor?
jz .send_hid_report_descr
; Jump or flow here if the request is not supported
.not_supported:
pop A ; Restore the stack
jmp USBFS_1_Not_Supported_Local_Hid
; Jump here to send the HID Report Descriptor
.send_hid_report_descr:
pop A ; Restore the interface lookup table MSB
swap A, X ; Add the offset
add A, 2 ; Point to the right table entry
jmp .finish
; Jump here to send the HID Class Descriptor
.send_hid_class_descr:
pop A ; Restore the interface lookup table MSB
swap A, X ; Add the offset
add A, 4 ; Point to the right table entry
; Jump or flow here with A:X Pointing to the
.finish:
swap A, X ; Back where they belong
adc A, 0 ; Don't forget the carry
mov [USBFS_1_t2],USBFS_1_t1 ; Set the GETWORD destination
call USBFS_1_GETWORD ; Get the pointer to the transfer descriptor table
; ITempW has the address
; Get the interface number
mov A, REG[USBFS_1_EP0DATA+wIndexLo] ; Get the interface number
mov [USBFS_1_t2], A ; Save it for the call to LOOKUP
mov A, [USBFS_1_t1] ; Get the transfer descriptor ROM Address MSB
mov X, [USBFS_1_t1+1] ; Get the transfer descriptor ROM Address LSB
jmp USBFS_1_GetTableEntry_Local_Hid
ENDIF
;-----------------------------------------------------------------------------
; FUNCTION NAME: USBFS_1_CB_d2h_cls_ifc_01
;
; DESCRIPTION: Get Report
;
;****************************************************************
; HID CLASS INTERFACE IN REQUEST: Get_Report
;****************************************************************
;
; bmRequestType : (IN | CLASS | INTERFACE) = A1h
; bRequest : GET_REPORT = 01h
; wValue : REPORT TYPE | REPORT ID = xxxxh
; wIndex : INTERFACE = --xxh
; wLength : REPORT LENGTH = --xxh
;
; The GET_REPORT request allows the host to receive a report from
; a specific interface via the control pipe.
;
;****************************************************************
;-----------------------------------------------------------------------------
;
; ARGUMENTS:
;
; RETURNS:
;
; SIDE EFFECTS: REGISTERS ARE VOLATILE: THE A AND X REGISTERS MAY BE MODIFIED!
;
; THEORY of OPERATION or PROCEDURE:
;
;-----------------------------------------------------------------------------
IF (USB_CB_SRC_d2h_cls_ifc_01 & USB_UM_SUPPLIED)
export USBFS_1_CB_d2h_cls_ifc_01
USBFS_1_CB_d2h_cls_ifc_01:
call Find_Report
NULL_PTR_CHECK USBFS_1_Not_Supported_Local_Hid
jmp USBFS_1_GetTableEntry_Local_Hid
ENDIF
;-----------------------------------------------------------------------------
; FUNCTION NAME: USBFS_1_CB_d2h_cls_ifc_02
;
; DESCRIPTION: Get Idle
;
;****************************************************************
; HID CLASS INTERFACE IN REQUEST: Get_Idle
;****************************************************************
;
; bmRequestType : (OUT | CLASS | INTERFACE) = A1h
; bRequest : GET_IDLE = 02h
; wValue : REPORT ID = 00xxh
; wIndex : INTERFACE = --xxh
; wLength : Report Size = 0001h
;
; The GET_IDLE request reads the current idle rate for a given
; input report on a specific interface.
;
;****************************************************************
;-----------------------------------------------------------------------------
;
; ARGUMENTS:
;
; RETURNS:
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -