📄 std1.asm
字号:
;----------------------------------------------------------------------
; Remark : 1. 将Descriptor table的内容读取出来放到FIFO_OUTx
; 2. 累加FIFO_SendLen的值
;----------------------------------------------------------------------
read_data_again:
snz brd_h_table ; 检查是否brd_h_table=1
jmp read_L_table_byte ; No
;read_H_byte
clr brd_h_table ; 设定brd_h_table=0
TABRDL R0 ; 将descriptor读到FIFO_OUTx
INC TBLP ;
mov a,tblh ; 取出读出来的High-byte
and a,00111111b ;
xor a,3FH ; 检查是否读到3FH(读到High-byte为3FH时要bypass掉)
sz z ;
jmp read_data_again ; Yes,读到3FH,则跳到read_data_again继续读取
mov a,tblh ; No.
and a,00111111b ;
mov R0,a ; 将读到的High-byte存到FIFO_OUTx
jmp read_next_table ;
read_L_table_byte:
set brd_h_table ; 设定brd_h_table=1
TABRDL R0 ; 将descriptor读到FIFO_OUTx
read_next_table:
INC MP0 ; Update memory pointer 0
INC FIFO_SendLen ; Update FIFO_SendLen
sz lengthl ; 检查LengthL是否为0
jmp skip_check_lengthh ; 若LengthL不为0,则跳到skip_check_lengthh
sz lengthH ; 若LengthL为0,则检查LengthH是否为0
jmp check_length_data ; 若LengthH不为0,则跳到check_length_data
out_descript:
MOV A,LOW EndSend ;
MOV ReturnAddr,A ; 读完Descriptor,将ReturnAddr设为EndSend
jmp get_table_lp ;
skip_check_lengthh:
dec lengthl ; 将Host指定的回传长度减1
get_table_lp:
SDZ TableLength ; 将descriptor指定的长度减1,并检查descriptor的读取动作是否结束
JMP GetTableTag ; 检查是否8-byte的FIFO_OUTx空间是否已经填满
RET
check_length_data:
set lengthl ; LengthL=FFH
dec lengthH ; LengthH减1
jmp get_table_lp ;
;----------------------------------------------------------------------
; Remark : 检查是否8-byte的FIFO_OUTx空间是否已经填满了
;----------------------------------------------------------------------
GetTableTag:
MOV A,FIFO_SendLen ;
XOR A,FIFO_SIZE ; 检查FIFO_OUT buffer(8 bytes)是否都填满了
SNZ Z ;
JMP GetTableLp ; No, 继续读取descriptor将FIFO_OUT buffer填满
RET ; Yes, FIFO FULL
;----------------------------------------------------------------------------------------------
;stack 1
;!!!!! Must in same page with caller
ReadEntityAndSendCnf:
MOV a,FIFO_wIndexL ; FIFO_wIndexL=Host欲读取的descriptor index
mov des_count,a ; des_count=descriptor index
call get_entity_length ; 根据descriptor index(des_count)取出目标Entity(Report) descriptor length
MOV TableLength,A ; TableLength=目标Entity(Report) descriptor length
jmp SendCnf ; 跳到SendCnf开始进行读取Entity(Report) descriptor的工作
;----------------------------------------------------------------------------------------------
;stack 1
ReadTableAndSendCnf:
TABRDL TableLength ; TableLength=读出descriptor的table length栏位
SendCnf:
call gettablenolength ; 决定真正读取Descriptor Table的长度=>TableLength
call GetTableBeg ; 将descriptor的内容读出来放到FIFO_OUTx
JMP ReadNextXX ; 跳到ReadNextXX
;----------------------------------------------------------------------------------------------
;程式进入点for get the next table data
GetTableLength:
clr brd_h_table ; 清除brd_h_table=0
TABRDL TableLength ; TableLength=读出descriptor的table length栏位
CALL GetTableNoLength ; 决定真正读取Descriptor Table的长度=>TableLength
gettablelength_cont:
SZ bFLAG_RsqF ; 是否已经正在传Descriptor给Host(bFLAG_RsqF=1)
JMP ReadAgain ; 是,已经正在传送,跳到ReadAgain
CALL GetTableLp ; 否,跳到GetTableLp,开始读取descriptor data
JMP ReadNextXX ; 跳到ReadNextXX
;----------------------------------------------------------------------------------------------
;----------------------------------------------------------------------
; Remark : Descriptor尚未读取完,会把bFLAG_SndFC设定为1
;----------------------------------------------------------------------
ReadAgain:
SET bFLAG_SndFC ; 设定bFLAG_SndFC=1(Set continue send flag)
MOV A,TBLP ; Save TBLP
MOV FIFO_TBLP,A ; FIFO_TBLP=Descriptor读取进度的指标
JMP RequestResponse ; 送出固定长度(FIFO_SendLen)的data到Host
;----------------------------------------------------------------------
; Remark : 当USB INT从FIFO0收到IN,接续未读完的descriptor
;----------------------------------------------------------------------
ReadNextCnf:
MOV A,FIFO_TBLP ; Restore TBLP
MOV TBLP,A ; TBLP=前次未读完的descriptor index
CALL GetTableBeg ; 继续读取前次未读完的descriptor
;----------------------------------------------------------------------
; Remark : 检查FIFO_OUTx的空间是否填满
;----------------------------------------------------------------------
ReadNextXX:
MOV A,FIFO_SendLen ; 检查是否FIFO_OUTx full ?
XOR A,FIFO_SIZE ; (FIFO_SIZE=08H)
SZ Z ;
JMP ReadTASTag ; Yes,跳到ReadTASTag
JMP ReadNextCnfLp ; No,跳到ReadNextCnfLp
;----------------------------------------------------------------------------------------------
;----------------------------------------------------------------------
; Remark : 决定读取descriptor时的真正长度=>Host所指定长度(LengthH,LengthL)
; 和descriptor所指定长度(TableLength),二者取较小者
;----------------------------------------------------------------------
GetTableNoLength:
SZ LengthH ; 检查是否LengthH=0?
ret ; No, return with error
MOV A,TableLength ;
SUB A,LengthL ; Table length >= wLengthL ?
SNZ C ;
ret ; 若TableLength<wLengthL,则return
set_tablelength:
MOV A,LengthL ; 若TableLength>=wLengthL,
MOV TableLength,A ; 则Update Tablelength=FIFO_wLengthL
ret ;
;----------------------------------------------------------------------
; Remark : GetDescriptor命令的Recipient若为Interface,则要处理的descriptor
; 是HID和Entity(Report)二种descriptor,因为这二种descriptor是隶属
; 在InterfaceDescriptor阶层之下的(03-09-2004)
;----------------------------------------------------------------------
ClassDst_Interface:
MOV A,FIFO_wIndexL ; ACC=取出interface number
SUB A,INTERFACE_NO ;
SZ C ; 检查interface number是否超过INTERFACE_NO
JMP ToStallPipe0 ; Yes,跳到ToStallPipe0
Skip_Check_Endpoint: ; No,continue
MOV A,FIFO_wValueH ; ACC=取出Class descriptor type(HID/Report/Physical)
AND A,wValueH_Dst ; Stanard, Class & Vendor
MOV TEMP,A ;
SUB A,04H ;Over 4 iteM ?
SZ C ;
JMP ToStallPipe0 ;Yes
MOV A,TEMP ;
class_des_pcl_5:
ADDM A,PCL ;
JMP ToStallPipe0 ; 不处理
JMP GetHID ; Get HID descriptor
JMP GetEntity ; Get entity descriptor
JMP ToStallPipe0 ; 不处理Get physical descriptor
;-----------------------------------------------------------------------------------
get_Interface_des_adr:
mov a,des_count ;
get_interface_pcl_3:
addm a,pcl ;
ret a,LOW InterfaceD_0 ; 回传ACC=InterfaceD_0的地址
ret a,LOW InterfaceD_1 ; 回传ACC=InterfaceD_1的地址
ret a,LOW InterfaceD_2 ; 回传ACC=InterfaceD_2的地址
;-----------------------------------------------------------------------------------
get_HID_des_adr:
mov a,des_count ;
get_HID_pcl_3:
addm a,pcl ;
ret a,LOW HID_0 ; 回传ACC=HID_0的地址
ret a,LOW HID_1 ; 回传ACC=HID_1的地址
ret a,LOW HID_2 ; 回传ACC=HID_2的地址
;-----------------------------------------------------------------------------------
get_endpt_des_adr:
mov a,des_count ;
get_endpt_pcl_3:
addm a,pcl ;
ret a,LOW EndpointD_0 ; 回传ACC=EndpointD_0的地址
ret a,LOW EndpointD_1 ; 回传ACC=EndpointD_1的地址
ret a,LOW EndpointD_2 ; 回传ACC=EndpointD_2的地址
;-----------------------------------------------------------------------------------
get_entity_des_adr:
mov a,des_count ;
get_entity_pcl_3:
addm a,pcl ;
ret a,LOW Entity_0 ; 回传ACC=Entity_0的地址
ret a,LOW Entity_1 ; 回传ACC=Entity_1的地址
ret a,LOW Entity_2 ; 回传ACC=Entity_2的地址
;-----------------------------------------------------------------------------------
get_entity_length:
mov a,des_count ;
get_entity_len_pcl_3:
addm a,pcl ;
ret a,Entity_Length_0 ; 回传ACC=Entity_Length_0的地址
ret a,Entity_Length_1 ; 回传ACC=Entity_Length_1的地址
ret a,Entity_Length_2 ; 回传ACC=Entity_Length_2的地址
PUBLIC StandardRequest
PUBLIC GetEnd
PUBLIC ReadNextCnf
public std_request_pcl_14
public clear_feature_pcl_5
public set_feature_pcl_5
public std_des_start_pcl
public std_des_end_pcl
public GetStringDes
public std_device_pcl_5
public class_des_pcl_5
public get_status_pcl_5
public get_interface_pcl_3
public get_endpt_pcl_3
public get_entity_pcl_3
public get_HID_pcl_3
public get_entity_len_pcl_3
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -