创建misc设备,同时创建对应的设备属性文件

第一部分 说明

1、创建了misc设备
2、创建设备属性文件,并实现操作接口

第二部分 代码;例程

#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/uaccess.h>
#include <linux/err.h>
#include <linux/miscdevice.h>


//写一份代码实现拉对应gpio的管脚

//-----------------------dts----------------------
/*
mynode :test_node {
	compatible = "huangzb,test_node";
	test-gpio = <&pio 45 0>;//45表示gpio的编号
};
*/

//-----------------------drv----------------------

const struct of_device_id proc_test_of_match[] = {
	{ .compatible = "huangzb,test_node", },
	{}
};
//------------------------创建设备节点:/sys/class/test_node-------------
static int test_gpio;
static int status=-1;

void gpio_status_exchange(int cmd)
{
	gpio_set_value(test_gpio,cmd);
	status = cmd;
	return;
}
static ssize_t test_device_read(struct device *dev,struct device_attribute *attr, char *buf)
{
	
	return sprintf(buf,"status=%d\n",status);
}
static ssize_t test_device_write(struct device *dev,
	struct device_attribute *attr, const char *buf,
	size_t count)
{
	int cmd=0;
	sscanf(buf, "%d", &cmd);
	gpio_status_exchange(cmd);
	return count;
}
DEVICE_ATTR(test_device, 0664, test_device_read, test_device_write);
static struct attribute *my_device_attributes[] = {
	&dev_attr_test_device.attr,
	NULL
};
static struct attribute_group my_device_group = {
	.attrs = my_device_attributes
};
int shf_open (struct inode *node, struct file *file)
{
	printk("%s() begin!\n", __func__);
	return 0;
}
int shf_release (struct inode *node, struct file *file)
{
	printk("%s() begin!\n", __func__);
	return 0;
}


struct file_operations shf_fops = {
	.owner = THIS_MODULE,
	.open= shf_open,
	.release = shf_release,
	};
struct miscdevice shf_device = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = "shf",
	.fops = &shf_fops,
};


static int test_node_create_device(void)
{
	int ret;

	ret = misc_register(&shf_device);
	if(ret<0){
		printk("%s() misc_register error!\n", __func__);
	}
	ret = sysfs_create_group(&shf_device.this_device->kobj, &my_device_group);
	if (ret < 0) {
		printk("%s() sysfs_create_group error!\n", __func__);
		goto dev_err;
	}
dev_err:
	return ret;
}

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,&proc_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_device();
	if(ret<0){
		printk("%s error,failed\n",__func__);
	}
	printk("%s() ok!\n", __func__);
	return 0;
}
static void test_node_exit(void)
{
	sysfs_remove_group(NULL, &my_device_group);
	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");


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值