首页 > 系统相关 >Linux extcon概要记录

Linux extcon概要记录

时间:2024-05-02 17:00:27浏览次数:22  
标签:概要 int EXTCON dev extcon Linux define struct

关键词:extcon、uevent等。

1 extcon介绍

extcon是External Connector的简称,用于抽象外部连接器,比如说Audio Jack、USB MicroB/TypeC接口等。

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

2 extcon内核配置

extcon配置如下:

Device Drivers
  External Connector Class (extcon) support
    ADC Jack extcon support
    GPIO extcon support
    USB GPIO extcon support

extcon相关文件包括:核心devres.c和extcon.c,以及特定Connector接口的实现,比如ADC、GPIO等。

drivers/extcon/├── devres.c--带资源管理的API。
├── extcon-adc-jack.c--基于ADC读取值进行extcon状态更新。
├── extcon.c
├── extcon-gpio.c--基于读取GPIO值进行extcon状态更新。
├── extcon-usb-gpio.c--基于gpio和vbus判断USB相关的extcon状态。

3 extcon类初始化

extcon类的初始化很简单,仅创建了一个extcon_class以及相关属性节点。

extcon_class_init
  create_extcon_class--创建extcon_class,此类设备属性为extcon_groups。

4 extcon相关数据结构和API

 struct extcon_dev表示一个External Connector设备:

struct extcon_dev {
    /* Optional user initializing data */
    const char *name;
    const unsigned int *supported_cable;
    const u32 *mutually_exclusive;

    /* Internal data. Please do not set. */
    struct device dev;
    struct raw_notifier_head nh_all;
    struct raw_notifier_head *nh;
    struct list_head entry;
    int max_supported;--当前extcon支持的最多cable数。
    spinlock_t lock;    /* could be called by irq handler */
    u32 state;

    /* /sys/class/extcon/.../cable.n/... */
    struct device_type extcon_dev_type;
    struct extcon_cable *cables;

    /* /sys/class/extcon/.../mutually_exclusive/... */
    struct attribute_group attr_g_muex;
    struct attribute **attrs_muex;
    struct device_attribute *d_attrs_muex;
};

支持的extcon类型和ID如下:

#define EXTCON_TYPE_USB        BIT(0)    /* USB connector */
#define EXTCON_TYPE_CHG        BIT(1)    /* Charger connector */
#define EXTCON_TYPE_JACK    BIT(2)    /* Jack connector */
#define EXTCON_TYPE_DISP    BIT(3)    /* Display connector */
#define EXTCON_TYPE_MISC    BIT(4)    /* Miscellaneous connector */

#define EXTCON_NONE        0

/* USB external connector */
#define EXTCON_USB        1
#define EXTCON_USB_HOST        2
#define EXTCON_USB_VBUS_EN    3
...
/* Jack external connector */
#define EXTCON_JACK_MICROPHONE    20
#define EXTCON_JACK_HEADPHONE    21
#define EXTCON_JACK_LINE_IN    22
#define EXTCON_JACK_LINE_OUT    23
#define EXTCON_JACK_VIDEO_IN    24
#define EXTCON_JACK_VIDEO_OUT    25
#define EXTCON_JACK_SPDIF_IN    26    /* Sony Philips Digital InterFace */
#define EXTCON_JACK_SPDIF_OUT    27
...
#define EXTCON_NUM        63

 

extcon内存的分配和释放函数:

struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
void extcon_dev_free(struct extcon_dev *edev);
struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
                const unsigned int *cable);
void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);

extcon的注册和注销函数:

int extcon_dev_register(struct extcon_dev *edev);
void extcon_dev_unregister(struct extcon_dev *edev);
int devm_extcon_dev_register(struct device *dev,
                struct extcon_dev *edev);
void devm_extcon_dev_unregister(struct device *dev,
                struct extcon_dev *edev);

devm_extcon_dev_register()是带资源管理的extcon注册函数:

devm_extcon_dev_register--带资源管理的extcon注册函数,去注册时调用devm_extcon_dev_unreg。
  extcon_dev_register
    --设置extcon名。
    --为每个Cable创建name和state属性。
    --device_register--注册设备。

extcon状态设置函数:

int extcon_set_state(struct extcon_dev *edev, unsigned int id,
                bool state);--设置状态但不sync。
int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
                bool state);--设置状态并sync。

extcon_set_state_sync()设置一个exton的状态,并通过uevent通知用户空间:

extcon_set_state_sync
  ->is_extcon_changed
  ->extcon_set_state
  ->extcon_sync
    ->kobject_uevent_env--获取name/state属性,以KOBJ_CHANGE动作发送uevent到用户空间。

extcon属性配置函数:

int extcon_set_property(struct extcon_dev *edev, unsigned int id,
                unsigned int prop,
                union extcon_property_value prop_val);
int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
                unsigned int prop,
                union extcon_property_value prop_val);
int extcon_set_property_capability(struct extcon_dev *edev,
                unsigned int id, unsigned int prop);

标签:概要,int,EXTCON,dev,extcon,Linux,define,struct
From: https://www.cnblogs.com/arnoldlu/p/18165739

相关文章

  • Linux-centos8-samaba配置
    安装samba:yuminstallsambasamba-clientsamba-swat检查是否安装成功:rpm-qa|grepsambasamba文件配置先将smb.conf备份,网上很多人都用rm,后面再建立个新文件cp/etc/samba/smb.conf/etc/samba/smb2.confls-laF/etc/samba/创建目录文件,并进行权限和安全相关设......
  • Linux常见命令-目录命令
    1.ls命令:显示目录下的内容基本格式[root@localhost~]#ls[选项][参数是文件名或目录名]常用选项-a:显示所有文件--color=when:支持颜色输出-d:显示目录信息,并非目录下的文件-h:易读化显示。文件的大小按照KB,MB为单位显示-i:显示文件的i节点号-l:显示文件的详细信息范例参......
  • 在Linux中,如何管理SSL/TLS证书?
    在Linux系统中,管理SSL/TLS证书是确保Web服务安全的重要环节。SSL(SecureSocketsLayer)和TLS(TransportLayerSecurity)证书用于加密服务器和客户端之间的通信,保护数据传输的安全。以下是管理SSL/TLS证书的一般步骤:1.获取SSL/TLS证书从证书颁发机构(CA)购买:如果你需要一个商业网......
  • Linux白屏部署OceanBase集群版
    本次将部署三个节点,将介质OceanBaseAllinOne传到一个节点上即可。#下载并解压安装包[root@tidb01db_ob]#tar-xzvfoceanbase-all-in-one-4.3.0.1-100000242024032211.el7.x86_64.tar.gz[root@tidb01db_ob]#cdoceanbase-all-in-one/[root@tidb01oceanbase-all-in-on......
  • Linux如何完全卸载OceanBase单机版
    OceanBase单机版重新部署的时候,遇到提示demoisrunning,因为之前部署的demo还在运行中,可以直接重启使用,如果想重新部署,需将之前的删除干净。本文将介绍如何删除OceanBase单机版。1.查看OB集群信息[root@tidb01bin]#obdclusterlist+-------------------------------------......
  • linux11-vi&vim
    linux11-vi&vimvi\vimvi,visualinterfacevim是vi的加强版本,兼容vi的所有指令,不仅能编辑文本,而且还具有shell程序编辑的功能,带有语法高亮#文件不存在,则创建并编辑新文件vim不存在路径#文件存在,则编辑已有文件vim已存在路径操作:i键,插入模式ESC,回......
  • linux12-root
    linux12-root为root用户设置密码sudopasswdrootsusu,switchuser,切换用户选项-,表示是否在切换用户后加载环境变量,建议加参数user不填写,默认切换root用户#切换到root用户su-root可以通过exit回退到上一个用户,也可以用快捷键ctrl+dsudosuperuse......
  • linux10-echo&重定向符&tail
    linux10-echo&重定向符&tailecho在终端输出语句echo"HelloWorld"echo输出命令#此处pwd被当做文本输出echopwd通过反引号``,输出pwd执行内容echo`pwd`重定向符>将左侧命令的结果,覆盖写入到右侧指定的文件中>>将左侧命令的结果,追加写入到右侧指......
  • Linux系统命令-目录命令
    1.ls命令:显示目录下的内容基本格式[root@localhost~]#ls[选项][参数是文件名或目录名]常用选项-a:显示所有文件--color=when:支持颜色输出-d:显示目录信息,并非目录下的文件-h:易读化显示。文件的大小按照KB,MB为单位显示-i:显示文件的i节点号-l:显示文件的详细信息范例参......
  • linux环境和vim能够编辑c/c++
    一、准备Linux环境整体安装和使用教程按照 http://why.ink:8080/ICS/2023/这个来进行讲的很全面linux安装软件,有些软件安装起来真的是问题重重,我认为这是linux的问题,而且还会遇到bug,从软件易用性上来看,是不如windows,但从开发角度来说倒是linux更好用一些Linux安装准备:1、......