linux字符驅動之自動創建設備節點

上一節中,我們是手工創建設備節點,大家肯定也會覺得這樣做太麻煩了。

上一節文章鏈接:https://blog.csdn.net/qq_37659294/article/details/104302700

問:能不能讓系統自動創建設備節點?

答:可以,linux有udev、mdev的機制,而我們的ARM開發板上移植的busybox有mdev機制,那么就使用mdev機制來自動創建設備節點。

問:文件系統里,在哪里設置了mdev機制?

答:在etc/init.d/rcS文件里有一句:

echo /sbin/mdev > /proc/sys/kernel/hotplug

問:在驅動程序里面如何編寫程序,讓系統自動創建設備節點?

答:首先創建一個class類,然后在class類下,創建一個class_device,即類下面創建類的設備。

?

詳細請參考驅動源碼:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>
#include <asm/hardware.h>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)
{printk("first_drv_open\n");return 0;
}
static int first_drv_write(struct file * file, const char __user * buffer, size_t count, loff_t * ppos)
{printk("first_drv_write\n");return 0;
}/* File operations struct for character device */
static const struct file_operations first_drv_fops = {.owner		= THIS_MODULE,.open		= first_drv_open,.write      = first_drv_write,
};/* 驅動入口函數 */
static int first_drv_init(void)
{/* 主設備號設置為0表示由系統自動分配主設備號 */major = register_chrdev(0, "first_drv", &first_drv_fops);/* 創建firstdrv類 */firstdrv_class = class_create(THIS_MODULE, "firstdrv");    //創建一個“類”/* 在firstdrv類下創建xxx設備,供應用程序打開設備*//*	在“類”里面創建設備*	MKDEV(major, 0)指定主設備號為major,次設備號為0(這里的major必須和register_chrdev返回的一致,不然會出錯)*/firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx");return 0;
}/* 驅動出口函數 */
static void first_drv_exit(void)
{unregister_chrdev(major, "first_drv");device_unregister(firstdrv_class_dev);  //卸載類下的設備class_destroy(firstdrv_class);		//卸載類
}module_init(first_drv_init);  //用于修飾入口函數
module_exit(first_drv_exit);  //用于修飾出口函數	MODULE_AUTHOR("LWJ");
MODULE_DESCRIPTION("Just for Demon");
MODULE_LICENSE("GPL");  //遵循GPL協議

測試程序和Makefile沒有修改,故再不貼。

上一節文章鏈接:https://blog.csdn.net/qq_37659294/article/details/104302700

測試步驟:

[WJ2440]# ls
Qt            driver_test   lib           root          udisk
TQLedtest     etc           linuxrc       sbin          usr
app_test      first_drv.ko  mnt           sddisk        var
bin           first_test    opt           sys           web
dev           home          proc          tmp
[WJ2440]# ls -l /dev/xxx                    //還沒有設備節點
ls: /dev/xxx: No such file or directory
[WJ2440]# insmod first_drv.ko             //裝上我們寫的驅動后,會自動生成設備節點/dev/xxx
[WJ2440]# lsmod
first_drv 1912 0 - Live 0xbf000000
[WJ2440]# ls -l /dev/xxx                //查看生成的設備節點
crw-rw----    1 root     root      252,   0 Jan  1 23:17 /dev/xxx
[WJ2440]# cat proc/devices           
Character devices:1 mem4 /dev/vc/04 tty5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound29 fb81 video4linux89 i2c90 mtd
116 alsa
128 ptm
136 pts
180 usb
188 ttyUSB
189 usb_device
204 tq2440_serial
252 first_drv                    
253 usb_endpoint
254 rtcBlock devices:
259 blkext7 loop8 sd31 mtdblock65 sd66 sd67 sd68 sd69 sd70 sd71 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類里面有我們的xxx設備
[WJ2440]# ls        
xxx
[WJ2440]# cd xxx/            
[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]# 

?

本文參考于:

https://blog.csdn.net/lwj103862095/article/details/17470573?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384501.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux字符驅動之點亮LED

上一節中&#xff0c;我們講解了如何自動創建設備節點&#xff0c;這一節我們在上一節的基礎上&#xff0c;實現點亮LED。 上一節文章鏈接&#xff1a;https://blog.csdn.net/qq_37659294/article/details/104308284 驅動里面能夠用很多種方法實現LED驅動&#xff0c;其中有本…

USB攝像頭視頻監控項目學習筆記

一個攝像頭監控應用程序的系統調用如下所示&#xff1a; /* open * VIDIOC_QUERYCAP 確定它是否視頻捕捉設備,支持哪種接口(streaming/read,write) * VIDIOC_ENUM_FMT 查詢支持哪種格式 * VIDIOC_S_FMT 設置攝像頭使用哪種格式 * VIDIOC_REQBUFS 申請buffer 對于 str…

圖片縮放算法

項目背景&#xff1a;博主之前做過一個攝像頭采集數據&#xff0c;然后在LCD上顯示視頻數據的項目&#xff0c;假如我們攝像頭采集的一幀數據的分辨率比我們的LCD的分辨率要大&#xff0c;那么LCD則無法顯示整個圖像&#xff0c;這時候我們就要把這么一幀圖片進行縮放&#xff…

數碼相框項目之顯示一張可放大、縮小、拖拽的圖片

之前我做過一個電子相框的項目&#xff0c;涉及到的重難點主要為&#xff1a;在LCD上放大、縮小、移動圖片。 首先我們得明白的一點是&#xff1a;無論是放大或縮小&#xff0c;實際上都是對原圖進行等比例的縮小&#xff0c;然后在LCD上面顯示&#xff0c;只不過縮小的程度不…

TCP協議-如何保證傳輸可靠性

TCP協議傳輸的特點主要就是面向字節流、傳輸可靠、面向連接。這篇博客&#xff0c;我們就重點討論一下TCP協議如何確保傳輸的可靠性的。 確保傳輸可靠性的方式 TCP協議保證數據傳輸可靠性的方式主要有&#xff1a; 校驗和序列號確認應答超時重傳連接管理流量控制擁塞控制 校…

TCP協議-握手與揮手

認識TCP協議 TCP全稱為“傳輸控制協議”&#xff0c;這是傳輸層的一個協議&#xff0c;對數據的傳輸進行一個詳細的控制。 特點&#xff1a; 面向字節流安全可靠面向連接 TCP協議段格式 源端口號與目的端口號&#xff1a;這里與UDP的一樣&#xff0c;每個數據都要知道從哪個…

ASOC注冊過程

一、什么是ASOC 在嵌入式系統里面的聲卡驅動為ASOC&#xff08;ALSA System on Chip&#xff09; &#xff0c;它是在ALSA 驅動程序上封裝的一層&#xff0c;分為3大部分&#xff0c;Machine&#xff0c;Platform和Codec ,三部分的關系如下圖所示&#xff1a;其中Machine是指我…

ASOC調用過程

上一篇文章我們將了嵌入式系統注冊聲卡的過程&#xff1a;https://blog.csdn.net/qq_37659294/article/details/104748747 這篇文章我們以打開一個聲卡的播放節點為例&#xff0c;講解一下在APP調用open時&#xff0c;最終會如何調用到硬件相關的函數。 在上一篇文章最后我們說…

編寫聲卡驅動(框架)

在前面兩篇文章中&#xff0c;我們分別講了嵌入式Linux系統聲卡注冊的過程和調用的過程&#xff1a; https://blog.csdn.net/qq_37659294/article/details/104748747 https://blog.csdn.net/qq_37659294/article/details/104802868 講了那么多&#xff0c;我們最終的目的無非…

聲卡學習筆記

分享幾篇關于韋東山聲卡驅動的學習筆記&#xff0c;作者寫得非常詳細。 ALSA驅動框架&#xff1a;https://blog.csdn.net/qingkongyeyue/article/details/52328991 ASoC驅動框架&#xff1a;https://blog.csdn.net/qingkongyeyue/article/details/52349120 ASoC驅動重要結構…

路由器、交換機、集線器的區別

https://blog.csdn.net/weibo1230123/article/details/82779040

$PATH環境變量的作用

echo $PATH 顯示當前PATH環境變量&#xff0c;該變量的值由一系列以冒號分隔的目錄名組成&#xff0c;如&#xff1a;/usr/local/bin:/bin:/usr/bin。(冒號:是路徑分隔符) 在執行一個程序的時候如果沒有PATH的話&#xff0c;就需要寫出路徑名&#xff08;絕對或者相對&#xf…

dmesg

https://blog.csdn.net/zm_21/article/details/31760569

進程上下文與中斷上下文的理解

一.什么是內核態和用戶態 內核態&#xff1a;在內核空間執行&#xff0c;通常是驅動程序&#xff0c;中斷相關程序&#xff0c;內核調度程序&#xff0c;內存管理及其操作程序。 用戶態&#xff1a;用戶程序運行空間。 二.什么是進程上下文與中斷上下文 1.進程上下文&#xf…

GDB調試教程:1小時玩轉Linux gdb命令

原文鏈接&#xff1a;http://c.biancheng.net/gdb/ GDB 入門教程 本教程以下面的代碼為例&#xff0c;在 Linux 系統下來講解 GBD 的調試流程&#xff1a; int main (void) {unsigned long long int n, sum;n 1;sum 0;while (n < 100){sum sum n;n n 1;}return 0; …

shell將命令執行的結果賦值給 變量

https://blog.csdn.net/lemontree1945/article/details/79126819/

Linux下shell腳本指定程序運行時長

https://www.cnblogs.com/yychuyu/p/12626798.html

vim編輯器如何刪除一行或者多行內容

http://blog.itpub.net/69955379/viewspace-2681334/

C++經典問題:如果對象A中有對象成員B,對象B沒有默認構造函數,那么對象A必須在初始化列表中初始化對象B?

對象成員特點總結&#xff1a; &#xff08;1&#xff09;實例化對象A時&#xff0c;如果對象A有對象成員B,那么先執行對象B的構造函數&#xff0c;再執行A的構造函數。 &#xff08;2&#xff09;如果對象A中有對象成員B,那么銷毀對象A時&#xff0c;先執行對象A的析構函數&…

JZ2440用U-Boot給Nand-Flash燒寫程序時報錯:NAND write: incorrect device type in bootloader ‘bootloader‘ is not

JZ2440開發板使用問題&#xff0c;U-Boot燒寫程序到Nand Flash時報錯&#xff1a;NAND write: incorrect device type in bootloader bootloader is not a number 這是因為分區名中u-boot&#xff0c;不是bootloader&#xff0c;而cmd_menu.c里用的是bootloader 可以執行&#…