USB - 通过configfs配置Linux USB Gadget

Linux USB gadget configured through configfs

Overview

USB Linux 小工具是一种具有 UDC(USB 设备控制器)的设备,可连接到 USB 主机,以扩展其附加功能,如串行端口或大容量存储功能。

A USB Linux Gadget is a device which has a UDC (USB Device Controller) and can be connected to a USB Host to extend it with additional functions like a serial port or a mass storage capability.

主机将gadget视为一组配置,每个配置都包含若干接口,从gadget的角度看,这些接口被称为功能,每个功能代表一个串行连接或 SCSI 磁盘等。

A gadget is seen by its host as a set of configurations, each of which contains a number of interfaces which, from the gadget's perspective, are known as functions, each function representing e.g. a serial connection or a SCSI disk.

Linux 为gadget提供了许多功能。

Linux provides a number of functions for gadgets to use.

创建gadget意味着要决定有哪些配置,以及每个配置将提供哪些功能。

Creating a gadget means deciding what configurations there will be and which functions each configuration will provide.

Configfs(请参阅 Configfs - 用户空间驱动的内核对象配置)可以很好地将上述决定告知内核。本文档将介绍如何做到这一点。 (Configfs - Userspace-driven Kernel Object Configuration — The Linux Kernel documentation)

Configfs (please see Configfs - Userspace-driven Kernel Object Configuration) lends itself nicely for the purpose of telling the kernel about the above mentioned decision. This document is about how to do it.

Configfs(请参阅 Configfs - 用户空间驱动的内核对象配置)可以很好地将上述决定告知内核。本文档将介绍如何做到这一点。

本文还将介绍如何将 configfs 集成到gadget中。

It also describes how configfs integration into gadget is designed.

Requirements

为使其正常工作,configfs 必须可用,因此 .config 中的 CONFIGFS_FS 必须为 "y "或 "m"。目前,USB_LIBCOMPOSITE 选择 CONFIGFS_FS。

In order for this to work configfs must be available, so CONFIGFS_FS must be 'y' or 'm' in .config. As of this writing USB_LIBCOMPOSITE selects CONFIGFS_FS.

Usage

在 RK3588 设备上通过 `configfs` 手动配置 USB Gadget 为 Mass Storage 模式,涉及对 Linux 内核的 USB Gadget 子系统进行操作。该功能依赖于内核中 `configfs` 提供的 API 接口,用于创建和管理 USB Gadget 配置项[^1]。 ### 准备工作 确保设备内核已启用以下配置选项: ```bash CONFIG_USB_GADGET=y CONFIG_USB_CONFIGFS=m CONFIG_USB_CONFIGFS_ACM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y CONFIG_USB_CONFIGFS_F_FS=y ``` 这些选项支持通过 `configfs` 创建 USB Gadget,并启用 Mass Storage 功能。 ### 挂载 configfs 文件系统 首先需要将 `configfs` 文件系统挂载到 `/sys/kernel/config` 路径下: ```bash mount -t configfs none /sys/kernel/config ``` 这一过程是使用 `configfs` 管理 USB Gadget 的基础步骤之一[^1]。 ### 创建并配置 USB Gadget 实例 进入 `configfs` 的 USB Gadget 目录并创建一个新的 Gadget 实例: ```bash cd /sys/kernel/config/usb_gadget/ mkdir my_gadget cd my_gadget ``` 设置基本属性,包括厂商 ID(idVendor)、产品 ID(idProduct)以及设备版本: ```bash echo 0x1d6b > idVendor echo 0x0104 > idProduct echo 0x0100 > bcdDevice echo 0x0200 > bcdUSB ``` 其中 `0x1d6b` 是 Linux Foundation 的 Vendor ID,`0x0104` 表示一个自定义设备的产品 ID。 ### 添加字符串描述符 创建字符串描述符以提供设备信息: ```bash mkdir strings/0x409 echo "fedcba9876543210" > strings/0x409/serialnumber echo "Rockchip Inc." > strings/0x409/manufacturer echo "RK3588 Mass Storage" > strings/0x409/product ``` 这些信息将在主机端显示为设备标识。 ### 创建配置描述符 添加配置描述符并设置其属性: ```bash mkdir configs/c.1 mkdir configs/c.1/strings/0x409 echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration echo 250 > configs/c.1/MaxPower ``` 此处的 `MaxPower` 设置表示设备最大功耗为 500mA(单位为 2mA)。 ### 启用 Mass Storage Function 创建 Mass Storage Function 并绑定至当前配置: ```bash mkdir functions/mass_storage.usb0 HOST_DIR="/path/to/storage" echo $HOST_DIR > functions/mass_storage.usb0/lun.0/file echo 1 > functions/mass_storage.usb0/lun.0/removable ``` 其中 `$HOST_DIR` 应替换为实际要导出的文件或镜像路径。该设置使能了一个可移动存储设备的功能。 ### 绑定 Function 至 Configuration 将 Mass Storage Function 添加至当前配置: ```bash ln -s functions/mass_storage.usb0 configs/c.1/ ``` 此步骤完成了 Mass Storage 功能与当前 USB 配置的关联。 ### 绑定 USB Gadget 至 UDC 控制器 最后,选择可用的 UDC 控制器并将当前 Gadget 实例绑定至其上: ```bash ls /sys/class/udc > UDC ``` 执行后,Gadget 将被激活并作为 Mass Storage 设备出现在主机端。 ### 注意事项 - 确保所使用的文件系统镜像或物理设备具有正确的读写权限。 - 若同时启用了 ADB 或其他 USB 功能,Mass Storage 可能无法正常工作,因为 USB Gadget 不支持多个功能并发运行。 - 在调试过程中,可通过 `dmesg` 查看内核日志以排查错误。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值