你好!这里是风筝的博客,

欢迎和我一起交流。


之前讲解了耳机驱动:
ALSA子系统(十六)------虚拟耳机驱动
Android音频子系统(四)------耳机拔插流程

那么必然少不了现在市场上较多的Type-C耳机。

常见的TYPE-C耳机有两种:

  • 一种是通过TYPE-C转3.5mm的转接线接3.5mm耳机,这种本质就是模拟耳机,信号还是通过HPOUT。
  • 一种是真正的TYPE-C耳机,一体式的,本质是数字耳机,耳机内部有DAC将数字信号转换为模拟信号(有的TYPE-C耳机也是一体式的,无需转接头,但是它是伪造的TYPE-C耳机,里面并没有DAC解码芯片,相当于里面封装了一个TYPE-C转3.5mm+模拟耳机)。

一、通过3.5mm的转接线的TYPE-C模拟耳机

单纯要HPOUT转USB(TYPE-C)还是比较简单的,加一个转换芯片就行,我们看下硬件实现:


其中USB0-DP-USBC和USB0-DM-USBC接到TYPE-C座子。
这样只要按照真值表,拉高EN和拉低SEL,通路为:
APB <-> DAC/ADC <-> HPOUTL/R <-> USB0-DP/M-USBC <-> TYPE-C接口
这样插入typec耳机,播音走HPOUT的话,耳机就能听到声音了,所以,理论上,无需任何TYPE-C芯片驱动,配置IO拉高EN,拉低SEL,即可使用TYPE-C模拟耳机进行播音,啥驱动都不用写,非常简单~

但是!!!!

我们如何探知typec耳机的插入和拔出呢?
所以实际上,我们会使用一个TYPE-C控制芯片,用来检测TYPE-C耳机何时插入,用来识别是什么设备插入。
这里我们用的是wusb3801 typec 控制芯片。

电路还是比较简单的,驱动代码在GitHub上可以搜得到,搜索wusb3801即可,这里我就不贴代码了。
插入耳机会触发INT中断,代码里面会判断插入的是啥耳机,进而控制USB/AUDIO SWITCH芯片的EN和SEL脚进行功能选择。

二、一体式TYPE-C数字耳机

对于真正的TYPE-C耳机,实际上是数字耳机,走的是USB声卡,选择的是USB通路。(需要确认内核中 CONFIG_SND_USB_AUDIO 是打开的)
插入TYPE-C耳机之后,通过wusb3801芯片的USB-ID脚,USB会切换成Host模式,此时插入TYPE-C的话会被注册成一个USB声卡。
这里我插入华为TYPE-C耳机之后,就会发现多了一个声卡:

console:/ # cat /proc/asound/cards
0 [HEADSET ]: USB-Audio - HUAWEI USB-C HEADSET
bestechnic HUAWEI USB-C HEADSET at usb-sunxi-ohci-1, full speed

然后往这个华为耳机声卡写数据,就可以在耳机听到声音~

最后实验的是时候还发现个问题!
理论上Type-C接口没有正反面之分的,两面都一样,但是实际上使用Type-C耳机发现,正插(A面)Type-C耳机,没问题,翻个面过来反插(B面)Type-C耳机,就会出现左右声道数据串扰的问题!

这个主要是因为加了MIC/GND SWTICH芯片造成的。

SBU1、SBU2分别接到了Type-C座子的SBU1、SBU2。

默认情况下SEL是低电平,此时HPOUTFB接到了SBU1,HS_MIC接到了SBU2。
正(A面)插时,SBU1对应Type-C的SBU1,SBU2对应Type-C的SBU2,这是没问题的。
反(B面)插时,就会导致SBU1对应Type-C的SBU2,SBU2对应Type-C的SBU1,所以出现了耳机左右声道串扰问题。

所以,理论上,反(B面)插时,我们要拉高MIC/GND SWTICH芯片的SEL脚,这样才对。

那么我们如何判断是正插还是反插呢?
靠mic!

这篇博客写的挺好的:Android 4.x下基于wm8994的mic检测

先看看带mic的耳机和不带mic的耳机的差别,如下图,不带mic的耳机为3段,带mic的耳机为4段,比对一下实物可以看出两者左右声道段没有差别,差别之处是不带mic的耳机将GND和MIC两段合并在一起。因而对于不带mic的耳机来说,GND和MIC两段是几乎短路的(有一定电阻),而mic检测就是基于这个原理。

为了实现录音,需要在MIC段施加一定的偏置电压,即micbias,对于没有mic的耳机来说,由于MIC和GND合成为一段,就相当于将micbias接地,因此会产生比较大的电流。一些codec支持电流检测功能,当电流超过某个阈值时,会将相应的寄存器设置为1,从而可以查询得到结果。

我们需要识别哪个是MIC,依靠MIC ADC值去判断是正面还是反面,驱动里会尝试控制SEL那个pin去切换。

static void wait_and_detect_mic_gnd_state(struct sound_card_priv *priv)
{int reg_val;int threshold = 0x8;gpio_set_value(priv->mic_gnd_sw_gpio, 0);//尝试先拉低SELreg_val = snd_soc_read(priv->codec, SUNXI_HMIC_STS);//读取ADC的值reg_val = (reg_val >> HMIC_DATA) & 0x1f;if (reg_val >= threshold) {//大于阈值,是micreturn;//是mic,则直接返回,保留SEL为低电平} else {gpio_set_value(priv->mic_gnd_sw_gpio, 1);//否则拉高SEL}return;
}

ALSA子系统(十七)------支持Type-C耳机驱动相关推荐

  1. Android 耳机驱动知识

    https://yunzhi.github.io/headset_knowledge 工作以后接手的第一个驱动就是android平台下耳机的插拔检测和按键检测.这部分涉及的硬件知识比较简单,但是软件上 ...

  2. Linux kernel中断子系统之(五):驱动申请中断API【转】

    转自:http://www.wowotech.net/linux_kenrel/request_threaded_irq.html 一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的 ...

  3. PyCharm社区版支持深度学习_在Windows的Ubuntu子系统运行支持CUDA的深度学习代码

    2020年6月,微软公布了Windows Subsystem for Linux 2的最新更新,全面支持CUDA和N卡GPU.在Windows上跑Ubuntu子系统并在其中运行GPU加速的深度学习代码 ...

  4. surface pro 7 使用type c耳机问题

    surface pro 7多了个type c接口,看很多人问是否支持type c接口耳机.自己有个锤子的type c接口的耳机,试了下不行,应该是没有内置DAC的原因,也就是说surface的type ...

  5. 耳机驱动调试(插拔检测与按键检测)

    耳机驱动调试(插拔检测与按键检测) 小白一枚,欢各位大佬指出错误 耳机类型判断 三段和四段.欧标和美标 现在许多设备的耳机接口都采用3.5mm的耳机接口,其中终端就是,终端可以兼容三段和四段耳机:三段 ...

  6. Type -C 耳机

    数字耳机和模拟耳机 模拟耳机即我们的常见的3.5mm接口的耳机,包括左右声道,地或者mic,如左图. 数字耳机(UAC耳机)(右图)包含一个usb声卡+DAC&&ADC+amp+模拟耳 ...

  7. 互联网晚报 | 8月14日 | ​爱马仕回应16.5万自行车已抢光;​曝苹果新一代不再支持3.5mm耳机插孔;​元宇宙招聘潮开启...

    爱马仕回应16.5万自行车已抢光:后续会从法国来货 爱马仕近日上架了一款售价16.5万元的自行车,引起了网友热议.8月13日,记者就爱马仕售价16.5万的新款单车致电爱马仕客服,客服表示,中国大陆暂时 ...

  8. 【鸿蒙OS开发入门】18 - HDF驱动子系统:加速度计传感器 Driver层驱动代码分析

    [鸿蒙OS开发入门]18 - HDF驱动子系统:加速度计传感器 Driver层代码分析 一.如何添加速度计传感器驱动代码(代码.编译.配置) 1.驱动代码实现 2.驱动编译配置 2.1 linux 编 ...

  9. ALSA子系统(十六)------虚拟耳机驱动

    你好!这里是风筝的博客, 欢迎和我一起交流. 在这之前,我们需要知道一些耳机类型的基本知识: 耳机有很多类型,图片左边带麦克的耳机术语叫做headset,右边不带麦克的术语叫做headphone. h ...

最新文章

  1. Mxnet - Understanding weight shape for Dense Layer MXNET权重参数形状的疑惑(内部设计形式行列谁在前不用管,多个转置运算而已)
  2. Android模拟器环境下SD卡内容的管理[转]
  3. [深入理解Android卷一全文-第十章]深入理解MediaScanner
  4. numpy.negative详解
  5. python爬取网上租房信息_Python爬虫入门 | 5 爬取小猪短租租房信息
  6. android 截屏_图文小编福利:Apowersoft专业截屏王
  7. c# Linq Where 抛出异常 导致 程序崩溃
  8. HMM隐马尔可夫模型(HMM)攻略
  9. vue-cli的router/index.js跳转出问题了
  10. java收_收java的小程序……谢谢
  11. springmvc和encache集成
  12. dosbox汇编环境turboC环境配置
  13. 软件工程专业职业规划发展路线
  14. 【LWIP】(补充)STM32H743(M7内核)CubeMX配置LWIP并ping通
  15. Android仿高德地图打车的三段式BottomSheet
  16. 自学平面设计,不能不知道的基础知识点是什么?
  17. 密码学中Alice(爱丽丝)和鲍勃(Bob)的历史
  18. python爬取歌曲_python爬取网易云音乐热歌榜实例代码
  19. 使用POI和EasyExcel实现Excel导入和导出功能
  20. java 编辑PDF 文件,或者填充数据

热门文章

  1. 游戏团队,各职位人员离职所带来的影响和不同
  2. 复旦大学计算机专业好还是浙大好,复旦大学和浙江大学,哪个更强一点?很多人都猜错了...
  3. 计算机信息系统打印输出的涉密文件,计算机信息系统打印输出的涉密文件,应当按相应的()文件进行管理。...
  4. STM32通信:IIC (二)
  5. 世界500强公司要求员工必须熟练掌握的七种工作方法
  6. Excel 2016图表标题不能输入中文,图表一直闪动
  7. 什么是庖丁解牛的思维?
  8. [玩转UE4/UE5动画系统>应用篇>功能模块] 之 ALS V4地面站立动作状态机详解
  9. 好消息:部分银行磁条卡更换芯片卡
  10. cesium两种方式鼠标移入移出实体显示提示框