資料介紹
用udev在/dev/下動態(tài)生成設備文件,這樣用戶就不用手工調(diào)用mknod了。
利用的kernel API:
class_create : 創(chuàng)建class
class_destroy : 銷毀class
class_device_create : 創(chuàng)建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 : 創(chuàng)建class
class_destroy : 銷毀class
class_device_create : 創(chuàng)建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文件生成器下載 19次下載
- 利用CAMtastic反向生成PCB文件 20次下載
- 如何利用ccs生成msp430的.hex文件
- 如何利用ccs生成msp430的.hex文件
- 嵌入式Linux利用udev實現(xiàn)自動檢測掛載U盤
- Zynq-7000的PL端功能動態(tài)設備樹使用方法
- allegro生成gerber等文件教程資源下載 0次下載
- Protel 99SE生成gerber文件的詳細步驟 0次下載
- 如何使用PHP查詢MYSQL生成動態(tài)表單 8次下載
- 如何在MDk生成bin格式的文件 4次下載
- altium_designer生成gerber文件和鉆孔文件 10次下載
- 紫金橋組態(tài)軟件動態(tài)生成畫面介紹 3次下載
- 由MATLAB的.m文件生成動態(tài)鏈接庫的方法說明 0次下載
- 利用AD6中CAMtastic反向生成PCB文件
- 【AIBOX 應用案例】通過 U2-Net 實現(xiàn)背景移除 566次閱讀
- 如何利用生成式人工智能進行精確編碼 1.8k次閱讀
- 如何利用Tcl腳本在Manage IP方式下實現(xiàn)對IP的高效管理 2k次閱讀
- 如何一鍵生成mybatisplus 1.7k次閱讀
- buildroot對/dev的四種處理方式 2k次閱讀
- buildroot對/dev的四種處理方式 2k次閱讀
- 三種常用IDE下花式生成鏡像文件的方法 2.3k次閱讀
- pcb如何生成gerber文件 2.4w次閱讀
- 一文詳解如何利用模板生成PCB文件? 7.3k次閱讀
- Xilinx Vivado .coe格式文件生成步驟 2.2w次閱讀
- ICD配置文件的詳細介紹和配置內(nèi)容的詳細概述 1.9w次閱讀
- 在 Linux 中如何編寫基本的 udev 規(guī)則并了解其基本的概念和邏輯 6k次閱讀
- 基于inux中每個目錄含義解析 3.1k次閱讀
- Maven工具生成Mybatis的代碼及映射的文件 2.3k次閱讀
- 在Vivado下利用Tcl實現(xiàn)IP的高效管理 6.1k次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關型降壓3.5A單節(jié)鋰電池充電管理電路技術手冊
- 0.74 MB | 1次下載 | 免費
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測距模塊產(chǎn)品手冊
- 0.43 MB | 1次下載 | 免費
- 8SDFM 激光測距模塊模組手冊
- 0.54 MB | 1次下載 | 免費
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場分析及創(chuàng)新應用
- 3.11 MB | 43次下載 | 免費
- 3RV1126B系列開發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發(fā)板 四核異構、3路千兆網(wǎng),賦能多元化工業(yè)場景
- 3.05 MB | 12次下載 | 免費
- 6【開源】60余套STM32單片機、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學習資源包
- 10.55 MB | 8次下載 | 免費
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191448次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論