Android USB Audio accessory设备
这个手机做device, audio accessory是Host.
以高通msm8x26(USB2.0) Lolliop android 5.0/5.1为例1 代码•Kernelkernel/drivers/usb/gadget/f_accessory.c,f_audio_source.c•Frameworks/baseservices/usb/java/com/android/server/usb/UsbDeviceManager.java•hardware/libhardwarehardware/libhardware/modules/usbaudio/audio_hw.c2 android_setup的调用栈
handle_IRQgeneric_handle_irqhandle_fasteoi_irqhandle_irq_eventhandle_irq_event_percpumsm_udc_irqisr_tr_complete_handlerudc->driver->setup(&udc->gadget,&req);android_setup android.cvalue = f->ctrlrequest(f,cdev, c); (value < 0)value = acc_ctrlrequest(cdev, c);value = composite_setup(gadget, c);schedule_work(&dev->work);android_work()3 连接过程
大致分5步
3.1 CDP charger detection
charger检测过程中的状态转换过程USB_CHG_STATE_UNDEFINEDUSB_CHG_STATE_WAIT_FOR_DCDUSB_CHG_STATE_DCD_DONEUSB_CHG_STATE_PRIMARY_DONEUSB_CHG_STATE_SECONDARY_DONEtypical log:
usbin-valid triggered: 1host_mode: 0 (usbin插入中断处理函数)msm_otg f9a55000.usb:USB exited from low power modemsm_otg f9a55000.usb:chg_type =USB_CDP_CHARGERmsm_otg f9a55000.usb:Availcurr from USB =15003.2 Reset
msm_hsusbmsm_hsusb:CI13XXX_CONTROLLER_RESET_EVENT receivedmsm_hsusbmsm_hsusb:CI13XXX_CONTROLLER_CONNECT_EVENT receivedmsm_hsusbmsm_hsusb: reset (可能两次)
android_work: android_work: did not senduevent (0 0 (null))3.3 第一次尝试枚举
GetDescriptor (Device)ResetSetAddressGetDescriptor(Device/Configuration)此时Host得到的通常是Device的Configuration为MTP的回应Typical logandroid_usb gadget: [COM]composite_setup:value=0,bRequestType=0x80,bRequest=0x6,w_value=0x100,w_length=0x40android_work: android_work: sent ueventUSB_STATE=CONNECTEDmsm_hsusbmsm_hsusb: resetandroid_work: android_work: sent ueventUSB_STATE=DISCONNECTEDisr_tr_complete_handlerUSB_REQ_SET_ADDRESS android_usb gadget: [COM]composite_setup:value=0,bRequestType=0x80,bRequest=0x6,w_value=0x100,w_length=0x12android_usb gadget: [COM]composite_setup:value=0,bRequestType=0x80,bRequest=0x6,w_value=0x200,w_length=0x9android_usb gadget: [COM]composite_setup:value=0,bRequestType=0x80,bRequest=0x6,w_value=0x200,w_length=0x27android_work: android_work: sent ueventUSB_STATE=CONNECTED然后host开始一些accessory的ctrl request命令typical logacc_ctrlrequest c0.33 v0000 i0000 l2
acc_ctrlrequest 40.34 v0000 i0000 l1
acc_ctrlrequest 40.34 v0000 i0001 l1
acc_ctrlrequest 40.34 v0000 i0002 l1
acc_ctrlrequest 40.34 v0000 i0003 l1
acc_ctrlrequest 40.34 v0000 i0004 l1
acc_ctrlrequest 40.34 v0000 i0005 l1
acc_ctrlrequest 40.3a v0001 i0000 l0
acc_ctrlrequest 40.35 v0000 i0000 l0
代码实现在Kernel/drivers/usb/gadget/f_accessory.c
定义在
kernel/include/linux/usb/f_accessory.h
•intacc_ctrlrequest(…)if (b_requestType ==(USB_DIR_OUT | USB_TYPE_VENDOR)) {if(b_request ==ACCESSORY_START) {dev->start_requested = 1;schedule_delayed_work(&dev->start_work,…)}else if (b_request ==ACCESSORY_SET_AUDIO_MODE &&w_index == 0&&w_length == 0) {dev->audio_mode =w_value;value= 0;...static void acc_start_work(structwork_struct *data)
{char*envp[2] = {"ACCESSORY=START", NULL };kobject_uevent_env(&acc_device.this_device->kobj, KOBJ_CHANGE,envp);
}设置USB Mode to audio_source
frameworks/base/…/usb/UsbDeviceManager.java
private final UEventObservermUEventObserver = newUEventObserver() {} else if ("START".equals(accessory)) {if (DEBUG) Slog.d(TAG,"got accessory start");startAccessoryMode();private void startAccessoryMode() {if (enableAccessory &&enableAudio) {functions = UsbManager.USB_FUNCTION_ACCESSORY +","+ UsbManager.USB_FUNCTION_AUDIO_SOURCE;} else if (enableAccessory) {functions = UsbManager.USB_FUNCTION_ACCESSORY;} else if (enableAudio) {functions = UsbManager.USB_FUNCTION_AUDIO_SOURCE;}if (functions != null) {mAccessoryModeRequestTime =SystemClock.elapsedRealtime();setCurrentFunctions(functions,false);}setCurrentFunctionssend MSG_SET_CURRENT_FUNCTIONSsetEnabledFunctions(functions,makeDefault)setUsbConfig("none")setUsbConfig(functions)init.usb.rc# audio accessory configurationon property:sys.usb.config=audio_sourcewrite /sys/class/android_usb/android0/enable0write /sys/class/android_usb/android0/idVendor18d1write /sys/class/android_usb/android0/idProduct2d02write /sys/class/android_usb/android0/functions${sys.usb.config}write /sys/class/android_usb/android0/enable1setpropsys.usb.state ${sys.usb.config}typical log:android_usb gadget:usb_remove_config #1 'fe8050c8.android_usb'/ec008900android_usb gadget:unbind function 'mtp'/c3d2ab00android_usb gadget:unbindconfig'fe8050c8.android_usb'/ec008900enable_store disablemtpandroid_usb gadget:usb_add_config addingconfig #1'fe8050c8.android_usb'/ec008900android_usb gadget:usb_add_function adding 'audio_source'/c0e70460 toconfig'fe8050c8.android_usb'/ec008900android_usb gadget:cfg 1/ec008900speeds: high fullandroid_usb gadget: interface 0 =audio_source/c0e70460msm_hsusbmsm_hsusb: suspendmsm_hsusbmsm_hsusb:CI13XXX_CONTROLLER_SUSPEND_EVENT received
android_work: android_work: did not senduevent (1 1 (null))3.4 Reset
msm_hsusbmsm_hsusb: reset (可能重复两次)msm_hsusbmsm_hsusb:CI13XXX_CONTROLLER_RESUME_EVENT receivedandroid_work: android_work: sent ueventUSB_STATE=DISCONNECTED3.5 第二次枚举
GetDescriptor(Device)
Reset
SetAddress
GetDescriptor(Device/Configuration)
SetConfiguration
SetInterface
SetCurtypical log:
android_work: android_work: sent ueventUSB_STATE=CONNECTEDmsm_hsusbmsm_hsusb: resetandroid_work: android_work: sentueventUSB_STATE=DISCONNECTED
android_work: android_work: sent ueventUSB_STATE=CONNECTED android_usb gadget:set_config high-speedconfig #1:fe8050c8.android_usbandroid_work: android_work: sent ueventUSB_STATE=CONFIGURED4. Audio初始化及播放
UsbDeviceManager在得知状态为CONFIGURED后,
UsbDeviceManager: updateAudioSourceFunction enabled=trueUsbDeviceManager: MSG_UPDATE_STATE updateAudioSourceFunctionif state=CONFIGUREDenable=truesend Intent AudioManager.ACTION_USB_AUDIO_ACCESSORY_PLUG
frameworks/base/media/java/android/media/AudioService.javaoutDevice = AudioSystem.DEVICE_OUT_USB_ACCESSORY;setWiredDeviceConnectionState(outDevice, state, params);sendMsg MSG_SET_WIRED_DEVICE_CONNECTION_STATEonSetWiredDeviceConnectionStatehandleDeviceConnection()AudioSystem.setDeviceConnectionState() (AudioSystem.java->AudioSystem.cpp)AudioPolicyIntefaceImpl: setDeviceConnectionState()AudioPolicyManager::setDeviceConnectionState()AudioPolicyManager::setDeviceConnectionStateInt()AudioPolicyManager::setDeviceConnectionStateInt()AudioPolicyManager::checkOutputsForDevice()mpClientInterface->openOutput() frameworks/av/services/audiopolicy/AudioPolicyClientImpl.cppaf->openOutput()frameworks/av/services/audioflinger/AudioFlinger.cppAudioFlinger::openOutputAudioFlinger::openOutput_l()hwDevHal->open_output_stream()adev_open_output_stream() hardware/libhardware/modules/usbaudio/audio_hw.cadev->hw_device.open_output_stream = adev_open_output_stream;此时usb_audio_hw.c里adev_open_output_stream()函数被调用
随后是alsa_device_proxy: proxy_prepare()
usb_audio_hw.c out_set_parameters如果开始播放音乐usb_audio_hw.c里的out_write() 被调用AudioFlinger: MixerThread::threadLoop_write Threads.cppAudioFlinger::PlaybackThread::threadLoop_write()ssize_tframesWritten = mNormalSink->write()bytesWritten = mOutput->stream->write()out_write() in usbaudio/audio_hw.chardware/libhardware/modules/usbaudio/audio_hw.c out->stream.write = out_write;out_write usb_audio_hwstart_output_streamproxy_open alsa_device_proxypcm_open qcom/audio/legacy/libalsa-intf/alsa_pcm.copenkernel/drivers/usb/gadget/f_audio_source.c
audio_pcm_open随后是audio_pcm_open(),audio_pcm_hw_params(), audio_pcm_prepare()audio_pcm_playback_trigger cmd=1
audio_pcm_playback_start
audio_send
audio_data_complete req->status 0 req->actual 176system/core/include/system/audio.haudio_devices_t;AUDIO_DEVICE_OUT_USB_ACCESSORY = 0x2000,frameworks/base/media/java/android/media/AudioSystem.javapublic static final intDEVICE_OUT_USB_ACCESSORY = 0x2000;5. Debug方法
•检查 /dev/usb_accessory 是否存在
•检查USB状态是否为CONFIGURED
•检查property sys.usb.config=audio_source
•检查USB data(Ellisys)
•加上一些log 在文件f_accessory.cf_audio_source.caudio_hw.c中6. Ellisys抓到的数据
Android USB Audio accessory设备相关推荐
- USB Audio accessory设备
这个手机做device, audio accessory是Host. 以高通msm8x26(USB2.0) Lolliop android 5.0/5.1为例 1 代码 • Kernel kernel ...
- Android新增usb Audio(mic)设备
From 可以先去掉Audio喇叭模块: # cat /proc/asound/cards kernel-3.10/arch/arm64/configs/defconfig -CONFIG_SND_U ...
- usb4java android,USB audio on Android platform
这种是android 手机为Host, audio设备为device. 以MSM8x26 android 5.0/5.1 (Lolliop) 为例 1. source code • Kernel k ...
- Android USB audio on Android platform
这种是android手机为Host, audio设备为device. 以MSM8x26 android 5.0/5.1 (Lolliop) 为例1. source code •Kernelkernel ...
- Android USB AUDIO初步分析
1.USB-AUDIO的声卡注册过程 usb_probe_interface ---- driver.cusb_audio_probe ---- card.csnd_usb_create_stream ...
- Android usb audio信息获取(一)
android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...
- Android usb audio调用流程(二)
android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...
- Android usb audio录音(四)
android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...
- Android USB Accessory分析
转自:https://blog.csdn.net/yingzhao80/article/details/45511351 Android下USB Accessory的实现分析 摘要:本文介绍了USB ...
最新文章
- CentOS 5.2 下安装tripwire2.3.1.2出错解决
- 一看就懂的极简MVVM
- Py之gensim:gensim的简介、安装、使用方法之详细攻略
- 废旧纸箱做机器人图片_制作纸箱板画(适合1112岁孩子们)
- tensorflow中用saver保存模型
- 解读制造业数字化转型的现状及发展趋势
- 浅谈电子数字取证技术
- 修改Tomcat窗口名称
- github上传文件 linux,第一次上传代码到github (Linux)
- NRF52832学习笔记
- 精选了20个Python实战项目(附源码)
- 基于android的旅游攻略应用(含源码)
- opengl 画椭圆_椭圆围城与圆型观光步道
- Android源码目录结构详解(转载)
- linux 安装`软件报错
- 12、PIC系列-I2C通讯模块
- $U_{GSQ}$对共源放大电路电压放大倍数的影响
- 一个10年程序员给大家的忠告
- ubuntu安装迅雷
- 西门子触摸屏HMI变量的指针化索引应用示例详解
热门文章
- modsecurity(尚不完善)
- Typescript tsconfig
- XML 在SQLServer中的使用
- CentOS配置snmp
- Linux 系统使用WordPress开启“固定链接设置”之后部分页面打不开(404)的解决办法...
- 软件以人为本1 - 序 - 写于上海2011 ScrumGathering会后
- GMAIL DRIVE 提供邮箱一样大小的硬盘
- 通过JAVA获取优酷视频
- Grafana 仪表盘和图形编辑器
- 深入浅出---unix多进程编程之wait()和waitpid()函数