色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 利用udev、sys動態創建linux設備結點

利用udev、sys動態創建linux設備結點 時間:2018-08-16      來源:未知

在Linux2.6內核中,devfs被認為是過時的方法,并終被拋棄,udev取代了它。Devfs的一個很重要的特點就是可以動態創建設備結點。那我們現在如何通過udev和sys文件系統動態創建設備結點呢?

下面通過一個實例,說明udev、sys動態創建設備結點的方法。注意代碼中紅色的部分是為了實現動態創建設備結點添加的。 
         #include <linux/module.h> 
         #include <linux/kernel.h>
         #include <linux/init.h> 
         #include <linux/fs.h> 
         #include <linux/cdev.h> 
         #include <asm/uaccess.h> 
         #include <linux/device.h>
         MODULE_LICENSE ("GPL");
         int hello_major = 252;
         int hello_minor = 0;
         int number_of_devices = 1;
         char data[50]="foobar not equal to barfoo";
         struct cdev cdev;
         dev_t dev = 0;
         static int hello_open (struct inode *inode, struct file *file)
         {
         printk (KERN_INFO "Hey! device opened\n");
         return 0;
         }
         static int hello_release (struct inode *inode, struct file *file)
         {
         printk (KERN_INFO "Hmmm... device closed\n");
         return 0;
         }
         ssize_t hello_read (struct file *filp, char *buff, size_t count, loff_t *offp)
         {
         ssize_t result = 0;
         if (copy_to_user (buff, data, sizeof(data)-1)) 
         result = -EFAULT;
         else 
         printk (KERN_INFO "wrote %d bytes\n", count);
         return result;
         }
         ssize_t hello_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos)
         {
         ssize_t ret = 0;
         printk (KERN_INFO "Writing %d bytes\n", count);
         if (count>127) return -ENOMEM;
         if (count<0) return -EINVAL;
         if (copy_from_user (data, buf, count)) {
         ret = -EFAULT;
         }
         else {
         data[127]='\0';
         printk (KERN_INFO"Received: %s\n", data);
         ret = count;
         }
         return ret;
         }
         struct file_operations hello_fops = {
.         owner = THIS_MODULE,
.         open = hello_open,
.         release = hello_release,
.         read = hello_read,
.         write = hello_write
         };
         struct class *my_class;
         static void char_reg_setup_cdev (void)
         {
         int error, devno = MKDEV (hello_major, hello_minor);
         cdev_init (&cdev, &hello_fops);
         cdev.owner = THIS_MODULE;
         cdev.ops = &hello_fops;
         error = cdev_add (&cdev, devno , 1);
         if (error)
         printk (KERN_NOTICE "Error %d adding char_reg_setup_cdev", error);
         /* creating your own class */
         my_class =class_create(THIS_MODULE, "farsight_class");//add by lht
         if(IS_ERR(my_class)) {
         printk("Err: failed in creating class.\n");
         return ;
         }
         /* register your own device in sysfs, and this will cause udevd to create corresponding device node */
         class_device_create(my_class,NULL, devno, NULL,"farsight_dev");
         // device_create(my_class,NULL, devno,"farsight_dev");
         }
         static int __init hello_2_init (void)
         {
         int result;
         dev = MKDEV (hello_major, hello_minor);
         result = register_chrdev_region (dev, number_of_devices, "test");
         if (result<0) {
         printk (KERN_WARNING "hello: can't get major number %d\n", hello_major);
         return result;
         }
         char_reg_setup_cdev ();
         printk (KERN_INFO "char device registered\n");
         return 0;
         }
         static void __exit hello_2_exit (void)
         {
         dev_t devno = MKDEV (hello_major, hello_minor);
         cdev_del (&cdev);
         unregister_chrdev_region (devno, number_of_devices);
         class_device_destroy(my_class, devno);
         class_destroy(my_class);
         }
         module_init (hello_2_init);
         module_exit (hello_2_exit);v

在編譯了驅動后,可以查看/dev/farsight_dev設備結點,和 /sys/class/farsight_class/farsight_dev/ 本代碼的測試環境是Ubantu7.04,內核版本是2.6.20-15-generi。在不同版本的內核中,有些系統函數的參數可能不太一樣。 

上一篇:udev機制

下一篇:arm11開發板適合新手學習嗎

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 亚洲AV成人一区二区三区天堂 | 丰满五十六十老熟女hd | 无码AV波多野结衣久久 | 国产99视频精品免视看7 | 成品片a免费入口麻豆 | 色欲AV久久一区二区三区 | 久久996re热这里只有精品无码 | 日韩欧美亚欧在线视频 | 无码人妻一区二区三区在线视频 | 中国人做受免费视频 | 中国一级毛片在线观看 | 在线观看免费无码专区 | 久久综合九色综合欧洲98 | 久久精品亚洲精品无码金尊 | 国精产品999国精产品官网 | 很色很黄很大爽的视频 | 亚洲AV日韩AV一区二区三曲 | 亚洲深深色噜噜狠狠网站 | 人人爽人人爽人人 | 亚洲成人在线视频网 | 亚洲色欲色欲www在线观看 | 国产成人欧美日韩综合 | 国产欧美日韩精品在线观看 | 亚洲精品国产字幕久久麻豆 | 少妇乳大丰满在线播放 | 亚洲AV一二三又爽又色又色 | 欧美 日韩 久久 | 欧美野外疯狂做受XXXX高潮 | 一色屋精品视频在线观看免费 | 亚洲成a人片在线观看日本 日本一区二区国产 | 在线观看免费a片视频 | 免费无码AV污污污在线观看 | 99国产精品久久99久久久 | 天堂约啪 | 精品国内在视频线2019 | 脱了美女内裤猛烈进入 | 国产激情久久久久久有声小说 | 亚洲综合小说另类图片五月天 | 日本毛毛片| 人人妻人人妻人人片色av | 中文字幕av无码不卡 |