Advertisement
goroh_kun

memdev.c(mmap test)

Jan 21st, 2013
585
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.54 KB | None | 0 0
  1. /* drivers/char/memdev.c
  2.  *
  3.  * This software is licensed under the terms of the GNU General Public
  4.  * License version 2, as published by the Free Software Foundation, and
  5.  * may be copied, distributed, and modified under those terms.
  6.  *
  7.  * This program is distributed in the hope that it will be useful,
  8.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.  * GNU General Public License for more details.
  11.  *
  12.  */
  13. #include <asm/uaccess.h>
  14. #include <linux/module.h>
  15. #include <linux/cdev.h>
  16. #include <linux/semaphore.h>
  17. #include <linux/sched.h>
  18. #include <linux/wait.h>
  19. #include <linux/fs.h>
  20. #include <linux/mm.h>
  21. #include <linux/device.h>
  22.  
  23. #define DEVICE_NAME "memdev"
  24.  
  25. static int memdev_mmap(struct file *filp, struct vm_area_struct *vma)
  26. {
  27.     int err;
  28.     err = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vma->vm_start, vma->vm_page_prot);
  29.     if (err) {
  30.         printk(KERN_ALERT "%s :io_remap_pfn_range failed.: \n", __func__);
  31.         return -EAGAIN;
  32.     }
  33.     return 0;
  34. }
  35.  
  36. static int memdev_open(struct inode *inode, struct file *filp)
  37. {
  38.     return 0;
  39. }
  40.  
  41. static int memdev_release(struct inode *inode, struct file *filp)
  42. {
  43.     return 0;
  44. }
  45.  
  46. static struct file_operations memdev_fops = {
  47.     .owner = THIS_MODULE,
  48.     .mmap = memdev_mmap,
  49.     .open = memdev_open,
  50.     .release = memdev_release
  51. };
  52.  
  53. static int alloc_chrdev_region_ok = 0;  /* false */
  54. static int cdev_add_ok = 0;             /* false */
  55. static int class_create_ok = 0;         /* false */
  56. static int device_create_ok = 0;        /* false */
  57.  
  58. static struct cdev memdev_cdev;
  59. static dev_t memdev_dev;
  60. static struct class *memdev_class;
  61.  
  62. static void cleanup(void)
  63. {
  64.     if (device_create_ok) {
  65.         device_destroy(memdev_class, memdev_dev);
  66.     }
  67.     if (class_create_ok) {
  68.         class_destroy(memdev_class);
  69.     }
  70.     if (cdev_add_ok) {
  71.         cdev_del(&memdev_cdev);
  72.     }
  73.     if (alloc_chrdev_region_ok) {
  74.         unregister_chrdev_region(memdev_dev, 1);
  75.     }
  76.  
  77.     return;
  78. }
  79.  
  80. static int __init memdev_init(void)
  81. {
  82.     int err = -1;
  83.  
  84.     err = alloc_chrdev_region(&memdev_dev, 0, 1, DEVICE_NAME);
  85.     if (err) {
  86.         printk(KERN_ALERT "%s :alloc_chrdev_region failed.: %d\n", __func__, err);
  87.         goto fail;
  88.     } else {
  89.         alloc_chrdev_region_ok = 1; /* true */
  90.     }
  91.  
  92.     cdev_init(&memdev_cdev, &memdev_fops);
  93.     memdev_cdev.owner = THIS_MODULE;
  94.  
  95.     err = cdev_add(&memdev_cdev, memdev_dev, 1);
  96.     if (err) {
  97.         printk(KERN_ALERT "%s :cdev_add failed.: %d\n", __func__, err);
  98.         goto fail;
  99.     } else {
  100.         cdev_add_ok = 1; /* true */
  101.     }
  102.  
  103.     /* make device file */
  104.     memdev_class = class_create(THIS_MODULE, DEVICE_NAME);
  105.  
  106.     if (IS_ERR(memdev_class)) {
  107.         printk(KERN_ALERT "%s :class_create failed.: \n", __func__);
  108.         goto fail;
  109.     } else {
  110.         class_create_ok = 1; /* true */
  111.     }
  112.  
  113.     if (device_create(memdev_class, NULL, memdev_dev,
  114.                       &memdev_cdev, DEVICE_NAME) < 0) {
  115.         printk(KERN_ALERT "%s :device_create failed.: \n", __func__);
  116.         goto fail;
  117.     } else {
  118.         device_create_ok = 1; /* true */
  119.     }
  120.  
  121.    
  122.     return 0;
  123.  
  124. fail:
  125.     cleanup();
  126.     return err;
  127. }
  128.  
  129. module_init(memdev_init);
  130.  
  131. static void __exit memdev_exit(void)
  132. {
  133.     cleanup();
  134.     return;
  135. }
  136.  
  137. module_exit(memdev_exit);
  138.  
  139. MODULE_DESCRIPTION("MEMDEV DRIVER MODULE");
  140. MODULE_LICENSE("GPL v2");
  141. MODULE_AUTHOR("goroh_kun");
  142. MODULE_VERSION("1.00");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement