資料介紹
用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次下載 | 免費
評論
查看更多