📄 std1.asm
字号:
MOV A,LOW EndSend ;
MOV ReturnAddr,A ; 设定ReturnAddr=EndSend
JMP ReadEntityAndSendCnf ; 读取Report table
;----------------------------------------------------------------------
; Remark : FIFO_OUTx被填满或某一个Descriptor被读完之後要做的动作
;----------------------------------------------------------------------
ReadTASTag:
SET bFLAG_RsqF ; 若是FIFO_OUTx被填满,则设定bFLAG_RsqF=1(代表Send Request)
ReadNextCnfLp:
CLR bFLAG_SndFC ; 设定bFLAG_SndFC=0(代表clear continue send flag)
SZ TableLength ; 检查是否Finished read某一Descriptor?
JMP ReadAgain ; No,跳到ReadAgain
MOV A,ReturnAddr ; Yes,跳到先前设定的ReturnAddr
std_des_end_pcl:
MOV PCL,A ; Return
;----------------------------------------------------------------------------------------------
; Remark : 不作处理的STD command
;----------------------------------------------------------------------------------------------
GetInterface:
JMP ToStallPipe0 ; 不作处理
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetInterface:
jmp TOstallpipe0 ; 不作处理
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SynchFrame: ;No support
JMP ToStallPipe0 ; 不作处理
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;------------------------------------------------------------------------------
; Remark : Get configuration(属於Standard request)--回传一个byte显示device是否SetConfiguration过
;------------------------------------------------------------------------------
GetConfiguration:
SNZ FIFO_Type.@Setup_D ; 检查是否FIFO_Type.Setup_D=1(device to host)?
JMP ToStallPipe0 ; No:Error
SZ FIFO_wLengthH ; 检查是否wLengthH == 0 ?
JMP ToStallPipe0 ; No:Error
MOV A,01H ;
XOR A,FIFO_wLengthL ; 检查是否wLengthL == 1 ?
SNZ Z ;
JMP ToStallPipe0 ; No:Error
clr FIFO_out1 ; 设定FIFO_OUT1=00
sz bcfgvalue ; 检查是否bCfgValue=0(若SetConfiguration过,则bCfgValue=1)
set FIFO_OUT1.0 ; 设定FIFO_OUT1=01
MOV A,01H ; 设定FIFO_SendLen=1
MOV FIFO_SendLen,A ;
jmp RequestResponse ; 送出固定长度(FIFO_SendLen)的data到Host
;------------------------------------------------------------------------------
; Remark : Set feature(属於Standard request)
;------------------------------------------------------------------------------
SetFeature:
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栏位
MOV TEMP,A ; TEMP=RequestType的Recipient栏位
SUB A,04H ; 检查是否Over 4 item?
SZ Z ; No: Continue
JMP ToStallPipe0 ; Yes: Error
;!!!!! Need in same page
MOV A,TEMP ;
set_feature_pcl_5:
ADDM A,PCL ;
JMP DeviceStatusSF ; 处理Recipient=Device
JMP TostallPipe0 ; 不处理Recipient=Interface
JMP EndpointStatusSF ; 处理Recipient=Endpoint
JMP ToStallPipe0 ; 不处理Recipient=Other
;----------------------------------------------------------------------
; Remark : Set endpoint feature(属於Standard request)--针对Endpoint来设定remote wakeup(clear stall flag)
;----------------------------------------------------------------------
EndpointStatusSF: ;
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不得大於ENDPOINT_NO)
SZ C ;
JMP ToStallPipe0 ; No, Error
MOV A,FIFO_wIndexL ;Get endpoint number
AND A,0FH ; Ignore direction
call GetPipeBit ;
CALL SetStall ;Set endpoint stall
JMP SendHandshake ;send handshake flag
;----------------------------------------------------------------------
; Remark : Set device feature(属於Standard request)--针对device设定remote wakeup
;----------------------------------------------------------------------
DeviceStatusSF: ;
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
;enable remote wakeup ; Yes
SET bRmtWakeup ; 设定bRmtWakeup=1(enable remote wakeup flag)
rla cmd_addr ;
and a,11111110b ;
mov fifo_addr,a ; (ADDR_Wake=fifo_addr.0) Set remote wakeup flag
SET fifo_addr.0 ; 设定fifo_addr=USB device address,和remote wake flag状态
;----------------------------------------------------------------------
; Remark : 将fifo_addr写入USB_ADDR_WAKE Register
;----------------------------------------------------------------------
SetAddrWake:
MOV A,USB_ADDR_WAKE ; Address & Remote wakeup address
MOV MP1,A ; MP1=USB_ADDR_WAKE
MOV A,fifo_addr ; 写入USB_ADDR_WAKE Register
MOV R1,A ;
JMP SendHandshake ; 送出一个Zero-length packet到Host
;------------------------------------------------------------------------------
; Remark : Set configuration(属於Standard request)
;------------------------------------------------------------------------------
SetConfiguration:
mov a,1 ;
sub a,FIFO_wValueL ; FIFO_wValueL=Configuration value
snz c ;
jmp ToStallPipe0 ; Configuration value不是0(处於AddressState),就是1(ConfigurationDescriptor中的ConfiguraitonValue)
clr baddr_state ;
snz z ; 检查fifo_wvalueL=1(SetConfiguration的期待值)?
set baddr_state ; No,若没有收到SetConfiguration的期待值1,则将baddr_state=1
mov a,11110000b ;
mov STALL,a ; 清除所有STALL变数
MOV A,USB_STALL ;
MOV MP1,A ; 清除所有USB_STALL bit
CLR R1 ;
CLR bFLAG_HvRpt ; 设定bFLAG_HvRpt=0(reset to nonreport)
sz FIFO_wValueL ; 检查fifo_wvalueL=0?
jmp set_cfg ;
clr bcfgvalue ; 清除bCfgValue=0,代表SetConfiguration尚未完成
JMP SendHandShake ; 送出一个Zero-length packet到Host
set_cfg:
set bcfgvalue ; 设定bCfgValue=1,代表SetConfiguration已经完成
JMP SendHandShake ; 送出一个Zero-length packet到Host
;------------------------------------------------------------------------------
; Remark : Get descriptor(属於Standard request)
;------------------------------------------------------------------------------
GetDescriptor: ;No check bmRequestType D4..0
SNZ FIFO_Type.@Setup_D ; 检查是否device to host?
JMP ToStallPipe0 ; No:Error
MOV A,FIFO_Type ; only (device,interface & endpoint)
AND A,Setup_Rev ; 取出RequestType的Recipient栏位(Setup_Rev=00011111B)
SUB A,03H ;
SZ C ; 检查是否Over 3 item?
JMP ToStallPipe0 ; Yes, Error
mov a,fifo_wlengthh ; fifo_wLengthH=Host所要求的Descriptor length High
mov lengthh,a ; lengthh=Host所要求的Descriptor length High
mov a,fifo_wlengthl ; fifo_wLengthL=Host所要求的Descriptor length Low
mov lengthl,a ; lengthl=Host所要求的Descriptor length Low
MOV A,LOW EndSend ;
MOV ReturnAddr,A ; 设定ReturnAddr=EndSend
MOV A,FIFO_Type ; RequestType的Recipient只允许Device(for standard request)
and a,00011110b ; 和Interface(for HID-class request)
snz z ; 检查是否为Device和Interface
jmp Tostallpipe0 ; No, Error
clr brd_h_table ; 清除brd_h_table=0
clr des_count ; 清除des_count=0,用作descriptor的index
sz fifo_type.0 ; 检查是否fifo_type.0=0(Recipient为Device)
JMP ClassDst_Interface ; No(Recipient为Interface),跳到ClassDst_Interface(去处理GetHIDDescriptor和GetEntityDescriptor,
; (03-09-2004)因为HID和Entity(或称Report) descriptor是隶属於Interface阶层下的descriptor)
;----------------------------------------------------------------------
; Remark : GetDescriptor命令的Recipient若为Device,则要处理的descriptor
; 是Device, Configuration, String叁种descriptor(03-09-2004)
;----------------------------------------------------------------------
StandardDst: ; 在Standard request中,只回应3种descriptor(DEVICE,CONFIGURATION,STRING)
MOV A,FIFO_wValueH ; Descriptor type(DEVICE,CONFIGURATION,STRING)
AND A,wValueH_Dst ; 取出Descriptor type(wValueH_Dst=00011111B)
MOV TEMP,A ;
SUB A,04H ; 检查是否Over 4 item ?
SZ C ;
JMP ToStallPipe0 ; Yes, Error
MOV A,TEMP ; No
std_device_pcl_5:
ADDM A,PCL ;
JMP ToStallPipe0 ; 不处理
JMP GetDeviceDes ; 处理Device descriptor
JMP GetConfigurationDes ; 处理Configuration descriptor
JMP GetstringDes ; 处理String descriptor
;----------------------------------------------------------------------------------------------
; Remark : 将descriptor的内容读出来放到FIFO_OUTx,直到内容读完,或FIFO_OUTx空间填满为止
;----------------------------------------------------------------------------------------------
GetTableBeg:
MOV A,OFFSET FIFO_OUT1 ; Let MP0 pointer to FIFO_OUT1
MOV MP0,A ; MP0=FIFO_OUT1
CLR FIFO_SendLen ; 将FIFO_SendLen设为0
;Check whether all data is written
GetTableLp:
sz tablelength ; 检查是否TableLength=0
jmp read_data_again ; No
MOV A,LOW EndSend ;
MOV ReturnAddr,A ; 设定ReturnAddr=EndSend
ret ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -