Linux regulator子系统分析之四 虚拟regulator device驱动实现

      在前面几章,我们分析了regulator子系统框架,主要是从数据结构及数据结构间的关联分析了regulator子系统。为了让大家对regulator子系统有一个深入的认识,我们本章将实现一个虚拟的regulator device驱动,从而掌握对regulator子系统的开发流程。

     本章的主要内容分为如下几部分:

一、 regulator device 驱动开发流程简要说明

二、virt regulator device简要介绍

三、virt regulator device driver设计

四、virt regulator consumer实现

 

一、预备知识

针对本文章,读者需要了解如下几方面的内容:

  1. Regulator 子系统相关的接口;
  2. 熟悉platform 驱动开发;
  3. 熟悉iic驱动开发;
  4. 熟悉device驱动子系统中属性文件的创建等接口
  5. 熟悉regmap相关的接口调用

 

二、 regulator device 驱动开发流程简要说明

  1. 创建struct regulator_desc类型的变量,包括regulator device的类型、寄存器定义、操作函数(struct regulator_ops类型的变量);
  2. 创建struct regulator_config类型的变量,包括regulator device相关的约束信息、consumer信息、regmap/enable gpio等相关信息;
  3. 调用regulator_register,完成regulator device的注册。

 

Regulator consumer的开发

  1. 通过regulator_get接口,依据supply name、device name在regulator_map查找是否存在对应的regulator_map信息,若存在则获取到对应的regulator_dev,并创建struct regulator 类型的变量;
  2. 通过regulator_get获取到struct regulator类型的变量后,则可以进行regulator的enable/disable等操作;
  3. 通过regulator_put释放regulator。

 

三、virt regulator device简要介绍

本次我们需要取得的虚拟regulator device是一个iic设备,该设备包含两个寄存器:

  1. 寄存器0x01表示电压输出选择寄存器,其中bit[7:4]表示输出电压的select id,支持8个电压输出选择,最小输出电压为2000000,电压调节步进为200000uV
  2. 寄存器0x2表示电压输出的使能与去使能,其中bit4为1表示电压输出使能;0表示关闭电压输出

 

 

 

 

四、virt regulator device driver设计

针对virt regulator device driver的设计,我们主要分为如下两部分:

  1. 创建i2c device、i2c driver,主要进行virt regulator device的驱动,在i2c driver的probe接口中,完成regulator device相关的约束信息的配置、consumer相关的配置信息、iic client对应的regmap的创建,并将这些信息作为platform device init data数据,创建对应的platform device;
  2. 完成regulator device platform driver,在该platform driver的probe接口中,依据platform device init data、struct regulator_desc类型变量(包括voltage sel寄存器、voltage sel mask、enable reg、enable reg mask、struct regulator_ops等配置),调用regulator_register,完成regulator_dev的创建及注册;

         下图即为这两部分的关联,在virt regulator i2c device与i2c driver进行绑定时,在i2c device driver的probe接口中完成platform device的注册,而在platform device与platform driver进行绑定时,在platform driver 的probe接口中,即完成上述2中所需完成的功能。

 

相关数据结构:

  1. virt_regulator_plat_data_t主要用于platform device相关的initdata信息,包含struct regulator_init_data类型变量(用于regulator_device相关的约束信息、consumer信息)、regmap(主要表示该virt regulator iic client对应的regmap,从而在regulator platform device driver中隐藏对virt regulator访问的真实接口信息(直接使用regmap_read、regmap_write即可访问该virt regulator));
  2. struct virt_regulator_dev主要表示一个虚拟的regulator device,包含regulator_dev成员

 

regulator_desc定义

       因为我们定义的virt regulator提供电压的输出配置、电压输出的使能等内容,且这些操作可直接通过操作regmap实现,因此,此处的list_voltage、map_voltage、get_voltage_sel等接口直接使用regulator子系统定义的接口即可,无须额外实现这些接口。

 

regulator_init_data的定义

      针对该virt regulator,其电压约束信息为2800000uV,有一个consumer,该consumer的的supply 类型名称为virt-vcc,consumer对应的设备名称为virt_consumer01;

 

 

sysfs属性文件

       因我们是virt regulator device,我们只能通过借助sysfs来作为virt regulator device相关的寄存器的通信机制;此处主要创建voltage_sel、voltage_enable两个属性文件,用于dump virt regulator device的电压输出选择、电压使能信息。

 

五、virt regulator consumer实现

         为了验证该virt regulator device,我们创建一个简单的platform device,在该platform device driver的probe接口中完成regulator的获取以及regulator device的电压输出使能操作;而在该platform device driver的remove接口中完成regulator的释放以及关闭regulator device的电压输出。

代码实现也比较简单,如下图所示:

 

六、验证说明

本次验证的驱动包括如下几个:

  1. virt_i2c_controller目录下存储的是虚拟iic控制器驱动代码,实现虚拟iic控制器模拟、virt regulator device模拟;
  2. virt0701_driver目录下存储的是virt regulator对应的iic driver以及virt regulator对应的platform device;
  3. virt_regulator_chip目录下存储的是virt regulator对应的platform device driver;
  4. virt_consumer目录下存储的是virt regulator的consumer。

 

验证步骤:

  1. 执行insmod virt_i2c_controller.ko;
  2. 执行insmod virt0701_driver.ko;
  3. 执行insmod virt_regulator_chip.ko;

       此时在目录/sys/bus/i2c/devices/0-0030下,可通过voltage_sel、voltage_enable查看virt regulator相关的输出电压选择、电压输出使能信息,如下所示,此时该regulator device还没有使能,而voltager sel中已经根据上述驱动中定义的regulator device的约束信息,将输出电压设置为280000uV.

然后执行命令insmod virt_consumer.ko,此时电压输出使能已设置

 

 

     至此,我们完成了virt regulator device driver的开发,基本上熟悉了regulator子系统下的驱动开发,我们也算是完成了regulator子系统的驱动分析。

     本篇文章涉及的代码链接如下,代码已在ubuntu16.04上完成测试验证:https://gitee.com/jerry_chg/virt_regulator.git

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值