基于韦东山视频 regulator 学习笔记

前言

无前言

主题

概念:

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

写驱动程序:

    // 参考 drivers/regulator/tps6105x-regulator.c
    
    1. regulator:【供给】                                                                                                     -----
       注册一个 platform_driver: 在它的 probe 函数里分配、设置、注册一个 regulator                                                |                                      
       "设置"里要做的事情: 实现 regulator 的操作, 比如 enable, disable, set_voltage                                               |=》 一对平台设备与驱动                                                                
    2. machine:【映射关系】                                                                                                       |                                    
       注册一个 platform_device: 在它的私有数据里指定 regulator 和 consumer 的对应关系(这个电源芯片给哪一个部件供电)              |                                                                        
                                指定约束条件(比如电压范围)                                                                    -----                  
                                约束里会指定 consumer 的平台设备名称
                                
    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);     

    /* 生成链表结构如下:
        regulator_list                                 图示:    
            |-regulator_dev                    |- 链表 
            |-regulator_dev                    >- 包含    
            |-regulator_dev                       
            |-regulator_dev
            |-regulator_dev
            |-regulator_dev
            。。。

        regulator_map_list
           |-regulator_map 
           |    >-dev_name: consumer 的名字【即调用的设备名字,如 mylcd 平台设备】
           |    >-supply: consumer 的电源引脚
           |    >-regulator: 指向对应的 regulator_dev 
           |-regulator_map 
           |    >-dev_name: consumer的名字
           |    >-supply: consumer 的电源引脚 
           |    >-regulator: 指向对应的 regulator_dev 
           。。。
        
        
    */

regulator_get() 流程:

    // 完成当前平台设备与电源设备与引脚的绑定,返回一个 regulator 方便控制
    regulator_get(当前的平台设备【用于获得 consumer 的名字,即平台名称】,电源引脚名称)
        _regulator_get
            list_for_each_entry(map, &regulator_map_list, list) 
                /* 根据平台名字以及 电源引脚名称,在 regulator_map_list 中查找 */

            regulator = create_regulator(【regulator_register 时生成的 regulator_dev】, 【调用此函数的平台设备】, 【电源引用】);
            return regulator;    

编译测试:

    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. 安装驱动:

猜你喜欢

转载自blog.csdn.net/wangjun7121/article/details/88139113