针对linux 内核各子系统学习而言,在理解了各子系统的实现背景后,再从数据结构入手,可快速理解其子系统的实现流程 。因此本章我们从regulator子系统的数据结构入手,从而理解regulator子系统的实现 。本章的提纲如下:
一、数据结构间的关联说明
二、各数据结构介绍
一、数据结构间的关联说明在上一章中,我们说明针对regulator子系统,包括regulator device(电源提供者)、电源管理芯片(pmic)、电源使用者(consumer)、电源域等几个概念 。而在regulator子系统的实现中,则抽象了数据结构regulator_device(表示一个regulator device)、regulator(对应一个电源使用者 consumer),然后围绕这两个数据结构,又定义了regulator_map、regulator_enable_gpio、regulator_desc、regulator_ops、regulator_constraints、regulator_config、regulator_init_data、regulator_consumer_supply等数据结构 。稍后我们一一展开说明 。
如下图所示,表示数据结构struct regulator_map、struct regulator、struct regulator_dev的关联图,下面我们详细说明下这张图的意义:
- 系统中所有注册的struct regulator_dev类型的变量,均会添加到链表regulator_list中,而这些操作由接口regulator_register实现 。
- 在regulator_register接口中,针对一个regulator device的所有使用者,均为其创建struct regulator_map类型变量,并将其插入regulator_map_list链表上,而struct regulator_map中包含该使用者的名称(使用者对应的设备名称、使用类型、regulator_dev类型的指针指向该电源的提供者);
- 当电源的使用者(对应的device驱动)在驱动接口中调用regulator_get,申请一个电源使用信息时,则根据该设备的名称、supply名称,在regulator_map_list上查找对应struct regulator_map类型的变量,并创建struct regulator类型的变量,并将其加入到struct regulator_dev的consumer_list链表中,从而实现下图struct regulator、struct regulator_dev的关联(它们之间的关联,需要借助注册在regulator_map_list链表的regulator_map类型变量) 。
- 若该regulator_dev通过gpio进行enable/disable的控制,则在调用接口regulator_register接口进行regulator_dev的注册时,则创建对应struct regulator_enable_gpio类型变量的创建,并注册到链表regulator_ena_gpio_list中 。
文章插图
二、各数据结构介绍
本章主要介绍数据结构regulator_dev、regulator_map、regulator等数据结构
regulator_dev相关数据结构说明struct regulator_dev包含多个数据结构,因此我们将这几个数据结构间的关联进行说明 。如下图所示即为regulator_dev相关的数据结构的关联图 。
struct regulator_config相关数据结构struct regulator_config相关数据结构主要用于描述regulator_dev的所有使用者信息,以及该regulator_dev的输出参数信息,具体说明如下:
- struct regulator_consumer_supply表示一个regulator_dev的使用者描述,包含使用者对应的设备名称(也可为空)、supply名称,通过这些描述信息,在调用接口regulator_register接口进行regulator_dev的注册时,则根据该数据结构描述的信息,完成上面所说的struct regulator_map类型变量的注册,以便调用regulator_get时可实现struct regulator类型变量的创建;
- 若该regulator_dev通过gpio进行enable/disable的控制,则需要对该gpio进行描述(包含gpio号、gpio使能状态、gpio状态是否为invert等),在调用接口regulator_register接口进行regulator_dev的注册时,则创建对应struct regulator_enable_gpio类型变量的创建,并注册到链表regulator_ena_gpio_list中 。
- 数据结构struct regulation_constraints描述该regulator dev相关的配置信息,包括最小输出电压、最大输出电压、初始模式、是否支持suspend state(suspend to memory、suspend to disk、suspend standby状态等)
struct regulator_desc相关数据结构主要涉及struct regulator_desc、struct regulator_ops,具体说明如下:
- struct regulator_desc描述该regulator device的类型(电压、电流、电流和电压)、中断id、支持的输出电压个数、操作类型(可改变电压等)、输出模式(fast、normal、idle、standby等);若该regulator device在注册的时候支持通过regmap进行配置(如该regulator device可通过spi、iic接口访问,则可以通过spi/iic对应的regmap接口访问该regulator device的寄存器,进行配置操作),则需要定义enable_reg、enable_mask、Apply_reg等参数的信息,以便通过regmap进行配置
推荐阅读
- Linux rpm命令管理软件包
- 郭子仪最后的结局是怎样的?
- 敬老爱老的优美句子有哪些?
- 护肤品|抗衰老护肤品什么牌子效果好?抗衰老护肤品排行榜前十名
- 万代南梦宫|万代推出新款电子宠物机:联动《侏罗纪》能养26种恐龙
- 新生儿嗯嗯叫满脸通红
- 新生儿猛长期的表现
- 第6年检车,第7年还需要领年检电子贴吗?
- 怎么才可以瘦鼻翼?
- 爽肤水|2022年爽肤水哪个牌子好?补水收缩毛孔的爽肤水排行榜