转载请注明出处,亲1,注册到平台 举例:

extern struct gpio_regulator_platform_data v210_gpio_regs_platform_data;
static struct platform_device v210_gpio_regulators_dev = {.name        = "gpio-regulators",.id        = -1,.dev = { .platform_data = &v210_gpio_regs_platform_data },
};

2,注册设备初始化接口

static struct regulator_consumer_supply gpio_reg_gpa07_consumers[] = {{.supply        = "vdd_gps",},
};
static struct regulator_init_data gpio_reg_gpa07 = {.constraints    = {.name        = "VDD_GPS12/VDD_GPS28",.valid_ops_mask = REGULATOR_CHANGE_STATUS,.state_mem    = {.mode    = REGULATOR_MODE_NORMAL,.enabled = 0,},},.num_consumer_supplies    = ARRAY_SIZE(gpio_reg_gpa07_consumers),.consumer_supplies    = gpio_reg_gpa07_consumers,
};static struct regulator_consumer_supply gpio_reg_gpb3_consumers[] = {{.supply        = "vdd_camb",},
};
static struct gpio_regulator v210_gpio_regulators [] = {[0] = {  /*"VDD_GPS",*/.gpio =  S5PV210_GPA0(7),.name = "LDO_GPA0(7)",.type = GPIO_REGULATOR_VOLTAGE,.initdata = &gpio_reg_gpa07,},[1] = { /*"VDD_CAMA",*/.gpio =  S5PV210_GPB(0),.name = "LDO_GPB(0)",.type = GPIO_REGULATOR_VOLTAGE,.initdata = &gpio_reg_gpb0,},[2] = { /*"VDD_CAMB",*/.gpio =  S5PV210_GPB(3),.name = "LDO_GPB(3)",.type = GPIO_REGULATOR_VOLTAGE,.initdata = &gpio_reg_gpb3,}    。。。。。    。。。。。
};struct gpio_regulator_platform_data v210_gpio_regs_platform_data  = {.num_regulators = ARRAY_SIZE(v210_gpio_regulators),.regulators = v210_gpio_regulators,
};

3,Regulator设备驱动加载的时候初始化,下面的驱动的一般流程和LINUX下的流驱动   字符设备等基本没区别

#include <linux/module.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <linux/regulator/driver.h>
#include <linux/mutex.h>
#include <linux/gpio.h>
#include <plat/gpio-cfg.h>#include <plat/gpio_regulator.h>
#include <linux/slab.h>struct gpio_regulator_device_data {struct device        *dev;struct gpio_regulator_platform_data *pdata;int    num_regulators;struct regulator_dev    **rdev;struct XXX_gpio_regulator_data *pregdata;
};struct XXX_gpio_regulator_data{struct regulator_desc reg_desc;int gpio_pin;int active_low;enum gpio_pull_mode pull;int gpio_sleep;    /*sleep mode. */
};static int XXX_gpio_reg_is_enabled(struct regulator_dev *rdev)
{struct gpio_regulator_device_data *pddata = rdev_get_drvdata(rdev);struct XXX_gpio_regulator_data *pregdata;int id, ret;id = rdev_get_id(rdev);pregdata = &pddata->pregdata[id];ret = (gpio_get_value(pregdata->gpio_pin))?1:0;if(pregdata->active_low)ret = !ret;printk("XXX_gpio_reg_is_enabled, regulator:[%s] is %d\n", pregdata->reg_desc.name, ret);printk("gpio_pin: 0x%0x\n", pregdata->gpio_pin);return ret;
}static int XXX_gpio_reg_enable(struct regulator_dev *rdev)
{struct gpio_regulator_device_data *pddata = rdev_get_drvdata(rdev);struct XXX_gpio_regulator_data *pregdata;int id, value, ret;id = rdev_get_id(rdev);pregdata = &pddata->pregdata[id];printk("XXX_gpio_reg_enable, regulator: %s\n", pregdata->reg_desc.name);printk("gpio_pin: 0x%0x\n", pregdata->gpio_pin);s3c_gpio_cfgpin(pregdata->gpio_pin,S3C_GPIO_OUTPUT);s3c_gpio_setpull(pregdata->gpio_pin,((__force s3c_gpio_pull_t)pregdata->pull));gpio_set_value(pregdata->gpio_pin, (pregdata->active_low?0:1));return 0;
}static int XXX_gpio_reg_disable(struct regulator_dev *rdev)
{struct gpio_regulator_device_data *pddata = rdev_get_drvdata(rdev);struct XXX_gpio_regulator_data *pregdata;int id, value, ret;id = rdev_get_id(rdev);pregdata = &pddata->pregdata[id];printk("XXX_gpio_reg_disable, regulator: %s\n", pregdata->reg_desc.name );printk("gpio_pin: 0x%0x\n", pregdata->gpio_pin);s3c_gpio_cfgpin(pregdata->gpio_pin,S3C_GPIO_OUTPUT);s3c_gpio_setpull(pregdata->gpio_pin,((__force s3c_gpio_pull_t)pregdata->pull));gpio_set_value(pregdata->gpio_pin, (pregdata->active_low?1:0));return 0;
}static int XXX_gpio_reg_set_voltage(struct regulator_dev *rdev,int min_uV, int max_uV)
{return 0;
}static int XXX_gpio_reg_get_voltage(struct regulator_dev *rdev)
{return 0;
}static int XXX_gpio_reg_suspend_enable(struct regulator_dev *rdev)
{return 0;
}static int XXX_gpio_reg_suspend_disable(struct regulator_dev *rdev)
{return 0;
}static int XXX_gpio_reg_set_suspend_voltage(struct regulator_dev *rdev, int uV)
{return 0;
}static struct regulator_ops XXX_gpio_reg_ops = {.list_voltage    = NULL, //XXX_gpio_reg_list_voltage,.is_enabled    = XXX_gpio_reg_is_enabled,.enable        = XXX_gpio_reg_enable,.disable    = XXX_gpio_reg_disable,.get_voltage    = XXX_gpio_reg_get_voltage,.set_voltage    = NULL,.set_suspend_enable    = XXX_gpio_reg_suspend_enable,.set_suspend_disable    = XXX_gpio_reg_suspend_disable,.set_suspend_voltage    = NULL,
};static int __devinit XXX_gpio_regulators_probe(struct platform_device *pdev)
{int i, error;int id, ret;//jeff,struct gpio_regulator_platform_data *pdata = pdev->dev.platform_data;struct gpio_regulator_device_data *ddata;struct regulator_desc *gpio_reg_desc;printk("XXX_gpio_regulators_probe\n");ddata = kzalloc(sizeof(struct gpio_regulator_device_data),GFP_KERNEL);if (!ddata)return -ENOMEM;ddata->rdev  = kzalloc(sizeof(struct regulator_dev *) * (pdata->num_regulators + 1), GFP_KERNEL);if (!ddata->rdev) {kfree(ddata);return -ENOMEM;}    ddata->pregdata = kzalloc(sizeof(struct XXX_gpio_regulator_data) * (pdata->num_regulators + 1), GFP_KERNEL);if (!ddata->pregdata) {kfree(ddata->rdev);kfree(ddata);return -ENOMEM;}ddata->num_regulators = pdata->num_regulators;for (i = 0; i < ddata->num_regulators; i++) {gpio_reg_desc = &(ddata->pregdata[i].reg_desc);gpio_reg_desc->id = i;gpio_reg_desc->name =  pdata->regulators[i].name;gpio_reg_desc->type = pdata->regulators[i].type;gpio_reg_desc->ops = &XXX_gpio_reg_ops;gpio_reg_desc->n_voltages = 1;gpio_reg_desc->owner    = THIS_MODULE,/*add regulator pin configure*/ddata->pregdata[i].gpio_pin = pdata->regulators[i].gpio;ddata->pregdata[i].active_low= pdata->regulators[i].active_low;ddata->pregdata[i].pull = pdata->regulators[i].pull;/**/ddata->rdev[i] = regulator_register(gpio_reg_desc,ddata->dev,pdata->regulators[i].initdata, ddata);ret = IS_ERR(ddata->rdev[i]);if (ret)printk("[gpio_regulator] regulator:\"%s\" init failed\n", gpio_reg_desc->name);    elseprintk("[gpio_regulator] regulator:\"%s\" init success\n", gpio_reg_desc->name);}return ret;
}static int __devexit XXX_gpio_regulators_remove(struct platform_device *pdev)
{printk("XXX_gpio_regulators_remove\n");return 0;
}static struct platform_driver gpio_regulators_driver = {.probe        = XXX_gpio_regulators_probe,.remove        = __devexit_p(XXX_gpio_regulators_remove),.driver        = {.name    = "gpio-regulators",.owner    = THIS_MODULE,
#if 0.pm    = &gpio_regulators_pm_ops,
#endif}
};static int __init XXX_gpio_regulator_init(void)
{printk("XXX_gpio_regulator_init\n");return platform_driver_register(&gpio_regulators_driver);
}static void __exit XXX_gpio_regulator_exit(void)
{platform_driver_unregister(&gpio_regulators_driver);
}
subsys_initcall(XXX_gpio_regulator_init);
//subsys_initcall_sync(XXX_gpio_regulator_init);
module_exit(XXX_gpio_regulator_exit);MODULE_DESCRIPTION("XXX gpio controlled regulator driver");
MODULE_AUTHOR("SSCR jeff ");
MODULE_LICENSE("GPL");

4,使用方式

首先,

static  struct regulator *xxx_reg; 定义一个regulator结构体指针;

其次,

xxx_reg = regulator_get(NULL, "vdd_gps");获取这个指针

最后操作

if (IS_ERR(xxx_reg)) {
printk(KERN_ERR "failed to get resource %s\n", "xxx_reg");
}else{
regulator_enable(wifi_reg);//通过此来操作I/O控制I/O

}

好处是,方便LINUX各个驱动内部之间的控制。当然也可以用一般的GPIO流驱动替换

转载于:https://www.cnblogs.com/heimi/archive/2012/12/11/2812534.html

Regulator相关GPIO控制使用流程简析相关推荐

  1. uboot源码分析(1)uboot 命令解析流程简析

    uboot 命令解析流程简析 uboot正常启动后,会调用main_loop(void)函数,进入main_loop()之后,如果在规定的时间(CONFIG_BOOTDELAY)内,没有检查到任何按键 ...

  2. Android开机启动流程简析

    Android开机启动流程简析 (一) 文章目录 Android开机启动流程简析 (一) 前言 一.开机启动的流程概述 二.Android的启动过程分析 (1).总体流程 init简述 Zygote简 ...

  3. CAS流程简析 服务端校验Ticket

    相关阅读 CAS基础组件 简介 CAS流程简析 服务端处理未携带Service登录请求 CAS流程简析 服务端处理携带Service登录请求 CAS基础组件 客户端过滤器 简介 用户访问客户端的请求若 ...

  4. Linux的启动流程简析(以Debian为例)

    Linux的启动流程简析(以Debian为例) 正文: 前面的文章探讨BIOS和主引导记录的作用.那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事 ...

  5. Python源码学习:启动流程简析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> Python简介: python主要是动态语言,虽然Python语言也有编译,生成中 ...

  6. AsyncTask 源码流程简析

    参考链接: https://blog.csdn.net/lmj623565791/article/details/38614699 AsyncTask的几个重要函数和参数 AsyncTask是一个抽象 ...

  7. GB28181国标协议通讯流程简析以及NVR注册不上等相关问题点记录

    目录 留给读者 初识GB28181协议 什么是SIP? SIP中的INVITE SIP中的MESSAGE 什么是NVR? GB28181从注册到注销都经历了哪些步骤? 注册 设备信息查询 实时视频.历 ...

  8. android uboot启动过程,Android启动流程简析(一)

    最近一时兴起,想对Android的启动流程进行一次分析,经过一番整理,从以下几个方面进行总结,代码部分只讨论思路,不论细节. Android架构介绍 Android启动概述 BootLoader介绍 ...

  9. android 5.1 壁纸路径,RTFSC – Android5.1 壁纸设置流程简析 – RustFisher

    Android5.1 壁纸设置流程浅析 Ubuntu14.04  Android5.1  Source Insight3 这里只是简单分析一下5.1里是如何设置壁纸的:这个流程和4.4有一些不同.但基 ...

最新文章

  1. 【深度解析】FPGA四大设计要点
  2. 自定义构建基于.net core 的基础镜像
  3. Codeforces Round #516 (Div. 2Div.1)
  4. 前端学习(2863):简单秒杀系统学习之优化cookie
  5. python的合法语句_Python练习2
  6. 物联网安全白皮书_天翼物联网安全白皮书发布 有方科技参与编纂
  7. (转)C#开发微信门户及应用(3)--文本消息和图文消息的应答
  8. ssm把后端数据传到前端_ssm框架中前端jsp页面的数据除了表单提交以外如何传到后台?...
  9. Elementui tabs组件内添加组件
  10. Tushare 简介与使用
  11. C# 填充Excel
  12. 计算机网上邻居怎么隐藏,Win7桌面不显示网上邻居图标方法 win7系统如何隐藏网上邻居图标...
  13. 人脸识别与膜虹识别_虹膜识别技术优势明显 比指纹、人脸识别更可靠
  14. 自动发送企业微信通知,让我来教你真的超简单
  15. Python编程:腾讯防水墙原理浅析与Flask结合测试
  16. 内存管理(二) - MRC关键字解读
  17. fatal: bad boolean config value ‘“false”‘ for ‘http.sslverify
  18. EntityFramworkCore 配置种子数据(seeding data)
  19. iptables匹配功能length
  20. H.264笔记(接上节)

热门文章

  1. torch.meshgrid 使用探究
  2. 用latex写IEEE论文投稿的踩坑笔记
  3. 金融工程学(一):概述
  4. 1.GoAhead运行
  5. Android一键锁屏,去除锁屏密码
  6. WebView(一)
  7. stm32实现毫秒ms微秒us级延时
  8. WPF Button 设置圆角 CornerRadius属性的使用
  9. 阿里云周宇:神龙计算平台智能运维体系建设
  10. 589. N 叉树的前序遍历(javascript)589. N-ary Tree Preorder Traversal