關於裝置節點的問題

2021-06-11 18:18:46 字數 2818 閱讀 7693

1.自動建立裝置節點

昨天剛剛試過,用一般字元裝置的方式生成模組,但是模組載入到開發板上去發現,不能在/dev下生成裝置節點,這樣就無法使用應用程式測試驅動。最後,發現是因為我使用的是動態註冊裝置的辦法,這種辦法雖然可以避免靜態註冊的麻煩,但是會造成無法直接生產裝置節點,現在在程式中加入udev/mdev的辦法,自動建立裝置節點。

在驅動初始化**裡呼叫class_create為該裝置建立乙個class,再為每個裝置呼叫device_create建立對應的裝置。

eg:    struct class *myclass=class_create(this_module,"my_device_driver");

device_create(myclass,null,mkdev(major_num,0),null,"mydevice")

當驅動被載入時,udev(mdev)就會自動在/dev下建立my_device裝置檔案

動態裝置自動建立裝置節點的辦法(//*****之間內容為新增自動建立裝置節點的**)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include //**************

static struct device *dev;

//*************

#define device_name "myled"

static struct cdev *cdevp=null;//定義乙個cdev結構體,並初始化

static dev_t devno;//定義乙個裝置號

static unsigned long led_table = ;

static unsigned int led_cfg_table = ;

static int s3c2440_leds_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)

s3c2410_gpio_setpin(led_table[arg],!cmd);

return 0;

default:

return -einval;

}}//應用程式與驅動對映

static struct file_operations myled_fops = ;

//**************

static struct class *led_class;

//**************

static int __init myled_init_module(void)

//****************************

led_class= class_create(this_module,device_name);

if(is_err(led_class))

dev=device_create(led_class,null,devno,null,device_name);

//**************************

cdevp = cdev_alloc();//動態申請乙個cdev記憶體

cdev_init(cdevp,&myled_fops);//初始化cdev

cdevp->owner = this_module;

err=cdev_add(cdevp,devno,1);

if(err)

for(i=0;i<4;i++)

printk(device_name "\tinitialized! 2012-12-9\n");

return 0;

}static void __exit myled_exit_module(void)

module_init(myled_init_module);

module_exit(myled_exit_module);

module_license("gpl");

module_author("tong 2012-12-9");

2.手動建立裝置節點

今天編譯載入memdev的過程中,發現無法載入模組,搜尋一下,檢視 cat /dev/devices,

是因為定義的主裝置號已經系統別的裝置呼叫,起了衝突,換個未被使用的主裝置號,ok,

插入模組成功後,用lsmod,檢視模組是否載入成功,再用cat /dev/devices,是不是多了乙個剛才載入成功

的模組。

查閱到成功註冊到主裝置號後,通過 "mknod /dev/memdev c 250 0"命令建立"dev/memdev"裝置節點

通過"echo 'hello world' > /dev/memdev "命令和"cat /dev/memdev"命令分別驗證裝置的讀寫。

關於篩選輸入裝置的裝置節點

對於一些輸入裝置,尤其是熱插拔的usb裝置,其會自動生成或者關聯裝置節點 dev input eventx x 0,1,2,這時候,我們需要找到我們要操作的目標裝置節點,下面是乙個示例,可以根據輸入裝置的name域判斷.如下 function this demo is to detect what ...

Zigbee裝置節點

zigbee定義了3種型別的裝置,每種裝置都有自己的功能要求 1 zigbee協調器 co ordinator 是啟動和配置網路的一種裝置,是網路的中心節點,乙個zigbee網路只允許有乙個zigbee協調器 2 zigbee路由器 router 是一種支援關聯的裝置,能夠將訊息 到其他裝置,zig...

生成裝置節點

雜項裝置的主裝置號是10,在任何linux 系統中它都是固定的。這樣雜項裝置的引入即解決了裝置號數量少的問題,又降低了使用難度,還能防止碎片化,一舉多得。雜項裝置的標頭檔案在 include linux miscdevice.h 雜項裝置註冊函式 一般在probe 中呼叫,引數是miscdevice...