<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://docs.bouffalolab.com/index.php?action=history&amp;feed=atom&amp;title=NetHubVirtualChannel</id>
	<title>NetHubVirtualChannel - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://docs.bouffalolab.com/index.php?action=history&amp;feed=atom&amp;title=NetHubVirtualChannel"/>
	<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=NetHubVirtualChannel&amp;action=history"/>
	<updated>2026-04-14T08:38:11Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=NetHubVirtualChannel&amp;diff=247&amp;oldid=prev</id>
		<title>张良：​Sync NetHub docs from local Markdown</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=NetHubVirtualChannel&amp;diff=247&amp;oldid=prev"/>
		<updated>2026-03-17T05:33:51Z</updated>

		<summary type="html">&lt;p&gt;Sync NetHub docs from local Markdown&lt;/p&gt;
&lt;a href=&quot;https://docs.bouffalolab.com/index.php?title=NetHubVirtualChannel&amp;amp;diff=247&amp;amp;oldid=235&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>张良</name></author>
	</entry>
	<entry>
		<id>https://docs.bouffalolab.com/index.php?title=NetHubVirtualChannel&amp;diff=235&amp;oldid=prev</id>
		<title>张良：​创建页面，内容为“= NetHub USER Virtual Channel =  本文档描述 NetHub 的 &lt;code&gt;USER virtual channel&lt;/code&gt; 用法。  == 1. 概念 ==  &lt;code&gt;USER virtual channel&lt;/code&gt; 是承载在当前 host link 上的逻辑消息通道。  它不是独立物理接口，而是复用当前的 &lt;code&gt;SDIO / USB / SPI&lt;/code&gt; 链路，把不同类型的数据拆分到不同逻辑通道中。  当前常用类型：  * &lt;code&gt;USER&lt;/code&gt; ** 客户或应用层私有数据 * &lt;code&gt;AT&lt;/code&gt; ** hos…”</title>
		<link rel="alternate" type="text/html" href="https://docs.bouffalolab.com/index.php?title=NetHubVirtualChannel&amp;diff=235&amp;oldid=prev"/>
		<updated>2026-03-13T09:17:57Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“= NetHub USER Virtual Channel =  本文档描述 NetHub 的 &amp;lt;code&amp;gt;USER virtual channel&amp;lt;/code&amp;gt; 用法。  == 1. 概念 ==  &amp;lt;code&amp;gt;USER virtual channel&amp;lt;/code&amp;gt; 是承载在当前 host link 上的逻辑消息通道。  它不是独立物理接口，而是复用当前的 &amp;lt;code&amp;gt;SDIO / USB / SPI&amp;lt;/code&amp;gt; 链路，把不同类型的数据拆分到不同逻辑通道中。  当前常用类型：  * &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; ** 客户或应用层私有数据 * &amp;lt;code&amp;gt;AT&amp;lt;/code&amp;gt; ** hos…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= NetHub USER Virtual Channel =&lt;br /&gt;
&lt;br /&gt;
本文档描述 NetHub 的 &amp;lt;code&amp;gt;USER virtual channel&amp;lt;/code&amp;gt; 用法。&lt;br /&gt;
&lt;br /&gt;
== 1. 概念 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;USER virtual channel&amp;lt;/code&amp;gt; 是承载在当前 host link 上的逻辑消息通道。&lt;br /&gt;
&lt;br /&gt;
它不是独立物理接口，而是复用当前的 &amp;lt;code&amp;gt;SDIO / USB / SPI&amp;lt;/code&amp;gt; 链路，把不同类型的数据拆分到不同逻辑通道中。&lt;br /&gt;
&lt;br /&gt;
当前常用类型：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt;&lt;br /&gt;
** 客户或应用层私有数据&lt;br /&gt;
* &amp;lt;code&amp;gt;AT&amp;lt;/code&amp;gt;&lt;br /&gt;
** host 控制面数据&lt;br /&gt;
* &amp;lt;code&amp;gt;SYSTEM&amp;lt;/code&amp;gt;&lt;br /&gt;
** 系统内部协调消息&lt;br /&gt;
&lt;br /&gt;
客户集成时，通常只需要关注 &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; 类型。&lt;br /&gt;
&lt;br /&gt;
== 2. bringup 前提 ==&lt;br /&gt;
&lt;br /&gt;
使用前建议确认：&lt;br /&gt;
&lt;br /&gt;
* device 侧已编入 &amp;lt;code&amp;gt;CONFIG_NETHUB=y&amp;lt;/code&amp;gt;&lt;br /&gt;
* device 侧已编入 &amp;lt;code&amp;gt;CONFIG_MR_VIRTUALCHAN=y&amp;lt;/code&amp;gt;&lt;br /&gt;
* host 侧已经加载 &amp;lt;code&amp;gt;mr_sdio.ko&amp;lt;/code&amp;gt;&lt;br /&gt;
* host 与 device 的底层链路已经正常工作&lt;br /&gt;
&lt;br /&gt;
补充说明：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; 通道和控制通道是并列关系&lt;br /&gt;
* 如果 host 控制面本身走 &amp;lt;code&amp;gt;vchan&amp;lt;/code&amp;gt;，它使用的是 &amp;lt;code&amp;gt;AT&amp;lt;/code&amp;gt; 类型&lt;br /&gt;
* 客户私有消息建议固定使用 &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; 类型&lt;br /&gt;
&lt;br /&gt;
== 3. Device 侧接口 ==&lt;br /&gt;
&lt;br /&gt;
头文件：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;components/net/nethub/include/nethub_vchan.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常用接口：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int nethub_vchan_user_send(const void *data, uint16_t len);&lt;br /&gt;
int nethub_vchan_user_recv_register(nethub_vchan_recv_cb_t recv_cb, void *cb_arg);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Host 侧接口 ==&lt;br /&gt;
&lt;br /&gt;
头文件：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;bsp/common/msg_router/linux_host/userspace/nethub/virtualchan/nethub_vchan.h&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.1 初始化与清理 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int nethub_vchan_init(void);&lt;br /&gt;
int nethub_vchan_deinit(void);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.2 USER 通道 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef void (*nethub_vchan_recv_callback_t)(const void *data, size_t len);&lt;br /&gt;
&lt;br /&gt;
int nethub_vchan_user_send(const void *data, size_t len);&lt;br /&gt;
int nethub_vchan_user_register_callback(nethub_vchan_recv_callback_t callback);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.3 可选状态查询 ===&lt;br /&gt;
&lt;br /&gt;
如果需要判断当前 virtual channel 是否 ready，可选使用：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct {&lt;br /&gt;
    nethub_vchan_link_state_t link_state;&lt;br /&gt;
    nethub_vchan_host_state_t host_state;&lt;br /&gt;
} nethub_vchan_state_snapshot_t;&lt;br /&gt;
&lt;br /&gt;
int nethub_vchan_get_state_snapshot(nethub_vchan_state_snapshot_t *snapshot);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
常用判断：&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;link_state == NETHUB_VCHAN_LINK_UP&amp;lt;/code&amp;gt;&lt;br /&gt;
** 表示链路已可收发&lt;br /&gt;
* &amp;lt;code&amp;gt;host_state == NETHUB_VCHAN_HOST_STATE_DEVICE_RUN&amp;lt;/code&amp;gt;&lt;br /&gt;
** 表示 host 侧已经和 device 完成握手&lt;br /&gt;
&lt;br /&gt;
=== 4.4 可选链路事件回调 ===&lt;br /&gt;
&lt;br /&gt;
如果应用希望在链路 up/down 时被动收到通知，可选注册：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int nethub_vchan_register_link_event_callback(&lt;br /&gt;
    nethub_vchan_link_event_callback_t callback,&lt;br /&gt;
    void *user_data);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5. 典型使用顺序 ==&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;nethub_vchan_init()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;nethub_vchan_user_register_callback()&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;nethub_vchan_user_send()&amp;lt;/code&amp;gt;&lt;br /&gt;
# 使用完成后调用 &amp;lt;code&amp;gt;nethub_vchan_deinit()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
示例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;nethub_vchan.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
static void user_rx_cb(const void *data, size_t len)&lt;br /&gt;
{&lt;br /&gt;
    printf(&amp;quot;recv USER data: %.*s\n&amp;quot;, (int)len, (const char *)data);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    const char *msg = &amp;quot;hello from host&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    if (nethub_vchan_init() != 0) {&lt;br /&gt;
        return -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    nethub_vchan_user_register_callback(user_rx_cb);&lt;br /&gt;
    nethub_vchan_user_send(msg, strlen(msg));&lt;br /&gt;
&lt;br /&gt;
    nethub_vchan_deinit();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6. 限制与注意事项 ==&lt;br /&gt;
&lt;br /&gt;
* 单次消息最大长度为 &amp;lt;code&amp;gt;1500&amp;lt;/code&amp;gt; 字节&lt;br /&gt;
* &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; 通道是消息包语义，不是流式字节流&lt;br /&gt;
* 使用前必须保证内核模块已经加载&lt;br /&gt;
* 如果 device 侧未启用 &amp;lt;code&amp;gt;CONFIG_MR_VIRTUALCHAN&amp;lt;/code&amp;gt;，host 侧 &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; 通道无法工作&lt;br /&gt;
* 如果同时使用 host 控制面和 &amp;lt;code&amp;gt;USER&amp;lt;/code&amp;gt; 通道，客户私有数据不要复用 &amp;lt;code&amp;gt;AT&amp;lt;/code&amp;gt; 类型&lt;br /&gt;
&lt;br /&gt;
== 7. 相关页面 ==&lt;br /&gt;
&lt;br /&gt;
* [[NetHubQuickBringup|NetHub 快速上手]]&lt;br /&gt;
* [[NetHubArchitecture|NetHub 架构说明]]&lt;/div&gt;</summary>
		<author><name>张良</name></author>
	</entry>
</feed>