📄 usbex.asm
字号:
CH375_REQ_SEL_02:
CJNE A,#DEF_USB_SET_ADDRESS,CH375_REQ_SEL_03
LJMP CH375_USB_SET_ADDRES
CH375_REQ_SEL_03:
CJNE A,#DEF_USB_GET_DESCR,CH375_REQ_SEL_04 ;
LJMP CH375_USB_GET_DESCR
CH375_REQ_SEL_04:
CJNE A,#DEF_USB_GET_CONFIG,CH375_REQ_SEL_05
LJMP CH375_USB_GET_CONFIG
CH375_REQ_SEL_05:
CJNE A,#DEF_USB_SET_CONFIG,CH375_REQ_SEL_06
LJMP CH375_USB_SET_CONFIG
CH375_REQ_SEL_06:
CJNE A,#DEF_USB_GET_INTERF,CH375_REQ_SEL_07
LJMP CH375_USB_GET_INTERF
CH375_REQ_SEL_07:
LJMP CH375_SETUP_RET_ERR
;*************************************************************************************************
;USB GET STATUS 得到状态
CH375_USB_GET_STATUS: MOV @R0,#00H
INC R0
MOV @R0,#00H
LCALL CH375_EP0_UPLOAD ;调用端点0上传
LJMP CH375_SETUP_RET ;中断返回
CH375_SETUP_RET_ERR_1: LJMP CH375_SETUP_RET_ERR
;************************************************************************************************
;USB CLR FEATURE 清除特性
CH375_USB_CLR_FEATURE: MOV A,CMD_BUFFER ;取请求码
ANL A,#1FH
CJNE A,#02H,CH375_SETUP_RET_ERR_1 ;不是端点则不支持
MOV A,CMD_BUFFER+4
CJNE A,#82H,CH375_USB_CLR_FEA_0
;端点2上传
MOV A,#CMD_SET_ENDP7 ;清除端点2上传
CALL WR_CMD_TO_375
MOV A,#8EH
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
;
CH375_USB_CLR_FEA_0: CJNE A,#02H,CH375_USB_CLR_FEA_1
MOV A,#CMD_SET_ENDP6 ;清除端点2下传
CALL WR_CMD_TO_375
MOV A,#80H
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包 ;端点2下传
LJMP CH375_SETUP_RET
CH375_USB_CLR_FEA_1: CJNE A,#81H,CH375_USB_CLR_FEA_2
MOV A,#CMD_SET_ENDP5 ;清除端点1上传
CALL WR_CMD_TO_375
MOV A,#8EH ;端点1上传
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
CH375_USB_CLR_FEA_2: CJNE A,#01H,CH375_USB_CLR_FEA_3
MOV A,#CMD_SET_ENDP4 ;清除端点1下传
CALL WR_CMD_TO_375
MOV A,#80H ;端点1下传
MOVX @DPTR,A
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
CH375_USB_CLR_FEA_3:
LJMP CH375_SETUP_RET_ERR ;;不支持
;****************************************************************************************
;USB AET ADDRESS
CH375_USB_SET_ADDRES:
MOV A,CMD_BUFFER+2 ;取出地址
MOV VAR_USB_ADDRESS,A ;暂存地址
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET ;先退出,到发出状态后才能反改变
;*****************************************************************************************
;USB GET DESCR 获得描述符
CH375_USB_GET_DESCR:
MOV A,CMD_BUFFER+3
CJNE A,#1H,CH375_GET_DESCR_1 ;获取设备描述符
MOV A,#00H
MOV VAR_SETUP_DESCR,A ;描述符偏移量=0
LCALL CH375_DES_UPLOAD
LJMP CH375_SETUP_RET
CH375_GET_DESCR_1:
CJNE A,#2H,CH375_GET_DESCR_2 ;获取配置描述符
MOV A,#USB_CFG_DESCR_TAB-USB_DEV_DESCR_TAB
MOV VAR_SETUP_DESCR,A ;描述符偏移量
LCALL CH375_DES_UPLOAD
LJMP CH375_SETUP_RET
CH375_GET_DESCR_2:
CJNE A,#22H,CH375_GET_DESCR_3
MOV A,#USB_REP_DESCR_TAB-USB_DEV_DESCR_TAB
MOV VAR_SETUP_DESCR,A ;描述符偏移量
LCALL CH375_DES_UPLOAD
LJMP CH375_SETUP_RET
CH375_GET_DESCR_3: LJMP CH375_SETUP_RET_ERR ;不支持退出
;*******************************************************************************************
;USB GET CONFIG
CH375_USB_GET_CONFIG: MOV @R0,#01H ;配置值为01H,在描述符里指定的
JB CH375_CON_FLAG,CH375_CON_CON
MOV @R1,#00H ;CH375没有配置返回00
CH375_CON_CON: LCALL CH375_EP0_UPLOAD ;调用端点0上传
LJMP CH375_SETUP_RET
;********************************************************************************************
;USB SET CONFIG
CH375_USB_SET_CONFIG: MOV A,CMD_BUFFER+2
CLR CH375_CON_FLAG ;取消配置
SETB CH375_CON_ACT
JZ CH375_USB_SET_CFG1
SETB CH375_CON_FLAG ;设置配置
CLR CH375_CON_ACT ;输出低电平指示完成标志
CH375_USB_SET_CFG1:
LCALL CH375_EP0_IN_ZERO ;上传0长读的信息包
LJMP CH375_SETUP_RET
;*********************************************************************************************
;USB GET INTER
CH375_USB_GET_INTERF: MOV @R0,#01H ;返回一个接口
LCALL CH375_EP0_UPLOAD ;因为在这里我们指定一个接口
LJMP CH375_SETUP_RET
;*********************************************************************************************
CH375_EP0_UPLOAD:
MOV A,VAR_SETUP_LENGTH ;取出长度
MOV R5,#08H
CLR C
SUBB A,R5
MOV R5,VAR_SETUP_LENGTH ;上传长度小于8
JC CH375_EP0_UP_LEN
MOV VAR_SETUP_LENGTH,A ;重新给出长度
MOV R5,#08H
CH375_EP0_UP_LEN:
MOV R0,#CMD_BUFFER ;上传缓冲区送R0
MOV A,#CMD_WR_USB_DATA3 ;命令口送入,写端点0
CALL WR_CMD_TO_375
MOV A,R5 ;首先上传长度
MOVX @DPTR,A ;数据长度送375
CH375_EP0_UP_LOOP2: MOV A,@R0 ;数据取出, ;
MOVX @DPTR,A ;数据送入CH375
INC R0 ;缓冲区地址加一
DJNZ R5,CH375_EP0_UP_LOOP2 ;缓冲区不满则继续
CH375_EP0_UP_LOOPRET:
RET
;********************************************************************************************
CH375_DES_UPLOAD:
MOV R0,#CMD_BUFFER ;缓冲区首地址送间接寻址
MOV R5,#08H
MOV DPTR,#USB_DEV_DESCR_TAB ;
CH375_DES_UPLOOP:
MOV A,VAR_SETUP_DESCR
LCALL CH375_TAB_TAB
MOV @R0,A
INC VAR_SETUP_DESCR
INC R0
DJNZ R5,CH375_DES_UPLOOP
LCALL CH375_EP0_UPLOAD
RET
;RERUEST OVER
CH375_EP0_IN_ZERO:
MOV A,#CMD_WR_USB_DATA3 ;上传0长度的联络信息包
CALL WR_CMD_TO_375
MOV A,#00H
MOVX @DPTR,A
RET
;串口初始化程序
;********************************************************************************************
; 以毫秒为单位延时
; ENTRY: R7 延时毫秒数
; USE: ACC, R7
DELAY_MS: MOV A,#0FAH ;250*(1*6+2)*0.5=1000uS
DELAY_1MS: NOP
NOP
NOP
NOP
NOP
NOP
DJNZ ACC,DELAY_1MS ;每周期延时1毫秒
DJNZ R7,DELAY_MS
RET
;
;*********************************************************************************************************************
;
CH375_TAB_TAB: MOVC A,@A+DPTR
RET
USB_DEV_DESCR_TAB: DB 12H ;USB设备描述符
DB 01H
DB 10H
DB 01H
DB 00H ;04H, DeviceClass
DB 00H ;05H, DeviceSubClass
DB 00H ;06H, DeviceProtocol
DB 08H ;端点0最大包长度8字节
DB 31H ;08H, VendorId-L
DB 51H ;09H, VendorId-H
DB 07H ;0AH, ProductId-L
DB 20H ;0BH, ProductId-H
DB 00H ;0CH, ReleaseId-L
DB 03H ;0DH, ReleaseId-H
DB 01H
DB 02H
DB 00H ;10H, IndexSerialNumber
DB 00H
USB_CFG_DESCR_TAB: DB 09H ;USB配置描述符
DB 02H
DB 29H ;02H, TotalLength-L
DB 00H
DB 01H
DB 01H ;配置值
DB 04H
DB 0A0H ;07H, Attributes
DB 23H
DB 09H ;USB接口描述符
DB 04H
DB 00H
DB 00H
DB 02H ;0DH, NumberEndpoints
DB 03H ;0EH, InterfaceClass
DB 01H ;0FH, InterfaceSubClass
DB 01H ;10H, InterfaceProtocol
DB 05H
DB 09H
DB 21H
DB 00H
DB 01H
DB 00H
DB 01H
DB 22H
DB 4BH
DB 00H
DB 07H
DB 05H
DB 81H ;端点82H发送/上传
DB 03H ;批量端点
DB 08H ;最大包长度32字节
DB 00H
DB 18H
DB 07H
DB 05H
DB 01H ;端点01H接收/下传
DB 03H ;批量端点
DB 08H ;最大包长度32字节
DB 00H
DB 18H
;报表描述符
USB_REP_DESCR_TAB: DB 05H
DB 00H
DB 09H
DB 01H
DB 0A1H
DB 01H
DB 85H
DB 01H
DB 09H
DB 01H
DB 15H
DB 00H
DB 25H
DB 0FFH
DB 75H
DB 08H
DB 95H
DB 07H
DB 81H
DB 06H
DB 09H
DB 01H
DB 0B1H
DB 06H
DB 85H
DB 03H
DB 09H
DB 01H
DB 15H
DB 00H
DB 25H
DB 08H
DB 75H
DB 08H
DB 95H
DB 01H
DB 09H
DB 01H
DB 0B1H
DB 06H
DB 85H
DB 02H
DB 09H
DB 02H
DB 15H
DB 00H
DB 25H
DB 0FFH
DB 75H
DB 08H
DB 95H
DB 07H
DB 91H
DB 06H
DB 09H
DB 02H
DB 0B1H
DB 06H
DB 85H
DB 04H
DB 09H
DB 02H
DB 15H
DB 00H
DB 25H
DB 08H
DB 75H
DB 08H
DB 95H
DB 01H
DB 09H
DB 02H
DB 0B1H
DB 06H
DB 0C0H
END
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -