这个手机做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设备相关推荐

  1. USB Audio accessory设备

    这个手机做device, audio accessory是Host. 以高通msm8x26(USB2.0) Lolliop android 5.0/5.1为例 1 代码 • Kernel kernel ...

  2. Android新增usb Audio(mic)设备

    From 可以先去掉Audio喇叭模块: # cat /proc/asound/cards kernel-3.10/arch/arm64/configs/defconfig -CONFIG_SND_U ...

  3. usb4java android,USB audio on Android platform

    这种是android 手机为Host, audio设备为device. 以MSM8x26  android 5.0/5.1 (Lolliop) 为例 1. source code • Kernel k ...

  4. Android USB audio on Android platform

    这种是android手机为Host, audio设备为device. 以MSM8x26 android 5.0/5.1 (Lolliop) 为例1. source code •Kernelkernel ...

  5. Android USB AUDIO初步分析

    1.USB-AUDIO的声卡注册过程 usb_probe_interface ---- driver.cusb_audio_probe ---- card.csnd_usb_create_stream ...

  6. Android usb audio信息获取(一)

    android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...

  7. Android usb audio调用流程(二)

    android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...

  8. Android usb audio录音(四)

    android audio 生产者与消费者 简介 全面接触生产者/消费者问题是在操作系统原理中,并发性原理讨论的问题 生产者/消费者问题.最近的工作偏向音频,接着上一篇文章,用生产者,消费者模型来理解 ...

  9. Android USB Accessory分析

    转自:https://blog.csdn.net/yingzhao80/article/details/45511351 Android下USB Accessory的实现分析 摘要:本文介绍了USB ...

最新文章

  1. CentOS 5.2 下安装tripwire2.3.1.2出错解决
  2. 一看就懂的极简MVVM
  3. Py之gensim:gensim的简介、安装、使用方法之详细攻略
  4. 废旧纸箱做机器人图片_制作纸箱板画(适合1112岁孩子们)
  5. tensorflow中用saver保存模型
  6. 解读制造业数字化转型的现状及发展趋势
  7. 浅谈电子数字取证技术
  8. 修改Tomcat窗口名称
  9. github上传文件 linux,第一次上传代码到github (Linux)
  10. NRF52832学习笔记
  11. 精选了20个Python实战项目(附源码)
  12. 基于android的旅游攻略应用(含源码)
  13. opengl 画椭圆_椭圆围城与圆型观光步道
  14. Android源码目录结构详解(转载)
  15. linux 安装`软件报错
  16. 12、PIC系列-I2C通讯模块
  17. $U_{GSQ}$对共源放大电路电压放大倍数的影响
  18. 一个10年程序员给大家的忠告
  19. ubuntu安装迅雷
  20. 西门子触摸屏HMI变量的指针化索引应用示例详解

热门文章

  1. modsecurity(尚不完善)
  2. Typescript tsconfig
  3. XML 在SQLServer中的使用
  4. CentOS配置snmp
  5. Linux 系统使用WordPress开启“固定链接设置”之后部分页面打不开(404)的解决办法...
  6. 软件以人为本1 - 序 - 写于上海2011 ScrumGathering会后
  7. GMAIL DRIVE 提供邮箱一样大小的硬盘
  8. 通过JAVA获取优酷视频
  9. Grafana 仪表盘和图形编辑器
  10. 深入浅出---unix多进程编程之wait()和waitpid()函数