南阳镇平尚彩云 發表於 2023-6-4 00:00:00

详解linux usb host驱动编写入门

<p>
        usb协议是一个复杂的协议,目前涉及到的版本就有usb1.0, usb2.0, usb3.0。大家如果打开kernel usb host目录,就会发现下面包含了ohci,uhci,ehci,xhci,whci等多种形式的控制器驱动。那么,对于我们这些不是很了解usb的开发人员,如何了解usb的代码结构呢?</p>
<p>
        <strong>1、代码分布</strong></p>
<p>
        drivers/usb目录下面,host目录包括了host驱动代码,core目录包含了主要的api接口代码,而其他目录则主要是device驱动代码。</p>
<p>
        <strong>2、device驱动怎么看</strong></p>
<p>
        device驱动大多数和上层协议有关,不涉及到具体的寄存器读写。示例代码可以参考usb-skeleton.c</p>
<p>
        <strong>3、host驱动怎么看</strong></p>
<p>
        a,不妨以s3c2410的host作为范例进行分析,首先找到Makefile,</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_491154">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">obj-$(CONFIG_USB_OHCI_HCD_S3C2410) += ohci-s3c2410.o</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        b,再查看一下Kconfig,</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_743162">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">config USB_OHCI_HCD_S3C2410 </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="plain spaces">    </code><code class="plain plain">tristate "OHCI support for Samsung S3C24xx/S3C64xx SoC series" </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="plain spaces">    </code><code class="plain plain">depends on USB_OHCI_HCD &amp;&amp; (ARCH_S3C24XX || ARCH_S3C64XX) </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="plain spaces">    </code><code class="plain plain">default y </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="plain spaces">    </code><code class="plain plain">---help--- </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="plain spaces">     </code><code class="plain plain">Enables support for the on-chip OHCI controller on </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="plain spaces">     </code><code class="plain plain">S3C24xx/S3C64xx chips.</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        c,通过Makefile和Kconfig发现,s3c2410依赖于USB_OHCI_HCD_S3C2410 和 USB_OHCI_HCD,那USB_OHCI_HCD呢?</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_782686">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">config USB_OHCI_HCD </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">tristate </code><code class="cpp string">"OHCI HCD (USB 1.1) support"</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">depends on HAS_DMA &amp;&amp; HAS_IOMEM </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">---help--- </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">The Open Host Controller Interface (OHCI) is a standard </code><code class="cpp keyword bold">for</code> <code class="cpp plain">accessing </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">USB 1.1 host controller hardware. It does more in hardware than Intel's </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">UHCI specification. If your USB host controller follows the OHCI spec, </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">say Y. On most non-x86 systems, and on x86 hardware that's not </code><code class="cpp keyword bold">using</code> <code class="cpp plain">a </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">USB controller from Intel or VIA, </code><code class="cpp keyword bold">this</code> <code class="cpp plain">is appropriate. If your host </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">controller doesn't use PCI, </code><code class="cpp keyword bold">this</code> <code class="cpp plain">is probably appropriate. For a PCI </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">based </code><code class="cpp functions bold">system</code> <code class="cpp plain">where you're not sure, the </code><code class="cpp string">"lspci -v"</code> <code class="cpp plain">entry will list the </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">right </code><code class="cpp string">"prog-if"</code> <code class="cpp keyword bold">for</code> <code class="cpp plain">your USB controller(s): EHCI, OHCI, or UHCI. </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">To compile </code><code class="cpp keyword bold">this</code> <code class="cpp plain">driver as a module, choose M here: the </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp spaces">   </code><code class="cpp plain">module will be called ohci-hcd.</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        d,USB_OHCI_HCD只依赖于DMA和IOMEM。继续回到Makefile,判断USB_OHCI_HCD会编译哪些文件</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_871850">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        e,看到这里,我们明白要打开s3c2410的host功能,只需要编译ohci-hcd.c和ohci-s3c2410.c两个文件就好了</p>
<p>
        f,通过观察,发现ohci-hcd.c和ohci-s3c2410.c的代码都很少,这原因是什么?下面这段代码来自于ohci-hcd.c。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_871175">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">const</code> <code class="cpp color1 bold">char</code>  <code class="cpp plain">hcd_name [] = </code><code class="cpp string">"ohci_hcd"</code><code class="cpp plain">; </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp preprocessor">#define STATECHANGE_DELAY  msecs_to_jiffies(300) </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#define IO_WATCHDOG_DELAY  msecs_to_jiffies(275) </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp preprocessor">#define IO_WATCHDOG_OFF   0xffffff00 </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp preprocessor">#include "ohci.h" </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#include "pci-quirks.h" </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">ohci_dump(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">ohci_hcd *ohci); </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">ohci_stop(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">usb_hcd *hcd); </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">io_watchdog_func(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">timer_list *t); </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp preprocessor">#include "ohci-hub.c" </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp preprocessor">#include "ohci-dbg.c" </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp preprocessor">#include "ohci-mem.c" </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp preprocessor">#include "ohci-q.c" </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        g,通过观察ohci-hcd.c文件,发现其实它其实已经包括了很多其他的ohci文件。那么寄存器又是怎么操作的呢?下面这段代码来自于ohci.h文件。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_256297">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">inline</code> <code class="cpp plain">unsigned </code><code class="cpp color1 bold">int</code> <code class="cpp plain">_ohci_readl (</code><code class="cpp keyword bold">const</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">ohci_hcd *ohci, </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces">          </code><code class="cpp plain">__hc32 __iomem * regs) </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp preprocessor">#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">big_endian_mmio(ohci) ? </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">readl_be (regs) : </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">readl (regs); </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp preprocessor">#else </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">return</code> <code class="cpp plain">readl (regs); </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp preprocessor">#endif </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">inline</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">_ohci_writel (</code><code class="cpp keyword bold">const</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">ohci_hcd *ohci, </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces">         </code><code class="cpp keyword bold">const</code> <code class="cpp plain">unsigned </code><code class="cpp color1 bold">int</code> <code class="cpp plain">val, __hc32 __iomem *regs) </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp plain">{ </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp preprocessor">#ifdef CONFIG_USB_OHCI_BIG_ENDIAN_MMIO </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">big_endian_mmio(ohci) ? </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">writel_be (val, regs) : </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">writel (val, regs); </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp preprocessor">#else </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">writel (val, regs); </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp preprocessor">#endif </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp preprocessor">#define ohci_readl(o,r)   _ohci_readl(o,r) </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp preprocessor">#define ohci_writel(o,v,r) _ohci_writel(o,v,r) </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        h,看到这里,你应该发现大部分底层操作其实也都是ohci帮助一起完成的。每个host driver其实就是注册了一下,告知了mem地址在哪。下面这段代码就是ohci-s3c2410.c中probe函数的代码。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_149187">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">hcd-&gt;regs = devm_ioremap_resource(&amp;dev-&gt;dev, &amp;dev-&gt;resource); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp keyword bold">if</code> <code class="cpp plain">(IS_ERR(hcd-&gt;regs)) { </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">retval = PTR_ERR(hcd-&gt;regs); </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">err_put; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        4、usb驱动怎么学</p>
<p>
        如果从代码结构来说,上面这段分析算是入门了。但是,如果要深入了解usb host&amp;device驱动,那么除了这些代码逻辑,那么还要熟读usb协议手册,更重要的学会用catc协议分析仪真正地去了解usb是如何发包和收包的。</p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:https://blog.csdn.net/feixiaoxing/article/details/79834031</p>
頁: [1]
查看完整版本: 详解linux usb host驱动编写入门