📄 cls1.asm
字号:
MOV A,ReportkbTime ; ACC=ReportKBTime
SZ FIFO_wIndexL.0 ; 检查FIFO_wIndexL(=Interface Number:0-KB, 1-Mouse)
mov a,reportmousetime ; ACC=ReportMouseTime
JMP ReportVL ; 跳到ReportVL,准备将data传出去
;------------------------------------------------------------------------------
; Remark : Get protocol (属於Class-specific request)--回传protocol为Boot或Report
; protocol给Host,若alternative protocol为0,则代表Boot protocol,否则为
; Report protocol
;------------------------------------------------------------------------------
GetProtocol:
SNZ FIFO_Type.@Setup_D ; 检查是否Device to host ?
JMP ToStallPipe0 ; No, Error
SZ FIFO_wValueL ; 检查是否FIFO_wValueL=0?
JMP ToStallPipe0 ; No, Error
SZ FIFO_wValueH ; 检查是否FIFO_wValueH=0?
JMP ToStallPipe0 ; No, Error
SZ FIFO_wLengthH ; 检查是否FIFO_wLengthH=0
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wLengthL ; 检查是否FIFO_wLengthL=1
XOR A,01H ;
SNZ Z ;
JMP ToStallPipe0 ; No, Error
clr acc ; ACC=00H
sz FIFO_wIndexL.0 ; 检查FIFO_wIndexL(=Interface Number:0-KB, 1-Mouse)是否为0(即KB)
jmp ms_get_protocol ; No, 跳到ms_get_protocol
sz bAltkbProtocol ; 检查bAltkbProtocol是否为0
set acc.0 ; No, ACC=01H(即为Report protocol)
jmp ReportVL ; 回传给Host
ms_get_protocol:
sz baltmouseprotocol ; 检查bAltMouseProtocol是否为0
set acc.0 ; No, ACC=01H(即为Report protocol)
jmp ReportVL ; 回传给Host
;------------------------------------------------------------------------------
; Remark : Set idle (属於Class-specific request)
;------------------------------------------------------------------------------
SetIdle:
sz FIFO_wLengthL ; 检查是否FIFO_wLengthL=0
jmp Tostallpipe0 ; No, Error
sz FIFO_wLengthH ; 检查是否FIFO_wLengthH=0
JMP ToStallPipe0 ; No, Error
clr TempKBTime ;
clr TempMouseTime ;
clr TempKBTime_L ;
clr TempMouseTime_L ;
MOV A,offset ReportKBTime ; ACC=ReportKBTime address
SZ FIFO_wIndexL.0 ; 检查是否FIFO_wIndexL(即Interface Number)=0(0-KB, 1-Mouse)
mov a,offset ReportMouseTime; ACC=ReportMouseTime address
write_idle_rate:
MOV MP0,A ; MP0=ReportKBTime或ReportMouseTime的地址
MOV A,FIFO_wValueH ; ACC=FIFO_wValueH(即KB或Mouse的Report cycle)
MOV R0,A ; 设定ReportKBTime或ReportMouseTime
JMP SendHandshake ; 跳到SendHandshake(send handshake flag)
;------------------------------------------------------------------------------
; Remark : Set report (属於Class-specific request)
;------------------------------------------------------------------------------
SetReport:
; Report_Type,Report_ID=0,Check bmRequestType direction
; No Feature Report, Input Report
SZ FIFO_Type.@Setup_D ; 检查是否Host to device ?
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wValueH ; ACC=FIFO_wValueH(即report type)(Only 3 kind)
SUB A,04H ; 检查是否Over 4 item ?
SZ C ;
JMP ToStallPipe0 ; Yes, Error
MOV A,FIFO_wValueH ;
setreport_pcl_5:
ADDM A,PCL ;
JMP ToStallPipe0 ; No this report type
JMP ToStallPipe0 ; 不处理SetInputReport
JMP SetOutputReport ; 跳到SetOutputReport
SetFeatureReport: ;
JMP ToStallPipe0 ; 不处理SetFeatureReport
SetOutputReport:
SZ FIFO_wIndexL ; 检查是否FIFO_wIndexL(即Interface Number)=0(0-KB, 1-Mouse)
JMP ToStallPipe0 ; No, Error
;KB
SZ FIFO_wLengthH ; 检查是否FIFO_wLengthH=0?
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wLengthL ; ACC=FIFO_wLengthL(1 byte report)
XOR A,KB_Output_SIZE ; 检查是否FIFO_wLengthL=KB_Output_SIZE
SNZ Z ;
JMP ToStallPipe0 ; No, Error
set bCMD_INDEX ; 设定bCMD_INDEX=1,在USB_INT的DataStage会用到,代表Host下了一个SetReport request
JMP ExitExt ; 准备离开ExitExt ISR
;------------------------------------------------------------------------------
; Remark : Set protocol (属於Class-specific request)--设定protocol为Boot或Report
; protocol给Host,若alternative protocol为0,则代表Boot protocol,否则为
; Report protocol
;------------------------------------------------------------------------------
SetProtocol: ;
;Not Check bmRequestType direction because wLength = 0
;SZ FIFO_Type.@Setup_D ;Host to device ?
;JMP ToStallPipe0 ;No: to stall
MOV A,FIFO_wLengthL ; 检查是否FIFO_wLength=0
ADD A,FIFO_wLengthH ;
SNZ Z ;
JMP ToStallPipe0 ; No, Error
SZ FIFO_wValueH ; 检查是否FIFO_wValueH = 0 ?
JMP ToStallPipe0 ; No, Error
sz FIFO_wIndexL.0 ; 检查是否FIFO_wIndexL(即Interface Number)=0
jmp ms_set_protocol ; No, 跳到ms_get_protocol
clr bAltkbProtocol ; 设定bAltKBProtocol=0(即Boot Protocol)
sz FIFO_wValueL ; 检查是否FIFO_wValueL(即Protocol type:0=Boot Protocol;1:Report Protocol)
set bAltkbProtocol ; 设定bAltKBProtocol=1(即Report Protocol)
JMP SendHandshake ; 跳到SendHandshake(send handshake flag)
ms_set_protocol:
clr baltmouseprotocol ; 设定bAltMouseProtocol=0(即Boot Protocol)
sz FIFO_wValueL ; 检查是否FIFO_wValueL(即Protocol type:0=Boot Protocol;1:Report Protocol)
set baltmouseprotocol ; 设定bAltMouseProtocol=1(即Report Protocol)
JMP SendHandshake ; 跳到SendHandshake(send handshake flag)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
get_kb_input:
;KB
MOV A,FIFO_wLengthL ; ACC=Report size
XOR A,REPORT_KB_SIZE ; 检查是否FIFO_wLengthL=Report size
SNZ Z ;
JMP ToStallPipe0 ; No,Error
call MoveMouseData ; 将Mouse的移动资料放到FIFO_OUTx
JMP ReportIt ; 跳到ReportIt
;----------------------------------------------------------------------------
get_mouse_input:
JMP ToStallPipe0 ; 不处理
PUBLIC ClassRequest
public class_request_pcl_5
public class_cmd_pcl_13
public get_report_pcl_5
public get_input_pcl_4
public setreport_pcl_5
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -