android耳机检测之最复杂的耳机检测流程

这几个月,我接触了可能是我目前见到过的最烂的耳机检测设计,这主要是指ASIC设计的针对耳机检测的模拟电路。这真是一个彻头彻尾的失败设计,因为耳机检测电路完全和audio codec被混合到了一起,这简直无法理解。

从软件流程来看,耳机检测流程和audio是没有半毛钱关系的。但是当硬件和ASIC把耳机检测相关的寄存器和audio的寄存器混合到一起后,这就变成了一坨屎!

很不幸的我在不知情的情况下去为这坨垃圾写驱动,驱动就像一个袋子,里面包裹了一坨屎,人们觉得这个袋子很臭,没有人想打开袋子看看,所以袋子很为难。袋子想说:我已经尽可能把它包裹起来了。。。


耳机检测驱动在检测到耳机插入后通过linux的switch device向上层报告耳机插入事件及耳机类型。

probe过程通过int switch_dev_register(struct switch_dev *sdev) 函数来注册一个switch dev。

注意:

static struct sprd_headset headset = {
        .sdev = {
                .name = "h2w",
        },
};

这个switch dev的名字必须为h2w,这个被android写死了。


耳机插入或拔出后,通过void switch_set_state(struct switch_dev *sdev, int state)函数更新 /sys/class/switch/h2w/state  (0=未插 1=4pole 2=3pole) 节点的值来给上层报告耳机插入或拔出动作。


通过logcat可以看到耳机插入时上层在state bar中显示耳机图标对应的log为:

插入:

V/WiredAccessoryManager(  579): Headset UEVENT: {SUBSYSTEM=switch, SWITCH_STATE=1, DEVPATH=/devices/virtual/switch/h2w, SEQNUM=1422, ACTION=change, SWITCH_NAME=h2w}
D/ENGPC   (  160): parse_event: event { 'change', '/devices/virtual/switch/h2w', 'switch', '' }
V/WiredAccessoryManager(  579): newName=h2w newState=1 headsetState=1 prev headsetState=0
V/WiredAccessoryManager(  579): device h2w connected
D/ENGPC   (  228): parse_event: event { 'change', '/devices/virtual/switch/h2w', 'switch', '' }
D/PhoneStatusBarPolicy(  638): headset state = 1,mic = 1,visiable = true


拔出:

V/WiredAccessoryManager(  579): Headset UEVENT: {SUBSYSTEM=switch, SWITCH_STATE=0, DEVPATH=/devices/virtual/switch/h2w, SEQNUM=1424, ACTION=change, SWITCH_NAME=h2w}
V/WiredAccessoryManager(  579): newName=h2w newState=0 headsetState=0 prev headsetState=1
V/WiredAccessoryManager(  579): device h2w disconnected
D/ENGPC   (  160): parse_event: event { 'change', '/devices/virtual/switch/h2w', 'switch', '' }
D/ENGPC   (  228): parse_event: event { 'change', '/devices/virtual/switch/h2w', 'switch', '' }
D/PhoneStatusBarPolicy(  638): headset state = 0,mic = 1,visiable = false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YasinLeeX

再来一杯西湖龙井。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值