驱动中添加参数进行调试和控制设备驱动
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);
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");
相关文章推荐
- 编译时向内核添加新设备 模块的方式动态的将驱动加入内核,但这种方式加入的驱动程序,当系统重新启动时, 还需要重新用模块的方式进行插入,如果是系统内常用的设备驱动采用这种方式进行加载, 就会很不方便。
- 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.
- 功能节点通过添加参数对相应功能进行控制
- Linux下SPI和IIC驱动免在设备树上添加设备信息的编写方法
- 块设备驱动实战进阶篇二 (调试基础二:ftrace)
- Linux设备驱动调试技术 3
- linux驱动学习--第十三天:第七章 Linux 设备驱动中的并发控制
- Android系统移植与调试之------->如何修改Android设备添加重启、飞行模式、静音模式等功能(二)
- 高级字符设备驱动-Ioctl设备控制笔记
- B4A 或其它Android开发平台连接USB设备进行调试
- 如何使用CeLog调试Windows mobile设备驱动
- Ubuntu下使用adb和USB连接的方式进行android设备调试
- xcode 如何添加调试设备
- Linux 驱动之模块参数--Linux设备驱动程序
- qt中如何设置makefile中的编译参数(qt中添加gdb调试的条件)
- Android 6.0中在/dev下添加新设备驱动下Selinux相关设置
- linux驱动入门-hello设备驱动程序编写及内核的更新(网卡的添加)
- Linux驱动添加的基本流程(SDRAM中调试驱动)
- 如何将android例子程序添加到Eclipse进行调试运行
- 在uclinux添加设备驱动的完整过程(ZT)