pmic输出电压设置+pinctrl子系统+平台驱动demo例程
第一章 环境
环境:以mtk平台为例,其他平台相似
内核版本:kernel-4.9
第二章 配置dts
2.1 在dts中定义节点(一般在项目的dtsi中)
test_node: test_node_ctrl {compatible = "test,test_node";vqmmc-supply = <&mt_pmic_vmc_ldo_reg>;vmmc-supply = <&mt_pmic_vmch_ldo_reg>;
};
2.2 在dts中配置引脚(一般在项目的dts中)
&test_node {pinctrl-names = "test_pin_output0","test_pin_output1";pinctrl-0 = <&step_dir_right_output0>;pinctrl-1 = <&step_dir_left_output1>;
};
&pio {pin_output0: test_output0 {pins_cmd_dat {pinmux = <PINMUX_GPIO33__FUNC_GPIO33>;slew-rate = <1>;//转换速率output-low;//低电平};};pin_output1: test_output1 {pins_cmd_dat {pinmux = <PINMUX_GPIO33__FUNC_GPIO33>;slew-rate = <1>;output-high;//低电平};};
};
第三章 驱动例程
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include <linux/proc_fs.h>
#include <linux/input/mt.h>
#include <linux/of_gpio.h>
#include <linux/of_irq.h>
#include <linux/sysfs.h>
#include <linux/device.h>
#include <linux/regulator/consumer.h>
#include <linux/platform_device.h>
//写一份平台驱动代码---platform_drv//-----------------------dts----------------------
/*
test_node: test_node_ctrl {compatible = "test,test_node";vqmmc-supply = <&mt_pmic_vmc_ldo_reg>;vmmc-supply = <&mt_pmic_vmch_ldo_reg>;
};
&test_node {pinctrl-names = "test_pin_output0","test_pin_output1";pinctrl-0 = <&pin_output0>;pinctrl-1 = <&pin_output1>;
};&pio {pin_output0: test_output0 {pins_cmd_dat {pinmux = <PINMUX_GPIO33__FUNC_GPIO33>;slew-rate = <1>;//转换速率output-low;//低电平};};pin_output1: test_output1 {pins_cmd_dat {pinmux = <PINMUX_GPIO33__FUNC_GPIO33>;slew-rate = <1>;output-high;//低电平};};
};
*///-----------------------drv----------------------
//pintcrl子系统获取引脚状态
struct platform_device * platform_dev;
struct pinctrl* test_pinctr;
struct pinctrl_state *pin_output0,*pin_output1;
int test_pinctrl_init(struct device *dev)
{int ret = -1;printk("%s()\n", __func__);test_pinctr = devm_pinctrl_get(dev);if (IS_ERR(test_pinctr)) {printk("err:test_pinctr\n");return 0;}pin_output0 = pinctrl_lookup_state(test_pinctr, "test_pin_output0");if (IS_ERR(pin_output0)) {printk("err:pin_output0\n");return -1;}pin_output1 = pinctrl_lookup_state(test_pinctr, "test_pin_output1");if (IS_ERR(pin_output1)) {printk("err:pin_output1\n");return -1;}ret = pinctrl_select_state(test_pinctr, pin_output1);if(ret < 0){printk("error:pin_output1\n");}return 1;
}
//平台探测函数
int test_drv_probe(struct platform_device * pdev)
{int ret;struct regulator *test_reg=NULL;struct regulator *pwr_reg=NULL;platform_dev = pdev;//获取电压输出引脚的寄存器test_reg = regulator_get(&pdev->dev,"vqmmc");if(!test_reg){printk("regulator_get failed!\n");goto err_regular;}pwr_reg = regulator_get(&pdev->dev,"vmmc");if(!pwr_reg){printk("regulator_get failed!\n");goto err_regular;}//设置电压输出引脚的值ret = regulator_set_voltage(test_reg,3300000,3300000);//设置电压值if (ret<0) {printk("regulator_set_voltage(ret = %d) failed:3000000!\n", ret);goto err_regular;}ret = regulator_set_voltage(pwr_reg,3300000,3300000);//设置电压值if (ret<0) {printk("regulator_set_voltage(ret = %d) failed:3000000!\n", ret);goto err_regular;}//电压输出设置完成//pinctrl子系统设置ret = test_pinctrl_init(&pdev->dev);if(ret < 1){printk("--------^_^ %s------test_pinctrl_init failed:ret=%d----\n",__FUNCTION__,ret);goto err_regular;}return 0;
err_regular:return ret;
}
int test_drv_remove(struct platform_device * pdev )
{printk("%s()\n", __func__);return 0;
}
int test_drv_suspend(struct platform_device *pdev, pm_message_t state)
{printk("%s()\n", __func__);return 0;
}
int test_drv_resume(struct platform_device *pdev)
{printk("%s() \n", __func__);return 0;
}
const struct of_device_id test_of_match[] = {{ .compatible = "test,test_node", },{}
};
// 4,创建用于和pdev匹配的列表--可不用
struct platform_device_id test_id_table[] = {{"test_one",0x124},{"test_two",0x234},{"test_three",0x1},
};
// 1 , 创建pdrv对象
struct platform_driver test_drv = {.probe = test_drv_probe, //探测:当匹配成功时,会执行该函数.remove = test_drv_remove, //移除 probe反操作.suspend = test_drv_suspend,//挂起.resume = test_drv_resume,//唤醒:唤醒、恢复时调用.driver = {.name = "test_DRV",//.pm = &tpd_pm_ops,.owner = THIS_MODULE,.of_match_table = test_of_match,},.id_table = test_id_table,
};
static int test_node_init(void)
{printk("%s() ok!\n", __func__);// 2,注册pdrvreturn platform_driver_register(&test_drv);//注册平台驱动
}
static void test_node_exit(void)
{printk("%s()!\n", __func__);
}
module_init(test_node_init);
module_exit(test_node_exit);
MODULE_DESCRIPTION("MTK gpio driver");
MODULE_AUTHOR("<huangzb>");
MODULE_LICENSE("GPL");
pmic输出电压设置+pinctrl子系统+平台驱动demo例程相关推荐
- linux pinctl 分析,Linux驱动架构之pinctrl子系统分析(一)
1.前言 在嵌入式系统中,许多SoC的内部都包含了pin控制器,通过芯片内部的pin控制器,我们可以配置一个或者一组引脚的状态和功能特性,Linux内核为了统一各SoC厂商的引脚管理,提供了pinct ...
- 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发
这周主要对pinctrl子系统进行分析,该分析的基本上已经分析完成,唯一没有细说的估计就是gpio与pinctrl之间的关联了.本章即是pinctrl子系统分析的最后一章,本章我们主要实现一个虚拟的p ...
- pinctrl子系统初始化RGB灯
文章目录 系列文章目录 前言 正文 引入 iomuxc节点:pinctrl子系统初窥 iomuxc节点 节点引脚配置方式 节点配置信息记录 pinctrl子系统实验:RGB灯引脚初始化 platfor ...
- Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍
文章目录 一.Linux设备模型介绍 (1)设备驱动模型总体介绍 (2)设备驱动模型文件表现 (3)设备驱动模型工作原理 [1]总线 [2]设备 [3]驱动 [4]注册流程 二.平台设备驱动介绍 (1 ...
- 【Linux驱动开发】010 pinctrl子系统
一.前言 上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别.本章我们就来学习一下如何借助 pinctr ...
- pinctrl 子系统介绍
pinctrl子系统 1. Pinctrl引入 1.1 Pinctrl作用 1.2 Pinctrl重要概念 2. Pinctrl子系统主要数据结构 2.1 设备树 2.1.1 理想模型 2.1.2 实 ...
- PINCTRL子系统
转载地址:http://www.360doc.com/content/14/0914/22/426085_409500256.shtml PINCTRL子系统用于处理: - 枚举和命名控制引脚 - 复 ...
- 第五十六讲 pinctrl子系统
第五十六讲 pinctrl子系统 文章目录 第五十六讲 pinctrl子系统 一.前言 二.iomuxc 节点 1.作用 2.节点信息 3.节点格式 4.引脚配置信息 三.imx_pinctrl和pi ...
- pinctrl子系统之二
以炬芯的方案来分析一下pinctrl子系统的代码 kernel/drivers/pinctrl/owl/pinctrl-s700.c中 pinctrl驱动是注册为平台驱动的. platform_dri ...
- Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)
以下讲的pinctrl子系统框架包括3点,1. pinctrl子系统简介:2.pinctrl子系统的注册:3. 设备驱动匹配时,probe执行前的管脚自动配置.写博客不易,如若转载,请注明出处. 一. ...
最新文章
- 是否能领先e步 浅析SSD中的eTLC和eMLC颗粒
- leetcode每日刷题计划-简单篇day8
- angularjs ngRoute的使用简单例子
- 算法导论之贪心算法(Huffman编码和拟阵)
- python文件操作2:在指定目录下查找指定后缀名的文件
- 近两年火热的微服务springboot不同配置文件详细讲解
- Spring-data-redis入门
- 【CyberSecurityLearning 55】SQL注入
- FTP协议常用COMMAND和状态码
- python设计大赛_GitHub - FatBallFish/Multimedia-Python: 多媒体设计大赛-Python后端
- xp和win7安装telnet服务
- php解escape,PHP下escape解码函数用法示例
- 学习进度——第十二周
- Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境
- 中国省市县数据_收货地址
- 安装Vista与XP双系统后如何做好备份
- 计算机主机usb端口使用不了,电脑USB接口不能用怎么办解决教程
- 软件工程-团队作业2
- 软件需求包括3个不同的层次――业务需求、用户需求和功能需求
- 高可用和热备份是什么意思?
热门文章
- 年底了,诈骗的怎么这么多?
- Cisco 交换机的操作
- 从盘古开天辟地说起JVM性能调优
- session 、cookie、token的区别及联系
- C++大小写字母转换(齐全)
- 2022年最新的Detectron 2 (0.6) 安装流程(联想笔记本Y9000K+Anaconda+Win 11 +RTX3070)
- with ties 的用法
- 赖美云的认证照_火箭少女最新路透照出炉:吴宣仪赖美云魅力十足,张紫宁傅菁凭颜值圈粉...
- python扩展包怎么安装_Python中扩展包的安装方法详解
- Android的在线热更新方案_Robust