(TODO)
### 嵌入式系统中的 UAC (USB 音频类)
**UAC(USB 音频类)**是一种标准,用于在 USB 主机(如 PC)和 USB 设备(如麦克风、扬声器)之间传输音频数据。在嵌入式系统中,UAC 通常用于让设备充当 USB 声卡、麦克风或扬声器。UAC 协议定义了音频流如何通过 USB 传输和控制,包括音频播放、录音以及同步。
UAC 主要有两个版本:
1. **UAC1**:支持基本的立体声音频和基础采样率。
2. **UAC2**:支持更高质量的音频、多声道音频和高级同步功能。#### UAC 工作原理:
- **控制端点**:用于发送和接收控制数据(如音量控制、采样率配置等)。
- **音频流端点**:用于传输实际的音频数据。
- **同步**:UAC2 提供了高级的时钟同步机制,用于保证音频数据的传输稳定性。### 在树莓派5上搭建 UAC
要在树莓派 5 上实现 UAC,可以通过配置内核的 **USB Gadget** 功能,使树莓派充当一个 USB 音频设备。以下是具体步骤:
1. **启用 USB Gadget 功能**:
确保内核支持 UAC,并启用相关 USB 音频类的内核模块:
- 在树莓派的内核配置中,启用 `CONFIG_USB_F_UAC1`(UAC1 支持)和 `CONFIG_USB_F_UAC2`(UAC2 支持)。2. **配置 Gadget FS**:
创建一个 Gadget 配置脚本,通过 libcomposite 在树莓派上设置 USB 音频类设备。例如,可以编写一个简单的脚本 `rpi-uac-gadget.sh` 来配置音频设备。3. **创建音频端点**:
设置音频输入和输出流,确保正确配置控制端点和音频流端点,满足主机的音频传输要求。4. **加载 UAC Gadget 模块**:
使用 `modprobe g_audio` 加载内核模块,它会创建一个 USB 音频设备。5. **连接到主机**:
使用 USB OTG 模式将树莓派连接到主机,主机会识别到树莓派作为一个 USB 音频设备。通过这些步骤,树莓派 5 就可以作为一个标准的 UAC 设备与其他主机进行音频传输和处理。
#!/bin/bash
# 检查是否以 root 权限运行
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root"
exit 1
fi
GADGET_DIR="/sys/kernel/config/usb_gadget"
GADGET_NAME="rpi_uac_gadget"
UDC_DEVICE=$(ls /sys/class/udc) # 获取 USB 设备控制器(如 dwc2)
# 创建 UAC gadget 目录
mkdir -p ${GADGET_DIR}/${GADGET_NAME}
cd ${GADGET_DIR}/${GADGET_NAME}
# 设置基本 USB 设备信息
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0101 > idProduct # Audio Gadget
echo 0x0100 > bcdDevice # 版本 1.0.0
echo 0x0200 > bcdUSB # USB 2.0
# 创建 English(0x409) 字符串
mkdir -p strings/0x409
echo "1234567890" > strings/0x409/serialnumber # 设备序列号
echo "Raspberry Pi" > strings/0x409/manufacturer # 制造商
echo "USB Audio Device" > strings/0x409/product # 产品名
# 创建配置
mkdir -p configs/c.1/strings/0x409
echo "UAC Configuration" > configs/c.1/strings/0x409/configuration
echo 120 > configs/c.1/MaxPower # 最大功率 120mA
# 创建音频功能(UAC1 或 UAC2)
mkdir -p functions/uac1.0 # 可以替换为 uac2.0 以使用 UAC2
ln -s functions/uac1.0 configs/c.1/
# 将 USB 设备控制器绑定到 Gadget
echo $UDC_DEVICE > UDC
echo "UAC gadget has been configured and activated"
脚本步骤解析:
-
检查 root 权限:由于要配置 USB 设备,脚本必须以 root 权限运行。
-
配置 gadget 目录:
- 在
/sys/kernel/config/usb_gadget
路径下创建一个名为rpi_uac_gadget
的 gadget。
- 在
-
设置 USB 设备基本信息:
- 使用
idVendor
、idProduct
来指定 USB 设备的供应商 ID 和产品 ID。 bcdUSB
设置为 0x0200 表示 USB 2.0 设备。
- 使用
-
配置字符串:
strings/0x409
是为英语语言配置的字符串目录,设置序列号、制造商和产品名称。
-
配置 USB 功能:
- 使用
uac1.0
配置音频功能,或使用uac2.0
配置更高级的 USB 音频类(UAC2)功能。
- 使用
-
启用设备:
UDC
表示 USB 设备控制器,绑定到 gadget,使设备准备好与主机进行通信。