第一章 环境

环境:以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例程相关推荐

  1. linux pinctl 分析,Linux驱动架构之pinctrl子系统分析(一)

    1.前言 在嵌入式系统中,许多SoC的内部都包含了pin控制器,通过芯片内部的pin控制器,我们可以配置一个或者一组引脚的状态和功能特性,Linux内核为了统一各SoC厂商的引脚管理,提供了pinct ...

  2. 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发

    这周主要对pinctrl子系统进行分析,该分析的基本上已经分析完成,唯一没有细说的估计就是gpio与pinctrl之间的关联了.本章即是pinctrl子系统分析的最后一章,本章我们主要实现一个虚拟的p ...

  3. pinctrl子系统初始化RGB灯

    文章目录 系列文章目录 前言 正文 引入 iomuxc节点:pinctrl子系统初窥 iomuxc节点 节点引脚配置方式 节点配置信息记录 pinctrl子系统实验:RGB灯引脚初始化 platfor ...

  4. Linux设备模型、平台设备驱动、设备树(device tree)、GPIO子系统以及pinctrl子系统介绍

    文章目录 一.Linux设备模型介绍 (1)设备驱动模型总体介绍 (2)设备驱动模型文件表现 (3)设备驱动模型工作原理 [1]总线 [2]设备 [3]驱动 [4]注册流程 二.平台设备驱动介绍 (1 ...

  5. 【Linux驱动开发】010 pinctrl子系统

    一.前言 上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别.本章我们就来学习一下如何借助 pinctr ...

  6. pinctrl 子系统介绍

    pinctrl子系统 1. Pinctrl引入 1.1 Pinctrl作用 1.2 Pinctrl重要概念 2. Pinctrl子系统主要数据结构 2.1 设备树 2.1.1 理想模型 2.1.2 实 ...

  7. PINCTRL子系统

    转载地址:http://www.360doc.com/content/14/0914/22/426085_409500256.shtml PINCTRL子系统用于处理: - 枚举和命名控制引脚 - 复 ...

  8. 第五十六讲 pinctrl子系统

    第五十六讲 pinctrl子系统 文章目录 第五十六讲 pinctrl子系统 一.前言 二.iomuxc 节点 1.作用 2.节点信息 3.节点格式 4.引脚配置信息 三.imx_pinctrl和pi ...

  9. pinctrl子系统之二

    以炬芯的方案来分析一下pinctrl子系统的代码 kernel/drivers/pinctrl/owl/pinctrl-s700.c中 pinctrl驱动是注册为平台驱动的. platform_dri ...

  10. Linux pinctrl子系统框架流程详解(基于Kernel 3.16,arm,设备树)

    以下讲的pinctrl子系统框架包括3点,1. pinctrl子系统简介:2.pinctrl子系统的注册:3. 设备驱动匹配时,probe执行前的管脚自动配置.写博客不易,如若转载,请注明出处. 一. ...

最新文章

  1. 是否能领先e步 浅析SSD中的eTLC和eMLC颗粒
  2. leetcode每日刷题计划-简单篇day8
  3. angularjs ngRoute的使用简单例子
  4. 算法导论之贪心算法(Huffman编码和拟阵)
  5. python文件操作2:在指定目录下查找指定后缀名的文件
  6. 近两年火热的微服务springboot不同配置文件详细讲解
  7. Spring-data-redis入门
  8. 【CyberSecurityLearning 55】SQL注入
  9. FTP协议常用COMMAND和状态码
  10. python设计大赛_GitHub - FatBallFish/Multimedia-Python: 多媒体设计大赛-Python后端
  11. xp和win7安装telnet服务
  12. php解escape,PHP下escape解码函数用法示例
  13. 学习进度——第十二周
  14. Intel 64/x86_64/IA-32/x86处理器基本执行环境 (2) - 64位执行环境
  15. 中国省市县数据_收货地址
  16. 安装Vista与XP双系统后如何做好备份
  17. 计算机主机usb端口使用不了,电脑USB接口不能用怎么办解决教程
  18. 软件工程-团队作业2
  19. 软件需求包括3个不同的层次――业务需求、用户需求和功能需求
  20. 高可用和热备份是什么意思?

热门文章

  1. 年底了,诈骗的怎么这么多?
  2. Cisco 交换机的操作
  3. 从盘古开天辟地说起JVM性能调优
  4. session 、cookie、token的区别及联系
  5. C++大小写字母转换(齐全)
  6. 2022年最新的Detectron 2 (0.6) 安装流程(联想笔记本Y9000K+Anaconda+Win 11 +RTX3070)
  7. with ties 的用法
  8. 赖美云的认证照_火箭少女最新路透照出炉:吴宣仪赖美云魅力十足,张紫宁傅菁凭颜值圈粉...
  9. python扩展包怎么安装_Python中扩展包的安装方法详解
  10. Android的在线热更新方案_Robust