ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux内核使用pinctrl子系统实现操作gpio输出高低电平的实现

2019-03-18 18:54:43  阅读:1530  来源: 互联网

标签:reset pin mz391 pinctrl mz391rst 低电平 linux gpio


硬件平台:rv1108


在内核中实现使用pinctrl子系统控制gpio主要实在两个方面:dts文件的节点的添加和驱动代码的编写。

1.dts文件的修改

在kernel/arch/arm/boot/dts/rv1108-evb-v12.dts中添加如下信息:

mz391_gpio_rst:mz391_gpio_rst {
    compatible = "rk,mz391-rst";
    pinctrl-names = "mz391-rst-on", "mz391-rst-off";
    pinctrl-0 = <&mz391_resetpin_on>;
    pinctrl-1 = <&mz391_resetpin_off>;
};

在 kernel/arch/arm/boot/dts/rv1108.dtsi

gpio3a3_low {                                                                                                  
    mz391_resetpin_on: pin_gpio3a3_low {                                                                       
        rockchip,pins = <3 GPIO_A3 RK_FUNC_GPIO &pcfg_output_low>;                                             
    };                                                                                                         
    mz391_resetpin_off: pin_gpio3a3_high {                                                                     
        rockchip,pins = <3 GPIO_A3 RK_FUNC_GPIO &pcfg_output_high>;                                            
    };                                                                                                         
}; 

2.驱动代码

包括makefile和Kconfig的编写。

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/delay.h>


#define MZ391_RESET_NAME "mz391_reset_gpio3a3"

static struct pinctrl *mz391rst_pin_ctrl = NULL;

static int gpio_reset_probe(struct platform_device *pdev)
{
	struct pinctrl_state  *mz391rst_on = NULL, *mz391rst_off = NULL;
	int ret = 0;

	printk("now is %s %d\n", __FUNCTION__, __LINE__);
	mz391rst_pin_ctrl = devm_pinctrl_get(&pdev->dev);
	if(IS_ERR(mz391rst_pin_ctrl))
	{
		printk("devm_pinctrl_get is error\n");
		ret = PTR_ERR(mz391rst_pin_ctrl);
		return ret;
	}
	
	mz391rst_on = pinctrl_lookup_state(mz391rst_pin_ctrl, "mz391-rst-on");
	if(IS_ERR(mz391rst_on))
	{
		printk("get the state of the mz391-rst-on is fail\n");
		ret = PTR_ERR(mz391rst_on);
		return ret;
	}

	mz391rst_off = pinctrl_lookup_state(mz391rst_pin_ctrl, "mz391-rst-off");
	if(IS_ERR(mz391rst_off))
	{
		printk("get the state of the mz391-rst-off fail\n");
		ret = PTR_ERR(mz391rst_off);
		return ret;
	}

	pinctrl_select_state(mz391rst_pin_ctrl, mz391rst_on);
	printk("now gpio3a3 is low\n");
	mdelay(5000);
	pinctrl_select_state(mz391rst_pin_ctrl, mz391rst_off);
	printk("now gpio3a3 is high\n");

	return ret;
}

static int gpio_reset_remove(struct platform_device *pdev)
{
	return 0;	
}

static const struct of_device_id  gpio_reset_of_id[] = {
	{.compatible = "rk,mz391-rst",},
	{}
};

static struct platform_driver mz391rst_platform_driver = {
	.probe = gpio_reset_probe,
	.remove = gpio_reset_remove,
	.driver = {
		.name = MZ391_RESET_NAME,
		.owner = THIS_MODULE,
		.of_match_table = gpio_reset_of_id,
	},
};

static int __init mz391_reset_init(void)
{
	printk("%s is called\n", __func__);
	platform_driver_register(&mz391rst_platform_driver);
	return 0;
}

static void __exit mz391_reset_exit(void)
{
	platform_driver_unregister(&mz391rst_platform_driver);
}

module_init(mz391_reset_init);
module_exit(mz391_reset_exit);

MODULE_AUTHOR("xyw");
MODULE_DESCRIPTION("the reset pin of the mz391 ");
MODULE_LICENSE("DUAL BSD/GPL");

 

标签:reset,pin,mz391,pinctrl,mz391rst,低电平,linux,gpio
来源: https://blog.csdn.net/u010299133/article/details/88646412

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有