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 禁止端点;

扫描二维码关注公众号,回复: 4100661 查看本文章

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端到达电脑),至于为何这样设计,待分析;

猜你喜欢

转载自www.cnblogs.com/baiyou123/p/9970294.html