zoukankan      html  css  js  c++  java
  • 5、regulator系统的概念及测试

    概念:
    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

  • 相关阅读:
    CLR Via
    HTML&XML
    SNS研究
    DotNet&C#
    电子商务
    WCF学习
    SQL
    构架设计
    JS&Ajax
    NHibernate之旅系列文章导航
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8978138.html
Copyright © 2011-2022 走看看