1. 程式人生 > >USB audio -- 錄音實現

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端到達電腦),至於為何這樣設計,待分析;