api_device.html 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771
  1. <!DOCTYPE html>
  2. <html class="writer-html5" lang="zh-CN" >
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>设备协议栈 &mdash; CherryUSB 使用指南 文档</title>
  7. <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  8. <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  9. <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  10. <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  11. <!--[if lt IE 9]>
  12. <script src="../_static/js/html5shiv.min.js"></script>
  13. <![endif]-->
  14. <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
  15. <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
  16. <script src="../_static/jquery.js"></script>
  17. <script src="../_static/underscore.js"></script>
  18. <script src="../_static/doctools.js"></script>
  19. <script src="../_static/translations.js"></script>
  20. <script type="text/javascript" src="../_static/js/theme.js"></script>
  21. <link rel="index" title="索引" href="../genindex.html" />
  22. <link rel="search" title="搜索" href="../search.html" />
  23. <link rel="next" title="主机协议栈" href="api_host.html" />
  24. <link rel="prev" title="USB 枚举" href="../usb/usb_enum.html" />
  25. </head>
  26. <body class="wy-body-for-nav">
  27. <div class="wy-grid-for-nav">
  28. <nav data-toggle="wy-nav-shift" class="wy-nav-side">
  29. <div class="wy-side-scroll">
  30. <div class="wy-side-nav-search" >
  31. <a href="../index.html" class="icon icon-home"> CherryUSB 使用指南
  32. </a>
  33. <div role="search">
  34. <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
  35. <input type="text" name="q" placeholder="在文档中搜索" />
  36. <input type="hidden" name="check_keywords" value="yes" />
  37. <input type="hidden" name="area" value="default" />
  38. </form>
  39. </div>
  40. </div>
  41. <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
  42. <p class="caption"><span class="caption-text">快速入门</span></p>
  43. <ul>
  44. <li class="toctree-l1"><a class="reference internal" href="../quick_start/bl702.html">基于 BL702 开发指南</a></li>
  45. <li class="toctree-l1"><a class="reference internal" href="../quick_start/stm32f429.html">基于 STM32F429 开发指南</a></li>
  46. <li class="toctree-l1"><a class="reference internal" href="../quick_start/ch32v307.html">基于 CH32V307 开发指南</a></li>
  47. <li class="toctree-l1"><a class="reference internal" href="../quick_start/rt-thread/rt-thread_zh.html">基于 RT-Thread 软件包开发指南</a></li>
  48. </ul>
  49. <p class="caption"><span class="caption-text">USB 基本知识点</span></p>
  50. <ul>
  51. <li class="toctree-l1"><a class="reference internal" href="../usb/usb_basic.html">USB 基本概念</a></li>
  52. <li class="toctree-l1"><a class="reference internal" href="../usb/usb_desc.html">USB 描述符</a></li>
  53. <li class="toctree-l1"><a class="reference internal" href="../usb/usb_request.html">USB 设备请求</a></li>
  54. <li class="toctree-l1"><a class="reference internal" href="../usb/usb_enum.html">USB 枚举</a></li>
  55. </ul>
  56. <p class="caption"><span class="caption-text">API 手册</span></p>
  57. <ul class="current">
  58. <li class="toctree-l1 current"><a class="current reference internal" href="#">设备协议栈</a><ul>
  59. <li class="toctree-l2"><a class="reference internal" href="#core">CORE</a><ul>
  60. <li class="toctree-l3"><a class="reference internal" href="#id2">端点结构体</a></li>
  61. <li class="toctree-l3"><a class="reference internal" href="#id3">接口结构体</a></li>
  62. <li class="toctree-l3"><a class="reference internal" href="#id4">类结构体</a></li>
  63. <li class="toctree-l3"><a class="reference internal" href="#usbd-event-notify-handler">usbd_event_notify_handler</a></li>
  64. <li class="toctree-l3"><a class="reference internal" href="#usbd-desc-register">usbd_desc_register</a></li>
  65. <li class="toctree-l3"><a class="reference internal" href="#usbd-msosv1-desc-register">usbd_msosv1_desc_register</a></li>
  66. <li class="toctree-l3"><a class="reference internal" href="#usbd-msosv2-desc-register">usbd_msosv2_desc_register</a></li>
  67. <li class="toctree-l3"><a class="reference internal" href="#usbd-bos-desc-register">usbd_bos_desc_register</a></li>
  68. <li class="toctree-l3"><a class="reference internal" href="#usbd-class-register">usbd_class_register</a></li>
  69. <li class="toctree-l3"><a class="reference internal" href="#usbd-class-add-interface">usbd_class_add_interface</a></li>
  70. <li class="toctree-l3"><a class="reference internal" href="#usbd-interface-add-endpoint"><strong>usbd_interface_add_endpoint</strong></a></li>
  71. <li class="toctree-l3"><a class="reference internal" href="#usb-device-is-configured"><strong>usb_device_is_configured</strong></a></li>
  72. </ul>
  73. </li>
  74. <li class="toctree-l2"><a class="reference internal" href="#cdc-acm">CDC ACM</a><ul>
  75. <li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-add-acm-interface">usbd_cdc_add_acm_interface</a></li>
  76. <li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-acm-set-line-coding">usbd_cdc_acm_set_line_coding</a></li>
  77. <li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-acm-set-dtr">usbd_cdc_acm_set_dtr</a></li>
  78. <li class="toctree-l3"><a class="reference internal" href="#usbd-cdc-acm-set-rts">usbd_cdc_acm_set_rts</a></li>
  79. </ul>
  80. </li>
  81. <li class="toctree-l2"><a class="reference internal" href="#hid">HID</a><ul>
  82. <li class="toctree-l3"><a class="reference internal" href="#usbd-hid-add-interface">usbd_hid_add_interface</a></li>
  83. <li class="toctree-l3"><a class="reference internal" href="#usbd-hid-report-descriptor-register">usbd_hid_report_descriptor_register</a></li>
  84. <li class="toctree-l3"><a class="reference internal" href="#usbd-hid-set-request-callback">usbd_hid_set_request_callback</a></li>
  85. </ul>
  86. </li>
  87. <li class="toctree-l2"><a class="reference internal" href="#msc">MSC</a><ul>
  88. <li class="toctree-l3"><a class="reference internal" href="#usbd-msc-class-init">usbd_msc_class_init</a></li>
  89. <li class="toctree-l3"><a class="reference internal" href="#usbd-msc-get-cap">usbd_msc_get_cap</a></li>
  90. <li class="toctree-l3"><a class="reference internal" href="#usbd-msc-sector-read">usbd_msc_sector_read</a></li>
  91. <li class="toctree-l3"><a class="reference internal" href="#usbd-msc-sector-write">usbd_msc_sector_write</a></li>
  92. </ul>
  93. </li>
  94. <li class="toctree-l2"><a class="reference internal" href="#uac">UAC</a><ul>
  95. <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-add-interface">usbd_audio_add_interface</a></li>
  96. <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-mute">usbd_audio_set_mute</a></li>
  97. <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-volume">usbd_audio_set_volume</a></li>
  98. <li class="toctree-l3"><a class="reference internal" href="#usbd-audio-set-interface-callback">usbd_audio_set_interface_callback</a></li>
  99. </ul>
  100. </li>
  101. <li class="toctree-l2"><a class="reference internal" href="#uvc">UVC</a><ul>
  102. <li class="toctree-l3"><a class="reference internal" href="#usbd-video-add-interface">usbd_video_add_interface</a></li>
  103. <li class="toctree-l3"><a class="reference internal" href="#usbd-video-probe-and-commit-controls-init">usbd_video_probe_and_commit_controls_init</a></li>
  104. <li class="toctree-l3"><a class="reference internal" href="#usbd-video-mjpeg-payload-fill">usbd_video_mjpeg_payload_fill</a></li>
  105. <li class="toctree-l3"><a class="reference internal" href="#usbd-video-mjpeg-payload-header-toggle">usbd_video_mjpeg_payload_header_toggle</a></li>
  106. </ul>
  107. </li>
  108. <li class="toctree-l2"><a class="reference internal" href="#dfu">DFU</a></li>
  109. <li class="toctree-l2"><a class="reference internal" href="#porting">PORTING</a></li>
  110. </ul>
  111. </li>
  112. <li class="toctree-l1"><a class="reference internal" href="api_host.html">主机协议栈</a></li>
  113. <li class="toctree-l1"><a class="reference internal" href="api_common.html">其他</a></li>
  114. </ul>
  115. <p class="caption"><span class="caption-text">Class 指南</span></p>
  116. <ul>
  117. <li class="toctree-l1"><a class="reference internal" href="../class/class_cdc.html">CDC</a></li>
  118. <li class="toctree-l1"><a class="reference internal" href="../class/class_hid.html">HID</a></li>
  119. <li class="toctree-l1"><a class="reference internal" href="../class/class_msc.html">MSC</a></li>
  120. <li class="toctree-l1"><a class="reference internal" href="../class/class_audio.html">UAC</a></li>
  121. <li class="toctree-l1"><a class="reference internal" href="../class/class_video.html">UVC</a></li>
  122. <li class="toctree-l1"><a class="reference internal" href="../class/winusb.html">WINUSB</a></li>
  123. </ul>
  124. <p class="caption"><span class="caption-text">综合例程</span></p>
  125. <ul>
  126. <li class="toctree-l1"><a class="reference internal" href="../demo/usb2uart.html">USB 转串口</a></li>
  127. <li class="toctree-l1"><a class="reference internal" href="../demo/mouse_keyboard.html">键盘与鼠标</a></li>
  128. <li class="toctree-l1"><a class="reference internal" href="../demo/msc_boot.html">U盘制作 BootLoader</a></li>
  129. <li class="toctree-l1"><a class="reference internal" href="../demo/video.html">USB 摄像头</a></li>
  130. <li class="toctree-l1"><a class="reference internal" href="../demo/speaker_mic.html">USB 双通道扬声器和麦克风</a></li>
  131. <li class="toctree-l1"><a class="reference internal" href="../demo/daplink.html">DAPLINK V2.0调试器</a></li>
  132. </ul>
  133. <p class="caption"><span class="caption-text">Porting 说明</span></p>
  134. <ul>
  135. <li class="toctree-l1"><a class="reference internal" href="../porting.html">Porting 编写说明</a></li>
  136. </ul>
  137. </div>
  138. </div>
  139. </nav>
  140. <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
  141. <nav class="wy-nav-top" aria-label="top navigation">
  142. <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
  143. <a href="../index.html">CherryUSB 使用指南</a>
  144. </nav>
  145. <div class="wy-nav-content">
  146. <div class="rst-content">
  147. <div role="navigation" aria-label="breadcrumbs navigation">
  148. <ul class="wy-breadcrumbs">
  149. <li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
  150. <li>设备协议栈</li>
  151. <li class="wy-breadcrumbs-aside">
  152. <a href="../_sources/api/api_device.rst.txt" rel="nofollow"> 查看页面源码</a>
  153. </li>
  154. </ul>
  155. <hr/>
  156. </div>
  157. <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
  158. <div itemprop="articleBody">
  159. <div class="section" id="id1">
  160. <h1>设备协议栈<a class="headerlink" href="#id1" title="永久链接至标题">¶</a></h1>
  161. <div class="section" id="core">
  162. <h2>CORE<a class="headerlink" href="#core" title="永久链接至标题">¶</a></h2>
  163. <div class="section" id="id2">
  164. <h3>端点结构体<a class="headerlink" href="#id2" title="永久链接至标题">¶</a></h3>
  165. <p>端点结构体主要用于注册不同端点地址的中断完成回调函数。</p>
  166. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbd_endpoint</span> <span class="p">{</span>
  167. <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
  168. <span class="kt">uint8_t</span> <span class="n">ep_addr</span><span class="p">;</span>
  169. <span class="n">usbd_endpoint_callback</span> <span class="n">ep_cb</span><span class="p">;</span>
  170. <span class="p">}</span> <span class="n">usbd_endpoint_t</span><span class="p">;</span>
  171. </pre></div>
  172. </div>
  173. <ul class="simple">
  174. <li><p><strong>list</strong> 端点的链表节点</p></li>
  175. <li><p><strong>ep_addr</strong> 端点地址(带方向)</p></li>
  176. <li><p><strong>ep_cb</strong> 端点中断回调函数</p></li>
  177. </ul>
  178. </div>
  179. <div class="section" id="id3">
  180. <h3>接口结构体<a class="headerlink" href="#id3" title="永久链接至标题">¶</a></h3>
  181. <p>接口结构体主要用于注册不同类设备除了标准设备请求外的其他请求,包括类设备请求、厂商设备请求和自定义设备请求。以及协议栈中的相关通知回调函数。</p>
  182. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbd_interface</span> <span class="p">{</span>
  183. <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
  184. <span class="cm">/** Handler for USB Class specific commands*/</span>
  185. <span class="n">usbd_request_handler</span> <span class="n">class_handler</span><span class="p">;</span>
  186. <span class="cm">/** Handler for USB Vendor specific commands */</span>
  187. <span class="n">usbd_request_handler</span> <span class="n">vendor_handler</span><span class="p">;</span>
  188. <span class="cm">/** Handler for USB custom specific commands */</span>
  189. <span class="n">usbd_request_handler</span> <span class="n">custom_handler</span><span class="p">;</span>
  190. <span class="cm">/** Handler for USB event notify commands */</span>
  191. <span class="n">usbd_notify_handler</span> <span class="n">notify_handler</span><span class="p">;</span>
  192. <span class="kt">uint8_t</span> <span class="n">intf_num</span><span class="p">;</span>
  193. <span class="n">usb_slist_t</span> <span class="n">ep_list</span><span class="p">;</span>
  194. <span class="p">}</span> <span class="n">usbd_interface_t</span><span class="p">;</span>
  195. </pre></div>
  196. </div>
  197. <ul class="simple">
  198. <li><p><strong>list</strong> 接口的链表节点</p></li>
  199. <li><p><strong>class_handler</strong> class setup 请求回调函数</p></li>
  200. <li><p><strong>vendor_handler</strong> vendor setup 请求回调函数</p></li>
  201. <li><p><strong>custom_handler</strong> custom setup 请求回调函数</p></li>
  202. <li><p><strong>notify_handler</strong> 中断标志、协议栈相关状态回调函数</p></li>
  203. <li><p><strong>intf_num</strong> 当前接口偏移</p></li>
  204. <li><p><strong>ep_list</strong> 端点的链表节点</p></li>
  205. </ul>
  206. </div>
  207. <div class="section" id="id4">
  208. <h3>类结构体<a class="headerlink" href="#id4" title="永久链接至标题">¶</a></h3>
  209. <p>类结构体主要用于挂载接口链表。后期可能会删除,因为这个部分跟接口其实是有关系的。</p>
  210. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span> <span class="k">struct</span> <span class="nc">usbd_class</span> <span class="p">{</span>
  211. <span class="n">usb_slist_t</span> <span class="n">list</span><span class="p">;</span>
  212. <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">;</span>
  213. <span class="n">usb_slist_t</span> <span class="n">intf_list</span><span class="p">;</span>
  214. <span class="p">}</span> <span class="n">usbd_class_t</span><span class="p">;</span>
  215. </pre></div>
  216. </div>
  217. <ul class="simple">
  218. <li><p><strong>list</strong> 类的链表节点</p></li>
  219. <li><p><strong>name</strong> 类的名称</p></li>
  220. <li><p><strong>intf_list</strong> 接口的链表节点</p></li>
  221. </ul>
  222. </div>
  223. <div class="section" id="usbd-event-notify-handler">
  224. <h3>usbd_event_notify_handler<a class="headerlink" href="#usbd-event-notify-handler" title="永久链接至标题">¶</a></h3>
  225. <p><code class="docutils literal notranslate"><span class="pre">usbd_event_notify_handler</span></code> 是 USB 中断中的核心,用于处理不同的中断标志。包括复位、端点0 IN/OUT/SETUP、其他端点 IN/OUT 、SUSPEND、RESUME、SOF 中断等等。用户需要在 porting 接口中的 USB中断中调用该接口。</p>
  226. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_event_notify_handler</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">event</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">arg</span><span class="p">);</span>
  227. </pre></div>
  228. </div>
  229. <ul class="simple">
  230. <li><p><strong>event</strong> 中断事件</p></li>
  231. <li><p><strong>arg</strong> 端点号</p></li>
  232. </ul>
  233. <p>其中 <code class="docutils literal notranslate"><span class="pre">event</span></code> 有如下类型:</p>
  234. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="k">enum</span> <span class="n">usbd_event_type</span> <span class="p">{</span>
  235. <span class="cm">/** USB error reported by the controller */</span>
  236. <span class="n">USBD_EVENT_ERROR</span><span class="p">,</span>
  237. <span class="cm">/** USB reset */</span>
  238. <span class="n">USBD_EVENT_RESET</span><span class="p">,</span>
  239. <span class="cm">/** Start of Frame received */</span>
  240. <span class="n">USBD_EVENT_SOF</span><span class="p">,</span>
  241. <span class="cm">/** USB connection established, hardware enumeration is completed */</span>
  242. <span class="n">USBD_EVENT_CONNECTED</span><span class="p">,</span>
  243. <span class="cm">/** USB configuration done */</span>
  244. <span class="n">USBD_EVENT_CONFIGURED</span><span class="p">,</span>
  245. <span class="cm">/** USB connection suspended by the HOST */</span>
  246. <span class="n">USBD_EVENT_SUSPEND</span><span class="p">,</span>
  247. <span class="cm">/** USB connection lost */</span>
  248. <span class="n">USBD_EVENT_DISCONNECTED</span><span class="p">,</span>
  249. <span class="cm">/** USB connection resumed by the HOST */</span>
  250. <span class="n">USBD_EVENT_RESUME</span><span class="p">,</span>
  251. <span class="cm">/** USB interface selected */</span>
  252. <span class="n">USBD_EVENT_SET_INTERFACE</span><span class="p">,</span>
  253. <span class="cm">/** USB interface selected */</span>
  254. <span class="n">USBD_EVENT_SET_REMOTE_WAKEUP</span><span class="p">,</span>
  255. <span class="cm">/** USB interface selected */</span>
  256. <span class="n">USBD_EVENT_CLEAR_REMOTE_WAKEUP</span><span class="p">,</span>
  257. <span class="cm">/** Set Feature ENDPOINT_HALT received */</span>
  258. <span class="n">USBD_EVENT_SET_HALT</span><span class="p">,</span>
  259. <span class="cm">/** Clear Feature ENDPOINT_HALT received */</span>
  260. <span class="n">USBD_EVENT_CLEAR_HALT</span><span class="p">,</span>
  261. <span class="cm">/** setup packet received */</span>
  262. <span class="n">USBD_EVENT_SETUP_NOTIFY</span><span class="p">,</span>
  263. <span class="cm">/** ep0 in packet received */</span>
  264. <span class="n">USBD_EVENT_EP0_IN_NOTIFY</span><span class="p">,</span>
  265. <span class="cm">/** ep0 out packet received */</span>
  266. <span class="n">USBD_EVENT_EP0_OUT_NOTIFY</span><span class="p">,</span>
  267. <span class="cm">/** ep in packet except ep0 received */</span>
  268. <span class="n">USBD_EVENT_EP_IN_NOTIFY</span><span class="p">,</span>
  269. <span class="cm">/** ep out packet except ep0 received */</span>
  270. <span class="n">USBD_EVENT_EP_OUT_NOTIFY</span><span class="p">,</span>
  271. <span class="cm">/** Initial USB connection status */</span>
  272. <span class="n">USBD_EVENT_UNKNOWN</span>
  273. <span class="p">};</span>
  274. </pre></div>
  275. </div>
  276. </div>
  277. <div class="section" id="usbd-desc-register">
  278. <h3>usbd_desc_register<a class="headerlink" href="#usbd-desc-register" title="永久链接至标题">¶</a></h3>
  279. <p><code class="docutils literal notranslate"><span class="pre">usbd_desc_register</span></code> 用来注册 USB 描述符,描述符种类包括:设备描述符、配置描述符(包含配置描述符、接口描述符、class 类描述符、端点描述符)、字符串描述符、设备限定描述符。</p>
  280. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_desc_register</span><span class="p">(</span><span class="k">const</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
  281. </pre></div>
  282. </div>
  283. <ul class="simple">
  284. <li><p><strong>desc</strong> 描述符的句柄</p></li>
  285. </ul>
  286. </div>
  287. <div class="section" id="usbd-msosv1-desc-register">
  288. <h3>usbd_msosv1_desc_register<a class="headerlink" href="#usbd-msosv1-desc-register" title="永久链接至标题">¶</a></h3>
  289. <p><code class="docutils literal notranslate"><span class="pre">usbd_msosv1_desc_register</span></code> 用来注册一个 WINUSB 1.0 描述符。</p>
  290. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msosv1_desc_register</span><span class="p">(</span><span class="k">struct</span> <span class="nc">usb_msosv1_descriptor</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
  291. </pre></div>
  292. </div>
  293. <ul class="simple">
  294. <li><p><strong>desc</strong> 描述符句柄</p></li>
  295. </ul>
  296. </div>
  297. <div class="section" id="usbd-msosv2-desc-register">
  298. <h3>usbd_msosv2_desc_register<a class="headerlink" href="#usbd-msosv2-desc-register" title="永久链接至标题">¶</a></h3>
  299. <p><code class="docutils literal notranslate"><span class="pre">usbd_msosv2_desc_register</span></code> 用来注册一个 WINUSB 2.0 描述符。</p>
  300. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msosv2_desc_register</span><span class="p">(</span><span class="k">struct</span> <span class="nc">usb_msosv2_descriptor</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
  301. </pre></div>
  302. </div>
  303. <ul class="simple">
  304. <li><p><strong>desc</strong> 描述符句柄</p></li>
  305. </ul>
  306. </div>
  307. <div class="section" id="usbd-bos-desc-register">
  308. <h3>usbd_bos_desc_register<a class="headerlink" href="#usbd-bos-desc-register" title="永久链接至标题">¶</a></h3>
  309. <p><code class="docutils literal notranslate"><span class="pre">usbd_bos_desc_register</span></code> 用来注册一个 BOS 描述符, USB 2.1 版本以上必须注册。</p>
  310. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_bos_desc_register</span><span class="p">(</span><span class="k">struct</span> <span class="nc">usb_bos_descriptor</span> <span class="o">*</span><span class="n">desc</span><span class="p">);</span>
  311. </pre></div>
  312. </div>
  313. <ul class="simple">
  314. <li><p><strong>desc</strong> 描述符句柄</p></li>
  315. </ul>
  316. </div>
  317. <div class="section" id="usbd-class-register">
  318. <h3>usbd_class_register<a class="headerlink" href="#usbd-class-register" title="永久链接至标题">¶</a></h3>
  319. <p><code class="docutils literal notranslate"><span class="pre">usbd_class_register</span></code> 用来注册一个 class,该 class 中的接口链表成员,用于后续挂载多个接口。</p>
  320. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_class_register</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">);</span>
  321. </pre></div>
  322. </div>
  323. <ul class="simple">
  324. <li><p><strong>devclass</strong> USB 设备类的句柄</p></li>
  325. </ul>
  326. </div>
  327. <div class="section" id="usbd-class-add-interface">
  328. <h3>usbd_class_add_interface<a class="headerlink" href="#usbd-class-add-interface" title="永久链接至标题">¶</a></h3>
  329. <p><code class="docutils literal notranslate"><span class="pre">usbd_class_add_interface</span></code> 用来给 USB 设备类增加接口,并将接口信息挂载在类的链表上。</p>
  330. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_class_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
  331. </pre></div>
  332. </div>
  333. <ul class="simple">
  334. <li><p><strong>devclass</strong> USB 设备类的句柄</p></li>
  335. <li><p><strong>intf</strong> USB 设备接口的句柄</p></li>
  336. </ul>
  337. </div>
  338. <div class="section" id="usbd-interface-add-endpoint">
  339. <h3><strong>usbd_interface_add_endpoint</strong><a class="headerlink" href="#usbd-interface-add-endpoint" title="永久链接至标题">¶</a></h3>
  340. <p><code class="docutils literal notranslate"><span class="pre">usbd_interface_add_endpoint</span></code> 用来给 USB 接口增加端点,并将端点信息挂载在接口的链表上。</p>
  341. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_interface_add_endpoint</span><span class="p">(</span><span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">,</span> <span class="n">usbd_endpoint_t</span> <span class="o">*</span><span class="n">ep</span><span class="p">);</span>
  342. </pre></div>
  343. </div>
  344. <ul class="simple">
  345. <li><p><strong>intf</strong> USB 设备接口的句柄</p></li>
  346. <li><p><strong>ep</strong> USB 设备端点的句柄</p></li>
  347. </ul>
  348. </div>
  349. <div class="section" id="usb-device-is-configured">
  350. <h3><strong>usb_device_is_configured</strong><a class="headerlink" href="#usb-device-is-configured" title="永久链接至标题">¶</a></h3>
  351. <p><code class="docutils literal notranslate"><span class="pre">usb_device_is_configured</span></code> 用来检查 USB 设备是否被配置(枚举)。</p>
  352. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">bool</span> <span class="nf">usb_device_is_configured</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
  353. </pre></div>
  354. </div>
  355. <ul class="simple">
  356. <li><p><strong>return</strong> 配置状态, 0 表示未配置, 1 表示配置成功</p></li>
  357. </ul>
  358. </div>
  359. </div>
  360. <div class="section" id="cdc-acm">
  361. <h2>CDC ACM<a class="headerlink" href="#cdc-acm" title="永久链接至标题">¶</a></h2>
  362. <div class="section" id="usbd-cdc-add-acm-interface">
  363. <h3>usbd_cdc_add_acm_interface<a class="headerlink" href="#usbd-cdc-add-acm-interface" title="永久链接至标题">¶</a></h3>
  364. <p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_add_acm_interface</span></code> 用来给 USB CDC ACM 类添加接口,并实现该接口相关的函数:</p>
  365. <ul class="simple">
  366. <li><p><code class="docutils literal notranslate"><span class="pre">cdc_acm_class_request_handler</span></code> 用来处理 USB CDC ACM 类 Setup 请求。</p></li>
  367. <li><p><code class="docutils literal notranslate"><span class="pre">cdc_notify_handler</span></code> 用来处理 USB CDC 其他中断回调函数。</p></li>
  368. </ul>
  369. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_add_acm_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
  370. </pre></div>
  371. </div>
  372. <ul class="simple">
  373. <li><p><strong>devclass</strong> 类的句柄</p></li>
  374. <li><p><strong>intf</strong> 接口句柄</p></li>
  375. </ul>
  376. </div>
  377. <div class="section" id="usbd-cdc-acm-set-line-coding">
  378. <h3>usbd_cdc_acm_set_line_coding<a class="headerlink" href="#usbd-cdc-acm-set-line-coding" title="永久链接至标题">¶</a></h3>
  379. <p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_set_line_coding</span></code> 用来对串口进行配置,如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
  380. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_acm_set_line_coding</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">baudrate</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">databits</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">parity</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">stopbits</span><span class="p">);</span>
  381. </pre></div>
  382. </div>
  383. <ul class="simple">
  384. <li><p><strong>baudrate</strong> 波特率</p></li>
  385. <li><p><strong>databits</strong> 数据位</p></li>
  386. <li><p><strong>parity</strong> 校验位</p></li>
  387. <li><p><strong>stopbits</strong> 停止位</p></li>
  388. </ul>
  389. </div>
  390. <div class="section" id="usbd-cdc-acm-set-dtr">
  391. <h3>usbd_cdc_acm_set_dtr<a class="headerlink" href="#usbd-cdc-acm-set-dtr" title="永久链接至标题">¶</a></h3>
  392. <p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_set_dtr</span></code> 用来控制串口 DTR 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
  393. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_acm_set_dtr</span><span class="p">(</span><span class="kt">bool</span> <span class="n">dtr</span><span class="p">);</span>
  394. </pre></div>
  395. </div>
  396. <ul class="simple">
  397. <li><p><strong>dtr</strong> dtr 为1表示拉低电平,为0表示拉高电平</p></li>
  398. </ul>
  399. </div>
  400. <div class="section" id="usbd-cdc-acm-set-rts">
  401. <h3>usbd_cdc_acm_set_rts<a class="headerlink" href="#usbd-cdc-acm-set-rts" title="永久链接至标题">¶</a></h3>
  402. <p><code class="docutils literal notranslate"><span class="pre">usbd_cdc_acm_set_rts</span></code> 用来控制串口 RTS 。如果仅使用 USB 而不用 串口,该接口不用用户实现,使用默认。</p>
  403. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_cdc_acm_set_rts</span><span class="p">(</span><span class="kt">bool</span> <span class="n">rts</span><span class="p">);</span>
  404. </pre></div>
  405. </div>
  406. <ul class="simple">
  407. <li><p><strong>rts</strong> rts 为1表示拉低电平,为0表示拉高电平</p></li>
  408. </ul>
  409. </div>
  410. </div>
  411. <div class="section" id="hid">
  412. <h2>HID<a class="headerlink" href="#hid" title="永久链接至标题">¶</a></h2>
  413. <div class="section" id="usbd-hid-add-interface">
  414. <h3>usbd_hid_add_interface<a class="headerlink" href="#usbd-hid-add-interface" title="永久链接至标题">¶</a></h3>
  415. <p><code class="docutils literal notranslate"><span class="pre">usbd_hid_add_interface</span></code> 用来给 USB HID 类添加接口,并实现该接口相关的函数:</p>
  416. <ul class="simple">
  417. <li><p><code class="docutils literal notranslate"><span class="pre">hid_class_request_handler</span></code> 用来处理 USB HID 类的 Setup 请求。</p></li>
  418. <li><p><code class="docutils literal notranslate"><span class="pre">hid_custom_request_handler</span></code> 用来处理 USB HID 获取报告描述符请求。</p></li>
  419. <li><p><code class="docutils literal notranslate"><span class="pre">hid_notify_handler</span></code> 用来处理 USB HID 其他中断回调函数。</p></li>
  420. </ul>
  421. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_hid_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
  422. </pre></div>
  423. </div>
  424. <ul class="simple">
  425. <li><p><strong>devclass</strong> 类的句柄</p></li>
  426. <li><p><strong>intf</strong> 接口句柄</p></li>
  427. </ul>
  428. </div>
  429. <div class="section" id="usbd-hid-report-descriptor-register">
  430. <h3>usbd_hid_report_descriptor_register<a class="headerlink" href="#usbd-hid-report-descriptor-register" title="永久链接至标题">¶</a></h3>
  431. <p><code class="docutils literal notranslate"><span class="pre">usbd_hid_report_descriptor_register</span></code> 用来注册 hid 报告描述符。</p>
  432. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_hid_report_descriptor_register</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">intf_num</span><span class="p">,</span> <span class="k">const</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">desc</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">desc_len</span><span class="p">);</span>
  433. </pre></div>
  434. </div>
  435. <ul class="simple">
  436. <li><p><strong>intf_num</strong> 当前 hid 报告描述符所在接口偏移</p></li>
  437. <li><p><strong>desc</strong> 报告描述符</p></li>
  438. <li><p><strong>desc_len</strong> 报告描述符长度</p></li>
  439. </ul>
  440. </div>
  441. <div class="section" id="usbd-hid-set-request-callback">
  442. <h3>usbd_hid_set_request_callback<a class="headerlink" href="#usbd-hid-set-request-callback" title="永久链接至标题">¶</a></h3>
  443. <p><code class="docutils literal notranslate"><span class="pre">usbd_hid_set_request_callback</span></code> 用来注册 hid 类请求命令的回调函数。</p>
  444. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_hid_set_request_callback</span><span class="p">(</span> <span class="kt">uint8_t</span> <span class="n">intf_num</span><span class="p">,</span>
  445. <span class="kt">uint8_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_report_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">report_type</span><span class="p">),</span>
  446. <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_report_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">report_type</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">report</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">report_len</span><span class="p">),</span>
  447. <span class="kt">uint8_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_idle_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">),</span>
  448. <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_idle_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">report_id</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">duration</span><span class="p">),</span>
  449. <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_protocol_callback</span><span class="p">)(</span><span class="kt">uint8_t</span> <span class="n">protocol</span><span class="p">),</span>
  450. <span class="kt">uint8_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_protocol_callback</span><span class="p">)(</span><span class="kt">void</span><span class="p">));</span>
  451. </pre></div>
  452. </div>
  453. <ul class="simple">
  454. <li><p><strong>intf_num</strong> 当前 hid 报告描述符所在接口偏移</p></li>
  455. <li><p><strong>get_report_callback</strong> get report命令处理回调函数</p></li>
  456. <li><p><strong>set_report_callback</strong> set report命令处理回调函数</p></li>
  457. <li><p><strong>get_idle_callback</strong> get idle命令处理回调函数</p></li>
  458. <li><p><strong>set_idle_callback</strong> set idle命令处理回调函数</p></li>
  459. <li><p><strong>set_protocol_callback</strong> set protocol命令处理回调函数</p></li>
  460. <li><p><strong>get_protocol_callback</strong> get protocol命令处理回调函数</p></li>
  461. </ul>
  462. </div>
  463. </div>
  464. <div class="section" id="msc">
  465. <h2>MSC<a class="headerlink" href="#msc" title="永久链接至标题">¶</a></h2>
  466. <div class="section" id="usbd-msc-class-init">
  467. <h3>usbd_msc_class_init<a class="headerlink" href="#usbd-msc-class-init" title="永久链接至标题">¶</a></h3>
  468. <p><code class="docutils literal notranslate"><span class="pre">usbd_msc_class_init</span></code> 用来给 MSC 类添加接口,并实现该接口相关函数,并且注册端点回调函数。(因为 msc bot 协议是固定的,所以不需要用于实现,因此端点回调函数自然不需要用户实现)。</p>
  469. <ul class="simple">
  470. <li><p><code class="docutils literal notranslate"><span class="pre">msc_storage_class_request_handler</span></code> 用于处理 USB MSC Setup 中断请求。</p></li>
  471. <li><p><code class="docutils literal notranslate"><span class="pre">msc_storage_notify_handler</span></code> 用于实现 USB MSC 其他中断回调函数。</p></li>
  472. <li><p><code class="docutils literal notranslate"><span class="pre">mass_storage_bulk_out</span></code> 用于处理 USB MSC 端点 out 中断。</p></li>
  473. <li><p><code class="docutils literal notranslate"><span class="pre">mass_storage_bulk_in</span></code> 用于处理 USB MSC 端点 in 中断。</p></li>
  474. </ul>
  475. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msc_class_init</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">out_ep</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="n">in_ep</span><span class="p">);</span>
  476. </pre></div>
  477. </div>
  478. <ul class="simple">
  479. <li><p><strong>out_ep</strong> out 端点地址</p></li>
  480. <li><p><strong>in_ep</strong> in 端点地址</p></li>
  481. </ul>
  482. </div>
  483. <div class="section" id="usbd-msc-get-cap">
  484. <h3>usbd_msc_get_cap<a class="headerlink" href="#usbd-msc-get-cap" title="永久链接至标题">¶</a></h3>
  485. <p><code class="docutils literal notranslate"><span class="pre">usbd_msc_get_cap</span></code> 用来获取存储器的 lun、扇区个数和每个扇区大小。用户必须实现该函数。</p>
  486. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_msc_get_cap</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">lun</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">block_num</span><span class="p">,</span> <span class="kt">uint16_t</span> <span class="o">*</span><span class="n">block_size</span><span class="p">);</span>
  487. </pre></div>
  488. </div>
  489. <ul class="simple">
  490. <li><p><strong>lun</strong> 存储逻辑单元,暂时无用,默认支持一个</p></li>
  491. <li><p><strong>block_num</strong> 存储扇区个数</p></li>
  492. <li><p><strong>block_size</strong> 存储扇区大小</p></li>
  493. </ul>
  494. </div>
  495. <div class="section" id="usbd-msc-sector-read">
  496. <h3>usbd_msc_sector_read<a class="headerlink" href="#usbd-msc-sector-read" title="永久链接至标题">¶</a></h3>
  497. <p><code class="docutils literal notranslate"><span class="pre">usbd_msc_sector_read</span></code> 用来对存储器某个扇区开始的地址进行数据读取。用户必须实现该函数。</p>
  498. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">usbd_msc_sector_read</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">sector</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">length</span><span class="p">);</span>
  499. </pre></div>
  500. </div>
  501. <ul class="simple">
  502. <li><p><strong>sector</strong> 扇区偏移</p></li>
  503. <li><p><strong>buffer</strong> 存储读取的数据的指针</p></li>
  504. <li><p><strong>length</strong> 读取长度</p></li>
  505. </ul>
  506. </div>
  507. <div class="section" id="usbd-msc-sector-write">
  508. <h3>usbd_msc_sector_write<a class="headerlink" href="#usbd-msc-sector-write" title="永久链接至标题">¶</a></h3>
  509. <p><code class="docutils literal notranslate"><span class="pre">usbd_msc_sector_write</span></code> 用来对存储器某个扇区开始写入数据。用户必须实现该函数。</p>
  510. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span> <span class="nf">usbd_msc_sector_write</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">sector</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">length</span><span class="p">);</span>
  511. </pre></div>
  512. </div>
  513. <ul class="simple">
  514. <li><p><strong>sector</strong> 扇区偏移</p></li>
  515. <li><p><strong>buffer</strong> 写入数据指针</p></li>
  516. <li><p><strong>length</strong> 写入长度</p></li>
  517. </ul>
  518. </div>
  519. </div>
  520. <div class="section" id="uac">
  521. <h2>UAC<a class="headerlink" href="#uac" title="永久链接至标题">¶</a></h2>
  522. <div class="section" id="usbd-audio-add-interface">
  523. <h3>usbd_audio_add_interface<a class="headerlink" href="#usbd-audio-add-interface" title="永久链接至标题">¶</a></h3>
  524. <p><code class="docutils literal notranslate"><span class="pre">usbd_audio_add_interface</span></code> 用来给 USB Audio 类添加接口,并实现该接口相关的函数:</p>
  525. <ul class="simple">
  526. <li><p><code class="docutils literal notranslate"><span class="pre">audio_class_request_handler</span></code> 用于处理 USB Audio Setup 中断请求。</p></li>
  527. <li><p><code class="docutils literal notranslate"><span class="pre">audio_notify_handler</span></code> 用于实现 USB Audio 其他中断回调函数。</p></li>
  528. </ul>
  529. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
  530. </pre></div>
  531. </div>
  532. <ul class="simple">
  533. <li><p><strong>class</strong> 类的句柄</p></li>
  534. <li><p><strong>intf</strong> 接口句柄</p></li>
  535. </ul>
  536. </div>
  537. <div class="section" id="usbd-audio-set-mute">
  538. <h3>usbd_audio_set_mute<a class="headerlink" href="#usbd-audio-set-mute" title="永久链接至标题">¶</a></h3>
  539. <p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_mute</span></code> 用来设置静音。</p>
  540. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_set_mute</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">mute</span><span class="p">);</span>
  541. </pre></div>
  542. </div>
  543. <ul class="simple">
  544. <li><p><strong>mute</strong> 为1 表示静音,0相反</p></li>
  545. </ul>
  546. </div>
  547. <div class="section" id="usbd-audio-set-volume">
  548. <h3>usbd_audio_set_volume<a class="headerlink" href="#usbd-audio-set-volume" title="永久链接至标题">¶</a></h3>
  549. <p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_volume</span></code> 用来设置音量。</p>
  550. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_set_volume</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">vol</span><span class="p">);</span>
  551. </pre></div>
  552. </div>
  553. <ul class="simple">
  554. <li><p><strong>vol</strong> 音量,从 0-100</p></li>
  555. </ul>
  556. </div>
  557. <div class="section" id="usbd-audio-set-interface-callback">
  558. <h3>usbd_audio_set_interface_callback<a class="headerlink" href="#usbd-audio-set-interface-callback" title="永久链接至标题">¶</a></h3>
  559. <p><code class="docutils literal notranslate"><span class="pre">usbd_audio_set_interface_callback</span></code> 用来开关音频数据传输。</p>
  560. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_audio_set_interface_callback</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="n">value</span><span class="p">);</span>
  561. </pre></div>
  562. </div>
  563. <ul class="simple">
  564. <li><p><strong>value</strong> 为1 表示开启 stream 传输,为0 相反</p></li>
  565. </ul>
  566. </div>
  567. </div>
  568. <div class="section" id="uvc">
  569. <h2>UVC<a class="headerlink" href="#uvc" title="永久链接至标题">¶</a></h2>
  570. <div class="section" id="usbd-video-add-interface">
  571. <h3>usbd_video_add_interface<a class="headerlink" href="#usbd-video-add-interface" title="永久链接至标题">¶</a></h3>
  572. <p><code class="docutils literal notranslate"><span class="pre">usbd_video_add_interface</span></code> 用来给 USB Video 类添加接口,并实现该接口相关的函数:</p>
  573. <ul class="simple">
  574. <li><p><code class="docutils literal notranslate"><span class="pre">video_class_request_handler</span></code> 用于处理 USB Video Setup 中断请求。</p></li>
  575. <li><p><code class="docutils literal notranslate"><span class="pre">video_notify_handler</span></code> 用于实现 USB Video 其他中断回调函数。</p></li>
  576. </ul>
  577. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_video_add_interface</span><span class="p">(</span><span class="n">usbd_class_t</span> <span class="o">*</span><span class="n">devclass</span><span class="p">,</span> <span class="n">usbd_interface_t</span> <span class="o">*</span><span class="n">intf</span><span class="p">);</span>
  578. </pre></div>
  579. </div>
  580. <ul class="simple">
  581. <li><p><strong>class</strong> 类的句柄</p></li>
  582. <li><p><strong>intf</strong> 接口句柄</p></li>
  583. </ul>
  584. </div>
  585. <div class="section" id="usbd-video-probe-and-commit-controls-init">
  586. <h3>usbd_video_probe_and_commit_controls_init<a class="headerlink" href="#usbd-video-probe-and-commit-controls-init" title="永久链接至标题">¶</a></h3>
  587. <p><code class="docutils literal notranslate"><span class="pre">usbd_video_probe_and_commit_controls_init</span></code> 用来开关视频数据传输。</p>
  588. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_video_probe_and_commit_controls_init</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">dwFrameInterval</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">dwMaxVideoFrameSize</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">dwMaxPayloadTransferSize</span><span class="p">);</span>
  589. </pre></div>
  590. </div>
  591. <ul class="simple">
  592. <li><p><strong>value</strong> 为1 表示开启 stream 传输,为0 相反</p></li>
  593. </ul>
  594. </div>
  595. <div class="section" id="usbd-video-mjpeg-payload-fill">
  596. <h3>usbd_video_mjpeg_payload_fill<a class="headerlink" href="#usbd-video-mjpeg-payload-fill" title="永久链接至标题">¶</a></h3>
  597. <p><code class="docutils literal notranslate"><span class="pre">usbd_video_mjpeg_payload_fill</span></code> 用来填充 mjpeg 到新的 buffer中,其中会对 mjpeg 数据按帧进行切分,切分大小由 <code class="docutils literal notranslate"><span class="pre">dwMaxPayloadTransferSize</span></code> 控制,并添加头部信息,当前头部字节数为 2。头部信息见 <code class="docutils literal notranslate"><span class="pre">struct</span> <span class="pre">video_mjpeg_payload_header</span></code></p>
  598. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">uint32_t</span> <span class="nf">usbd_video_mjpeg_payload_fill</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">input</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">input_len</span><span class="p">,</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">output</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">out_len</span><span class="p">);</span>
  599. </pre></div>
  600. </div>
  601. <ul class="simple">
  602. <li><p><strong>input</strong> mjpeg 格式的数据包,从 FFD8~FFD9结束</p></li>
  603. <li><p><strong>input_len</strong> mjpeg数据包大小</p></li>
  604. <li><p><strong>output</strong> 输出缓冲区</p></li>
  605. <li><p><strong>out_len</strong> 输出实际要发送的长度大小</p></li>
  606. <li><p><strong>return</strong> 返回 usb 按照 <code class="docutils literal notranslate"><span class="pre">dwMaxPayloadTransferSize</span></code> 大小要发多少帧</p></li>
  607. </ul>
  608. </div>
  609. <div class="section" id="usbd-video-mjpeg-payload-header-toggle">
  610. <h3>usbd_video_mjpeg_payload_header_toggle<a class="headerlink" href="#usbd-video-mjpeg-payload-header-toggle" title="永久链接至标题">¶</a></h3>
  611. <p><code class="docutils literal notranslate"><span class="pre">usbd_video_mjpeg_payload_header_toggle</span></code> 用来对每一帧图像数据要发送时进行翻转,并保持到一帧图像数据发送完成。</p>
  612. <div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span> <span class="nf">usbd_video_mjpeg_payload_header_toggle</span><span class="p">(</span><span class="kt">uint8_t</span> <span class="o">*</span><span class="n">output</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">packets</span><span class="p">);</span>
  613. </pre></div>
  614. </div>
  615. <ul class="simple">
  616. <li><p><strong>output</strong> 要翻转的 usb 缓冲区,该缓冲区是 <code class="docutils literal notranslate"><span class="pre">usbd_video_mjpeg_payload_fill</span></code> 中的 <code class="docutils literal notranslate"><span class="pre">output</span></code></p></li>
  617. <li><p><strong>packets</strong> USB 发送的帧个数</p></li>
  618. </ul>
  619. </div>
  620. </div>
  621. <div class="section" id="dfu">
  622. <h2>DFU<a class="headerlink" href="#dfu" title="永久链接至标题">¶</a></h2>
  623. </div>
  624. <div class="section" id="porting">
  625. <h2>PORTING<a class="headerlink" href="#porting" title="永久链接至标题">¶</a></h2>
  626. </div>
  627. </div>
  628. </div>
  629. </div>
  630. <footer>
  631. <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
  632. <a href="api_host.html" class="btn btn-neutral float-right" title="主机协议栈" accesskey="n" rel="next">下一页 <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
  633. <a href="../usb/usb_enum.html" class="btn btn-neutral float-left" title="USB 枚举" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> 上一页</a>
  634. </div>
  635. <hr/>
  636. <div role="contentinfo">
  637. <p>
  638. &#169; 版权所有 2022, sakumisu.
  639. </p>
  640. </div>
  641. 利用 <a href="https://www.sphinx-doc.org/">Sphinx</a> 构建,使用了
  642. <a href="https://github.com/readthedocs/sphinx_rtd_theme">主题</a>
  643. 由 <a href="https://readthedocs.org">Read the Docs</a>开发.
  644. </footer>
  645. </div>
  646. </div>
  647. </section>
  648. </div>
  649. <script type="text/javascript">
  650. jQuery(function () {
  651. SphinxRtdTheme.Navigation.enable(true);
  652. });
  653. </script>
  654. </body>
  655. </html>