我是靠谱客的博主 幸福宝马,最近开发中收集的这篇文章主要介绍普通gpio功能驱动代码例程普通gpio功能驱动代码例程1、环境描述2、dts配置3、驱动例程代码4、通过adb测试gpio管脚控制是否正常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

普通gpio功能驱动代码例程

1、环境描述

1、适用于所有的内核驱动
2、gpio子系统的管脚控制

2、dts配置

新增dts节点

test_node: my_node{
		compatible = "mytest,test_node";
		test-gpio = <&pio 45 0>;
	};

3、驱动例程代码

#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>
//写一份代码实现拉对应gpio的管脚
//-----------------------dts----------------------
/*
mynode :test_node {
	compatible = "mytest,test_node";
	test-gpio = <&pio 45 0>;//45表示gpio的编号
};
*/
//-----------------------drv----------------------
const struct of_device_id test_of_match[] = {
	{ .compatible = "mytest,test_node", },
	{}
};
//------------------------创建的设备节点:/sys/class/test_node-------------
int test_gpio;
int status=-1;
static ssize_t test_node_ctrl_gpio_write(struct class *class, struct class_attribute *attr,const char *buf, size_t count)
{
	unsigned int cmd;
	int ret;
//	ret =kstrtouint(buf,10,&cmd);//获取输入的数值
	ret = sscanf(buf,"%d",&cmd);//获取输入的数值
	if (ret < 0) {
		printk("%s param error: err = %dn", __func__, ret);
		return ret;
	}
	if(cmd == 0){//写入0输出低电平
		if (gpio_is_valid(test_gpio)){//判断管脚是否能够控制
			gpio_direction_output(test_gpio,0);//输出低电平
			status=0;
		}else{
			status = -1;
		}
	}else{//否则输出高电平
		if (gpio_is_valid(test_gpio)){//判断管脚是否能够控制
			gpio_direction_output(test_gpio,1);//输出高电平
			status=1;
		}else{
			status = -1;
		}
	}
	return count;
}
static ssize_t test_node_ctrl_gpio_read(struct class *cls, struct class_attribute *attr, char *buf)
{
    return scnprintf(buf, 60,"0:output 0;1:output 1;-1:output errorn status=%dn",status);
}
static struct class_attribute device_attrs[] = {
	__ATTR(teset_node, 0664, test_node_ctrl_gpio_read, test_node_ctrl_gpio_write),
	__ATTR_NULL,
};

static int test_node_create_class(void)
{
	struct class *test_node_class;
	int ret;
	test_node_class = class_create(THIS_MODULE, "test_node");
	if (IS_ERR(test_node_class)) {
		ret = PTR_ERR(test_node_class);
		printk("Failed to create test_node class.n");
	}
	if (class_create_file(test_node_class, &device_attrs[0]) != 0) {
		printk("sysfs firmware creation failedn");
		ret = -1;
	}
	printk("%s endn",__func__);
	return 0;
}

static int test_node_init(void)
{
	struct device_node *test_node = NULL;//定义一个节点
	int ret;
	printk("%s() begin!n", __func__);

	//通过compatible找到dts中的节点
	test_node = of_find_matching_node(test_node,&test_of_match[0]);
	if (IS_ERR(test_node)) {
		printk("----^_^ %s---dts'node has found---------n",__FUNCTION__);
	}
	//获取gpio号
	test_gpio = of_get_named_gpio(test_node, "test-gpio", 0);
	if(test_gpio<0){
		printk("get gpio error,failed");
		return -1;
	}
	ret = test_node_create_class();
	if(ret<0){
		printk("test_node_create_node error,failed");
	}
	printk("%s() ok!n", __func__);
	return 0;
}
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");

4、通过adb测试gpio管脚控制是否正常

驱动编入后,会生成节点/sys/class/test_node
拉高gpio:echo 1 > /sys/class/test_node
拉低gpio:echo 0 > /sys/class/test_node
查看gpio的高低电平情况:cat /sys/class/test_node
附:mtk平台检查gpio配置和状态的链接如下:https://editor.csdn.net/md/?articleId=112765136

最后

以上就是幸福宝马为你收集整理的普通gpio功能驱动代码例程普通gpio功能驱动代码例程1、环境描述2、dts配置3、驱动例程代码4、通过adb测试gpio管脚控制是否正常的全部内容,希望文章能够帮你解决普通gpio功能驱动代码例程普通gpio功能驱动代码例程1、环境描述2、dts配置3、驱动例程代码4、通过adb测试gpio管脚控制是否正常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部