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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM