USB CDC / USBnet (ECM, NCM, ACM)

本文详细介绍了USB通讯协议中几种关键的子协议,包括CDC-ACM、CDC-ECM、CDC-NCM、OBEX及WMC-DeviceManagement等。这些协议支持从虚拟串口到高速以太网数据传输的各种应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

USB CDC-ACM (Abstract Control Model), CDC-ECM (Ethernet Networking Control Model), CDC-NCM (Network Control Model), OBEX (Object Exchange) and WCM-Device Management USB class and function drivers

CDC-ACM (Abstract Control Model) allows any communication device to provide a serial communication interface (e.g modem devices that send and receive AT commands).

/lib/modules/$(uname -r)/kernel/drivers/usb/class目录下看到cdc-acm.ko文件。


CDC-ECM (Ethernet Networking Control Model) offers device manufacturers to interface as a standard NIC (Network Interface Card) device. This interface is usually adopted by high speed LAN networking devices allowing high speed Ethernet data transfer over USB.

CDC-NCM (Network Control Model).

OBEX (Object Exchange) is compliant with the Wireless Mobile Communication OBEX function model, supporting OBEX applications over USB.

WMC-Device Management is compliant with the Device Management function model, supporting a minimal AT command based control model.

RNDIS - provides CDC like communication capabilities on Windows PCs supporting the Microsoft RNDIS protocol. Please refer to theRNDIS webpage for more info.

  • ACM - Abstract Communication Model
  • ECM - Ethernet Control Module
  • NCM - Network Control Model
  • OBEX - Object Exchange Function Model
  • WMC - Device management Function Model 

The CDC ACM driver exposes the USB device as a virtual modem or a virtual COM port to the operating system.

The driver enables sending both data and AT commands, either through ACM (separating data and AT commands over different channels) or through Serial Emulation (passing the AT commands as is and as part of the data stream).


The ECM ( Ethernet Networking Control Model) protocol is used for exchanging Ethernet-framed data between the device and host. A CDC ECM compliant device exposes itself as a virtual NIC to the host operating system. The NIC is assigned with a MAC and an IP address.

A general use case of a CDC ECM device is a point-to-point Ethernet adapter to a LAN/WLAN.


The  NCM  ( Network Control Model ) protocol is used for exchanging High Speed Ethernet-framed data between the device and host. A CDC NCM compliant device exposes itself as a virtual NIC to the host operating system. The NIC is assigned with a MAC and an IP address.

A general use case of a CDC NCM device is a Wireless Network Adapter which supports 3.5G/4G networks such as: HSPA+ and LTE.

<think>嗯,用户这次的问题看起来非常具体和专业,直接指向cdc_ncm.ko模块构建失败的错误。用户已经提供了相当详细的错误信息:“buildfailedout_vndtargetproductlakesystem_dlkmlibmoduleserror”,这些关键信息对定位问题至关重要。用户应该是在Android系统开发过程中遇到了内核模块构建问题,特别是针对lake产品版本的构建。这种情况通常发生在自定义ROM开发或内核移植场景中,用户可能是手机厂商的工程师或ROM开发者,正面临产品发布前的构建瓶颈。从ta精准提供编译路径(out_vnd、system_dlkm)来看,用户显然具备一定的AOSP开发基础。让我拆解这个技术问题:首先核心错误是cdc_ncm.ko编译失败,这是个USB网络驱动模块。可能导致的原因包括内核配置问题、工具链版本不匹配、源代码错误等。结合用户给出的具体路径信息,需要特别关注Android特有的system_dlkm分区配置。考虑到用户正在处理特定平台(lake)的问题,我应该重点排查两方面:一是该芯片平台对CDC_NCM驱动的特殊要求,二是Androidsystem_dlkm的编译机制。用户之前没有提供具体错误日志,所以需要引导ta获取关键信息,比如make命令的输出和Kconfig配置状态。值得注意的是,编译失败有时会由间接原因导致。比如某些依赖模块编译失败,或者vndk版本冲突。用户提到的“out_vnd”路径提示了vendor模块编译可能有问题,需要确认整个依赖链是否完整编译成功。在解决方案层面,应该按排查难度分层建议:从最基础的Kconfig启用检查,到工具链验证,最后到源码分析。特别要强调Android特有机制,比如PRODUCT_DLKM_ENABLED和SKIP_ABI_CHECKS等宏定义。用户可能会需要查看特定平台的设备树配置,比如lake对应的arch/arm64/configs/目录。不过ta没有提供具体芯片组信息,所以建议暂时保持方案通用性,后续可根据ta反馈补充平台相关内容。如果用户实际使用的是QDSS驱动方案,还需要考虑DIAG功能的依赖关系。最后要注意技术细节描述的准确性。比如解释ABI检查时需要明确说明这是Android11之后引入的机制,但又要避免过度技术性描述让用户困惑。给出具体make命令示例时,必须包含lake产品标识和showcommands参数。</think> 针对 `cdc_ncm.ko` 模块在编译 `lake` 平台 Android 系统时出现 **system_dlkm** 分区构建失败的问题,以下是系统级的解决方案和排查步骤: --- ### **核心错误原因分析** 错误日志中 `out_vnd` 路径和 `system_dlkm` 目标表明: 1. **模块依赖问题** `cdc_ncm.ko` 依赖 USB 核心驱动或其他内核符号未正确导出,导致链接阶段符号解析失败(常见于跨模块调用)[^1]。 2. **内核配置错误** CDC-NCM 驱动所需配置(如 `CONFIG_USB_NET_CDC_NCM=y`)未启用或与新版本内核存在兼容性问题[^2]。 3. **DLKM 编译机制冲突** 当内核模块同时声明为 `GKI模块`(与主内核捆绑)和 `DLKM`(动态加载模块)时,会导致编译目标冲突(常见于 Android 11+)[^3]。 --- ### **分步解决方案** #### **1. 验证内核配置** 在 `kernel/arch/arm64/configs/<lake>_defconfig` 中添加: ```makefile # 确保启用 CDC-NCM 依赖项 CONFIG_USB_NET=y CONFIG_USB_NET_CDCETHER=y CONFIG_USB_NET_CDC_NCM=y # 关闭冲突选项 # CONFIG_USB_NET_CDC_MBIM is not set ``` **编译验证**: ```bash make O=out <lake>_defconfig && make O=out menuconfig # 手动确认配置 ``` #### **2. 修复符号导出问题** 在驱动源文件(如 `drivers/net/usb/cdc_ncm.c`)中添加缺失符号的导出: ```c // 确保所有被调用的函数均有 EXPORT_SYMBOL() static void cdc_ncm_do_work(struct work_struct *w); EXPORT_SYMBOL(cdc_ncm_do_work); // 添加导出符号 ``` #### **3. 解决 DLKM 编译冲突** 在设备树文件(`device/<vendor>/lake/<device>.mk`)中声明模块编译方式: ```makefile # 将 cdc_ncm 排除出 system_dlkm 目标 BOARD_VENDOR_KERNEL_MODULES := $(filter-out %/cdc_ncm.ko, $(BOARD_VENDOR_KERNEL_MODULES)) # 直接编译进内核(若无需动态加载) TARGET_KERNEL_CONFIG_OVERRIDES += CONFIG_USB_NET_CDC_NCM=y ``` #### **4. 检查 ABI 兼容性(Android 12+)** ```bash # 在编译命令中跳过 ABI 检查(临时绕过) EMMA_INSTRUMENT=false SKIP_ABI_CHECKS=true make system_dlkm -j32 ``` --- ### **验证流程** ```bash # 清除缓存重新编译 make clean && make system_dlkm -j32 # 确认模块生成 ls -l out/target/product/lake/system_dlkm/lib/modules/cdc_ncm.ko # 检查符号依赖 nm out/target/product/lake/system_dlkm/lib/modules/cdc_ncm.ko | grep "U __ndo" # 确保无未解析符号 ``` --- ### **典型错误日志及对应修复** ```log ERROR: modpost: "usbnet_get_endpoints" [cdc_ncm.ko] undefined! ➔ 修复:在 `drivers/net/usb/usbnet.c` 添加 `EXPORT_SYMBOL(usbnet_get_endpoints);` ERROR: ABI symbol __ndo_tx_timeout_add not found ➔ 修复:内核升级后,添加 `CONFIG_NET_DEVREFCNT_TRACKER=y` 或回退补丁 ``` --- ### **预防性措施** ```makefile # 在设备树文件中固定工具链版本 KERNEL_TOOLCHAIN := prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN) ``` [^1]: Android DLKM 编译机制要求被调用的跨模块符号必须显式导出。 [^2]: CDC-NCM 驱动需要 USB Host 和 Network Stack 基础支持。 [^3]: GKI 架构下禁止将核心模块同时编译为 DLKM 和内置模块。 --- ### 相关问题 1. 如何为自定义内核模块添加 DLKM 支持? 2. 修复 Android 内核编译时 `__ndo` 符号缺失错误的方法? 3. 如何验证 system_dlkm 分区的模块兼容性? 4. 快速排查 Android 内核编译错误的关键日志位置?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值