USB audio -- 錄音實現
阿新 • • 發佈:2018-11-16
原始檔路徑: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) \ staticstruct 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端到達電腦),至於為何這樣設計,待分析;