前言
无前言
主题
概念:
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, ®ulator_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, ®ulator_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. 安装驱动: