📄 std1.asm
字号:
include ht82k96e.inc
include usbrf.inc
include usbfifo.inc
extern baddr_state :bit
extern bFLAG_FIFO_REDY :bit
extern bRmtWakeup :bit
extern bFLAG_RsqF :bit
extern bFLAG_SndFC :bit
extern bFLAG_HvRpt :bit
extern brd_h_table :bit
extern bCfgValue :bit
extern bwait_setup :bit
extern int_temp1 :byte
extern int_temp2 :byte
fifo_temp EQU int_temp1
FIFO_ADDR equ int_temp1
ADDR_Wake equ fifo_addr.0
temp equ int_temp2
extern STALL :byte
extern Wtotallength :near
;extern Entity_length :near
extern bNumberInterface :near
extern des_count :byte
extern FIFO_Request :byte
extern FIFO_wValueH :byte
extern FIFO_wValueL :byte
extern CMD_ADDR :byte
extern FIFO_wIndexH :byte
extern FIFO_Type :byte
;extern TEMP :byte
extern FIFO_wIndexL :byte
extern FIFO_OUT1 :byte
extern fifo_out2 :byte
extern ReturnAddr :byte
extern FIFO_SendLen :byte
extern TableLength :byte
extern FIFO_wLengthH :byte
extern FIFO_wLengthL :byte
;extern AltkbSetting :byte
;extern altmousesetting :byte
extern lengthh :byte
extern lengthl :byte
extern FIFO_TBLP :byte
Extern ExitExt:near
EXTERN ToStallPipe0:NEAR
EXTERN RequestResponse:NEAR
EXTERN SendHandshake:NEAR
EXTERN GetPipeBit:NEAR
EXTERN SendFIFOOut:NEAR
EXTERN ClearStall:NEAR
EXTERN SetStall:NEAR
EXTERN DeviceD:NEAR
EXTERN ConfigurationD:NEAR
EXTERN InterfaceD_0:NEAR
EXTERN EndpointD_0:NEAR
EXTERN HID_0:NEAR
EXTERN Entity_0:NEAR
EXTERN InterfaceD_1:NEAR
EXTERN EndpointD_1:NEAR
EXTERN HID_1:NEAR
EXTERN Entity_1:NEAR
EXTERN InterfaceD_2:NEAR
EXTERN EndpointD_2:NEAR
EXTERN HID_2:NEAR
EXTERN Entity_2:NEAR
extern LangID:near
extern ManufactureS:near
extern ProductS:near
;STD1 .SECTION AT 009H 'code'
STD1 .SECTION AT 0010H 'code'
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;----- Standard request -----------------------------------------------------
StandardRequest:
mov a,1 ; ACC=1
snz baddr_state ; 检查baddr_state是否为1(baddr_state要在SetConfiguration完成後才会设为0)
mov a,ENDPOINT_NO ; 若baddr_state=0,则ACC=ENDPOINT_NO=02H
mov fifo_temp,a ;
MOV A,FIFO_Request ; ACC=bRequest栏位
SUB A,STANDARD_REQUEST_NO ; Over 13 Item ?
SZ C ; 检查Standard request的值是否超过13
JMP ToStallPipe0 ; Yes,ToStallPipe0
MOV A,FIFO_Request ; ACC=合法的Standard request
;!!!!! Need in same page
std_request_pcl_14:
ADDM A,PCL ;
JMP GetStatus ;0 ; 获得Interface/Device/Endpoint的状态
JMP ClearFeature ;1 ; 解除Device的RemoteWakeup,或Endpoint的Halt feature
JMP ToStallPipe0 ;2 ; 不作处理
JMP SetFeature ;3 ; 设定Device的RemoteWakeup,或Endpoint的Halt feature
JMP ToStallPipe0 ;4 ; 不作处理
JMP SetAddressC ;5 ; 设定Device的address(CMD_ADDR)
JMP GetDescriptor ;6 ; 跳到GetDescriptor
JMP Tostallpipe0 ;7 ; 不作处理
JMP GetConfiguration ;8 ; 跳到GetConfiguration
JMP SetConfiguration ;9 ; 跳到SetConfiguration
JMP GetInterface ;A ; 跳到GetInterface(不作处理)
JMP SetInterface ;B ; 跳到SetInterface(不作处理)
JMP SynchFrame ;C ; 跳到SynchFrame(不作处理)
;------------------------------------------------------------------------------
; Remark : Set address(属於Standard request)
;------------------------------------------------------------------------------
SetAddressC:
SZ FIFO_wValueH ; 检查是否wValueH == 0 ?
JMP ToStallPipe0 ; No: Error
MOV A,FIFO_wValueL ; Save address to CMD_ADDR
MOV CMD_ADDR,A ; CMD_ADDR=Host所指定的Device Address
mov a,USB_SIES ;
mov mp1,a ;
mov a,00000001b ; 将USB_SIES[45H]的bit0(Adr_set)设成1
orm a,R1 ;
rla CMD_ADDR ;
AND A,0FEH ;& save it
MOV FIFO_ADDR,A ;Move address to adress buffer
SZ bRmtWakeup ;Remote wakeup exist ?
SET FIFO_ADDR.0 ;Yes:Set remote wakeup flag
MOV A,USB_ADDR_WAKE ;MP1 point to Address register
MOV MP1,A ;
MOV A,FIFO_ADDR ; 将Host设定的device address和remote wakeup feature设定给USB_ADDR_WAKE
MOV R1,A ;
sz CMD_ADDR ; 检查Host刚设定的CMD_ADDR是否为0
set baddr_state ; 若CMD_ADDR不为0,则设baddr_state=1
;SET bFLAG_FIFO_REDY ; Host发出SetAddress command後,设定bFLAG_FIFO_REDY=1(Wait to write address)
JMP SendHandshake ; 送出一个Zero-length packet到Host
;------------------------------------------------------------------------------
; Remark : Clear feature(属於Standard request)
;------------------------------------------------------------------------------
ClearFeature:
SZ FIFO_wValueH ; 检查是否wValueH == 0 ?
JMP ToStallPipe0 ; No, Error
SZ FIFO_wIndexH ; 检查是否wIndexH == 0 ?
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_Type ; Type (Device, Interface or Endpoint)
AND A,Setup_Rev ; 取出RequestType的Recipient栏位(Setup_Rev=00011111B)
MOV TEMP,A ; TEMP=RequestType的Recipient栏位
;!!!!! Need in same page
SUB A,04H ; 检查是否Over 4 item?
SZ C ; No: Continue
JMP ToStallPipe0 ; Yes: Error
MOV A,TEMP ;
clear_feature_pcl_5:
ADDM A,PCL ;
JMP DeviceStatusCF ; 处理Recipient=Device
JMP ToStallpipe0 ; 不处理Recipient=Interface
JMP EndpointStatusCF ; 处理Recipient=Endpoint
JMP ToStallPipe0 ; 不处理Recipient=Other
;------------------------------------------------------------------------------
; Remark : Clear EndpointStatus feature(属於Standard request)--清除Endpoint的Stall flag
;------------------------------------------------------------------------------
EndpointStatusCF:
SZ FIFO_wValueL ; 检查是否FeatureSelector=(ENDPOINT_HALT=0)?
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wIndexL ; 取得Endpoint number
and a,01111111b ;
SUB A,FIFO_temp ; 是否超过合法Endpoint number
SZ C ;
JMP ToStallPipe0 ; Yes, Error
MOV A,FIFO_wIndexL ; ACC=取出Host所指定的Endpoint number
;Is it necessary to check endpoint number range ?
AND A,0FH ;
call GetPipeBit ;
CALL ClearStall ; 清除指定的Endpoint的Stall flag
;Is it necessary to check clear completely ?
JMP SendHandshake ; 送出一个Zero-length packet到Host
;------------------------------------------------------------------------------
; Remark : Clear DeviceStatus feature(属於Standard request)--清除Device的RemoteWakeup状态
;------------------------------------------------------------------------------
DeviceStatusCF:
MOV A,FIFO_wValueL ; 检查是否FeatureSelector=(DEVICE_REMOTE_WAKEUP=1)?
XOR A,01H ;
SNZ Z ;
JMP ToStallPipe0 ; No, Error
SZ FIFO_wIndexL ; 检查是否wIndex == 0(代表device)?
JMP ToStallPipe0 ; No, Error
;disable remote wakeup ; Yes
CLR bRmtWakeup ; Disable remote wakeup (flag)
rla cmd_addr ;
and a,11111110b ;
mov fifo_addr,a ;
CLR ADDR_Wake ; 清除remote wakeup flag(即fifo_addr.0)
JMP SetAddrWake ; 跳到SetAddrWake,将fifo_addr写入USB_ADDR_WAKE Register
;------------------------------------------------------------------------------
; Remark : Get status(属於Standard request)
;------------------------------------------------------------------------------
GetStatus:
SNZ FIFO_Type.@Setup_D ; 检查是否Device to Host ?
JMP ToStallPipe0 ; No: Error
SZ FIFO_wIndexH ; 检查是否wIndex == 0 ?
JMP ToStallPipe0 ; No: Error
MOV A,FIFO_Type ; Type (Device, Interface or Endpoint)
AND A,Setup_Rev ; 取出RequestType的Recipient栏位
MOV TEMP,A ; TEMP=RequestType的Recipient栏位
;!!!!! Need in same page
SUB A,04H ; 检查是否Over 4 item ?
SZ C ; No: Continue
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -