位置: 编程技术 - 正文

耳机插拔流程(耳机插头怎么拔)

编辑:rootadmin
1.1 耳机

推荐整理分享耳机插拔流程(耳机插头怎么拔),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:耳机怎么插上去,耳机插拔流程图,耳机插拔流程图解,耳机插针怎么拔,耳机插拔线,耳机插拔流程图,耳机插拔流程视频,耳机插拔流程图解,内容如对您有帮助,希望把文章链接给更多的朋友!

在Android系统中,有线耳机分两种,一种带mic,一种不带mic,带mic的耳机被称为Headset,不带mic的耳机被称为HeadPhone。在audio.h中,有以下几个设备来表示耳机:

AUDIO_DEVICE_OUT_WIRED_HEADSET = 0x4,

AUDIO_DEVICE_OUT_WIRED_HEADPHONE = 0x8,

AUDIO_DEVICE_IN_WIRED_HEADSET = AUDIO_DEVICE_BIT_IN | 0x,

对于Headset的插入检测,一般通过jack耳机插座来完成,大概原理是使用带检测机构的耳机插座,将检测脚连到GPIO中断上,耳机插入时,是的检测脚的电平变化,引起中断。通过GPIO的&#;判断耳机是插入还是拔出。

1.2 Uevent

目前使用的耳机插拔事件使用的是UEvent。但是也可以使用InputEvent,这种设置在frameworks/base/core/res/res/values/config.xml中,设置项为

<boolname="config_useDevInputEventForAudioJack">false</bool>

&#;为false,所以目前kernel是用Uevent来通知应用层耳机插拔的。

什么是Uevent:

1. 内核通知应用的一种方式

2. 目前使用socket进行内核和应用的通信

3. uevent就是一个特殊&#;式的字符串,如下,这应该是插入鼠标的Uevent

"add@/class/input/input9/mouse2 // message

ACTION=add // action type

DEVPATH=/class/input/input9/mouse2 // path in /sys

SUBSYSTEM=input // subsystem (class)

SEQNUM= // sequence number

PHYSDEVPATH=/devices/pci:/::1d.1/usb2/2­2/2­2:1.0 // device path in /sys

PHYSDEVBUS=usb // bus

PHYSDEVDRIVER=usbhid // driver

MAJOR= // major number

MINOR=", // minor number

1.3 UEvent是怎么工作的?1.3.1 Switch驱动

Switch是在android中实现的一个module,可动态加载,是一个驱动。 Switch相关的代码在在driversswitchswitch_class.c和driversswitchswitch_gpio.c中,其中switch_gpio基于platform_device框架,在switch_class.c中,Export了以下两个函数供switch_gpio使用

EXPORT_SYMBOL_GPL(switch_dev_register);

EXPORT_SYMBOL_GPL(switch_dev_unregister);

而Switch_gpio.c是驱动模块栈的更靠近设备的一层,这个设备就是gpio,初始化函数是

gpio_switch_probe{

switch_dev_register(&switch_data->sdev);

gpio_request(switch_data->gpio,pdev->name);

gpio_direction_input(switch_data->gpio);

gpio_to_irq(switch_data->gpio);

request_irq//申请GPIO中断

gpio_switch_work

}

这货是个platform驱动,它会调用

static int __init gpio_switch_init(void)

{

returnplatform_driver_register(&gpio_switch_driver);

}

把自己注册成一个platform驱动。Platform是一种虚拟总线,和spi,emmc等都是类&#;的。

基于platform device/driver框架,在probe函数中完成初始化,包括获取gpio的使用权限,设置gpio方向为输入,注册switch_dev设备,为gpio分配中断,指定中断服务程序,初始化一个gpio_switch_work工作,最后读取gpio初始状态。

在switch_class.c中,调用switch_set_state->switch_gpio_print_state输出GPIO状态到 sysfs。

Sysfs是一个虚拟的文件系统,由linux内核提供,通过使用虚拟文件,sysfs向用户空间公布了关于内核子系统的信息,硬件设备和相关的设备驱动。但是这个文件系统并不是被上层直接使用的,它仅仅是作为比较直观的方式提供给human being检查状态用的。

而真正发送uevent是在switch_class.c的这个函数里:

void switch_set_state(struct switch_dev *sdev,int state)

最终通过kobject_uevent_env(&sdev->dev->kobj, KOBJ_CHANGE, envp)发送。

kobject_uevent_env的流程如下:

1. 调用kobject_uevent_env之前,系统已经调用uevent_net_init(struct net *net)完成了初始化工作,也就是创建了socket,并创建了netlink,如下:

netlink_kernel_create(net,NETLINK_KOBJECT_UEVENT,1, NULL, NULL, THIS_MODULE);

sock_create_lite(PF_NETLINK,SOCK_DGRAM, unit, &sock)

__netlink_create(&init_net,sock, cb_mutex, unit)

2. netlink_broadcast_filtered,netlink广播uevent信息。

sk_for_each_bound

do_one_broadcast(sk,&info);

上面提到了Netlink socket,下面看看这是啥:

耳机插拔流程(耳机插头怎么拔)

Netlink socket是一种Linux特有的socket,用于实现用户进程与内核进程之间通信的一种特殊的进程间通信方式(IPC),也是网络应用程序与内核通信的最常用的接口。Netlink 是一种在内核和用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API就能使用 Netlink提供的强大功能,内核态需要使用专门的内核 API来使用 Netlink。

1.3.2 Netlink Socket通信

用户空间程序只需要创建一个NETLINK socket描述符,就可以侦听Uevent了,如下:

sockfd=socket(AF_NETLINK,SOCK_RAW,NETLINK_KOBJECT_UEVENT);

AF_NETLINK 是一种“domain”,定义了通信使用的协议,比如我们通常使用的IPV4协议。

<sys/socket.h>定义的所有的协议如下:

AF_UNIX,

AF_LOCAL

AF_INET

IPv4

AF_INET6

IPv6

AF_IPX

IPX

AF_NETLINK

Kernel

AF_X

ITU-T

AF_AX

Amateur

AF_ATMPVC

Access

AF_APPLETALK

AppleTal

AF_PACKET

Low

AF_ALG

Interface

事实上,Framework就是写了一个很简单的socket网络程序:

在uevent.c (hardwarelibhardware_legacyuevent)中,看函数uevent_init,

s =socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);

setsockopt(s,SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz));

bind(s,(struct sockaddr *) &addr, sizeof(addr)

再看uevent_next_event(char* buffer, intbuffer_length)

int count =recv(fd, buffer, buffer_length, 0);

其实就是读取socket的内容到buffer中。

1.3.3 观察者模式

拿到socket的内容后,需要通知对它感兴趣的模块。这里就使用了观察者模式。Android在frameworks/base/services/java/com/android/server/WiredAccessoryManager. java中实现对UEvent的处理。在这个文件中,从UEventObserver中继承了类WiredAccessoryObserver,在makeObservedUEventList中将要观察的事件加入到UEvent系统中:

UeventObserver持有一个静态的UEventThread对象,所有子类Observer都共享一个Thread。

private staticUEventThread sThread;

UeventThread是一个静态类,有一个Array:

private finalArrayList<Object> mKeysAndObservers = new ArrayList<Object>();

各种子类Observer都添加key和observer到mKeysAndObservers。比如,WiredAccessoryObserver添加(“DEVPATH=/devices/virtual/switch/h2w”,this),(“DEVPATH=/devices/virtual/switch/usb_audio”,this),(“DEVPATH=/devices/virtual/switch/hdmi”,this)到mKeysAndObservers。这个Thread不断的去读取AF_NETLINK中的数据,并对注册进去的key字符串进行匹配,匹配上的调用改key对应的observer的onUevent函数。

如何匹配的?

private voidsendEvent(String message){

for(;;){

if(message.contains(key))

mTempObserversToSignal.add(observer);

}

for (;;) {

final UEventObserverobserver = mTempObserversToSignal.get(i);

observer.onUEvent(event);

}

}

这个onUEvent经过一系列无聊的调用,最终调到

AudioManager:: setWiredDeviceConnectionState(intdevice, int state, String name),自此进入Audio子系统

1.4 Audio子系统

最终会到Audio Policy中的setDeviceConnectionState来,它有两个参数,一个表示设备id,另一个表示该设备是插入还是拔出。比如设备id 4代表的是HEADSET,而当state是AUDIO_POLICY_DEVICE_STATE_AVAILABLE时表示插入,当AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE时表示拔出。当设备有hw module与之相对应时(getModuleForDevice),会增加或减少mAvailableOutputDevices和mAvailableInputDevices。

用Fragment+ViewPager搭建万能的android界面 android由于受限于屏幕的尺寸,我们尽可能的想要在界面上显示更多的东西。先来两张图一个是的,一个是汽车之家。今天这篇文章就来搭建这个框架

Android spinner 的使用 本篇构造spiner使用了两种方式,一种是默认的视图一种是自定义的视图这里放两张效果图因为这是项目直接截图,可能有些没用的代码,大家看有用的

模拟新浪微博随便看看 1.运行效果图2.目的:1)对LIstView控件的使用2)理解Adapter的作用并掌控自定义FruitAdapter的使用方法3.步骤:1)extendsActivity2)定义数据集合3)创建SimpleAda

标签: 耳机插头怎么拔

本文链接地址:https://www.jiuchutong.com/biancheng/379663.html 转载请保留说明!

上一篇:Android:应用的运行过程(android应用程序)

下一篇:用Fragment+ViewPager搭建万能的android界面

  • 工会经费税前扣除比例是多少
  • 计提社保公积金的会计分录
  • 期末留抵税额退税怎么做分录
  • 工厂筹建期间购房合法吗
  • 个人给公司开税票有没有影响
  • 科目期初余额的录入需要从上级科目开始
  • 金融企业税务稽查案例分析
  • 公司代扣代缴的个人所得税怎么做账
  • 农产品收购发票可以跨区域开吗
  • 让渡资产使用权收入的确认条件
  • 产品成本核算过程
  • 企业未能实施个人所得税代扣代缴是否会罚款呢?
  • 报废车辆残值收入交多少增值税
  • 个人所得税如果换公司怎么办
  • 工程发票包括哪些
  • 怎么网上补报以前年度的个人所得税?
  • 三方扣款fd6
  • 金税盘上报汇总是什么时候
  • 企业职工福利费扣除标准
  • 未达起征点怎么写摘要
  • 收据能不能做账
  • 企业的业务招待费多了好还是少了好
  • 企业出售旧设备的收入要纳税吗
  • 出口货物免征增值税的有哪些
  • 应收账款增加记哪一方
  • 免抵退税申报表主表
  • 少计收入被处罚账务处理怎么做?
  • macbookair网页全屏
  • mac系统技巧
  • linux连接windows的服务redis
  • 咨询公司流程完整
  • 投资性房地产减值准备属于什么科目
  • 分公司的股东怎么填
  • php中的include
  • 企业汇算清缴费用
  • 交易性金融资产包括哪些项目
  • 收取增值税一般是多少
  • 增值税加计抵减企业所得税如何处理
  • 招待费专票可以抵扣进项吗
  • vue项目使用百度地图怎么长久使用
  • 查询命令的操作步骤
  • 房地产企业建筑成本
  • 资产减值损失账户核算内容包括
  • 增值税地方留存比例2023
  • 帝国cms使用手册
  • 将织梦dedecms转换到wordpress
  • 购入商品再卖出
  • 民办非企业单位工会经费
  • 办公装修费用多少
  • 商品互换概念
  • 小规模纳税人的条件
  • 住宿发票 抵扣
  • 公司购买的机票可以退吗
  • 优秀员工奖金领取表模板
  • 购买库存商品的运输费
  • 利润分享并购方法有哪些
  • 运费发票没到可以先计提吗
  • 小规模申请专票,税率是多少?
  • 新成立的公司哪个地方能查到
  • 房屋租赁公司装修费会计分录
  • 公司购买电视属于什么费用
  • 重要空白凭证是什么科目
  • 税务会计每个月几号需要干工作流程
  • 怎么做好出纳帐
  • win7开始菜单路径在哪里
  • 微软禁用windows
  • win7重装系统需要重新激活吗
  • cocos2dx怎么安装
  • dos批处理高级教程合编.pdf
  • 游戏unity报错
  • [置顶]马粥街残酷史
  • 使用express
  • js如何修改style
  • jquery 使用
  • 个人经营所得定率征收税率表
  • 信息咨询费包括什么费用
  • 江西省电子信息职业学院
  • 安徽省地方税务局公告2016年第1号
  • 教育培训行业的发展前景
  • 深圳市国家税务局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设