資料介紹
用udev在/dev/下動態(tài)生成設(shè)備文件,這樣用戶就不用手工調(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之前,應(yīng)當(dāng)使用
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove
這一系列,也就是ldd3第14章描述的。 詳見:
https://lwn.net/Articles/128644/
Output:
===========================================
?。踨oot@localhost dynamic_dev_node]# insmod 。/dummy_dev.ko
?。踨oot@localhost dynamic_dev_node]# file /dev/dummy_dev0
/dev/dummy_dev0: character special (250/0)
?。踨oot@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之前,應(yīng)當(dāng)使用
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove
這一系列,也就是ldd3第14章描述的。 詳見:
https://lwn.net/Articles/128644/
Output:
===========================================
?。踨oot@localhost dynamic_dev_node]# insmod 。/dummy_dev.ko
?。踨oot@localhost dynamic_dev_node]# file /dev/dummy_dev0
/dev/dummy_dev0: character special (250/0)
?。踨oot@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實(shí)現(xiàn)自動檢測掛載U盤
- Zynq-7000的PL端功能動態(tài)設(shè)備樹使用方法
- allegro生成gerber等文件教程資源下載 0次下載
- Protel 99SE生成gerber文件的詳細(xì)步驟 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文件
- 如何利用生成式人工智能進(jìn)行精確編碼 284次閱讀
- 如何利用Tcl腳本在Manage IP方式下實(shí)現(xiàn)對IP的高效管理 508次閱讀
- 如何利用Linux下的工具來自動生成實(shí)用的狀態(tài)機(jī)框架? 1084次閱讀
- 如何一鍵生成mybatisplus 628次閱讀
- buildroot對/dev的四種處理方式 910次閱讀
- buildroot對/dev的四種處理方式 1069次閱讀
- 三種常用IDE下花式生成鏡像文件的方法 1290次閱讀
- pcb如何生成gerber文件 2.2w次閱讀
- 一文詳解如何利用模板生成PCB文件? 6163次閱讀
- Xilinx Vivado .coe格式文件生成步驟 2w次閱讀
- ICD配置文件的詳細(xì)介紹和配置內(nèi)容的詳細(xì)概述 1.7w次閱讀
- 在 Linux 中如何編寫基本的 udev 規(guī)則并了解其基本的概念和邏輯 5477次閱讀
- 基于inux中每個(gè)目錄含義解析 2689次閱讀
- Maven工具生成Mybatis的代碼及映射的文件 1958次閱讀
- 在Vivado下利用Tcl實(shí)現(xiàn)IP的高效管理 5706次閱讀
下載排行
本周
- 1GBT1094.11-2022電力變壓器第11部分:干式變壓器
- 14.12 MB | 3次下載 | 免費(fèi)
- 2FT-7800R對講機(jī)維修手冊附原理圖
- 3.35 MB | 2次下載 | 免費(fèi)
- 3串口工具UartAssist5.0.exe
- 0.60 MB | 2次下載 | 免費(fèi)
- 4爬電距離和電氣間隙計(jì)算
- 0.75 MB | 2次下載 | 1 積分
- 5UC3584DW次級側(cè)后置穩(wěn)壓器EVM板原理圖
- 38.97KB | 2次下載 | 免費(fèi)
- 6UCC38C42 25瓦自諧振復(fù)位正激變換器
- 320.6KB | 1次下載 | 免費(fèi)
- 7ZX-D37 BLE主從一體藍(lán)牙模塊技術(shù)手冊
- 1.22 MB | 1次下載 | 免費(fèi)
- 8使用15個(gè)時(shí)鐘周期的ADS7841和ADS7844
- 188.55KB | 1次下載 | 免費(fèi)
本月
- 1無刷電機(jī)控制方案設(shè)計(jì)合作
- 1.05 MB | 22次下載 | 免費(fèi)
- 2美的超薄電磁爐TM-S1-09B主板原理圖
- 0.08 MB | 20次下載 | 免費(fèi)
- 3純電動汽?的主要部件及?作原理
- 5.76 MB | 12次下載 | 5 積分
- 4GP328和GP88S對講機(jī)的維修實(shí)列資料合集免費(fèi)下載
- 0.03 MB | 10次下載 | 10 積分
- 5舒爾SLX4無線話筒接收機(jī)原理圖:二次變頻超外差部分
- 0.27 MB | 8次下載 | 免費(fèi)
- 6IP5385_DEMO開發(fā)資料
- 1.96 MB | 7次下載 | 2 積分
- 7i.MX Linux開發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開發(fā)板
- 17.86 MB | 7次下載 | 免費(fèi)
- 8Type-C VL160數(shù)據(jù)手冊
- 0.92 MB | 7次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935115次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191363次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183329次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73805次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評論
查看更多