USB audio -- 录音实现
源文件路径:drivers/usb/gadget/function/f_audio_source.c
DECLARE_USB_FUNCTION_INIT(audio_source, audio_source_alloc_inst,audio_source_alloc);
该宏实例化struct usb_function_driver对象,实现、修饰module_init/module_exit函数:
#define DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc) \ static struct usb_function_driver _name ## usb_func = { \ .name = __stringify(_name), \ .mod = THIS_MODULE, \ .alloc_inst = _inst_alloc, \ .alloc_func = _func_alloc, \ }; \ MODULE_ALIAS("usbfunc:"__stringify(_name)); #define DECLARE_USB_FUNCTION_INIT(_name, _inst_alloc, _func_alloc) \ DECLARE_USB_FUNCTION(_name, _inst_alloc, _func_alloc) \ static int __init _name ## mod_init(void) \ { \ return usb_function_register(&_name ## usb_func); \ } \ static void __exit _name ## mod_exit(void) \ { \ usb_function_unregister(&_name ## usb_func); \ } \ module_init(_name ## mod_init); \ module_exit(_name ## mod_exit)
函数audio_source_alloc_inst 实例化并返回 struct usb_function_instance 对象指针;
函数audio_source_alloc 实例化并返回 struct usb_function 对象指针,struct usb_function用于描述一个配置的功能;
在f_audio_source.c中初始化了struct usb_function 的如下成员:
.name = "audio_source", .bind = audio_bind, .unbind = audio_unbind, .set_alt = audio_set_alt, .setup = audio_setup, .disable = audio_disable, .free_func = audio_free_func,
1.audio_bind主要做了如下事情:
创建playback声卡设备
并配置、生成usb描述符端点等信息
2.audio_unbind 是audio_unbind的反操作;
3.audio_set_alt,选择合适端点并使能;
4.audio_setup usb请求处理函数;
5.audio_disable 禁止端点;
6.audio_free_func 空函数;
usb 配置audio_source功能:
test -d /sys/kernel/config || mkdir /sys/kernel/config mount -t configfs none /sys/kernel/config mkdir /sys/kernel/config/usb_gadget/g1 cd /sys/kernel/config/usb_gadget/g1 echo 0x2207 > idVendor echo 0x0007 > idProduct mkdir strings/0x409 echo 0123456789ABCDEF > strings/0x409/serialnumber echo "rockchip" > strings/0x409/manufacturer echo "rk3xxx" > strings/0x409/product mkdir configs/b.1 mkdir configs/b.1/strings/0x409 echo "usb_audio" > configs/b.1/strings/0x409/configuration mkdir /sys/kernel/config/usb_gadget/g1/functions/audio_source.usb0 ln -s /sys/kernel/config/usb_gadget/g1/functions/audio_source.usb0 /sys/kernel/config/usb_gadget/g1/configs/b.1/audio_source.usb0 echo ff400000.usb > /sys/kernel/config/usb_gadget/g1/UDC
并且需要执行如下命令:
arecord -f cd -t wav -D hw:0,0 | aplay -f cd -D hw:3,0 &
接入usb 到windows ,出现声卡设备,启动录音软件可实现录音;
audio_source注册的是playback声卡,上面的命令相当于设备录音声音,用audio_source声卡播放(输出到usb端到达电脑),至于为何这样设计,待分析;