驱动中添加参数进行调试和控制设备驱动

1.在加载驱动的时候向驱动传入参数:
1.1传入字符型参数
static char *name;
module_param(name, charp, 0);
MODULE_PARM_DESC(name, "param description");
1.2传入无符号整型参数
static unsigned rotate;
module_param(rotate, uint, 0);
MODULE_PARM_DESC(rotate,"param description");
1.3使用方法
insmod xxx.ko name = "abc"

2.在驱动加载后去向驱动传参数控制设备
驱动中添加CLASS属性步骤:

2.1 定义一个类:
static struct class *example_class = NULL;
2.2 在入口函数中创建设备类,并且在类下创建属性文件
example_class = class_create(THIS_MODULE, "example_class");
if (IS_ERR(example_class))
{
printk("Create class example_class failed.\n");
return -ENOMEM;
}
ret = class_create_file(example_class, &class_attr_example);


2.3 定义属性文件的读写函数及权限 example是属性文件名字 后面两个参数是操作属性文件的读写方法
static CLASS_ATTR(example, 0660, arr_class_read, arr_class_write);
2.4 在出口函数中销毁类
class_remove_file(example_class, &class_attr_example);
class_destroy(example_class);


example1:
	#include <linux/kernel.h>
	#include <linux/module.h>
	#include <linux/init.h>
	#include <linux/platform_device.h>
	#include <linux/device.h>
	#include <linux/fs.h>
	#include <linux/gpio.h>
	#include <linux/slab.h>
	#include <linux/uaccess.h>
	#include <linux/syscalls.h>
	static unsigned int value;
	//写文件函数
	static ssize_t arr_class_write(struct class *cls, struct class_attribute *attr, const char *_buf, size_t _count)
	{
			value = simple_strtol(_buf, NULL, 10);
			printk("value = %d\n",value);
			return _count;
	}
	//读文件函数
	static ssize_t arr_class_read(struct class *cls, struct class_attribute *attr, char *_buf)
	{
			return sprintf(_buf,"%d\n",value);
	}


	static struct class *example_class = NULL;
	/*CLASS_ATTR(在/sys/class/example_class/操作的文件,读文件函数,写文件函数)*/
	static CLASS_ATTR(example, 0660, arr_class_read, arr_class_write);


	static int __init class_file_init(void)
	{
			int ret;
			printk(KERN_INFO" class_file_init \n");
			example_class = class_create(THIS_MODULE, "example_class");
			if (IS_ERR(example_class))
			{
					 printk("Create class example_class failed.\n");
					 return -ENOMEM;
			}
			ret = class_create_file(example_class, &class_attr_example);


			return 0;
	}
	static void __exit class_file_exit(void)
	{
			printk(KERN_INFO"class_file_exit \n");
			class_remove_file(example_class, &class_attr_example);
			class_destroy(example_class);
			example_class = NULL;
			return ;
	}


	module_init(class_file_init);
	module_exit(class_file_exit);
	MODULE_AUTHOR("Dave/nova_wangwenbo@126.com");
	MODULE_LICENSE("GPL");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值