1. 前言

本站之前的三篇文章[1][2][3]介绍了pin controller(对应的pin controller

subsystem)、gpio controller(对应的GPIO subsystem)有关的基本概念,包括pin

multiplexing、pin configuration等等。本文将基于这些文章,单纯地从pin controller

driver的角度(屏蔽掉pinctrl core的实现细节),理解pinctrl

subsystem的设计思想,并掌握pinctrl驱动的移植和实现方法。

2. pin controller的概念和软件抽象

相信每一个嵌入式从业人员,都知道“pin(管脚)”是什么东西(就不赘述了)。由于SoC系统越来越复杂、集成度越来越高,SoC中pin的数量也越来越多、功能也越来越复杂,这就对如何管理、使用这些pins提出了挑战。因此,用于管理这些pins的硬件模块(pin

controller)就出现了。相应地,linux kernel也出现了对应的驱动(pin controller

driver)。

Kernel pinctrl core使用struct pinctrl_desc抽象一个pin

controller,该结构的定义如下(先贴在这里,后面会围绕这个抽象一步步展开):

struct pinctrl_desc { const char *name; const struct pinctrl_pin_desc *pins; unsigned int npins; const struct pinctrl_ops *pctlops; const struct pinmux_ops *pmxops; const struct pinconf_ops *confops; struct module *owner; #ifdef CONFIG_GENERIC_PINCONF unsigned int num_custom_params; const struct pinconf_generic_params

*custom_params; const struct pin_config_item

*custom_conf_items; #endif };

注1:本文后续的描述基于本站“X Project”所使用的kernel版本[4]。 注2:本文很多的表述(特别是例子),都是引用kernel的document[5](写的很好,可以耐心看看)。

2.1 Pin

kernel的pin

controller子系统要想管理好系统的pin资源,第一个要搞明白的问题就是:系统中到底有多少个pin?用软件语言来表述就是:要把系统中所有的pin描述出来,并建立索引。这由上面struct

pinctrl_desc结构中pins和npins来完成。

对pinctrl

core来说,它只关心系统中有多少个pin,并使用自然数为这些pin编号,后续的操作,都是以这些编号为操作对象。至于编号怎样和具体的pin对应上,完全是pinctrl

driver自己的事情。

因此,pinctrl driver需要根据实际情况,将系统中所有的pin组织成一个struct

pinctrl_pin_desc类型的数组,该类型的定义为:

struct pinctrl_pin_desc { unsigned number; const char *name; void *drv_data; };

number和name完全由driver自己决定,不过要遵循有利于代码编写、有利于理解等原则。另外,为了便于driver的编写,可以在drv_data中保存driver的私有数据结构(可以包含相关的寄存器偏移等信息)。

注3:[5]中有个例子,大家可以参考理解。

2.2 Pin groups

在SoC系统中,有时需要将很多pin组合在一起,以实现特定的功能,例如SPI接口、I2C接口等。因此pin

controller需要以group为单位,访问、控制多个pin,这就是pin groups。相应地,pin controller

subsystem需要提供一些机制,来获取系统中到底有多少groups、每个groups包含哪些pins、等等。

因此,pinctrl core在struct pinctrl_ops中抽象出三个回调函数,用来获取pin

groups相关信息,如下:

struct pinctrl_ops { int (*get_groups_count) (struct pinctrl_dev

*pctldev); const char *(*get_group_name) (struct pinctrl_dev

*pctldev, unsigned selector); int (*get_group_pins) (struct pinctrl_dev

*pctldev, unsigned selector, const unsigned **pins, unsigned *num_pins); void (*pin_dbg_show) (struct pinctrl_dev *pctldev, struct seq_file

*s, unsigned offset); int (*dt_node_to_map) (struct pinctrl_dev

*pctldev, struct device_node *np_config,

pinctrl虚拟spi的linux驱动,linux内核pinctrl驱动的理解和总结相关推荐

  1. Linux驱动开发—内核I2C驱动详解

    Linux驱动开发--内核I2C驱动 I2C驱动文件结构 I2C数据传输过程 i2c_transfer i2c_msg I2C通讯常用的接口函数(老版本) 快速读写接口函数:(连续读写) 常用的读操作 ...

  2. pinctrl虚拟spi的linux驱动,LinuxSPI驱动.md

    --- ![](https://b3logfile.com/bing/20190517.jpg?imageView2/1/w/960/h/540/interlace/1/q/100) SPI 驱动框架 ...

  3. linux 怎么往内核加驱动,向Linux内核添加驱动

    Linux内核中提供了很多设备的驱动代码,但每个项目中总会需要添加我们自己的驱动,比如我们需要添加红外遥控驱动.我们可以先独立去编写和调试这个驱动,等成熟后应该放到内核目录树中,使用make modu ...

  4. linux单独编译内核的驱动

    1.找到对应驱动的宏 grep r8188eu.o drivers/staging/rtl8188eu -r | grep Makefile 找到配置宏为: CONFIG_R8188EU 2.编译 m ...

  5. aix内核是linux,linux和aix内核参数检查

    安装oracle软件时需要设置操作系统级别的用户限制,后期检查可以使用如下命令,方便问题的排查工作 linux: tail -15 /etc/security/limits.conf tail -30 ...

  6. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的SPI驱动架构分析

    PowerPC + Linux2.6.25平台下的SPI驱动架构分析 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人b ...

  7. 《Linux设备驱动开发详解(第3版)》(即《Linux设备驱动开发详解:基于最新的Linux 4.0内核》)进展同步更新

    本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 目前已经完成稿件. 2015年8月9日,china-pub开始上线预售: http://product.china-pub ...

  8. Linux内核IOREMAP驱动

    1 Linux内核IOREMAP驱动 在内核驱动的代码中,存在大量代码使用ioremap进行物理地址和虚拟地址映射,使得内核更加容易操作硬件,对比于简单的gpio控制,实际的代码同样是使用了iorem ...

  9. linux spi屏驱动程序,65 linux spi设备驱动之spi LCD屏驱动

    SPI的控制器驱动由平台设备与平台驱动来实现. 驱动后用spi_master对象来描述.在设备驱动中就可以通过函数spi_write, spi_read, spi_w8r16, spi_w8r8等函数 ...

最新文章

  1. 打开python的步骤_python RE 常见的打开方法
  2. python读文件操作-python文件操作读取文件写入文件
  3. 企业USB权限控制心得
  4. End to End Sequence Labeling via Bi-directional LSTM CNNs CRF
  5. curl命令java_Java中的curl命令
  6. MyBatis中if,where,set标签
  7. 读取记事本内容,自动发布到新浪微博
  8. 380天!理想汽车交付量突破30000辆
  9. IO口复用时钟的配置
  10. [经验] Cocos Creator使用笔记 --- 调用不同脚本下的函数
  11. espcms联动筛选功能开发
  12. 51单片机流水灯实验
  13. 利用python暴力破解rar压缩文件密码
  14. html5 游戏制作教程,利用HTML5 Canvas制作一个简单的打飞机游戏
  15. wstmart 对目录进行授权
  16. 简化服装ERP系统的规范流程和规范功用
  17. (力扣)171.Excel表列序号(c语言)
  18. 2022保育员(高级)考试模拟100题及在线模拟考试
  19. 5月最新M1芯片安装PS2021和PS2020已更新M1芯片mac安装PS2021解决教程(附安装方法)
  20. 详细分析contrex-A9的汇编代码__switch_to(进程切换)

热门文章

  1. Icomparer和Icomparable集合排序
  2. 二十年后的回眸(2)——顺风顺水的前三年
  3. 软件测试(四)之 PrintPrimes
  4. 【参数】REMOTE_LOGIN_PASSWORDFILE参数三种取值及其行为特性分析
  5. 【案例】爆老师拆解同步网络seo分析思路
  6. Linq的一些操作符-图表展示
  7. echarts 去掉网格线
  8. Microsoft Visual Studio 正忙
  9. php curl伪造referer与来源IP实例
  10. windows下配置安装YAF环境