阅读:2403回复:15
那位大哥能给一个52+d12的固件的例子(asm51)的,我都快疯掉了
就算是调试还有错误的也没关系,主要是有许多问题不知如何下手,想看看格式阿,有些数据啊,命令是怎么处理的!!
拜托拜托了! happycw@eyou.com |
|
最新喜欢:changj... |
沙发#
发布于:2002-11-20 13:57
同志,斑竹早把资源公开了.
你到 zboard 论坛看看吧. |
|
|
板凳#
发布于:2002-11-20 15:07
我要的是asm51的程序!!那个是c的呀。不过还是很感谢你的回答。
|
|
地板#
发布于:2002-11-24 02:20
不信吧,到www.intel.com上面去找找,我以前在上面下载过的,
要不www.lvr.com上也能找到。 |
|
|
地下室#
发布于:2002-11-25 08:34
谢谢你提供的网站.不过那些例子是for EZ-USB,而我是用52的.不知道在指令上有什么不同阿??我怎么把它改成52可以使用的呢?
|
|
5楼#
发布于:2002-11-26 14:18
我要的是asm51的程序!!那个是c的呀。不过还是很感谢你的回答。 编译时可以选择生成汇编源文件的呀!在此基础上,把有用的部分提取出来简单修改一下不就行了? |
|
|
6楼#
发布于:2002-11-26 17:18
[quote]我要的是asm51的程序!!那个是c的呀。不过还是很感谢你的回答。 编译时可以选择生成汇编源文件的呀!在此基础上,把有用的部分提取出来简单修改一下不就行了? [/quote] 这个办法我也想过,不过可读性太差,..郁闷中..... |
|
7楼#
发布于:2002-11-26 20:48
兼容的啊,不过你的板不一样,还是要根据硬件改改的。
|
|
|
8楼#
发布于:2002-11-27 08:06
兼容的啊,不过你的板不一样,还是要根据硬件改改的。 请问你指的是什么兼容的阿? |
|
9楼#
发布于:2002-12-11 20:02
指令兼容啊。
|
|
|
10楼#
发布于:2002-12-12 08:24
谢谢你.不过因为不太熟悉,所以看的还不是很懂..不过通过参考很多地方的资源,现在正在做枚举,就差最后一步了.正在研究那...
|
|
11楼#
发布于:2002-12-14 00:39
a
|
|
|
12楼#
发布于:2002-12-14 08:05
a 太谢谢了..好人啊....我最近正碰到问题呢..... |
|
13楼#
发布于:2002-12-14 08:07
可是分数以前已经给出去了..没法给了...你要么..我可以专门开个帖子给你分啊..要多少说话.只要我能做到的
|
|
14楼#
发布于:2002-12-25 21:12
; /////////////初始化命令
USB_SET_ADD EQU 0D0H ; 设置地址/使能 USB_SET_EPN EQU 0D8H ; 设置端点使能 USB_SET_MOD EQU 0F3H ; 设置模式 USB_SET_DMA EQU 0FBH ; 设置DMA ; ////////////选择端点命令 SLT_EP0_OUT EQU 000H ; 端点0输出 SLT_EP0_INP EQU 001H ; 端点0输入 SLT_EP1_OUT EQU 002H ; 端点1输出 SLT_EP1_INP EQU 003H ; 端点1输入 SLT_EP2_OUT EQU 004H ; 端点2输出 SLT_EP2_INP EQU 005H ; 端点2输入 ; ////////////读最后处理状态命令 RD_EP0_OUT EQU 040H ; 端点0输出 RD_EP0_INP EQU 041H ; 端点0输入 RD_EP1_OUT EQU 042H ; 端点1输出 RD_EP1_INP EQU 043H ; 端点1输入 RD_EP2_OUT EQU 044H ; 端点2输出 RD_EP2_INP EQU 045H ; 端点2输入 ; ////////////设置端点状态命令 SET_EP0_OUT EQU 040H ; 端点0输出 SET_EP0_INP EQU 041H ; 端点0输入 SET_EP1_OUT EQU 042H ; 端点1输出 SET_EP1_INP EQU 043H ; 端点1输入 SET_EP2_OUT EQU 044H ; 端点2输出 SET_EP2_INP EQU 045H ; 端点2输入 ; ////////////读缓冲区命令 USB_RD_TMP EQU 0F0H ; ////////////写缓冲区命令 USB_WR_TMP EQU 0F0H ; ////////////应答建立命令 USB_ACK_CMD EQU 0F1H ; ////////////清缓冲区命令 USB_CLR_TMP EQU 0F2H ; ////////////读中断寄存器命令 USB_RD_INT EQU 0F4H ; ////////////读当前接收帧数目命令 USB_RD_SUM EQU 0F5H ; ////////////挂起恢复命令 USB_SUP_WAK EQU 0F6H ; ////////////使缓冲区有效命令 USB_SET_TMP EQU 0FAH ; //////////// USB 常量 USB_ADD_MSK EQU 080H ; 地址使能掩码 USB_SYC_MSK EQU 001H ; 普通同步端点使能掩码 USB_LAZ_MSK EQU 002H ; LAZYCLOCK掩码 USB_CLK_MSK EQU 004H ; 时00000000钟运行掩码 USB_INT_MSK EQU 008H ; 中断模式掩码 USB_SCT_MSK EQU 010H ; SOFTCONNECT掩码 USB_SET_MD0 EQU 000H ; 模式0(非同步模式)掩码 USB_SET_MD1 EQU 040H ; 模式1(同步输出模式)掩码 USB_SET_MD2 EQU 080H ; 模式2(同步输入模式)掩码 USB_SET_MD3 EQU 0C0H ; 模式3(同步输入/输出模式)掩码 ; ///////////// D12 中断寄存器掩码 INT_EP0_OUT EQU 001H ; 端点0输出中断 INT_EP0_INP EQU 002H ; 端点0输入中断 INT_EP1_OUT EQU 004H ; 端点1输出中断 INT_EP1_INP EQU 008H ; 端点1输入中断 INT_EP2_OUT EQU 010H ; 端点2输出中断 INT_EP2_INP EQU 020H ; 端点2输入中断 INT_BUS_RST EQU 040H ; 总线复位 INT_SUP_CHG EQU 080H ; 挂起改变 INT_DMA_EOT EQU 100H ; DMA操作结束 ; ///////////// D12 命令地址,数据地址 USB_CMD_ADD EQU 8203H USB_DATA_ADD EQU 8202H ;------------------------------------------ ;-- USB SYSTEM -- ; D12在ALE方式:奇地址写命令,偶地址读写数据 ;------------------------------------------ USB_DISCON: CLR USB_RST LCALL LDELAY LCALL LDELAY SETB USB_RST MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_MOD MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, #02H MOVX @DPTR, A MOV A, #41H MOVX @DPTR, A RET USB_CONECT: MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_MOD MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, #12H MOVX @DPTR, A MOV A, #41H MOVX @DPTR, A RET ;----------------------------------------- USB_RECONECT: LCALL USB_DISCON MOV R0, #90H USB_IJ1: LCALL LDELAY LCALL LDELAY CLR DOG_CS SETB DOG_CS DJNZ R0, USB_IJ1 LCALL USB_CONECT RET ;-----------------------------------+ ; USB controller interrupt | ;-----------------------------------+ I_INT1: CLR EA PUSH PSW PUSH DPH PUSH DPL PUSH ACC CLR RS1 SETB RS0 MOV DPTR, #USB_CMD_ADD MOV A, #USB_RD_INT MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR PUSH ACC MOVX A, @DPTR ; JNB ACC.0, INT1_J1 ; LCALL DMA_EOT INT1_J1: POP ACC JNB ACC.6, INT1_J2 PUSH ACC SETB USB_BUSRST ; 总线复位 POP ACC SJMP INT1_J3 INT1_J2: JNB ACC.7, INT1_J3 PUSH ACC ; 挂起改变 SETB USB_SUSCHG POP ACC INT1_J3: JNB ACC.1, INT1_J4 PUSH ACC LCALL EP0_TXDONE ; 端点0发送中断 POP ACC INT1_J4: JNB ACC.0, INT1_J5 PUSH ACC LCALL EP0_RXDONE ; 端点0接收中断 POP ACC INT1_J5: JNB ACC.2, INT1_J6 PUSH ACC LCALL EP1_RXDONE ; 端点1接收中断 POP ACC INT1_J6: JNB ACC.3, INT1_J7 PUSH ACC LCALL EP1_TXDONE ; 端点1发送中断 POP ACC INT1_J7: JNB ACC.4, INT1_J8 PUSH ACC LCALL EP2_RXDONE ; 端点2接收中断 POP ACC INT1_J8: JNB ACC.5, INT1_RET LCALL EP2_TXDONE ; 端点2发送中断 INT1_RET: SETB EX1 POP ACC POP DPL POP DPH POP PSW SETB EA RETI ;----------------------------------- ; DMA 结束中断处理 ;----------------------------------- DMA_EOT: RET ;----------------------------------- ; 端点0发送中断处理(控制输入) ;----------------------------------- EP0_TXDONE: MOV DPTR, #USB_CMD_ADD MOV A, #RD_EP0_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR ; 清除中断标志 JB USB_TRANSMIT, EP0_WJ0 RET EP0_WJ0: MOV A, USB_TX_LEN ; 计算发送数据长度 JNZ EP0_J1 ; 长度=0发送一个空包结束 MOV DPTR, #USB_CMD_ADD ; 选择端点 MOV A, #SLT_EP0_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR MOV DPTR, #USB_CMD_ADD MOV A, #USB_WR_TMP ; 写缓冲区命令 MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 写数据 MOV A, #00H MOVX @DPTR, A MOV A, #00H MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD ; 使缓冲区有效 MOV A, #USB_SET_TMP MOVX @DPTR, A MOV USB_TX_LEN, #00H MOV USB_TX_HEAD, #00H CLR USB_TRANSMIT RET EP0_J1: MOV A, USB_TX_LEN CLR C SUBB A, #10H JC EP0_WJ2 MOV USB_TX_LEN, A SETB USB_TRANSMIT MOV R0, #10H SJMP EP0_WJ3 EP0_WJ2: MOV R0, USB_TX_LEN MOV USB_TX_LEN, #00H EP0_WJ3: MOV DPTR, #USB_CMD_ADD ; 选择端点0索引1 MOV A, #SLT_EP0_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR MOV DPTR, #USB_CMD_ADD MOV A, #USB_WR_TMP ; 写缓冲区命令 MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 写数据 MOV A, #00H MOVX @DPTR, A MOV A, R0 MOVX @DPTR, A MOV A, USB_TX_HEAD ADD A, #USB_W_RAM MOV R1, A MOV A, USB_TX_HEAD ADD A, #10H MOV USB_TX_HEAD, A EP0_WJ4: MOV A, @R1 MOVX @DPTR, A INC R1 DJNZ R0, EP0_WJ4 MOV DPTR, #USB_CMD_ADD ; 使缓冲区有效开始发送 MOV A, #USB_SET_TMP MOVX @DPTR, A RET ;----------------------------------- ; 端点0接收中断处理(控制输出) ;----------------------------------- EP0_RXDONE: MOV DPTR, #USB_CMD_ADD MOV A, #RD_EP0_OUT MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR ; 清除中断标志 JB ACC.5, EP0_RJ0 LJMP EP0_REND EP0_RJ0: ; 处理设置包 MOV A, #SLT_EP0_OUT LCALL USB_RDFRAME MOV A, USB_D12_LEN CJNE A, #08H,EP0_RJ1 SJMP EP0_RJ2 EP0_RJ1: ; 接收数据长度错误 SETB USB_ENDP_STAT MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT MOV USB_RX_LEN, #00H CLR USB_TRANSMIT CLR USB_RECEIVE RET EP0_RJ2: ; 有效数据处理 MOV R0, #USB_R_RAM MOV R1, #USB_REQTYPE MOV R2, #08H EP0_RJ2A: MOV A, @R0 MOV @R1, A INC R0 INC R1 DJNZ R2, EP0_RJ2A MOV USB_RX_LEN, #00H MOV USB_TX_LEN, #00H MOV USB_TX_HEAD, #00H MOV DPTR, #USB_CMD_ADD ; 选择端点0输出 MOV A, #SLT_EP0_OUT MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD ; 应答 MOV A, #USB_ACK_CMD MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD MOV A, #USB_CLR_TMP ; 清缓冲区 MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD ; 选择端点0输入 MOV A, #SLT_EP0_INP MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD ; 应答 MOV A, #USB_ACK_CMD MOVX @DPTR, A MOV A, USB_REQTYPE JNB ACC.7, EP0_RJ3 SETB USB_SETPACK ; DEVICE TO HOST CLR USB_TRANSMIT CLR USB_RECEIVE RET EP0_RJ3: MOV A, USB_LENGH_H JNZ EP0_RJ4 MOV A, USB_LENGH JNZ EP0_RJ4 SETB USB_SETPACK CLR USB_RECEIVE CLR USB_TRANSMIT RET EP0_RJ4: CLR C MOV A, USB_LENGH CJNE A, #08H, EP0_RJ5 SJMP EP0_RJ6 EP0_RJ5: JC EP0_RJ6 SETB USB_ENDP_STAT MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT CLR USB_RECEIVE CLR USB_TRANSMIT RET EP0_RJ6: SETB USB_RECEIVE RET EP0_REND: JB USB_RECEIVE, EP0_RJ7 CLR USB_RECEIVE CLR USB_TRANSMIT RET EP0_RJ7: MOV A, #SLT_EP0_OUT LCALL USB_RDFRAME MOV A, USB_RX_LEN ADD A, USB_D12_LEN MOV USB_RX_LEN, A MOV A, USB_D12_LEN CJNE A, #10H, EP0_RJ8 MOV A, USB_LENGH DEC A CLR C SUBB A, USB_RX_LEN JC EP0_RJ8 RET EP0_RJ8: SETB USB_SETPACK CLR USB_RECEIVE CLR USB_TRANSMIT RET ;----------------------------------- ; 设备请求处理 ;----------------------------------- DEV_REQUEST: MOV A, USB_REQTYPE ANL A, #60H CJNE A, #00H, DEV_J1 LJMP USB_STD_REQ DEV_J1:CJNE A, #20H, DEV_J2 LJMP USB_CLASS_REQ DEV_J2:CJNE A, #40H, DEV_J3 LJMP USB_VENDOR_REQ DEV_J3: SETB USB_ENDP_STAT MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET USB_STD_REQ: MOV A, USB_REQUEST ANL A, #0FH CJNE A, #00H, DEV_S_J1 LCALL GET_STATUS RET DEV_S_J1: CJNE A, #01H, DEV_S_J2 LCALL CLEAR_FEATURE RET DEV_S_J2: CJNE A, #02H, DEV_S_J3 LJMP DEV_S_J13 ; RESERVED DEV_S_J3: CJNE A, #03H, DEV_S_J4 LCALL SET_FEATURE RET DEV_S_J4: CJNE A, #04H, DEV_S_J5 LJMP DEV_S_J13 ; RESERVED DEV_S_J5: CJNE A, #05H, DEV_S_J6 LCALL SET_ADDRESS RET DEV_S_J6: CJNE A, #06H, DEV_S_J7 LCALL GET_DESCRIPTOR RET DEV_S_J7: CJNE A, #07H, DEV_S_J8 LJMP DEV_S_J13 ; RESERVED DEV_S_J8: CJNE A, #08H, DEV_S_J9 LCALL GET_CONFIGURATION RET DEV_S_J9: CJNE A, #09H, DEV_S_J10 LCALL SET_CONFIGURATION RET DEV_S_J10: CJNE A, #0AH, DEV_S_J11 LCALL GET_INTERFACE RET DEV_S_J11: CJNE A, #0BH, DEV_S_J12 LCALL SET_INTERFACE RET DEV_S_J12: CJNE A, #0CH, DEV_S_J13 LCALL SYNCH_FRAME RET DEV_S_J13: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET USB_CLASS_REQ: RET USB_VENDOR_REQ: MOV A, USB_REQUEST JB ACC.7, V_RRJ LJMP V_WRJ V_RRJ: MOV A, USB_INDEX_H ; GET FIRMWARE VERSION CJNE A, #04H, V_RRJ1 ; USB_wINDEX = 0472H MOV A, USB_INDEX ; USB_wVALUE = 0 CJNE A, #72H, V_RRJ1 ; USB_wLENGH = 1 MOV A, USB_VALUE_H JNZ V_RRJ1 MOV A, USB_VALUE JNZ V_RRJ1 MOV A, USB_LENGH_H JNZ V_RRJ1 MOV A, USB_LENGH CJNE A, #01H, V_RRJ1 MOV USB_WRDAT, #01H MOV USB_WRDAT+1, #30H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET V_RRJ1: MOV A, USB_INDEX_H ; GET BUFFER SIZE CJNE A, #04H, V_RRJ2 ; USB_wVALUE = 0474H MOV A, USB_INDEX ; USB_wVALUE = 0 CJNE A, #74H, V_RRJ2 ; USB_wLENGH = 4 MOV A, USB_VALUE_H JNZ V_RRJ2 MOV A, USB_VALUE JNZ V_RRJ2 MOV A, USB_LENGH_H JNZ V_RRJ2 MOV A, USB_LENGH XRL A, #04H JNZ V_RRJ2 MOV USB_WRDAT, #04H MOV USB_WRDAT+1, #40H MOV USB_WRDAT+2, #00H MOV USB_WRDAT+3, #00H MOV USB_WRDAT+4, #00H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET V_RRJ2: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET V_WRJ: MOV A, USB_INDEX_H ; SET UP DMA REQUEST CJNE A, #04H, V_WRJ1 ; USB_wINDEX = 0471H MOV A, USB_INDEX_H ; USB_wVALUE = 0 CJNE A, #71H, V_WRJ1 ; USB_wLENGH = 6 MOV A, USB_VALUE_H JNZ V_WRJ1 MOV A, USB_VALUE JNZ V_WRJ1 MOV A, USB_LENGH_H JNZ V_WRJ1 MOV A, USB_LENGH CJNE A, #06H, V_WRJ1 RET V_WRJ1: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET ;-------------------------- GET_STATUS: MOV A, USB_REQTYPE ANL A, #1FH CJNE A, #00H, GETS_J1 MOV A, #03H ; DEVICE MOV C, USB_RMT_WAK MOV ACC.1, C MOV USB_WRDAT+1, A MOV USB_WRDAT+2, #00H LJMP GETS_END GETS_J1: CJNE A, #01H, GETS_J2 MOV USB_WRDAT+1, #00H ; INTERFACE MOV USB_WRDAT+2, #00H LJMP GETS_END GETS_J2: CJNE A, #02H, GETS_J3 MOV A, USB_INDEX ; ENDPOINT ANL A, #03H RL A PUSH ACC MOV A, USB_INDEX ANL A, #80H JZ GETS_J3A POP ACC ADD A, #01H PUSH ACC GETS_J3A: POP ACC LCALL SELECT_POINT MOV USB_WRDAT+1, #00H JNB ACC.1, GETS_J3B MOV USB_WRDAT+1, #01H GETS_J3B: MOV USB_WRDAT+2, #00H LJMP GETS_END GETS_J3: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET GETS_END: MOV USB_WRDAT, #02H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET ;-------------------------- CLEAR_FEATURE: MOV A, USB_REQTYPE ANL A, #1FH PUSH ACC CJNE A, #00H, CLRF_J1 MOV A, USB_VALUE_H ; USB FEATURE REMOTE_WAKEUP = 0001H JNZ CLRF_J1 MOV A, USB_VALUE CJNE A, #01H, CLRF_J1 CLR USB_RMT_WAK POP ACC LJMP CLRF_END CLRF_J1: POP ACC CJNE A, #02H, CLRF_J2 MOV A, USB_VALUE_H ; USB FEATURE ENDPOINT STALL = 0000H JNZ CLRF_J2 MOV A, USB_VALUE JNZ CLRF_J2 MOV A, USB_INDEX ANL A, #03H RL A PUSH ACC MOV A, USB_INDEX ANL A, #80H JZ CLRF_J1A POP ACC ADD A, #01H PUSH ACC CLRF_J1A: POP ACC CLR USB_ENDP_STAT LCALL SET_ENDPNT_STAT LJMP CLRF_END CLRF_J2: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET CLRF_END: MOV USB_WRDAT, #00H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET ;-------------------------- SET_FEATURE: MOV A, USB_REQTYPE ANL A, #1FH PUSH ACC CJNE A, #00H, SETF_J1 MOV A, USB_VALUE_H ; USB FEATURE REMOTE_WAKEUP JNZ SETF_J1 MOV A, USB_VALUE CJNE A, #01H, SETF_J1 SETB USB_RMT_WAK POP ACC LJMP SETF_END SETF_J1: POP ACC CJNE A, #02H, SETF_J2 MOV A, USB_VALUE_H ; USB FEATURE ENDPOINT STALL JNZ SETF_J2 MOV A, USB_VALUE JNZ SETF_J2 MOV A, USB_INDEX ANL A, #03H RL A PUSH ACC MOV A, USB_INDEX ANL A, #80H JZ SETF_J1A POP ACC ADD A, #01H PUSH ACC SETF_J1A: POP ACC SETB USB_ENDP_STAT LCALL SET_ENDPNT_STAT LJMP SETF_END SETF_J2: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET SETF_END: MOV USB_WRDAT, #00H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET ;-------------------------- SET_ADDRESS: MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_ADD MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, USB_VALUE ORL A, #80H MOVX @DPTR, A SETB USB_SET_ADDR MOV USB_WRDAT, #00H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET ;-------------------------- GET_DESCRIPTOR: CLR DOG_CS SETB DOG_CS MOV A, USB_VALUE_H CJNE A, #01H, GETD_J1 MOV A, USB_LENGH ;#40H ;12H CJNE A, #40H, GETD_J1B SJMP GETD_J1C GETD_J1B: JC GETD_J1C MOV A, #40H GETD_J1C: MOV R0, A MOV R1, #USB_W_RAM MOV DPTR, #DEV_DESCPT GETD_J1A: CLR A MOVC A, @A+DPTR MOV @R1, A INC DPTR INC R1 DJNZ R0, GETD_J1A MOV A, USB_LENGH CLR C SUBB A, #10H MOV USB_TX_LEN, A ;#30H ; USB DEVICE DESCRIPTOR SETB USB_TRANSMIT MOV USB_TX_HEAD, #10H MOV A, #SLT_EP0_INP LCALL USB_WRFRAME RET GETD_J1: CJNE A, #02H, GETD_J2 MOV A, USB_LENGH_H JZ GETD_J2D SJMP GETD_J2BB GETD_J2D: MOV A, USB_LENGH CLR C CJNE A, #2EH, GETD_J2B SJMP GETD_J2C GETD_J2B: JC GETD_J2C GETD_J2BB: MOV R0, #2EH MOV R1, #USB_W_RAM MOV DPTR, #CFG_DESCPT LJMP GETD_J1A GETD_J2C: MOV R0, #09H MOV R1, #USB_WRDAT ;USB_W_RAM MOV USB_WRDAT, #09H INC R1 MOV DPTR, #CFG_DESCPT GETD_J2A: CLR A MOVC A, @A+DPTR MOV @R1, A INC DPTR INC R1 DJNZ R0, GETD_J2A ; USB CONFIGURATTION DESCRIPTOR MOV USB_TX_LEN, #00H MOV USB_TX_HEAD, #00H SETB USB_TRANSMIT LCALL EP0_S_TX RET GETD_J2: CJNE A, #04H, GETD_J3 MOV R0, USB_LENGH ;#09H MOV R1, #USB_WRDAT MOV USB_WRDAT, #09H INC R1 MOV DPTR, #INTFACE_DESCPT GETD_J3A: CLR A MOVC A, @A+DPTR MOV @R1, A INC DPTR INC R1 DJNZ R0, GETD_J3A ; USB INTERFACE DESCRIPTOR MOV USB_TX_LEN, #00H SETB USB_TRANSMIT LCALL EP0_S_TX RET GETD_J3: CJNE A, #05H, GETD_J4 MOV R0, #1CH MOV R1, #USB_W_RAM MOV DPTR, #EP1TX_DESCPT GETD_J4A: CLR A MOVC A, @A+DPTR MOV @R1, A INC DPTR INC R1 DJNZ R0, GETD_J4A ; USB ENDPOINT DESCRIPTOR MOV USB_TX_LEN, #0CH MOV USB_TX_HEAD, #10H SETB USB_TRANSMIT LCALL USB_WRFRAME RET GETD_J4: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET ;-------------------------- GET_CONFIGURATION: MOV USB_WRDAT, #01H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H MOV C, USB_CONFIG CLR A MOV ACC.0, C MOV USB_WRDAT+1, A MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET ;-------------------------- SET_CONFIGURATION: SETB USB_SET_CFG MOV A, USB_VALUE_H JNZ SET_CON_J2 MOV A, USB_VALUE JNZ SET_CON_J1 MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_EPN MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, #00H MOVX @DPTR, A CLR USB_CONFIG MOV USB_WRDAT, #00H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H LCALL EP0_S_TX RET SET_CON_J1: CJNE A, #01H, SET_CON_J2 MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_EPN MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, #00H MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_EPN MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, #01H MOVX @DPTR, A SETB USB_CONFIG MOV USB_WRDAT, #00H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET SET_CON_J2: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET ;-------------------------- GET_INTERFACE: MOV USB_WRDAT, #01H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H LCALL EP0_S_TX RET ;-------------------------- SET_INTERFACE: MOV A, USB_VALUE_H ; USB wVALUE = 0 JNZ SET_INTF_J1 MOV A, USB_VALUE JNZ SET_INTF_J1 MOV A, USB_INDEX_H ; USB wINDEX = 0 JNZ SET_INTF_J1 MOV A, USB_INDEX JNZ SET_INTF_J1 MOV USB_WRDAT, #00H MOV USB_WRDAT+1, #00H MOV USB_WRDAT+2, #00H MOV USB_TX_LEN, #00H LCALL EP0_S_TX RET SET_INTF_J1: SETB USB_ENDP_STAT ; STALL EP0 MOV A, #00H LCALL SET_ENDPNT_STAT MOV A, #01H LCALL SET_ENDPNT_STAT RET ;-------------------------- SYNCH_FRAME: RET ;--------------------------- EP0_S_TX: MOV DPTR, #USB_CMD_ADD ; 选择端点 MOV A, #SLT_EP0_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR MOV DPTR, #USB_CMD_ADD MOV A, #USB_WR_TMP ; 写缓冲区命令 MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV A, #00H MOVX @DPTR, A MOV A, USB_WRDAT MOVX @DPTR, A MOV R0, A MOV R1, #USB_WRDAT INC R1 JZ EP0_S_3 EP0_S_2: MOV A, @R1 MOVX @DPTR, A INC R1 DJNZ R0, EP0_S_2 EP0_S_3: MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_TMP ; 使缓冲区有效 MOVX @DPTR, A RET ;----------------------------------- ; 选择端点 ;----------------------------------- SELECT_POINT: MOV DPTR, #USB_CMD_ADD MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR RET ;----------------------------------- ; 设置端点状态 ;----------------------------------- SET_ENDPNT_STAT: MOV DPTR, #USB_CMD_ADD ADD A, #40H MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOV C, USB_ENDP_STAT MOV ACC.0, C MOVX @DPTR, A RET ;----------------------------------- ; 端点1接收中断处理(输出) ;----------------------------------- EP1_RXDONE: MOV DPTR, #USB_CMD_ADD ; 选择 MOV A, #RD_EP1_OUT MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 读最后处理状态清中断标志 MOVX A, @DPTR JB ACC.0, EP1_RJ1 ; 端点缓冲区是否有数据 RET EP1_RJ1: MOV DPTR, #USB_CMD_ADD MOV A, #SLT_EP1_OUT MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD ; 读缓冲区命令 MOV A, #USB_RD_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 读数据 MOV R1, #USB_EP1_RAM MOVX A, @DPTR MOVX A, @DPTR ; 接收数据长度 0 < x < 16 JNZ EP1_RJ1A RET EP1_RJ1A: CJNE A, #10H, EP1_RJ1B SJMP EP1_RJ2 EP1_RJ1B: JC EP1_RJ2 MOV A, #10H EP1_RJ2: MOV R0, A EP1_RJ2A: MOVX A, @DPTR MOV @R1, A INC R1 DJNZ R0, EP1_RJ2A MOV DPTR, #USB_CMD_ADD ; 清缓冲区 MOV A, #USB_CLR_TMP MOVX @DPTR, A EP1_RD_J1: SETB USB_EP1_RX RET ;----------------------------------- ; 端点1发送 ;----------------------------------- EP1_TX: MOV DPTR, #USB_CMD_ADD ; 选择端点 MOV A, #SLT_EP1_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR JNB ACC.0, EP1_TJ1 ; 端点缓冲区是否空 SETB USB_REPEAT RET EP1_TJ1: MOV DPTR, #USB_CMD_ADD ; 写缓冲区命令 MOV A, #USB_WR_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 写数据 MOV A, #00H MOVX @DPTR, A MOV A, #10H MOVX @DPTR, A MOV R0, #10H MOV R1, #USB_W_RAM EP1_TJ2: MOV A, @R1 MOVX @DPTR, A INC R1 DJNZ R0, EP1_TJ2 MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_TMP ; 使缓冲区有效 MOVX @DPTR, A RET ;----------------------------------- ; 端点1发送中断处理(输入) ;----------------------------------- EP1_TXDONE: MOV DPTR, #USB_CMD_ADD ; 选择 MOV A, #RD_EP1_INP MOVX @DPTR, A ; 读最后处理状态清中断标志 MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR RET ;----------------------------------- ; 端点2接收中断处理(输出) ;----------------------------------- EP2_RXDONE: MOV DPTR, #USB_CMD_ADD ; 选择 MOV A, #RD_EP2_OUT MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 读最后处理状态清中断标志 MOVX A, @DPTR JB ACC.0, EP2_RJ1 ; 端点缓冲区是否有数据 RET EP2_RJ1: MOV DPTR, #USB_CMD_ADD MOV A, #SLT_EP2_OUT MOVX @DPTR, A MOV DPTR, #USB_CMD_ADD ; 读缓冲区命令 MOV A, #USB_RD_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 读数据 MOVX A, @DPTR MOVX A, @DPTR JNZ EP2_RJ1A RET EP2_RJ1A: CJNE A, #0FFH, EP2_RJ2 RET EP2_RJ2: CJNE A, #40H, EP2_RJ3 ; 缓冲区长度64字节 SJMP EP2_RJ4 EP2_RJ3: JC EP2_RJ4 MOV A, #40H EP2_RJ4: MOV R2, A ; 接收的数据长度 MOV R3, #10H MOV A, USB_QEUE ANL A, #70H ADD A, #USB_TEMP SETB ACC.7 MOV R1, A PUSH 8EH MOV 8EH, #00H EP2_RJ5: MOVX A, @DPTR MOVX @R1, A INC R1 DJNZ R3, EP2_RJ5 MOV R3, #10H MOV A, R2 ; 计算剩余长度 CLR C SUBB A, #10H JNC EP2_RJ6 MOV A, #00H EP2_RJ6: MOV R2, A MOV A, USB_QEUE ; 计算接收队列头指针 ADD A, #10H ANL A, #77H MOV USB_QEUE, A MOV A, R1 ; 计算接收缓冲区地址 SETB ACC.7 MOV R1, A MOV A, USB_QEUE SWAP A CLR USB_FULL CJNE A, USB_QEUE, EP2_RJ7 SETB USB_FULL EP2_RJ7: CJNE R2, #00H, EP2_RJ5 POP 8EH MOV DPTR, #USB_CMD_ADD MOV A, #USB_CLR_TMP ; 清缓冲区 MOVX @DPTR, A SETB USB_RX LJMP EP2_RXDONE RET ;----------------------------------- ; 端点2发送 ;----------------------------------- EP2_TX: MOV DPTR, #USB_CMD_ADD ; 选择端点 MOV A, #SLT_EP2_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR JNB ACC.0, EP2_TJ1 ; 端点缓冲区是否空 SETB USB_REPEAT RET EP2_TJ1: MOV DPTR, #USB_CMD_ADD ; 写缓冲区命令 MOV A, #USB_WR_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 写数据 MOV A, #00H MOVX @DPTR, A MOV A, EP2_TX_LEN MOVX @DPTR, A MOV R0, EP2_TX_LEN MOV R1, #USB_W_RAM EP2_TJ2: MOV A, @R1 MOVX @DPTR, A INC R1 DJNZ R0, EP2_TJ2 MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_TMP ; 使缓冲区有效 MOVX @DPTR, A RET ;----------------------------------- ; 端点2发送中断处理(输入) ;----------------------------------- EP2_TXDONE: MOV DPTR, #USB_CMD_ADD ; 选择 MOV A, #RD_EP2_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 读最后处理状态清中断标志 MOVX A, @DPTR RET ; -------------------- ; 由主程序判断发送是否完成,EP2发送中断不处理数据 MOV A, USB_TX_LEN JNZ EP2_WJ1 RET EP2_WJ1: MOV DPTR, #USB_CMD_ADD ; 选择端点 MOV A, #SLT_EP2_INP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR JNB ACC.0, EP2_WJ2 ; 端点缓冲区是否空 RET EP2_WJ2: MOV A, USB_TX_LEN PUSH ACC CLR C SUBB A, #41H JC EP2_WJ2A ADD A, #01H MOV USB_TX_LEN, A POP ACC MOV A, #40H PUSH ACC EP2_WJ2A: POP ACC MOV R0, A MOV DPTR, #USB_CMD_ADD ; 写缓冲区命令 MOV A, #USB_WR_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 写数据 MOV A, #00H MOVX @DPTR, A MOV A, R0 MOVX @DPTR, A MOV R1, #USB_W_RAM EP2_WJ3: MOV A, @R1 MOVX @DPTR, A INC R1 DJNZ R0, EP2_WJ3 MOV DPTR, #USB_CMD_ADD MOV A, #USB_SET_TMP ; 使缓冲区有效 MOVX @DPTR, A RET ;----------------------------------- ; 挂起改变中断处理 ;----------------------------------- SUSP_CHG: MOV DPTR, #USB_CMD_ADD MOV A, #USB_SUP_WAK MOVX @DPTR, A RET ;------------------------------------------------ ; 向主机发送一个数据包,A 端点索引1,3或5(输入) ;------------------------------------------------ USB_WRFRAME: MOV DPTR, #USB_CMD_ADD ; 选择端点 MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR SND_J1: MOV DPTR, #USB_CMD_ADD ; 写缓冲区命令 MOV A, #USB_WR_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 写数据 MOV A, #00H MOVX @DPTR, A MOV A, #10H MOVX @DPTR, A MOV R0, #10H MOV R1, #USB_W_RAM SND_J2: MOV A, @R1 MOVX @DPTR, A INC R1 DJNZ R0, SND_J2 MOV DPTR, #USB_CMD_ADD ; 使缓冲区有效 MOV A, #USB_SET_TMP MOVX @DPTR, A RET ;----------------------------------- ; 接收一个数据包,A 端点索引0,2或4 ;----------------------------------- USB_RDFRAME: MOV DPTR, #USB_CMD_ADD ; 选择端点 MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD MOVX A, @DPTR JB ACC.0, REC_J1 ; 端点缓冲区是否有数据 MOV USB_D12_LEN, #00H RET REC_J1: MOV DPTR, #USB_CMD_ADD ; 读缓冲区命令 MOV A, #USB_RD_TMP MOVX @DPTR, A MOV DPTR, #USB_DATA_ADD ; 读数据 MOVX A, @DPTR MOVX A, @DPTR CJNE A, #40H, REC_J1A SJMP REC_J1B REC_J1A: JC REC_J1B MOV A, #40H REC_J1B: MOV USB_D12_LEN, A MOV R0, A MOV A, USB_RX_LEN ADD A, #USB_R_RAM MOV R1, A MOV A, USB_D12_LEN JNZ REC_J2 RET REC_J2: MOVX A, @DPTR MOV @R1, A INC R1 DJNZ R0, REC_J2 MOV A, USB_RX_LEN MOV USB_RX_HEAD, A ADD A, USB_D12_LEN MOV USB_RX_LEN, A MOV DPTR, #USB_CMD_ADD ; 清缓冲区 MOV A, #USB_CLR_TMP MOVX @DPTR, A RET ;----------------------------------- DEV_DESCPT: DB 012H,001H,000H,001H,0DCH,000H,000H,010H,071H DB 004H,066H,006H,000H,001H,000H,000H,000H,019H ;----------------------------------- ; USB DEVICE DESCRIPTOR: ; unsigned char bLengh; ; unsigned char bDescriptorType; ; unsigned bcdUSB; ; unsigned char bDeviceClass; ; unsigned char bdeviceSubClass; ; unsigned char bDeviceProtocol; ; unsigned char bMaxPacketsize; ; unsigned idVendor; ; unsigned idProduct; ; unsigned bcdDevice; ; unsigned char iManufacture; ; unsigned char iProduct; ; unsigned char iSerialNumber; ; unsigned char bNumConfigurations; ;----------------------------------- ;code USB_DEVICE_DESCRIPTOR DeviceDescr = ;{ ; sizeof(USB_DEVICE_DESCRIPTOR), ; USB_DEVICE_DESCRIPTOR_TYPE, ; SWAP(0x0100), ; USB_CLASS_CODE_TEST_CLASS_DEVICE, ; 0, ; 0, ; EP0_PACKET_SIZE, ; SWAP(0x0471), //VID ; SWAP(0x0666), //PID ; SWAP(0x0100), ; 0, //Manufactory ; 0, //Product ; 0, //Serial Number ; 25 //Number of possible configurations ;}; ;----------------------------------- CFG_DESCPT: DB 009H,002H,02EH,000H,001H,001H,000H,060H,0F0H ;----------------------------------- INTFACE_DESCPT: DB 009H,004H,000H,000H,004H,0DCH,0A0H,0B0H,000H ;----------------------------------- EP1TX_DESCPT: DB 007H,005H,081H,002H,010H,000H,005H ;----------------------------------- EP1RX_DESCPT: DB 007H,005H,001H,002H,010H,000H,005H ;----------------------------------- EP2TX_DESCPT: DB 007H,005H,082H,002H,040H,000H,00AH ;----------------------------------- EP2RX_DESCPT: DB 007H,005H,002H,002H,040H,000H,00AH ;----------------------------------- ;USB CONFIGURATION_DESCRIPTOR: ; unsigned char bLength; ; unsigned char bDescriptorType; ; unsigned wTotalLength; ; unsigned char bNumInterfaces; ; unsigned char bConfigurationValue; ; unsigned char iConfiguration; ; unsigned char bmAttributes; ; unsigned char MaxPower; ;----------------------------------- ;code USB_CONFIGURATION_DESCRIPTOR ConfigDescr = ;{ ; sizeof(USB_CONFIGURATION_DESCRIPTOR), ; USB_CONFIGURATION_DESCRIPTOR_TYPE, ; SWAP(CONFIG_DESCRIPTOR_LENGTH), ; 1, ; 1, ; 0, ; 0x60, ; 0xf0 ; //0x1 ;}; ;----------------------------------- ;USB INTERFACE DESCRIPTOR ; unsigned char bLength; ; unsigned char bDescriptorType; ; unsigned char bInterfaceNumber; ; unsigned char bAlternateSetting; ; unsigned char bNumEndpoints; ; unsigned char bInterfaceClass; ; unsigned char bInterfaceSubClass; ; unsigned char bInterfaceProtocol; ; unsigned char iInterface; ;----------------------------------- ;code USB_INTERFACE_DESCRIPTOR InterfaceDescr = ;{ ; sizeof(USB_INTERFACE_DESCRIPTOR), ; USB_INTERFACE_DESCRIPTOR_TYPE, ; 0, ; 0, ; NUM_ENDPOINTS, ; USB_CLASS_CODE_TEST_CLASS_DEVICE, ; USB_SUBCLASS_CODE_TEST_CLASS_D12, ; USB_PROTOCOL_CODE_TEST_CLASS_D12, ; 0 ;}; ;----------------------------------- ;USB ENDPOINT DESCRIPTOR: ; unsigned char bLength; ; unsigned char bDescriptorType; ; unsigned char bEndpointAddress; ; unsigned char bmAttributes; ; unsigned wMaxPacketSize; ; unsigned char bInterval; ;----------------------------------- ;code USB_ENDPOINT_DESCRIPTOR EP1_TXDescr = ;{ ; sizeof(USB_ENDPOINT_DESCRIPTOR), ; USB_ENDPOINT_DESCRIPTOR_TYPE, ; 0x81, ; USB_ENDPOINT_TYPE_INTERRUPT, ; SWAP(EP1_PACKET_SIZE), ; 10 ;}; ;----------------------------------- ;code USB_ENDPOINT_DESCRIPTOR EP1_RXDescr = ;{ ; sizeof(USB_ENDPOINT_DESCRIPTOR), ; USB_ENDPOINT_DESCRIPTOR_TYPE, ; 0x1, ; USB_ENDPOINT_TYPE_INTERRUPT, ; SWAP(EP1_PACKET_SIZE), ; 10 ;}; ;----------------------------------- ;code USB_ENDPOINT_DESCRIPTOR EP2_TXDescr = ;{ ; sizeof(USB_ENDPOINT_DESCRIPTOR), ; USB_ENDPOINT_DESCRIPTOR_TYPE, ; 0x82, ; USB_ENDPOINT_TYPE_BULK, ; SWAP(EP2_PACKET_SIZE), ; 10 ;}; ;----------------------------------- ;code USB_ENDPOINT_DESCRIPTOR EP2_RXDescr = ;{ ; sizeof(USB_ENDPOINT_DESCRIPTOR), ; USB_ENDPOINT_DESCRIPTOR_TYPE, ; 0x2, ; USB_ENDPOINT_TYPE_BULK, ; SWAP(EP2_PACKET_SIZE), ; 10 ;}; ;----------------------------------- ;USB STRING DESCRIPTOR ; unsigned char bLength; ; unsigned char bDescriptorType; ; unsigned char bString[1]; ;----------------------------------- ;USB POWER DESCRIPTOR: ; unsigned char bLength; ; unsigned char bDescriptorType; ; unsigned char bCapabilitiesFlags; ; unsigned char EventNotification; ; unsigned D1LatencyTime; ; unsigned D2LatencyTime; ; unsigned D3LatencyTime; ; unsigned char PowerUnit; ; unsigned D0PowerConsumption; ; unsigned D1PowerConsumption; ; unsigned D2PowerConsumption; ;----------------------------------- ;USB COMMON DESCRIPTOR ; unsigned char bLength; ; unsigned char bDescriptorType; ;----------------------------------- ;USB HUB DESCRIPTOR ; unsigned char bDescriptorLength; // Length of this descriptor ; unsigned char bDescriptorType; // Hub configuration type ; unsigned char bNumberOfPorts; // number of ports on this hub ; unsigned wHubCharacteristics; // Hub Charateristics ; unsigned char bPowerOnToPowerGood; // port power on till power good in 2ms ; unsigned char bHubControlCurrent; // max current in mA ; unsigned char bRemoveAndPowerMask[64]; //room for 255 ports power control and removable bitmask ;----------------------------------- |
|
15楼#
发布于:2002-12-26 08:15
十分感谢..!!!
|
|