Linux混杂字符设备

Linux混杂字符设备

混杂设备驱动模型

混杂设备概念

在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。

1.设备描述

Linux中使用structmiscdevice来描述一个混杂设备。structmiscdevice{intminor;/*次设备号*/constchar*name;/*设备名*/conststructfile_operations*fops;/*文件操作*/structlist_headlist;structdevice*parent;structdevice*this_device;};

2.设备注册

Linux中使用misc_register函数来注册一个混杂设备驱动。intmisc_register(structmiscdevice*misc)

先写一个内核态数据与用户态数据互传的例子及APP

手动安装步骤:

Insmodmy_char_dev.ko

不需要再安装设备节点

然后是测试app

./my_char_dev_app1

#include <linux/module.h>#include <linux/init.h>#include <linux/io.h>#include <linux/miscdevice.h>#include <linux/fs.h>#include <asm/uaccess.h>

unsigned int param=0;

static int my_open(struct inode *node,struct file *filep ){ printk(“Open my_open sucess!\n”); return 0;}static int my_read(struct file *filp,char __user *buf,size_t size,loff_t *pos){ printk(“Read my_read sucess!\n”); param = 500; copy_to_user(buf, &param, 4); return 0;}

struct file_operations my_miscdev_fops ={ .open = my_open, .read = my_read,};

struct miscdevice my_miscdev = { .minor = 200, .name = “my_miscdev”, .fops = &my_miscdev_fops,};static int my_miscdev_init(void){ int ret; ret = misc_register(&my_miscdev); if(ret != 0) printk(“miscdev register fail.\n!”); return 0;

}static void my_miscdev_exit(void){ misc_deregister(&my_miscdev);

}

MODULE_LICENSE(“GPL”);

module_init(my_miscdev_init);module_exit(my_miscdev_exit);

——————————————————————–

#include <stdio.h>#include <sys/stat.h>#include <sys/types.h>#include <sys/ioctl.h>#include <fcntl.h>

int main(char argc,char *argv[]){ int fd; int cmd; int param = 0; if(argc < 2) { printf(“please enter the second param!\n”); return 0; } cmd = atoi(argv[1]); fd = open(“/dev/my_miscdev”,O_RDWR); if(fd < 0) { printf(“Open /dev/my_miscdev fail.\n”); }

switch(cmd) { case 1: printf(“Second param is %c\n”,*argv[1]); read(fd, &param, 4); printf(“Read Param is %d.\n”,param); break; default : break; } close(fd); return 0;

}

—————————————-

1 obj-m := my_miscdev.o2 KDIR := /home/win/dn377org/trunk/bcm7252/linux/3 all:4 make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm5 clean:6 rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order

海阔凭鱼跃,天高任鸟飞。我要加油,冲向我的理想。

Linux混杂字符设备

相关文章:

你感兴趣的文章:

标签云: