概念:
Regulator : 电源芯片, 比如电压转换芯片
Consumer : 消费者,使用电源的部件, Regulator是给Consumer供电的
machine : 单板,上面焊接有Regulator和Consumer
Constraints : 约束, 比如某个电源管理芯片输出的电压范围
Supply : 提供电源的部件, Regulator就是一个Supply; Regulator A可以给Regulator B供电, 那么Regulator B的Supply就是A

regulator 电源芯片本身的驱动程序:.enable、.diable、.set_voltage、.set_current

Consumer在驱动中引用regulator的函数工作

machine(单板):1、Regulator和Consumer的对应关系

        2、约束:单板相关的条件,比如电压范围

(详细文档见内核顶层目录下Documentation/power/regulator目录下的overview.txt和其他文档)

写驱动程序:
1. regulator:(可以参考drivers/regulator/tps6105x-regulator.c)
注册一个platform_driver: 在它的probe函数里分配、设置、注册一个regulator
"设置"里要做的事情: 实现regulator的操作, 比如enable, disable, set_voltage

在regulator的probe函数中通过dev_get_platdata获得在machine端设置的私有数据
2. machine:
注册一个platform_device: 在它的私有数据里指定regulator和consume的对应关系(这个电源芯片给哪一个部件供电)
指定约束条件(比如电压范围)

在machine端的platform_device中的.dev中设置platform_data私有数据(regulator和consumer的对应关系,约束条件),该私有数据供regulator在register的时候使用

在代码中

static struct regulator_consumer_supply myregulator_supplies[] = {
REGULATOR_SUPPLY("VCC", "mylcd"),//”mylcd”的名字是根据lcd驱动动注册的platform_device的名字,“VCC”是指的consumer的电源管脚名称(有的consumer有多个电源管脚)
};是对应关系,consumer中通过dev(中有mylcd名字)和VCC找到regulator,在suspend和resume中调用它的enable和disable

3. consumer: 使用即可: regulator_get, regulator_enable, regulator_disable, regulator_set_voltage....

regulator_register流程分析:
  // 分配regulator_dev
  rdev = kzalloc(sizeof(struct regulator_dev), GFP_KERNEL);

  /* set regulator constraints 设置约束条件*/
  set_machine_constraints
  add_regulator_attributes

  /* add consumers devices */
  set_consumer_device_supply
  在regulator_map_list链表里生成一项regulator_map: 它里面有dev_name(consumer的名字),supply(cosumer的电源引脚名字)

  // 把regulator_dev放入regulator_list
  list_add(&rdev->list, &regulator_list);

编译测试:
1. make menuconfig
Device Drivers --->
  [*] Voltage and Current Regulator Support --->

修改 drivers/video/Makefile把原来的LCD驱动去掉
#obj-$(CONFIG_FB_S3C2410) += lcd_4.3.o

make uImage

2. 编译驱动
3. 使用新内核启动
4. 安装驱动:

insmod regulator.ko

insmod machine.ko

insmod consumer_lcd_4.3.ko

最新文章

  1. [Android]Volley源码分析(五)
  2. 【哈希表】CodeVs1230元素查找
  3. Day2 summary
  4. 洛谷P1736 创意吃鱼法
  5. C++经典编程题#1:含k个3的数
  6. Multiply Strings [LeetCode]
  7. 让 Putty 保存密码,自动登陆的四种方法
  8. Android Activity启动模式
  9. php引用传值
  10. UF访问,一些对用友最新的旗舰级产品U9一些引进(图像)
  11. <context:component-scan>
  12. Python3的string库模板的应用
  13. docker ,docker与虚拟机的区别
  14. CCF2017-9-1
  15. webpack 中版本兼容性问题错误总结
  16. mysql主从复制-方案2
  17. 判断JS的数据类型
  18. Linux下环境变量配置方法梳理(.bash_profile和.bashrc的区别)
  19. yum常用命令大全
  20. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

热门文章

  1. (MySQL里的数据)通过Sqoop Import HBase 里 和 通过Sqoop Export HBase 里的数据到(MySQL)
  2. ElasticSearch vs Lucene多维度分析对比
  3. 转 C#:使用MD5对用户密码加密与解密
  4. BZOJ1814: Ural 1519 Formula 1(插头Dp)
  5. rpm---rpm包管理
  6. C# Unable to load DLL 'WzCanDll.dll':找不到指定的模块
  7. Summary Day32
  8. 各种join一目了然: join 、inner join、left join 、right join、full join
  9. badblocks 检查硬盘是否有坏道
  10. 35.Intellij IDEA设置忽略部分类编译错误