extcon驱动及其在USB驱动中的应用

news/2024/10/8 16:03:38/文章来源:https://www.cnblogs.com/linhaostudy/p/18451808

extcon,是External Connector的简称,用于抽象外部连接器,比如说Audio Jack、USB MicroB/TypeC接口等。它的原型是Android的switch-class驱动,经过修改后在kernel 3.4.0版本时被引入内核中。

Extcon (external connector): import Android's switch class and modify.

External connector class (extcon) is based on and an extension of Android kernel's switch class located at linux/drivers/switch/.

https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/extcon?h=next-20220502&id=de55d8716ac50a356cea736c29bb7db5ac3d0190

extcon驱动的主要功能是识别外部连接器状态变化,并将状态变化通知到与外部连接器相关的其他驱动。

使用extcon驱动,有什么好处呢?之前的内核都没有extcon驱动,又是怎么处理这些外部连接器的?不妨以USB驱动为例,看看使用extcon驱动前后的变化。

USB常见的外部接口有TypeA/B/C三种,其中TypeA/B又有标准A/B、Mini A/B和Micro A/B三种,直接上图:

这三种不同的接口,TypeA/B只是物理信号上的连接,主控芯片内部没有针对TypeA/B的专用控制器,可通过VBUS和ID两个脚的状态来识别是否接入了USB主机或USB外设。接入主机前,VBUS脚上没有电压,接入主机后,主机端会在VBUS脚上提供5V电压;接入外设前,ID脚为高电平,接入外设后,ID脚被拉低。于是软件可以通过主动读取这两个脚的电平或者异步响应这两个脚的中断来获知状态的变化。

TypeC就有点特别,从TypeC规范可以看到,TypeC是有一个状态机的,从Unattached状态走到Attached Sink状态(做从设备)或者Attached Source状态(做主机),主控芯片内部是有相应的控制器的,控制器会通过寄存器汇报状态变化,并产生中断通知主控。TypeC控制器需要软件进行相应的编程来配置和使能它。

截图来自官方规范:USB Type-C 2.1 Release

https://www.usb.org/document-library/usb-type-cr-cable-and-connector-specification-release-21

以上就是USB针对不同外部接口所面临的状况。在extcon驱动出现之前,同一份USB控制器驱动代码,比较常见的做法就是在设备树(dts)中指明是哪种接口,USB控制器驱动代码中会解析设备树中的定义,通过if...else...来走不同的代码逻辑。如果是MicroB接口,就注册VBUS和ID脚的中断、查询IO脚的电平状态;如果是TypeC接口,就注册TypeC的中断,查询TypeC的状态。假设后续又有新的接口出现,工作原理不同于已有的接口,那就又需要在USB控制器驱动中去增加相关代码。

在extcon驱动出现后,USB控制器驱动就能和外部接口驱动解耦。在USB控制器驱动看来,不管外部接口是什么,我只需知道外部接口状态的变化就好了,比如是否接入主机了、是否有设备接入了。使用extcon驱动提供的函数接口来注册notifier,当外部接口状态变化时,extcon驱动负责回调notifier,USB控制器驱动代码无需再针对不同的外部接口改来改去。不同的外部接口,都用extcon来抽象自己的行为。

以上都是原理性的介绍,最后还是要落实到代码上才够清晰。以内核原生代码为例:

drivers\extcon\extcon-usb-gpio.c  //extcon驱动示例
drivers\usb\dwc3\dwc3-omap.c  //使用extcon示例

extcon-usb-gpio.c实现了通过IO脚(VBUS和ID)检测USB插拔的extcon驱动。整个驱动是以platform driver为框架。

在驱动的probe函数中,会从设备树获取VBUS和ID脚对应的GPIO。设备树中定义了这个extcon设备的相关属性。

2287045-20220513222924715-1100249837

接着会分配并注册一个extcon device。usb_extcon_cable数组定义了这个extcon device所支持的状态类型,EXTCON_USB表示USB做Device,EXTCON_USB_HOST表示USB做Host。状态值当然是插入或者拔出。

最后注册ID脚和VBUS脚的中断,注意这里两个脚的中断处理函数都是usb_irq_handler。两个脚的中断处理函数也不是非要是同一个,这里设置为同一个,是为了逻辑处理上的方便,因为VBUS和ID脚要联合判断。

usb_irq_handler函数里会queue work,这个work对应的处理函数如下图。通过extcon_set_state_sync函数通知其他驱动,只要有驱动注册了相应的notifier,就会被通知到。

以上是extcon-usb-gpio.c的实现,类似地,TypeC驱动也可以注册extcon device,通过extcon_set_state_sync函数向其他驱动汇报状态,这里就不再重复地举例。

最后看看dwc3-omap.c如何使用extcon。该驱动的probe函数中会调用下图函数,该函数首先调用extcon_get_edev_by_phandle从设备树获取extcon device,然后注册notifier,当extcon device状态变化时,notifier被回调;也可以通过extcon_get_state主动查询extcon device的状态。

2287045-20220513223205869-163965713

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/810005.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IIS 配置referer 请求筛选_请求拒绝

一、IIS 配置Referer 拒绝解析: 访问静态内容,拒绝指定的referer,例如:拒绝后,对应的网站引用当前网站的静态资源会被拒绝。更多: iis怎么限制http下载速度_IIS 限制网站带宽使用? IIS 执行此操作时出错。 详细信息:web.config 错误,.net core项目IIS10 隐藏 http serve…

RAG系统评测实践详细版:Coze及相关产品评测对比,以及下一代RAG技术

RAG系统评测实践详细版:Coze及相关产品评测对比,以及下一代RAG技术AI RAG系统评测实践:Coze及相关产品评测对比 RAG(检索增强生成)是一种 AI 框架,它将传统信息检索系统(例如数据库)的优势与生成式大语言模型 (LLM) 的功能结合在一起,通过将这些额外的知识与自己的语言…

深入了解Oracle OCP认证,开启数据库专业之旅

使用Oracle数据库的公司内部,经常有员工们在讨论OCP认证(Oracle Certified Professional,Oracle认证专家),这是甲骨文Oracle公司提供的一种专业认证,认证用于使用者在Oracle技术领域的专业知识和技能。 在这里,有一点需要大家知道,虽然OCP认证一般指的是Oracle数据库管理…

vue2项目 一直报ts-plugin错误

如图,项目代码未动,突然代码报错,运行没问题不受影响 经排查,插件Vue-Official版本问题 ,问题版本v2.1.6 解决版本,安装其他版本 ,v1.8.27 作者:听着music睡出处:http://www.cnblogs.com/xqxacm/Android交流群:38197636本文版权归作者和博客园共有,欢迎转载,但未经…

鼠标的移入、移出事件

原文链接:鼠标的移入、移出事件_鼠标移入事件-CSDN博客

初识Rancher

一、简介 1、什么是rancher Rancher是一个开源软件平台,使组织能够在生产中运行和管理Docker和Kubernetes。使用Rancher,组织不再需要使用一套独特的开源技术从头开始构建容器服务平台。Rancher提供了管理生产中的容器所需的整个软件堆栈。  2、充分发挥K8s的潜力 Kubernete…

Linux下操作Nginx相关命令

1、查看Nginx进程 ps -aux | grep nginx圈出的就是Nginx的二进制文件 2、测试Nginx配置文件 /usr/sbin/nginx -t可以看到nginx配置文件位置 3、nginx的使用(启动、重启、关闭) 首先利用配置文件启动nginx。nginx -c /usr/local/nginx/conf/nginx.conf重启服务:service nginx r…

10月8号笔记

1.StringUtil常用方法2.判断不为空:CollectionUtils.isNotEmpty():集合不为空; StringUtils.isNotBlank():String不为空; MapUtils.isNotEmpoty():Map集合判断不为空;3."::"用法:4.getRecords()用法:5.MyBatis-Plus常用方法:6.MyBatis-Plus中Page与IPage的区…

夜莺监控的机器支持挂载到多个业务组了

夜莺开源项目于国庆前夕发布了 v7.4.1 版本,修复了一些 bug,同时也带来了一些新功能。其中最重要的一个功能是:机器支持挂载到多个业务组了。本文将介绍几个重要的变更。 所有变更点feat: 左侧栏业务组新设计 feat: 机器支持了绑定到多个业务组,机器混部的场景,管理机器更…

SS241007C. 步行(walk)

待订正。SS241007C. 步行(walk) 题意 给你一个 \(n \le 3 \times 10^5\) 个结点的树,每个结点有一个权值 \(a_i\)。有 \(m \le 1.5 \times 10^6\) 次询问,每次删除一条边,然后再连上一条边。如果修改后的图不是树输出无解。否则找出一条路径,满足每个点恰好经过 \(a_i\) …

day02_基本的DOS命令

电脑常用快捷键 常用快捷键快捷键 作用CTRL + c 复制CTRL + v 粘贴CTRL + x 剪切CTRL + z 撤销CTRL + s 保存alt + f4 关闭窗口del 删除shift + del 强制删除Windows + r 打开 “运行” 窗口windows + e 打开 “我的文档”ctrl + alt + del 锁定/切换用户/注销/更改密码/任务管…