extcon学习记录

【理解】

对于usb的应用来说,extcon的活就是要给usb控制器驱动提供外部连接器的状态,外部连接器就是充电器头,u盘,另外一台手机那样的东西;而状态就是主从机,谁给谁充电这些,所以extcon还有个很重要的活就是去考虑如何得到这些状态,得到这些状态就要涉及到外部链接器和我这台机器之间连接的线了,也就是type-c,micro-b这些;

因为不同的线的接口的引脚不一样,判断主从机的机制也不一样,这应该就是extcon驱动里最主要的活了;

得到状态后,是通过内核notify机制去通知其他的模块的,比如把检测到的状态通知给usb phy模块;

综上得出,

【最主要的活】根据不同的usb线的判断机制去判断外部连接器的状态

【目的】给usb控制器驱动提供这些状态,对usb控制器而言,它只管外部连接器的状态

(1)什么是状态呢?每一个状态就是一个struct extcon_cable

extcon学习记录_第1张图片

线类型:struct extcon_cable *cables; 具体指什么,通过adb shell 看到cable就是对应了这个extcon设备支持的状态类型,主从机

extcon学习记录_第2张图片

extcon学习记录_第3张图片
这些就是状态,对应的值是0和1,分别表示拔出插入

extcon学习记录_第4张图片

可以通过extcon_get_state来获取对应cable的值,这个值就表示有没有插入主从设备
extcon学习记录_第5张图片

(2)别的驱动怎么使用extcon呢? 内核通知链

记录一下notify传过去的参数,

raw_notifier_call_chain(&edev->nh[index], state, edev);

state:对应的cable的状态,插入或者拔出

edev:ectcon_dev外部连接的设备

extcon学习记录_第6张图片

val = state

v = edev

所以最后传入回调函数的参数就是 state 和 edev

在别的驱动中通过下面的方法得到exrcon_dev,再得到extcon_dev对应cable的状态
 extcon学习记录_第7张图片

 写个extcon = <&extcon_gpio>;
extcon学习记录_第8张图片

这里取自反编译的dts,可以看到每一个设备树节点都会有个phandle ,像身份证一样的标识了一个节点

然后对应的.c里去得到对应的of_node,再去得到对应的dev,再得到ectcon_dev
extcon学习记录_第9张图片

通过of_parse_phandle 这个函数去获取对应的节点

"extcon" :名字

0 : 是extcon后面第一个<> 里的,1的话就是第二个<><>,如果有的话

(3)这里以/drivers/extcon/extcon_usb_gpio.c 为例看一下它是怎么获取外部连接器的状态的

背景这个extcon_usb_gpio.c 是针对Micro-B 口,它的引脚是vbus d+ d- gnd ,有的会以gnd引脚作为id引脚,有的是直接多了一个id引脚,Micro-B 口是通过VBUS和ID两个脚的状态来识别是否接入了USB主机或USB外设的,

也就是对应了EXTCON_USB_HOST、EXTCON_USB,插入对应的值就会是1;

实现】

主要代码如下:

extcon学习记录_第10张图片

分配和注册extcon_dev,其中写好了这个extcon_dev的状态;
extcon学习记录_第11张图片

给vbus和id这两个引脚申请中断,跑的是同一个中断处理函数,在这个中断处理函数里去跑上面那个delay_work

extcon学习记录_第12张图片

在中断处理函数里去根据id和vbus的值设置对应状态(EXTCON_USB_HOST、EXTCON_USB)的值,并同步,同步就是唤醒他的通知链,跑挂在上面的函数

你可能感兴趣的:(学习,linux)