Deploying to gh-pages from @ cherry-embedded/CherryUSB@9519e06e46 🚀

This commit is contained in:
sakumisu 2024-11-27 10:26:55 +00:00
parent 17244c894d
commit 5636ba36df
5 changed files with 157 additions and 3 deletions

View File

@ -70,7 +70,7 @@ usbd_cdc_acm
}
}
- 以下是为了测试 DTR 功能并控制 USB 发送DTR 和 RST 只用于搭配 UART 使用,如果是纯 USB没什么用这里仅做测试。DTR 开关使用任意串口上位机并勾选 DTR。
- 以下是为了测试 DTR 功能并控制 USB 发送DTR 和 RTS 只用于搭配 UART 使用,如果是纯 USB没什么用这里仅做测试。DTR 开关使用任意串口上位机并勾选 DTR。
.. code-block:: C

View File

@ -1,2 +1,81 @@
usbd_video
===============
本节主要演示 USB UAC 功能,支持 YUYV, MJPEG, H264 格式。为了方便演示,都采用的静态图。
demo 包含 **video_static_yuyv_template**, **video_static_mjpeg_template**, **video_static_h264_template**, 仅描述符和图片数据不同。
- 在高速模式下默认最大是1024字节但是如果芯片支持 additional transcations可以配置为最高 2048字节或者3072字节这样可以提高传输效率。
.. code-block:: C
#ifdef CONFIG_USB_HS
#define MAX_PAYLOAD_SIZE 1024 // for high speed with one transcations every one micro frame
#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11))
// #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame
// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 << 11))
// #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame
// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 << 11))
#else
#define MAX_PAYLOAD_SIZE 1020
#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 << 11))
#endif
- 通常只需要修改 WIDTH 和 HEIGHT
.. code-block:: C
#define WIDTH (unsigned int)(640)
#define HEIGHT (unsigned int)(480)
#define CAM_FPS (30)
#define INTERVAL (unsigned long)(10000000 / CAM_FPS)
#define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) //16 bit
#define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS)
#define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2)
- USB 端点配置,默认 interval 为 1也就是全速模式下 1ms高速模式下 125us。同步类型使用异步模式。
.. code-block:: C
/* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */
USB_ENDPOINT_DESCRIPTOR_INIT(VIDEO_IN_EP, 0x05, VIDEO_PACKET_SIZE, 0x01),
- 使用 `usbd_video_stream_start_write` 传输数据
1采用双缓冲的形式 **MAX_PACKETS_IN_ONE_TRANSFER** 表示一次传输可以携带多少个 **MAX_PAYLOAD_SIZE**,通常 IP 只能为 1。
2在中断完成中调用 `usbd_video_stream_split_transfer` 继续下一次传输,直到返回为 true 表示传输完成。这边的分裂传输只是表示将图片数据拆成 **MAX_PACKETS_IN_ONE_TRANSFER * MAX_PAYLOAD_SIZE** 份传输。
3通常 IP 不支持一次传输非常大的数据,比如传输 1MB因此需要做分裂传输但是会增加中断次数。并且一次传输非常大数据也是需要足够的 RAM。
.. code-block:: C
void usbd_video_iso_callback(uint8_t busid, uint8_t ep, uint32_t nbytes)
{
if (usbd_video_stream_split_transfer(busid, ep)) {
/* one frame has done */
iso_tx_busy = false;
}
}
USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t packet_buffer[2][MAX_PACKETS_IN_ONE_TRANSFER * MAX_PAYLOAD_SIZE];
void video_test(uint8_t busid)
{
memset(packet_buffer, 0, sizeof(packet_buffer));
while (1) {
if (tx_flag) {
iso_tx_busy = true;
usbd_video_stream_start_write(busid, VIDEO_IN_EP, &packet_buffer[0][0], &packet_buffer[1][0], MAX_PACKETS_IN_ONE_TRANSFER * MAX_PAYLOAD_SIZE, (uint8_t *)cherryusb_mjpeg, sizeof(cherryusb_mjpeg));
while (iso_tx_busy) {
if (tx_flag == 0) {
break;
}
}
}
}
}

View File

@ -219,7 +219,7 @@
</pre></div>
</div>
<ul class="simple">
<li><p>以下是为了测试 DTR 功能并控制 USB 发送DTR 和 RST 只用于搭配 UART 使用,如果是纯 USB没什么用这里仅做测试。DTR 开关使用任意串口上位机并勾选 DTR。</p></li>
<li><p>以下是为了测试 DTR 功能并控制 USB 发送DTR 和 RTS 只用于搭配 UART 使用,如果是纯 USB没什么用这里仅做测试。DTR 开关使用任意串口上位机并勾选 DTR。</p></li>
</ul>
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_cdc_acm_set_dtr</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">intf</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">dtr</span><span class="p">)</span>
<span class="p">{</span>

View File

@ -151,6 +151,81 @@
<section id="usbd-video">
<h1>usbd_video<a class="headerlink" href="#usbd-video" title="Link to this heading"></a></h1>
<p>本节主要演示 USB UAC 功能,支持 YUYV, MJPEG, H264 格式。为了方便演示,都采用的静态图。</p>
<p>demo 包含 <strong>video_static_yuyv_template</strong>, <strong>video_static_mjpeg_template</strong>, <strong>video_static_h264_template</strong>, 仅描述符和图片数据不同。</p>
<ul class="simple">
<li><p>在高速模式下默认最大是1024字节但是如果芯片支持 additional transcations可以配置为最高 2048字节或者3072字节这样可以提高传输效率。</p></li>
</ul>
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifdef CONFIG_USB_HS</span>
<span class="cp">#define MAX_PAYLOAD_SIZE 1024 </span><span class="c1">// for high speed with one transcations every one micro frame</span>
<span class="cp">#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 &lt;&lt; 11))</span>
<span class="c1">// #define MAX_PAYLOAD_SIZE 2048 // for high speed with two transcations every one micro frame</span>
<span class="c1">// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 2)) | (0x01 &lt;&lt; 11))</span>
<span class="c1">// #define MAX_PAYLOAD_SIZE 3072 // for high speed with three transcations every one micro frame</span>
<span class="c1">// #define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 3)) | (0x02 &lt;&lt; 11))</span>
<span class="cp">#else</span>
<span class="cp">#define MAX_PAYLOAD_SIZE 1020</span>
<span class="cp">#define VIDEO_PACKET_SIZE (unsigned int)(((MAX_PAYLOAD_SIZE / 1)) | (0x00 &lt;&lt; 11))</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<ul class="simple">
<li><p>通常只需要修改 WIDTH 和 HEIGHT</p></li>
</ul>
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="cp">#define WIDTH (unsigned int)(640)</span>
<span class="cp">#define HEIGHT (unsigned int)(480)</span>
<span class="cp">#define CAM_FPS (30)</span>
<span class="cp">#define INTERVAL (unsigned long)(10000000 / CAM_FPS)</span>
<span class="cp">#define MIN_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS) </span><span class="c1">//16 bit</span>
<span class="cp">#define MAX_BIT_RATE (unsigned long)(WIDTH * HEIGHT * 16 * CAM_FPS)</span>
<span class="cp">#define MAX_FRAME_SIZE (unsigned long)(WIDTH * HEIGHT * 2)</span>
</pre></div>
</div>
<ul class="simple">
<li><p>USB 端点配置,默认 interval 为 1也就是全速模式下 1ms高速模式下 125us。同步类型使用异步模式。</p></li>
</ul>
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="cm">/* 1.2.2.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */</span>
<span class="n">USB_ENDPOINT_DESCRIPTOR_INIT</span><span class="p">(</span><span class="n">VIDEO_IN_EP</span><span class="p">,</span><span class="w"> </span><span class="mh">0x05</span><span class="p">,</span><span class="w"> </span><span class="n">VIDEO_PACKET_SIZE</span><span class="p">,</span><span class="w"> </span><span class="mh">0x01</span><span class="p">),</span>
</pre></div>
</div>
<ul class="simple">
<li><p>使用 <cite>usbd_video_stream_start_write</cite> 传输数据</p></li>
</ul>
<p>1采用双缓冲的形式 <strong>MAX_PACKETS_IN_ONE_TRANSFER</strong> 表示一次传输可以携带多少个 <strong>MAX_PAYLOAD_SIZE</strong>,通常 IP 只能为 1。
2在中断完成中调用 <cite>usbd_video_stream_split_transfer</cite> 继续下一次传输,直到返回为 true 表示传输完成。这边的分裂传输只是表示将图片数据拆成 <strong>MAX_PACKETS_IN_ONE_TRANSFER * MAX_PAYLOAD_SIZE</strong> 份传输。
3通常 IP 不支持一次传输非常大的数据,比如传输 1MB因此需要做分裂传输但是会增加中断次数。并且一次传输非常大数据也是需要足够的 RAM。</p>
<div class="highlight-C notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span><span class="w"> </span><span class="nf">usbd_video_iso_callback</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">ep</span><span class="p">,</span><span class="w"> </span><span class="kt">uint32_t</span><span class="w"> </span><span class="n">nbytes</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">usbd_video_stream_split_transfer</span><span class="p">(</span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="n">ep</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* one frame has done */</span>
<span class="w"> </span><span class="n">iso_tx_busy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
<span class="n">USB_NOCACHE_RAM_SECTION</span><span class="w"> </span><span class="n">USB_MEM_ALIGNX</span><span class="w"> </span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">packet_buffer</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="n">MAX_PACKETS_IN_ONE_TRANSFER</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">MAX_PAYLOAD_SIZE</span><span class="p">];</span>
<span class="kt">void</span><span class="w"> </span><span class="nf">video_test</span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="n">busid</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">memset</span><span class="p">(</span><span class="n">packet_buffer</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">packet_buffer</span><span class="p">));</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tx_flag</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">iso_tx_busy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
<span class="w"> </span><span class="n">usbd_video_stream_start_write</span><span class="p">(</span><span class="n">busid</span><span class="p">,</span><span class="w"> </span><span class="n">VIDEO_IN_EP</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">packet_buffer</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="o">&amp;</span><span class="n">packet_buffer</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span><span class="w"> </span><span class="n">MAX_PACKETS_IN_ONE_TRANSFER</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">MAX_PAYLOAD_SIZE</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">uint8_t</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">cherryusb_mjpeg</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">cherryusb_mjpeg</span><span class="p">));</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">iso_tx_busy</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">tx_flag</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">break</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>

File diff suppressed because one or more lines are too long