USB网络控制通讯NCM
+ -

NCM通讯类特定消息

2025-07-08 0 0

1. 通信接口(Communications Interface)要求

必须支持以下三类请求

请求类型 规范依据 示例请求
标准USB请求 [USB30] Chapter 9 GET_DESCRIPTOR, SET_CONFIGURATION, CLEAR_FEATURE
CDC类特定请求 [USBCDC12] SET_LINE_CODING(虽NCM不适用但需实现框架)
NCM子类特定请求 本规范第6章 SET_NTB_INPUT_SIZE, GET_NTB_PARAMETERS, SET_CRC_MODE

通知(Notifications)要求

  • 必须通过Interrupt IN端点异步发送
  • 包含网络状态变化(如连接/断开)和错误报告

2. 数据接口(Data Interface)限制

严格禁止以下操作

// 错误示例(主机禁止行为)
usb_control_transfer(
    dev, 
    USB_DIR_OUT|USB_TYPE_CLASS, 
    0x22,  // 假设的类请求
    0, 0, 
    data, len, timeout);  // 目标为数据接口

违规后果

  • 设备行为未定义(可能:静默丢弃/返回STALL/系统崩溃)
  • 主机驱动应预先验证目标接口类型

3. 请求处理流程(通信接口)

1009428646

4. 关键实现约束

  1. 端点分配策略

    // 正确配置示例
    #define COMM_IFACE  0  // 通信接口(控制+中断IN)
    #define DATA_IFACE  1  // 数据接口(批量IN/OUT)
    
    void handle_request(usb_request_t *req) {
        if (req->wIndex == DATA_IFACE) {  // 检测到针对数据接口
            usb_stall_ep0();              // 立即终止
            return;
        }
        // ...正常处理通信接口请求
    }
    
  2. 错误恢复机制

    • 主机收到STALL后应:
      1. 重置通信接口(SET_INTERFACE到Alternate Setting 0)
      2. 重新初始化NCM功能描述符
      3. 切回工作模式(Alternate Setting 1)

5. 开发者检查清单

  1. 请求过滤

    if ((bmRequestType & USB_RECIPIENT_MASK) == USB_RECIPIENT_INTERFACE) {
        if (wIndex == data_iface_num) { /* 拒绝数据接口请求 */ }
    }
    
  2. 通知优先级

    • 中断端点应优先处理连接状态通知(如USB_CDC_NOTIFY_NETWORK_CONNECTION
  3. 合规性测试

6. 典型NCM特定请求

// 设置NTB输入大小(Host→Device)
#define SET_NTB_INPUT_SIZE   0x80
#pragma pack(1)
typedef struct {
    uint32_t dwNtbInMaxSize;
    uint16_t wNtbInMaxDatagrams;
} ntb_input_size_t;

此规范通过严格的接口隔离,确保NCM设备在保持USB通用性的同时,实现高效的网络数据流管理。

0 篇笔记 写笔记

关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB网络控制通讯NCM
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!