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...