资料介绍
用udev在/dev/下动态生成设备文件,这样用户就不用手工调用mknod了。
利用的kernel API:
class_create : 创建class
class_destroy : 销毁class
class_device_create : 创建device
class_device_destroy : 销毁device
注意,这些API是2.6.13开始有的,在2.6.13之前,应当使用
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove
这一系列,也就是ldd3第14章描述的。 详见:
https://lwn.net/Articles/128644/
Output:
===========================================
[root@localhost dynamic_dev_node]# insmod 。/dummy_dev.ko
[root@localhost dynamic_dev_node]# file /dev/dummy_dev0
/dev/dummy_dev0: character special (250/0)
[root@localhost dynamic_dev_node]# rmmod dummy_dev.ko
[root@localhost dynamic_dev_node]# file /dev/dummy_dev0
/dev/dummy_dev0: ERROR: cannot open `/dev/dummy_dev0‘ (No such file or directory)
#include 《linux/kernel.h》
#include 《linux/module.h》
#include 《linux/init.h》
#include 《linux/mm.h》
#include 《linux/fs.h》
#include 《linux/types.h》
#include 《linux/delay.h》
#include 《linux/moduleparam.h》
#include 《linux/slab.h》
#include 《linux/errno.h》
#include 《linux/ioctl.h》
#include 《linux/cdev.h》
#include 《linux/string.h》
#include 《linux/list.h》
#include 《linux/pci.h》
#include 《asm/uaccess.h》
#include 《asm/atomic.h》
#include 《asm/unistd.h》
#define THIS_DESCRIPTION “
This module is a dummy device driver, it registern
tta char device, and utilize udev to create/destroy n
ttdevice node under /dev/ dynamicallly.”
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“albcamus 《albcamus@gmail.com》”);
MODULE_DESCRIPTION(THIS_DESCRIPTION);
#define DUMMY_MAJOR 250
#define DUMMY_MINOR 0
#define DUMMY_NAME “dummy_dev”
/**
* the open routine of ’dummy_dev‘
*/
static int dummy_open(struct inode *inode, struct file *file)
{
printk(“Open OKn”);
return 0;
}
/**
* the write routine of ’dummy_dev‘
*/
static ssize_t dummy_write(struct file *filp, const char *bp, size_t count, loff_t *ppos)
{
printk(“Don’t Write!n”);
return 0;
}
/**
* the read routine of ‘dummy_dev’
*/
static ssize_t dummy_read(struct file *filp, char *bp, size_t count, loff_t *ppos)
{
return 0;
}
/**
* the ioctl routine of ‘dummy_dev’
*/
static int dummy_ioctl(struct inode *inode, struct file *filep,
unsigned int cmd, unsigned long arg)
{
return 0;
}
/**
* file_operations of ‘dummy_dev’
*/
static struct file_operations dummy_dev_ops = {
.owner = THIS_MODULE,
.open = dummy_open,
.read = dummy_read,
.write = dummy_write,
.ioctl = dummy_ioctl,
};
/**
* struct cdev of ‘dummy_dev’
*/
struct cdev *my_cdev;
struct class *my_class;
static int __init my_init(void)
{
int err, devno = MKDEV(DUMMY_MAJOR, DUMMY_MINOR);
/* register the ‘dummy_dev’ char device */
my_cdev = cdev_alloc();
cdev_init(my_cdev, &dummy_dev_ops);
my_cdev-》owner = THIS_MODULE;
err = cdev_add(my_cdev, devno, 1);
if (err != 0)
printk(“dummy pci device register failed!n”);
/* creating your own class */
my_class = class_create(THIS_MODULE, “dummy_class”);
if(IS_ERR(my_class)) {
printk(“Err: failed in creating class.n”);
return -1;
}
/* register your own device in sysfs, and this will cause udevd to create corresponding device node */
class_device_create(my_class, NULL, MKDEV(DUMMY_MAJOR, DUMMY_MINOR), NULL, DUMMY_NAME “%d”, DUMMY_MINOR );
return 0;
}
static void __exit my_fini(void)
{
printk(“byen”);
cdev_del(my_cdev);
//kfree(my_cdev); no use. because that cdev_del() will call kfree if neccessary.
class_device_destroy(my_class, MKDEV(DUMMY_MAJOR, DUMMY_MINOR));
class_destroy(my_class);
}
module_init(my_init);
module_exit(my_fini);
利用的kernel API:
class_create : 创建class
class_destroy : 销毁class
class_device_create : 创建device
class_device_destroy : 销毁device
注意,这些API是2.6.13开始有的,在2.6.13之前,应当使用
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove
这一系列,也就是ldd3第14章描述的。 详见:
https://lwn.net/Articles/128644/
Output:
===========================================
[root@localhost dynamic_dev_node]# insmod 。/dummy_dev.ko
[root@localhost dynamic_dev_node]# file /dev/dummy_dev0
/dev/dummy_dev0: character special (250/0)
[root@localhost dynamic_dev_node]# rmmod dummy_dev.ko
[root@localhost dynamic_dev_node]# file /dev/dummy_dev0
/dev/dummy_dev0: ERROR: cannot open `/dev/dummy_dev0‘ (No such file or directory)
#include 《linux/kernel.h》
#include 《linux/module.h》
#include 《linux/init.h》
#include 《linux/mm.h》
#include 《linux/fs.h》
#include 《linux/types.h》
#include 《linux/delay.h》
#include 《linux/moduleparam.h》
#include 《linux/slab.h》
#include 《linux/errno.h》
#include 《linux/ioctl.h》
#include 《linux/cdev.h》
#include 《linux/string.h》
#include 《linux/list.h》
#include 《linux/pci.h》
#include 《asm/uaccess.h》
#include 《asm/atomic.h》
#include 《asm/unistd.h》
#define THIS_DESCRIPTION “
This module is a dummy device driver, it registern
tta char device, and utilize udev to create/destroy n
ttdevice node under /dev/ dynamicallly.”
MODULE_LICENSE(“GPL”);
MODULE_AUTHOR(“albcamus 《albcamus@gmail.com》”);
MODULE_DESCRIPTION(THIS_DESCRIPTION);
#define DUMMY_MAJOR 250
#define DUMMY_MINOR 0
#define DUMMY_NAME “dummy_dev”
/**
* the open routine of ’dummy_dev‘
*/
static int dummy_open(struct inode *inode, struct file *file)
{
printk(“Open OKn”);
return 0;
}
/**
* the write routine of ’dummy_dev‘
*/
static ssize_t dummy_write(struct file *filp, const char *bp, size_t count, loff_t *ppos)
{
printk(“Don’t Write!n”);
return 0;
}
/**
* the read routine of ‘dummy_dev’
*/
static ssize_t dummy_read(struct file *filp, char *bp, size_t count, loff_t *ppos)
{
return 0;
}
/**
* the ioctl routine of ‘dummy_dev’
*/
static int dummy_ioctl(struct inode *inode, struct file *filep,
unsigned int cmd, unsigned long arg)
{
return 0;
}
/**
* file_operations of ‘dummy_dev’
*/
static struct file_operations dummy_dev_ops = {
.owner = THIS_MODULE,
.open = dummy_open,
.read = dummy_read,
.write = dummy_write,
.ioctl = dummy_ioctl,
};
/**
* struct cdev of ‘dummy_dev’
*/
struct cdev *my_cdev;
struct class *my_class;
static int __init my_init(void)
{
int err, devno = MKDEV(DUMMY_MAJOR, DUMMY_MINOR);
/* register the ‘dummy_dev’ char device */
my_cdev = cdev_alloc();
cdev_init(my_cdev, &dummy_dev_ops);
my_cdev-》owner = THIS_MODULE;
err = cdev_add(my_cdev, devno, 1);
if (err != 0)
printk(“dummy pci device register failed!n”);
/* creating your own class */
my_class = class_create(THIS_MODULE, “dummy_class”);
if(IS_ERR(my_class)) {
printk(“Err: failed in creating class.n”);
return -1;
}
/* register your own device in sysfs, and this will cause udevd to create corresponding device node */
class_device_create(my_class, NULL, MKDEV(DUMMY_MAJOR, DUMMY_MINOR), NULL, DUMMY_NAME “%d”, DUMMY_MINOR );
return 0;
}
static void __exit my_fini(void)
{
printk(“byen”);
cdev_del(my_cdev);
//kfree(my_cdev); no use. because that cdev_del() will call kfree if neccessary.
class_device_destroy(my_class, MKDEV(DUMMY_MAJOR, DUMMY_MINOR));
class_destroy(my_class);
}
module_init(my_init);
module_exit(my_fini);
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 在MDK中如何生成bin格式的文件 0次下载
- MIF文件生成器下载 18次下载
- 利用CAMtastic反向生成PCB文件 20次下载
- 如何利用ccs生成msp430的.hex文件
- 如何利用ccs生成msp430的.hex文件
- 嵌入式Linux利用udev实现自动检测挂载U盘
- Zynq-7000的PL端功能动态设备树使用方法
- allegro生成gerber等文件教程资源下载 0次下载
- Protel 99SE生成gerber文件的详细步骤 0次下载
- 如何使用PHP查询MYSQL生成动态表单 8次下载
- 如何在MDk生成bin格式的文件 4次下载
- altium_designer生成gerber文件和钻孔文件 10次下载
- 紫金桥组态软件动态生成画面介绍 3次下载
- 由MATLAB的.m文件生成动态链接库的方法说明 0次下载
- 利用AD6中CAMtastic反向生成PCB文件
- 如何利用生成式人工智能进行精确编码 284次阅读
- 如何利用Tcl脚本在Manage IP方式下实现对IP的高效管理 508次阅读
- 如何利用Linux下的工具来自动生成实用的状态机框架? 1084次阅读
- 如何一键生成mybatisplus 628次阅读
- buildroot对/dev的四种处理方式 910次阅读
- buildroot对/dev的四种处理方式 1069次阅读
- 三种常用IDE下花式生成镜像文件的方法 1290次阅读
- pcb如何生成gerber文件 2.2w次阅读
- 一文详解如何利用模板生成PCB文件? 6163次阅读
- Xilinx Vivado .coe格式文件生成步骤 2w次阅读
- ICD配置文件的详细介绍和配置内容的详细概述 1.7w次阅读
- 在 Linux 中如何编写基本的 udev 规则并了解其基本的概念和逻辑 5477次阅读
- 基于inux中每个目录含义解析 2689次阅读
- Maven工具生成Mybatis的代码及映射的文件 1958次阅读
- 在Vivado下利用Tcl实现IP的高效管理 5706次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多