問:能不能讓系統自動建立裝置節點?
答:可以,linux有udev、mdev的機制,而我們的arm開發板上移植的busybox有mdev機制,那麼就使用mdev機制來自動建立裝置節點。
問:檔案系統裡,在**設定了mdev機制?
答:在etc/init.d/rcs檔案裡有一句:
echo /sbin/mdev > /proc/sys/kernel/hotplug
問:在驅動程式裡面如何編寫程式,讓系統自動建立裝置節點?
答:首先建立乙個class類,然後在class類下,建立乙個class_device,即類下面建立類的裝置。
#include #include #include #include #include #include #include #include #include #include static struct class *firstdrv_class;
static struct class_device *firstdrv_class_dev;
int major;
static int first_drv_open(struct inode * inode, struct file * filp)
static int first_drv_write(struct file * file, const char __user * buffer, size_t count, loff_t * ppos)
/* file operations struct for character device */
static const struct file_operations first_drv_fops = ;
/* 驅動入口函式 */
static int first_drv_init(void)
/* 驅動出口函式 */
static void first_drv_exit(void)
module_init(first_drv_init); //用於修飾入口函式
module_exit(first_drv_exit); //用於修飾出口函式
module_author("lwj");
module_description("just for demon");
module_license("gpl"); //遵循gpl協議
測試程式和makefile沒有修改,故再不貼。
測試步驟:
[wj2440]# ls
qt driver_test lib root udisk
tqledtest etc linuxrc sbin usr
bin first_test opt sys web
dev home proc tmp
[wj2440]# ls -l /dev/*** //還沒有裝置節點
ls: /dev/***: no such file or directory
[wj2440]# insmod first_drv.ko //裝上我們寫的驅動後,會自動生成裝置節點/dev/***
[wj2440]# lsmod
first_drv 1912 0 - live 0xbf000000
[wj2440]# ls -l /dev/*** //檢視生成的裝置節點
crw-rw---- 1 root root 252, 0 jan 1 23:17 /dev/***
[wj2440]# cat proc/devices
character devices:
1 mem
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
29 fb
81 video4linux
89 i2c
90 mtd
116 alsa
128 ptm
136 pts
180 usb
188 ttyusb
189 usb_device
204 tq2440_serial
252 first_drv
253 usb_endpoint
254 rtc
block devices:
259 blkext
7 loop
8 sd
31 mtdblock
65 sd
66 sd
67 sd
68 sd
69 sd
70 sd
71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc
[wj2440]# cd /sys/class/ //開啟/sys/class可以看到我們生成的firstdrv類
[wj2440]# ls
bdi i2c-adapter misc scsi_device usb_endpoint
block i2c-dev mmc_host scsi_disk usb_host
firmware ieee80211 mtd scsi_host vc
firstdrv input net sound video4linux
graphics mem rtc tty vtconsole
[wj2440]# cd firstdrv/ //firstdrv類裡面有我們的***裝置
[wj2440]# ls
***[wj2440]# cd ***/
[wj2440]# ls
dev subsystem uevent
[wj2440]# cat dev //主裝置號252,次裝置號0
252:0
[wj2440]# cat uevent
major=252
minor=0
[wj2440]# cd /
[wj2440]# ./first_test //有了裝置節點便能夠執行我們的程式了
first_drv_open
first_drv_write
[wj2440]#
Linux核心驅動之自動建立裝置檔案
裝置檔案是非常重要的檔案,是應用程式與裝置驅動交換資料,控制硬體的橋梁。在驅動程式中open release的實現過程中其中的乙個引數struct inode實質就是裝置檔案的索引,沒有這個索引也就沒有後期的各種操作,通常裝置檔案也被稱為裝置檔案節點。因此沒有裝置檔案後期的各種實現都是多餘的。裝置檔...
linux字元裝置驅動中自動建立裝置節點
簡述 1 裝置號 驅動等概念性問題 2 裝置號的自動分配和手動指定 3 mknode手動建立節點。編碼實現 1 核心點 要使的驅動能夠在載入時自動完成裝置節點的註冊,主要流程如下 驅動載入時完成如下工作 分配裝置號 註冊字元裝置 動態建立裝置節點。驅動解除安裝時完成如下工作 刪除裝置節點 取消字元裝...
Linux驅動(三) 完善裝置驅動自動建立裝置號
include include include include include include include argc 應用程式引數個數,包括應用程式本身 ar 具體的引數內容,字串形式 int main int argc,char ar filename ar 1 獲取檔名稱 fd open f...