国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 利用udev、sys動態(tài)創(chuàng)建linux設(shè)備結(jié)點

利用udev、sys動態(tài)創(chuàng)建linux設(shè)備結(jié)點 時間:2018-08-16      來源:未知

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

下面通過一個實例,說明udev、sys動態(tài)創(chuàng)建設(shè)備結(jié)點的方法。注意代碼中紅色的部分是為了實現(xiàn)動態(tài)創(chuàng)建設(shè)備結(jié)點添加的。 
         #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

在編譯了驅(qū)動后,可以查看/dev/farsight_dev設(shè)備結(jié)點,和 /sys/class/farsight_class/farsight_dev/ 本代碼的測試環(huán)境是Ubantu7.04,內(nèi)核版本是2.6.20-15-generi。在不同版本的內(nèi)核中,有些系統(tǒng)函數(shù)的參數(shù)可能不太一樣。 

上一篇:udev機制

下一篇:arm11開發(fā)板適合新手學(xué)習(xí)嗎

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

回到頂部