USB之设备插入波形变化2

本文深入探讨USB设备接入电脑的全过程,从设备插入前、插入中到插入后的详细步骤,包括hub的角色、信号交互、设备识别及配置。揭示了USB设备如何被系统检测、识别和初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

=============  本系列参考  =============

《圈圈教你玩USB》、《Linux那些事儿之我是USB》

协议文档:https://www.usb.org/document-library/usb-20-specification  usb_20_20190524/usb_20.pdf

调试工具:Beagle USB 480 逻辑分析仪、sys/kernel/debug/usb/usbmon/

====================================

前言

  USB设备插入端口到底发生了什么? 总线上的波形发生了什么变化?  这一节我们从设备插入前、插入中、插入后三个阶段分析

 

一、设备插入前

  首先要知道设备插入的端口是hub的端口(port), 外设不直接与Host相连, 而是通过hub这个“代理商”, 所以一个Host必然有一个hub, 这个最基本的hub我们称之root hub,基本上Host和root hub是捆绑一起,

一个hub可以引出多个端口(port), 目前Linux定义hub最多有31个port, 如果你连接超过这个数量可以改下面的定义

linux-4.1.15/include/uapi/linux/usb/ch11.h
/* This is arbitrary.
 * From USB 2.0 spec Table 11-13, offset 7, a hub can
 * have up to 255 ports. The most yet reported is 10.
 *
 * Current Wireless USB host hardware (Intel i1480 for example) allows
 * up to 22 devices to connect. Upcoming hardware might raise that
 * limit. Because the arrays need to add a bit for hub status data, we
 * use 31, so plus one evens out to four bytes.
 */
#define USB_MAXCHILDREN        31

 

 已我的电脑为例, 只有一个Host主控器和一个root hub, 所有外设的端口都是一个root hub出来的, 如果你的PC机有多个Host/root hub, 可以让设备分散到各个Host避免电流限制

  

  有个概念非常重要, 就是hub也是一个设备, 跟普通的U盘、鼠标、键盘一样, 在Linux中都用struct usb_device 表示, 只是实现的功能侧重点不一样(比如复位功能只有hub有, 用于复位普通外设)

 

  设想一下, 当USB设备插入电脑USB端口时, 电脑提示有设备插入, 接着提示安装成功或者失败,  Host怎么知道外设插入这一事件呢? 既然Host不跟外设直连那肯定跟hub有关, 另外, 如果插入端口信号可以传给Host,

可如果Host还连接着其他外设, 必然导致信号串扰, 因为信号可以在Host和所有外设传达, 比如我正在拷贝U盘数据, 此时插入键盘, 并不会干扰我拷贝, 所以可以推测插入键盘这事件(D+/D-状态改变)并没有传到总线上。

总总现象表明, 这个插入的事件只有被插的那个hub知道, 同时hub的port默认是disable的, 信号不会连接到Host总线上!

  hub既然知道这一事件, 它可以告知Host, 或者是Host来询问, 很显然是后者, 因为外设没有权利主动勾搭Host, 所有的通信过程都是Host主动发起的, 设备被动接收!(唯一例外就是设备远程唤醒Host),   所以我们可以反推,

hub不仅是个外设, 同时采用中断传输, 端点描述符里的bIterval间隔时间值告知Host希望多久访问一次, 协议文档11章有定义hub规范, 代码只要每次读取hub的状态寄存器值, 判断是否有外设插入就行了。

  下面是用usbmon工具调试USB Host跟hub通信的log:

 # cat sys/kernel/debug/usb/usbmon/1u
0s  0u  1s  1t  1u

ce382380 1944921539 C Ii:1:001:1 0:2048 1 = 02
ce382380 1944921539 S Ii:1:001:1 -115:2048 4 <
ce399800 1944921752 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <-----------------------@1
               | | | |__setup令牌包 后面就是请求数据(不会列出PID/CRC5域) 
               | | |__端点地址, 控制传输使用端点0
               | |__设备地址, root hub是第一个设备, 所以是地址1, 0地址表示刚插入设备
               |__主控器/总线
ce399800
1944921752 C Ci:1:001:0 0 4 = 01010100 ce399800 1944921783 S Co:1:001:0 s 23 01 0010 0001 0000 0 <-------------------@2 ce399800 1944921783 C Co:1:001:0 0 0 ce399800 1944921813 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <-------------------@3 ce399800 1944921813 C Ci:1:001:0 0 4 = 01010000 ce399e80 1944961608 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <-------------------@4 ce399e80 1944961608 C Ci:1:001:0 0 4 = 01010000 ce399800 1945001556 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <-------------------@5 ce399800 1945001556 C Ci:1:001:0 0 4 = 01010000 ce399e80 1945041564 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <-------------------@6 ce399e80 1945041564 C Ci:1:001:0 0 4 = 01010000 ce399e80 1945081604 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <-------------------@7 ce399e80 1945081604 C Ci:1:001:0 0 4 = 01010000 ce399e80 1945081665 S Co:1:001:0 s 23 03 0004 0001 0000 0 复位 ce399e80 1945185211 C Co:1:001:0 0 0 ce399e80 1945241546 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <------------------@8 ce399e80 1945241638 C Ci:1:001:0 0 4 = 03051000 ce399800 1945301544 S Co:1:001:0 s 23 01 0014 0001 0000 0 ce399800 1945301635 C Co:1:001:0 0 0 ce399800 1945301696 S Ci:1:000:0 s 80 06 0100 0000 0040 64 < 获取设备描述符 ce399800 1945302276 C Ci:1:000:0 0 18 = 12011002 00000040 0c090010 00110102 0301 ce399800 1945302368 S Co:1:001:0 s 23 03 0004 0001 0000 0 再次复位 后面是跟外设U盘打交道的log, 放在下一节讲

 

  @1的a3(1010 0011):表示设备到主机, 是class且other, 说明不是标准的请求(请求有上面4中), 获取的是GET_STATUS DEVICE, 说明这是读取地址为1端点为0的root hub设备的状态, 也可以参考Linux代码:

port_event()
    -> hub_port_status(hub, port1, &portstatus, &portchange)
        -> get_port_status():
            /* #define    USB_STS_TIMEOUT        1000
             * #define    USB_STS_RETRIES        5
             * #define   USB_REQ_GET_STATUS        0x00
             * #define   USB_DIR_IN            0x80 /* to host */
             * #define USB_RT_PORT    (USB_TYPE_CLASS | USB_RECIP_OTHER)
             * #define USB_TYPE_CLASS            (0x01 << 5)
             * #define USB_RECIP_OTHER            0x03
             */
            static int get_port_status(struct usb_device *hdev, int port1, struct usb_port_status *data)
            {
                int i, status = -ETIMEDOUT;

                for (i = 0; i < USB_STS_RETRIES && (status == -ETIMEDOUT || status == -EPIPE); i++) {
                    status = usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0),
                        USB_REQ_GET_STATUS, USB_DIR_IN | USB_RT_PORT, 0, port1,
                        data, sizeof(*data), USB_STS_TIMEOUT);
                }
                return status;
            }

struct usb_port_status {
    __le16 wPortStatus;    
    __le16 wPortChange;
} __attribute__ ((packed));

最后 portstatus = 0101  portchange = 0100;

/*
 * wPortStatus bit field
 * See USB 2.0 spec Table 11-21
 */
#define USB_PORT_STAT_CONNECTION    0x0001
#define USB_PORT_STAT_ENABLE        0x0002
#define USB_PORT_STAT_SUSPEND        0x0004
#define USB_PORT_STAT_OVERCURRENT    0x0008
#define USB_PORT_STAT_RESET        0x0010
#define USB_PORT_STAT_L1        0x0020
/* bits 6 to 7 are reserved */
#define USB_PORT_STAT_POWER        0x0100
#define USB_PORT_STAT_LOW_SPEED        0x0200
#define USB_PORT_STAT_HIGH_SPEED        0x0400
#define USB_PORT_STAT_TEST              0x0800
#define USB_PORT_STAT_INDICATOR         0x1000
/* bits 13 to 15 are reserved */



#define USB_PORT_STAT_C_CONNECTION    0x0001
#define USB_PORT_STAT_C_ENABLE        0x0002
#define USB_PORT_STAT_C_SUSPEND        0x0004
#define USB_PORT_STAT_C_OVERCURRENT    0x0008
#define USB_PORT_STAT_C_RESET        0x0010
#define USB_PORT_STAT_C_L1        0x0020

  从返回的四个字节01010100可以看出port状态已经连接了, 但是还是suspend状态, 我们接着看@2的(23 01 0010 0001 0000)  这是个清除hub寄存器操作,

@3~@7五次都是(a3 00 0000 0001 0004) =读取状态0101 0000刚好是代码定义try的次数 #define USB_STS_RETRIES 5 , 既然没有新的状态, 所以Host发送了第一次的复位操作reset

port_event()
    -> hub_port_status(hub, port1, &portstatus, &portchange)
        .....................
    -> hub_port_warm_reset_required(hub, port1, portstatus)
        -> hub_port_reset()
            -> set_port_feature(hub->hdev, port1, (warm ? USB_PORT_FEAT_BH_PORT_RESET : USB_PORT_FEAT_RESET));
            -> hub_port_wait_reset()
                -> hub_port_status()
  -> hub_port_connect_change(hub, port1, portstatus, portchange);
    -> hub_port_connect()
      -> usb_alloc_dev() //创建设备
      -> hub_port_init() //获取设备描述符的等各种描述符(注意接口描述符/端点描述符不能单独获取必须跟随配置描述符一块获取,所以第一次先获取9字节的配置描述符, 解析后续还有多少再次获取)
      -> usb_new_device() //注册, 然后会跟usb_generic_driver 进行match 然后再创建真正的执行单元 interface! 后续博文会讲解

  总之, 设备的插入事件是又hub检测到的, Host通过中断控制传输定期获取各个hub的状态, 当检测到有设备connect, 则调用hub_port_connect_change()  创建设备、填充各种描述符、注册设备,

在注册之前hub会设置这个usb_device里的parent指针为本hub, port为插入的port号, 并且分配唯一地址给外设, 更多具体的我们在后面分析hub时再讲解。

  还有个遗漏的细节, 就是Host通过hub获得事件, 那为什么设备插入hub, hub就知道呢? 其实就是改变D+/D-的状态, 我们放到设备插入中解释。

 

二、设备插入中

  hub的port口D+/D-在默认状态下下拉15kΩ的电阻, 悬空状态电平都为0。 而USB设备在D+或D-上拉一个1.5kΩ的电阻到VBUS, 这也是为何USB接口四根线VBUS和GND比D+/D-长的原因,

如果是FS设备, 上拉电阻接到D+, 插入port分压后D+为高电平, hub认为是FS设备; 如果是LS, 上拉电阻接到D-, 插入port分压后D-为高电平, hub认为是LS设备, 那怎么区分HS设备呢?

目前的做法是HS也是将1.5k的上拉电阻接在D+处, 所以前期HS/FS的表现是一样的, hub不区分是FS还是HS, 都先当做FS设备, 在后面一点, Host会对设备复位, 也即D+/D- 都为0且持续10ms以上,

而这个期间, 如果是高速设备, 会在D-灌入17.78mA电流(设备D+上的1.5k电阻还未撤销), 在hub端会形成45欧姆的等效终端电阻, 导致D-变成电平17.78*45=800mv电平, 且持续1~7ms,

如果hub是支持高速的话, 在复位期间就会自动检测D-有没有这800mv电平, 如果没有则说明外设不是高速的, 如果有持续的800mv的话, 等外设停止驱动D-的17.78mA的100us内, hub也使用自己的电流源

交叉驱动D+/D-形成KJKJKJ...波形,同时将自己内部电路切换到高速模式(hub硬件无法同时支持高速和全速/低速, 靠一个开关切换到哪一路),  设备停止驱动D-后会检测是否有KJ信号, 如果有说明hub是支持

高速的然后自己也切换到高速模式, 切换的具体表现有:断掉1.5K的上拉电阻; 连接新的等效终端电阻;硬件切换到高速模式。 由于新的等效终端电阻是原来的一半22.5欧姆, 所以hub发出的KJKJKJ...波形的

电平变成从原来的800mv变成400mv了, 至此高速握手协商结束。总之在握手协商期间任何一方没有给出该有的响应(设备持续灌电流到D- 800mv、hub交叉灌D+/D-), 则使用默认的全速。 

  当然我们这有个前提就是Host也是支持高速的, 否则Host在与hub握手时就会禁止hub的高速能力, 后面自然不会响应高速外设的800mv(即不会发送KJKJKJ...), 其波形如下:

 

    

    

   

 三、设备插入后

  插入后做如下:

  a. 获取各种描述符(设备描述符、配置描述符、字符串描述符), 丰富struct usb_device结构体的骨骼

  b.  与usb_generic_driver match后设置合适的配置描述符, 并创建 具体的设备(操作对象) struct usb_interface

  c. struct usb_interface 与 struct usb_driver match后进行具体驱动后续的初始化和目的操作

  更详细的流程将在后续博文介绍.....

 

附完整log:

 # cat sys/kernel/debug/usb/usbmon/1u
0s  0u  1s  1t  1u

ce382380 1944921539 C Ii:1:001:1 0:2048 1 = 02
ce382380 1944921539 S Ii:1:001:1 -115:2048 4 <
ce399800 1944921752 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399800 1944921752 C Ci:1:001:0 0 4 = 01010100
ce399800 1944921783 S Co:1:001:0 s 23 01 0010 0001 0000 0
ce399800 1944921783 C Co:1:001:0 0 0
ce399800 1944921813 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399800 1944921813 C Ci:1:001:0 0 4 = 01010000
ce399e80 1944961608 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399e80 1944961608 C Ci:1:001:0 0 4 = 01010000
ce399800 1945001556 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399800 1945001556 C Ci:1:001:0 0 4 = 01010000
ce399e80 1945041564 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399e80 1945041564 C Ci:1:001:0 0 4 = 01010000

ce399e80 1945081604 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399e80 1945081604 C Ci:1:001:0 0 4 = 01010000
ce399e80 1945081665 S Co:1:001:0 s 23 03 0004 0001 0000 0    复位

ce399e80 1945185211 C Co:1:001:0 0 0

ce399e80 1945241546 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399e80 1945241638 C Ci:1:001:0 0 4 = 03051000
ce399800 1945301544 S Co:1:001:0 s 23 01 0014 0001 0000 0
ce399800 1945301635 C Co:1:001:0 0 0
ce399800 1945301696 S Ci:1:000:0 s 80 06 0100 0000 0040 64 <    获取设备描述符
ce399800 1945302276 C Ci:1:000:0 0 18 = 12011002 00000040 0c090010 00110102 0301
ce399800 1945302368 S Co:1:001:0 s 23 03 0004 0001 0000 0     再次复位

ce399800 1945405822 C Co:1:001:0 0 0
ce382380 1945421539 C Ii:1:001:1 0:2048 1 = 02
ce382380 1945421539 S Ii:1:001:1 -115:2048 4 <
ce399e80 1945461608 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399e80 1945461669 C Ci:1:001:0 0 4 = 03051200
ce399800 1945521545 S Co:1:001:0 s 23 01 0014 0001 0000 0
ce399800 1945521636 C Co:1:001:0 0 0
ce399800 1945521697 S Co:1:000:0 s 00 05 0004 0000 0000 0    设置地址
ce399800 1945521972 C Co:1:000:0 0 0
ce399e80 1945541595 S Ci:1:004:0 s 80 06 0100 0000 0012 18 <
ce399e80 1945542205 C Ci:1:004:0 0 18 = 12011002 00000040 0c090010 00110102 0301
ce399e80 1945542297 S Ci:1:004:0 s 80 06 0f00 0000 0005 5 <
ce399e80 1945542846 C Ci:1:004:0 0 5 = 050f1600 02
ce399e80 1945542938 S Ci:1:004:0 s 80 06 0f00 0000 0016 22 <
ce399e80 1945543487 C Ci:1:004:0 0 22 = 050f1600 02071002 02000000 0a100300 0c000204 0400
ce399e80 1945543579 S Ci:1:004:0 s 80 06 0200 0000 0009 9 <
ce399e80 1945544097 C Ci:1:004:0 0 9 = 09022000 01010080 96
ce399e80 1945544189 S Ci:1:004:0 s 80 06 0200 0000 0020 32 <
ce399e80 1945544738 C Ci:1:004:0 0 32 = 09022000 01010080 96090400 00020806 50000705 01020002 00070582 02000200
ce399800 1945544830 S Ci:1:004:0 s 80 06 0300 0000 00ff 255 <
ce399800 1945545410 C Ci:1:004:0 0 4 = 04030904
ce399800 1945545471 S Ci:1:004:0 s 80 06 0302 0409 00ff 255 <
ce399800 1945546051 C Ci:1:004:0 0 32 = 20034600 6c006100 73006800 20004400 72006900 76006500 20004600 49005400
ce399800 1945546142 S Ci:1:004:0 s 80 06 0301 0409 00ff 255 <
ce399800 1945546691 C Ci:1:004:0 0 16 = 10035300 61006d00 73007500 6e006700
ce399800 1945546752 S Ci:1:004:0 s 80 06 0303 0409 00ff 255 <
ce399800 1945547332 C Ci:1:004:0 0 34 = 22033000 33003100 38003300 31003800 30003300 30003000 30003000 31003200
ce399e00 1945548126 S Co:1:004:0 s 00 09 0001 0000 0000 0
ce399e00 1945548889 C Co:1:004:0 0 0
ce399400 1945550048 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce399400 1945550079 C Ci:1:001:0 0 4 = 03050200
ce399400 1945550109 S Co:1:001:0 s 23 01 0011 0001 0000 0
ce399400 1945550109 C Co:1:001:0 0 0

ce399600 1946541564 S Ci:1:004:0 s a1 fe 0000 0000 0001 1 <
ce399600 1946542114 C Ci:1:004:0 0 1 = 00
ce399600 1946542449 S Bo:1:004:1 -115 31 = 55534243 01000000 24000000 80000612 00000024 00000000 00000000 000000
ce399600 1946542510 C Bo:1:004:1 0 31 >
ce399200 1946542510 S Bi:1:004:2 -115 36 <
ce399200 1946760925 C Bi:1:004:2 0 36 = 00800602 1f736d69 53616d73 756e6720 466c6173 68204472 69766520 46495420
ce399600 1946760986 S Bi:1:004:2 -115 13 <
ce399600 1946761138 C Bi:1:004:2 0 13 = 55534253 01000000 00000000 00
ce399600 1946762145 S Bo:1:004:1 -115 31 = 55534243 02000000 00000000 00000600 00000000 00000000 00000000 000000
ce399600 1946762207 C Bo:1:004:1 0 31 >
ce399600 1946762268 S Bi:1:004:2 -115 13 <
ce399600 1946762329 C Bi:1:004:2 0 13 = 55534253 02000000 00000000 00
ce399600 1946762451 S Bo:1:004:1 -115 31 = 55534243 03000000 08000000 80000a25 00000000 00000000 00000000 000000
ce399600 1946762481 C Bo:1:004:1 0 31 >
ce39e080 1946762573 S Bi:1:004:2 -115 8 <
ce39e080 1946763000 C Bi:1:004:2 0 8 = 03bc3fff 00000200
ce399600 1946763031 S Bi:1:004:2 -115 13 <
ce399600 1946763061 C Bi:1:004:2 0 13 = 55534253 03000000 00000000 00
ce399600 1946763305 S Bo:1:004:1 -115 31 = 55534243 04000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
ce399600 1946763336 C Bo:1:004:1 0 31 >
ce39e900 1946763397 S Bi:1:004:2 -115 192 <
ce39e900 1946763824 C Bi:1:004:2 -121 68 = 43000000 051e0000 103f0200 3fff0000 00000000 00000000 00000000 00000000
ce399600 1946763854 S Bi:1:004:2 -115 13 <
ce399600 1946763885 C Bi:1:004:2 0 13 = 55534253 04000000 00000000 00
ce399600 1946764099 S Bo:1:004:1 -115 31 = 55534243 05000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
ce399600 1946764129 C Bo:1:004:1 0 31 >
ce39e900 1946764221 S Bi:1:004:2 -115 192 <
ce39e900 1946764617 C Bi:1:004:2 -121 68 = 43000000 051e0000 103f0200 3fff0000 00000000 00000000 00000000 00000000
ce399600 1946764678 S Bi:1:004:2 -115 13 <
ce399600 1946764678 C Bi:1:004:2 0 13 = 55534253 05000000 00000000 00
ce399600 1946765197 S Bo:1:004:1 -115 31 = 55534243 06000000 00000000 00000600 00000000 00000000 00000000 000000
ce399600 1946765258 C Bo:1:004:1 0 31 >
ce399600 1946765319 S Bi:1:004:2 -115 13 <
ce399600 1946765350 C Bi:1:004:2 0 13 = 55534253 06000000 00000000 00
ce399600 1946765563 S Bo:1:004:1 -115 31 = 55534243 07000000 00000000 0000061e 00000001 00000000 00000000 000000
ce399600 1946765594 C Bo:1:004:1 0 31 >
ce399600 1946765686 S Bi:1:004:2 -115 13 <
ce399600 1946766052 C Bi:1:004:2 0 13 = 55534253 07000000 00000000 01
ce399600 1946766082 S Bo:1:004:1 -115 31 = 55534243 08000000 60000000 80000603 00000060 00000000 00000000 000000
ce399600 1946766113 C Bo:1:004:1 0 31 >
ce39e900 1946766204 S Bi:1:004:2 -115 96 <
ce39e900 1946766632 C Bi:1:004:2 0 96 = 70000500 0000000a 00000000 20000000 00000000 00000000 00000000 00000000
ce399600 1946766662 S Bi:1:004:2 -115 13 <
ce399600 1946766693 C Bi:1:004:2 0 13 = 55534253 08000000 00000000 00
ce399600 1946766906 S Bo:1:004:1 -115 31 = 55534243 09000000 00000000 00000600 00000000 00000000 00000000 000000
ce399600 1946766937 C Bo:1:004:1 0 31 >
ce399600 1946767028 S Bi:1:004:2 -115 13 <
ce399600 1946767059 C Bi:1:004:2 0 13 = 55534253 09000000 00000000 00
ce399600 1946767272 S Bo:1:004:1 -115 31 = 55534243 0a000000 08000000 80000a25 00000000 00000000 00000000 000000
ce399600 1946767303 C Bo:1:004:1 0 31 >
ce39e900 1946767395 S Bi:1:004:2 -115 8 <
ce39e900 1946767791 C Bi:1:004:2 0 8 = 03bc3fff 00000200
ce399600 1946767822 S Bi:1:004:2 -115 13 <
ce399600 1946767852 C Bi:1:004:2 0 13 = 55534253 0a000000 00000000 00
ce399600 1946768066 S Bo:1:004:1 -115 31 = 55534243 0b000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
ce399600 1946768096 C Bo:1:004:1 0 31 >
ce39e900 1946768188 S Bi:1:004:2 -115 192 <
ce39e900 1946768585 C Bi:1:004:2 -121 68 = 43000000 051e0000 103f0200 3fff0000 00000000 00000000 00000000 00000000
ce399600 1946768615 S Bi:1:004:2 -115 13 <
ce399600 1946768646 C Bi:1:004:2 0 13 = 55534253 0b000000 00000000 00
ce399600 1946768859 S Bo:1:004:1 -115 31 = 55534243 0c000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
ce399600 1946768890 C Bo:1:004:1 0 31 >
ce39e900 1946768981 S Bi:1:004:2 -115 192 <
ce39e900 1946769378 C Bi:1:004:2 -121 68 = 43000000 051e0000 103f0200 3fff0000 00000000 00000000 00000000 00000000
ce399600 1946769409 S Bi:1:004:2 -115 13 <
ce399600 1946769439 C Bi:1:004:2 0 13 = 55534253 0c000000 00000000 00
ce399600 1946769744 S Bo:1:004:1 -115 31 = 55534243 0d000000 00100000 80000a28 00000000 00000008 00000000 000000
ce399600 1946769775 C Bo:1:004:1 0 31 >
ce39e900 1946769836 S Bi:1:004:2 -115 4096 <
ce39e900 1946771026 C Bi:1:004:2 0 4096 = eb5e0000 00000000 00000000 00000000 02000000 00000000 3f00ff00 00000000
ce399600 1946771087 S Bi:1:004:2 -115 13 <
ce399600 1946771118 C Bi:1:004:2 0 13 = 55534253 0d000000 00000000 00
ce399600 1946771972 S Bo:1:004:1 -115 31 = 55534243 0e000000 00000000 00000600 00000000 00000000 00000000 000000
ce399600 1946772033 C Bo:1:004:1 0 31 >
ce399600 1946772033 S Bi:1:004:2 -115 13 <
ce399600 1946772155 C Bi:1:004:2 0 13 = 55534253 0e000000 00000000 00
ce399600 1946772216 S Bo:1:004:1 -115 31 = 55534243 0f000000 00000000 00000600 00000000 00000000 00000000 000000
ce399600 1946772247 C Bo:1:004:1 0 31 >
ce399600 1946772277 S Bi:1:004:2 -115 13 <
ce399600 1946772308 C Bi:1:004:2 0 13 = 55534253 0f000000 00000000 00
ce399600 1946772430 S Bo:1:004:1 -115 31 = 55534243 10000000 08000000 80000a25 00000000 00000000 00000000 000000
ce399600 1946772460 C Bo:1:004:1 0 31 >
ce392c80 1946772460 S Bi:1:004:2 -115 8 <
ce392c80 1946772949 C Bi:1:004:2 0 8 = 03bc3fff 00000200
ce399600 1946772979 S Bi:1:004:2 -115 13 <
ce399600 1946773010 C Bi:1:004:2 0 13 = 55534253 10000000 00000000 00
ce399600 1946773132 S Bo:1:004:1 -115 31 = 55534243 11000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
ce399600 1946773162 C Bo:1:004:1 0 31 >
ce392c80 1946773193 S Bi:1:004:2 -115 192 <
ce392c80 1946773651 C Bi:1:004:2 -121 68 = 43000000 051e0000 103f0200 3fff0000 00000000 00000000 00000000 00000000
ce399600 1946773681 S Bi:1:004:2 -115 13 <
ce399600 1946773712 C Bi:1:004:2 0 13 = 55534253 11000000 00000000 00
ce399600 1946773834 S Bo:1:004:1 -115 31 = 55534243 12000000 c0000000 8000061a 003f00c0 00000000 00000000 000000
ce399600 1946773864 C Bo:1:004:1 0 31 >
ce392c80 1946773864 S Bi:1:004:2 -115 192 <
ce392c80 1946774353 C Bi:1:004:2 -121 68 = 43000000 051e0000 103f0200 3fff0000 00000000 00000000 00000000 00000000
ce399600 1946774383 S Bi:1:004:2 -115 13 <
ce399600 1946774414 C Bi:1:004:2 0 13 = 55534253 12000000 00000000 00



拔掉U盘......




ce382380 2068171539 C Ii:1:001:1 0:2048 1 = 02
ce382380 2068171539 S Ii:1:001:1 -115:2048 4 <
ce392e00 2068171752 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392e00 2068171752 C Ci:1:001:0 0 4 = 00000300
ce392e00 2068171783 S Co:1:001:0 s 23 01 0010 0001 0000 0
ce392e00 2068171783 C Co:1:001:0 0 0
ce392e00 2068171783 S Co:1:001:0 s 23 01 0011 0001 0000 0
ce392e00 2068171783 C Co:1:001:0 0 0
ce392e00 2068175231 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392e00 2068175292 C Ci:1:001:0 0 4 = 00000000
ce392b00 2068211547 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068211639 C Ci:1:001:0 0 4 = 00000000
ce392b00 2068251617 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068251708 C Ci:1:001:0 0 4 = 00000000
ce392b00 2068291564 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068291656 C Ci:1:001:0 0 4 = 00000000

ce392b00 2068331542 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068331604 C Ci:1:001:0 0 4 = 00000000
ce392b00 2068331695 S Co:1:001:0 s 23 03 0008 0001 0000 0
ce392b00 2068331756 C Co:1:001:0 0 0
ce382380 2068331848 C Ii:1:001:1 -2:2048 0
ce392b00 2068331909 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068331909 C Ci:1:001:0 0 4 = 00000000
ce382380 2068331909 S Ii:1:001:1 -115:2048 4 <
ce382380 2068332092 C Ii:1:001:1 -2:2048 0
ce392b00 2068332153 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068332153 C Ci:1:001:0 0 4 = 00000000
ce382380 2068332153 S Ii:1:001:1 -115:2048 4 <
ce382380 2068332305 C Ii:1:001:1 -2:2048 0
ce392b00 2068332366 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068332397 C Ci:1:001:0 0 4 = 00000000
ce382380 2068332397 S Ii:1:001:1 -115:2048 4 <
ce382380 2068332550 C Ii:1:001:1 -2:2048 0
ce392b00 2068332611 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068332611 C Ci:1:001:0 0 4 = 00000000
ce382380 2068332611 S Ii:1:001:1 -115:2048 4 <
ce382380 2068332794 C Ii:1:001:1 -2:2048 0
ce392b00 2068332824 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068332855 C Ci:1:001:0 0 4 = 00000000
ce382380 2068332855 S Ii:1:001:1 -115:2048 4 <
ce382380 2068333007 C Ii:1:001:1 -2:2048 0
ce392b00 2068333068 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068333068 C Ci:1:001:0 0 4 = 00000000
ce382380 2068333068 S Ii:1:001:1 -115:2048 4 <
ce382380 2068333251 C Ii:1:001:1 -2:2048 0
ce392b00 2068333282 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068333312 C Ci:1:001:0 0 4 = 00000000
ce382380 2068333312 S Ii:1:001:1 -115:2048 4 <
ce382380 2068333465 C Ii:1:001:1 -2:2048 0
ce392b00 2068333526 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068333526 C Ci:1:001:0 0 4 = 00000000
ce382380 2068333526 S Ii:1:001:1 -115:2048 4 <
ce382380 2068333709 C Ii:1:001:1 -2:2048 0
ce392b00 2068333740 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068333770 C Ci:1:001:0 0 4 = 00000000
ce382380 2068333770 S Ii:1:001:1 -115:2048 4 <
ce382380 2068333923 C Ii:1:001:1 -2:2048 0
ce392b00 2068333984 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068333984 C Ci:1:001:0 0 4 = 00000000
ce382380 2068333984 S Ii:1:001:1 -115:2048 4 <
ce382380 2068334167 C Ii:1:001:1 -2:2048 0
ce392b00 2068334197 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068334228 C Ci:1:001:0 0 4 = 00000000
ce382380 2068334228 S Ii:1:001:1 -115:2048 4 <
ce382380 2068334381 C Ii:1:001:1 -2:2048 0
ce392b00 2068334442 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068334442 C Ci:1:001:0 0 4 = 00000000
ce382380 2068334442 S Ii:1:001:1 -115:2048 4 <
ce382380 2068334625 C Ii:1:001:1 -2:2048 0
ce392b00 2068334686 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068334686 C Ci:1:001:0 0 4 = 00000000
ce382380 2068334686 S Ii:1:001:1 -115:2048 4 <
ce382380 2068334869 C Ii:1:001:1 -2:2048 0
ce392b00 2068334930 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068334930 C Ci:1:001:0 0 4 = 00000000
ce382380 2068334930 S Ii:1:001:1 -115:2048 4 <
ce382380 2068335113 C Ii:1:001:1 -2:2048 0
ce392b00 2068335144 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068335174 C Ci:1:001:0 0 4 = 00000000
ce382380 2068335174 S Ii:1:001:1 -115:2048 4 <
ce382380 2068335357 C Ii:1:001:1 -2:2048 0
ce392b00 2068335418 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068335418 C Ci:1:001:0 0 4 = 00000000
ce382380 2068335418 S Ii:1:001:1 -115:2048 4 <
ce382380 2068335601 C Ii:1:001:1 -2:2048 0
ce392b00 2068335662 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068335662 C Ci:1:001:0 0 4 = 00000000
ce382380 2068335662 S Ii:1:001:1 -115:2048 4 <
ce382380 2068335815 C Ii:1:001:1 -2:2048 0
ce392b00 2068335876 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068335876 C Ci:1:001:0 0 4 = 00000000
ce382380 2068335906 S Ii:1:001:1 -115:2048 4 <
ce382380 2068336059 C Ii:1:001:1 -2:2048 0
ce392b00 2068336120 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068336120 C Ci:1:001:0 0 4 = 00000000
ce382380 2068336120 S Ii:1:001:1 -115:2048 4 <
ce382380 2068336303 C Ii:1:001:1 -2:2048 0
ce392b00 2068336364 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068336364 C Ci:1:001:0 0 4 = 00000000
ce382380 2068336364 S Ii:1:001:1 -115:2048 4 <
ce382380 2068336547 C Ii:1:001:1 -2:2048 0
ce392b00 2068336578 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068336608 C Ci:1:001:0 0 4 = 00000000
ce382380 2068336608 S Ii:1:001:1 -115:2048 4 <
ce382380 2068336700 C Ii:1:001:1 -2:2048 0
ce392b00 2068336761 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068336761 C Ci:1:001:0 0 4 = 00000000
ce382380 2068336761 S Ii:1:001:1 -115:2048 4 <
ce382380 2068336853 C Ii:1:001:1 -2:2048 0
ce392b00 2068336914 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068336914 C Ci:1:001:0 0 4 = 00000000
ce382380 2068336914 S Ii:1:001:1 -115:2048 4 <
ce382380 2068336975 C Ii:1:001:1 -2:2048 0
ce392b00 2068337036 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337036 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337036 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337127 C Ii:1:001:1 -2:2048 0
ce392b00 2068337188 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337188 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337188 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337280 C Ii:1:001:1 -2:2048 0
ce392b00 2068337310 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337310 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337341 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337402 C Ii:1:001:1 -2:2048 0
ce392b00 2068337463 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337463 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337463 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337554 C Ii:1:001:1 -2:2048 0
ce392b00 2068337615 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337615 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337615 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337677 C Ii:1:001:1 -2:2048 0
ce392b00 2068337738 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337738 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337738 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337829 C Ii:1:001:1 -2:2048 0
ce392b00 2068337890 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068337890 C Ci:1:001:0 0 4 = 00000000
ce382380 2068337890 S Ii:1:001:1 -115:2048 4 <
ce382380 2068337951 C Ii:1:001:1 -2:2048 0
ce392b00 2068338012 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338012 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338012 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338104 C Ii:1:001:1 -2:2048 0
ce392b00 2068338165 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338165 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338165 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338256 C Ii:1:001:1 -2:2048 0
ce392b00 2068338287 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338287 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338317 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338378 C Ii:1:001:1 -2:2048 0
ce392b00 2068338439 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338439 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338439 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338531 C Ii:1:001:1 -2:2048 0
ce392b00 2068338562 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338592 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338592 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338653 C Ii:1:001:1 -2:2048 0
ce392b00 2068338714 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338714 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338714 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338806 C Ii:1:001:1 -2:2048 0
ce392b00 2068338867 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338867 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338867 S Ii:1:001:1 -115:2048 4 <
ce382380 2068338928 C Ii:1:001:1 -2:2048 0
ce392b00 2068338989 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068338989 C Ci:1:001:0 0 4 = 00000000
ce382380 2068338989 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339080 C Ii:1:001:1 -2:2048 0
ce392b00 2068339141 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339141 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339141 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339233 C Ii:1:001:1 -2:2048 0
ce392b00 2068339263 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339294 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339294 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339355 C Ii:1:001:1 -2:2048 0
ce392b00 2068339416 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339416 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339416 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339508 C Ii:1:001:1 -2:2048 0
ce392b00 2068339569 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339569 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339569 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339630 C Ii:1:001:1 -2:2048 0
ce392b00 2068339691 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339691 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339691 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339782 C Ii:1:001:1 -2:2048 0
ce392b00 2068339843 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339843 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339843 S Ii:1:001:1 -115:2048 4 <
ce382380 2068339935 C Ii:1:001:1 -2:2048 0
ce392b00 2068339965 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068339965 C Ci:1:001:0 0 4 = 00000000
ce382380 2068339996 S Ii:1:001:1 -115:2048 4 <
ce382380 2068340057 C Ii:1:001:1 -2:2048 0
ce392b00 2068340179 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
ce392b00 2068340179 C Ci:1:001:0 0 4 = 00000000
ce382380 2068340179 S Ii:1:001:1 -115:2048 4 <
ce382380 2068340270 C Ii:1:001:1 -2:2048 0
ce392b00 2068340301 S Ci:1:001:0 s a3 00 0000 0001 0004 4 <
usbmon-U盘log

 

 

  

 

转载于:https://www.cnblogs.com/vedic/p/10956312.html

第一章 USB概述及协议基础 1 1.1 USB是什么 1 1.2 USB的特点 1 1.3 USB的拓扑结构 2 1.4 USB的电气特性 5 1.5 USB的线缆以及插头、插座 5 1.6 USB插入检测机制 7 1.7 USB的描述符及其之间的关系 9 1.8 USB设备的枚举过程 10 1.9 USB的包结构及传输过程 11 1.9.1 USB包的结构及包的分类 11 1.9.2 令牌包 13 1.9.3 数据包 14 1.9.4 握手包 14 1.9.5 特殊包 15 1.9.6 如何处理数据包 15 1.10 USB的四种传输类型 16 1.10.1 USB事务 16 1.10.2 批量传输 16 1.10.3 中断传输 18 1.10.4 等时传输(同步传输) 19 1.10.5 控制传输 20 1.10.6 端点类型与传输类型的关系 21 1.10.7 传输类型与端点支持的最大包长 21 1.11 本章小结 21 第二章 硬件系统设计 1 2.1 方案以及芯片的选定 1 2.2 D12引脚功能说明 2 2.3 D12与89S52的连接 4 2.4 串口部分电路 6 2.5 按键部分 7 2.6 指示灯部分 7 2.7 IDE接口部分 8 2.8 单片机部分 8 2.9 元件安装 8 2.10 电路调试 11 2.11 测试程序的编写和调试 12 2.11.1 建立一个工程 12 2.11.2 为工程添加源文件 14 2.11.3 KEIL工具栏及仿真介绍 15 2.11.4 按键驱动的编写 18 2.11.5 串口驱动的编写 24 2.11.6 PDIUSBD12读写函数及读ID的实现 28 2.12 本章小结 33 第三章 USB鼠标的实现 1 3.1 USB鼠标工程的建立 1 3.2 USB的断开与连接 1 3.3 USB中断的处理 4 3.4 读取从主机发送到端点0的数据 6 3.5 USB标准请求 12 3.5.1 USB标准设备请求的结构 13 3.5.2 GET_DESCRIPTOR请求 15 3.5.3 SET_ADDRESS请求 16 3.5.6 SET_CONFIGURATION请求 16 3.6 设备描述符的实现 17 3.7 设备描述符的返回 20 3.8 设置地址请求的处理 30 3.9 配置描述符集合的结构 32 3.9.1 配置描述符的结构 32 3.9.2 接口描述符的结构 33 3.9.3 端点描述符的结构 33 3.9.4 HID描述符的结构 34 3.10 配置描述符集合的实现以及返回 35 3.11 字符串及语言ID请求的实现 39 3.12 设置配置请求的实现 45 3.13 报告描述符的结构及实现 48 3.14 报告的返回 54 3.15 Bus Hound工具的简介 57 3.16 本章小结 59 第四章 USB键盘的实现 1 4.1 USB键盘工程的建立 1 4.2 设备描述符的实现 1 4.4 配置描述符集合的实现 2 4.4.1 配置描述符 3 4.4.2 接口描述符 3 4.4.3 HID描述符 3 4.4.4 端点描述 3 4.5 字符串描述符 6 4.6 报告描述符 6 4.7 输入和输出报告的实现 10 4.8 USB键盘实例的测试 13 4.9 再谈USB HID的报告描述符 14 4.10 带鼠标功能的USB键盘(方法一) 16 4.11 带鼠标功能的键盘(方法二) 22 4.12 多媒体USB键盘 29 4.13 本章小结 34 第五章 用户自定义的USB HID设备 1 5.1 MyUsbHid工程的建立 1 5.2 描述符的修改 1 5.3 报告的实现 3 5.4 对用户自定义的USB HID设备的访问 5 5.5 访问HID设备时所用到的相关函数 5 5.5.1 获取HID设备的接口类GUID的函数 5 5.5.2 获取指定类的所有设备信息集合的函数 6 5.5.3 从设备信息集合中获取一个设备接口信息的函数 6 5.5.4 获取指定设备接口详细信息的函数 7 5.5.5 打开设备的函数 8 5.5.6 获取HID设备属性的函数 8 5.5.7 从设备读取数据的函数 9 5.5.8 往设备写数据的函数 9 5.5.9 通过控制端点0读取报告的函数 10 5.5.10 通过控制端点0发送报告的函数 10 5.5.11 关闭设备的函数 10 5.5.12 需要包含的库文件 11 5.6 访问USB HID设备的上位机软件的实现 11 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值