当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > MISC(杂项)设备驱动

MISC(杂项)设备驱动 时间:2018-09-27      来源:未知

@misc是特殊的字符设备(让一些特殊的字符设备驱动的编写变得更简单)

1) miscdevice结构体来描述一个misc设备

2) MISC_MAJOR == 10 (主设备号固定), 次设备号不同。

3) 双向链表list_head 来管理设备

4) const char* name是/dev中设备文件的名称

@misc子系统其他特点:

1) misc子系统能自动生成设备节点。

@实现misc子系统驱动主要流程:

1) 定义

@struct miscdevice misc;

2) 初始化(@结构体参考头文件:include/linux/miscdevice.h)

misc.minor = MISC_DYNAMIC_MINOR; //255,让系统动态分配次设备号

misc.name = "misc_name";

struct file_operations fops = {

.owner = THIS_MODULE,

};

misc.fops = &fops;

3) 注册

misc_register

4) 注销

misc_deregister

############

@杂项设备的次设备号的取值一般为255,让系统自动分配,其他值可能不能使用,或者会出错。

示例代码如下:

###########

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
 
#include <linux/fs.h>l
#include <linux/miscdevice.h>

MODULE_LICENSE("GPL");

#define DebugPrint() printk("---DebugPrint--- %s:%s--%d\n",__FILE__,__func__,__LINE__)

int misc_open (struct inode * ip, struct file * fp)

{

DebugPrint();

return 0;

}

int misc_close (struct inode * ip, struct file * fp)

{

DebugPrint();

return 0;

}

ssize_t misc_read (struct file * fp, char __user * buf, size_t n, loff_t * f)

{

DebugPrint();

return 0;

}

ssize_t misc_write (struct file *fp, const char __user *buf, size_t n, loff_t * f)

{

DebugPrint();

return 0;

}

struct file_operations misc_demo_fops={

.owner = THIS_MODULE,

.open =misc_open,

.release= misc_close,

.read = misc_read,

.write= misc_write,

};

struct miscdevice misc_demo={

.minor = MISC_DYNAMIC_MINOR,

.name ="misc_demo",

.fops = &misc_demo_fops,

};

static int __init misc_demo_init(void)

{

int ret=0;

DebugPrint();

ret = misc_register(&misc_demo);

if(ret != 0)

{

DebugPrint();

printk("misc_register error\n");

return ret;

}

return 0;

}

static void __exit misc_demo_exit(void)

{

DebugPrint();

misc_deregister(&misc_demo);

return ;

}

module_init(misc_demo_init);

module_exit(misc_demo_exit);

##############

Makefile参考:

##############

ifneq ($(KERNELRELEASE),)

obj-m:=misc_demo.o

else

KERNELDIR =/lib/modules/$(uname -r)/build/

PWD = $(pwd)

modules:

make -C $(KERNELDIR) M=$(PWD) modules

clean:

make -C $(KERNELDIR) M=$(PWD) clean

endif

########

注意:楼主使用的开发环境是ubuntu14.2,编译链是gcc4.6.4

上一篇:纯CSS3实现3D正方形360度旋转

下一篇:扁平化图标长投影

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部