对于一个 , 比如它是一个串口设备 , 它有多种状态 , 比如、sleep等 。那么对应的引脚也有这些状态 , 比如:
state有两种标识:一种就是-names定义的字符串列表 , 另外一种就是ID 。ID从0开始 , 依次加一 。以上面例子为例:
内核自己定义了"","init","idel","sleep"状态;也可以是其它自己定义的状态, 比如串口的""状态(使用流量控制) 。
(2)-x的定义 。-x是一个句柄()列表 , 每个句柄指向一个"引脚配置节点" , 有时候 , 一个state可以用到多组pin , 比如A1、A2两组pin , A1组pin复用为F1功能 , A2组pin复用为F2功能 。
我们以串口0设备节点定义为例:
&uart_0 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&uart0_data>;};
其中:
2.3框架
下图描述了 的模块图:
中间层是pincore , 用于管理系统中的pin。pincore汇总了pin 的通用操作:
基本上这个软件框架图和GPIO 是一样的 , 其软件抽象的思想也是一样的 , 当然其内部具体的实现不一样 。
2.4 目录结构 2.4.1 源文件
linux内核将驱动相关的代码放在/目录下 , 这下面的文件还是比较多的 , 我们大概了解一下即可 。
文章插图
其中:
在pin文档中 , 我们以的pin 为例 , 描述了一个具体的low level的 , 这个涉及的文件包括-.c , -.h和-.c 。
2.4.2 头文件
会向系统中的其它提供接口以便进行该的引脚配置和引脚复用功能的设定 , 下面这些头文件就定义了 的外部接口以及相关的数据结构:
.h:这是for linux内核的驱动模型模块( model)使用的接口 。中包括了一个*pins的成员 , 这个成员描述了该设备的引脚的初始状态信息 , 在probe之前 , model中的core 在调用的probe函数之前会先设定pin state;.h:模块的接口;
提供给底层pin的头文件列表如下:
2.5 数据结构
学习pin , 首先要了解 涉及到的数据结构 , 知道每个数据结构以及成员的含义之后 , 再去看源码就容易了 。
我们从pin和 视角去介绍 涉及到的数据结构 , 其中:
三、pin3.
pincore使用 抽象一个pin , 其定义在//core.h文件 , 如下:
/*** struct pinctrl_dev - pin control class device* @node: node to include this pin controller in the global pin controller list* @desc: the pin controller descriptor supplied when initializing this pin*controller* @pin_desc_tree: each pin descriptor for this pin controller is stored in*this radix tree* @pin_group_tree: optionally each pin group can be stored in this radix tree* @num_groups: optionally number of groups can be kept here* @pin_function_tree: optionally each function can be stored in this radix tree* @num_functions: optionally number of functions can be kept here* @gpio_ranges: a list of GPIO ranges that is handled by this pin controller,*ranges are added to this list at runtime* @dev: the device entry for this pin controller* @owner: module providing the pin controller, used for refcounting* @driver_data: driver data for drivers registering to the pin controller*subsystem* @p: result of pinctrl_get() for this device* @hog_default: default state for pins hogged by this device* @hog_sleep: sleep state for pins hogged by this device* @mutex: mutex taken on each pin controller specific action* @device_root: debugfs root for this device*/struct pinctrl_dev {struct list_head node;struct pinctrl_desc *desc;struct radix_tree_root pin_desc_tree;#ifdef CONFIG_GENERIC_PINCTRL_GROUPSstruct radix_tree_root pin_group_tree;unsigned int num_groups;#endif#ifdef CONFIG_GENERIC_PINMUX_FUNCTIONSstruct radix_tree_root pin_function_tree;unsigned int num_functions;#endifstruct list_head gpio_ranges;struct device *dev;struct module *owner;void *driver_data;struct pinctrl *p;struct pinctrl_state *hog_default;struct pinctrl_state *hog_sleep;struct mutex mutex;#ifdef CONFIG_DEBUG_FSstruct dentry *device_root;#endif};
- linux运行不了gnuplot,linux下安装Gnuplot
- FPC电子线路板自动焊锡机器人设备
- 选购自动焊锡设备的三大要点详解
- 【Shell 命令集合 扩展命令】Linux chgrp命令使用教程
- 手机Linux服务器,安装domoticz实现简单物联网
- 计算机设备问题代码43
- linux 内存回收机制
- 松树果子的功效与作用
- 在大兴安岭大树年轮较密的方向是
- 3.1过滤敏感词