extcon学习记录

【理解】

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

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

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

综上得出,

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

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

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

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


这些就是状态,对应的值是0和1,分别表示拔出插入

可以通过extcon_get_state来获取对应cable的值,这个值就表示有没有插入主从设备

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

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

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

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

edev:ectcon_dev外部连接的设备

val = state

v = edev

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

在别的驱动中通过下面的方法得到exrcon_dev,再得到extcon_dev对应cable的状态
 

 写个extcon = <&extcon_gpio>;

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

然后对应的.c里去得到对应的of_node,再去得到对应的dev,再得到ectcon_dev

通过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_dev,其中写好了这个extcon_dev的状态;

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值