您的位置:首页 > 其它

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

2017-09-11 15:36 453 查看
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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐