当前位置: 首页 > news >正文

虚拟pinctrl驱动

之前呢,我们讲解了在内核中pinctrl子系统是怎么实现的,今天我们来尝试一下自己去写一个pinctrl子系统:

首先呢,我们来看看一个pinctrl子系统需要做的事情:

上面的话,我们看了一个pinctrl子系统需要的三大功能以及在驱动程序中对应的三大结构体

下面我们来看看编写驱动程序时我们需要干什么:

我们是需要去搭建俩个驱动程序的,一个是pin controller设备节点的驱动程序,一个是client设备节点的驱动程序

设备树文件已经给出了,下面我们来看看驱动程序应该怎么去写:

下面我们来慢慢看:

我们先来把驱动程序的框架搭建出来:

接着就是去构建platform_deiver结构体了:


这样子在驱动程序和设备树节点通过compatible属性匹配后,probe函数就会被调用,那么在这里面,我们就需要去解析设备树,也就是需要去实现Pinctrl desc结构体:

首先就是分配pinctrl desc结构体了:

接着就是去设置了:

第一个作用就是去描述引脚了,单个引脚就只需要靠pins npins去描述就行,对于一组引脚,我们就需要去配置相应的结构体virtual_pctrl_ops去进行描述了:

接着就是实现这个结构体里面的函数指针了:第一个就是获取一共有多少组,我们这里为了图方便,这里一个引脚就代表一组吧:

所以我们这个函数只需要去返回引脚的数量就行了

接着就是获取组的名字:

一样的,我们只需要去返回pins结构体数组里面的名字就行

接着就是去获取组的引脚:

那个把设备树上面的信息转换成mapping结构体我们后面再讲,因为有点复杂,我们接着来看probe函数:

接着就是去设置pinctrl子系统的第二个功能,也就是引脚复用了,一样的,我们只需要去配置好virtual_pmx_ops结构体就可以了:

先来看第一个函数,这个是用来查看一共有多少个功能的:这里面全是静态的,是比较简单的,其实还有一种动态的从设备树里面去获取的方法

第二个就是去获取这个功能的名字了:

第三个就是获取指定功能的引脚组:

最后一个也就是最重要的,也就是去把对应的组设置成指定的功能:但是因为没有硬件寄存器去给我们操作,所以我们去打印信息就行了,毕竟只是虚拟的嘛,所以没有必要去搞的那么复杂

那么pinctrl子系统的第二个功能,引脚复用就讲完了,我们再回看probe函数:

第三个功能就是去配置引脚功能了:

这样子就大概虚拟的把指定的引脚设置成相应的配置模式了

那么我们去设置pinctrl desc结构体就搞完了,最后去注册就行了:

那么我们就只剩下怎么去从设备树中去注册一个Mapping结构体了,client驱动只需要去写一个简单的platform_driver就可以了

接着我们来看看怎么去注册mapping结构体:

那么到这里,我们就彻底讲完啦,完结,撒花(doge.)

相关文章:

  • ZGC初步了解
  • 【小技巧】如何查看容器的启动参数
  • Java 大视界 -- Java 大数据在智能电网电力市场交易数据分析与策略制定中的关键作用(162)
  • C++中的搜索算法实现
  • Chapters 15 16:What Is Architecture?Independence_《clean architecture》notes
  • 百人会上的蔚小理与「来的刚刚好」的雷军
  • 关于参加CSP-J/S认证需符合年龄条件的公告(2025年起)
  • Python PDF解析利器:pdfplumber | AI应用开发
  • 【什么是机器学习——多项式逼近】
  • 多线程 - 线程安全 2 -- > 死锁问题
  • snort检测端口扫描工具
  • AI基础03-视频数据采集
  • SpringBoot 概述
  • Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型多变量回归预测
  • 算力100问☞第98问:算力鸿沟会加剧数字不平等吗?
  • 常用正则表达式-MAC 地址
  • 安卓的布局方式
  • 【MySQL基础】聚合函数从基础使用到高级分组过滤
  • 【今日半导体行业分析】2025年3月30日
  • vue2,vue3,vue3 + vite 动态加载图片的方式