Advertisement
Guest User

Untitled

a guest
Apr 18th, 2014
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. #include <linux/init.h>
  2. #include <linux/module.h> /** needed by all modules **/
  3. #include <linux/kernel.h> /** This is for KERN_ALERT **/
  4. #include <linux/fs.h>
  5. #include <linux/cdev.h>
  6.  
  7. /** for putuser **/
  8. #include <asm/uaccess.h>
  9.  
  10. MODULE_LICENSE("SJ BSD/GPL");
  11.  
  12.  
  13. static struct cdev SimpleDevs[2];
  14.  
  15. static int simple_major = 0;
  16.  
  17.  
  18. static ssize_t sj_read(struct file *filp,
  19. char *buffer, /* The buffer to fill with data */
  20. size_t length, /* The length of the buffer */
  21. loff_t *offset);
  22.  
  23. static int sj_open(struct inode *inode, struct file *file);
  24.  
  25.  
  26. static struct file_operations fops = {
  27. .read = sj_read,
  28. //.write = sj_write,
  29. .open = sj_open,
  30. //.release = sj_release
  31. };
  32.  
  33. static ssize_t sj_read(struct file *filp,
  34. char *buffer, /* The buffer to fill with data */
  35. size_t length, /* The length of the buffer */
  36. loff_t *offset) /* Our offset in the file */
  37. {
  38.  
  39. char msg[1024] = "Hello SJ_read";
  40. copy_to_user( buffer, msg, sizeof(msg) );
  41.  
  42. return sizeof(msg);
  43.  
  44. }
  45.  
  46. static void simple_setup_cdev(struct cdev *dev, int minor,
  47. struct file_operations *fops)
  48. {
  49. int err, devno = MKDEV(simple_major, minor);
  50.  
  51. dev = cdev_alloc();
  52.  
  53. cdev_init(dev, fops);
  54. dev->owner = THIS_MODULE;
  55. dev->ops = fops;
  56. err = cdev_add (dev, devno, 1);
  57. /* Fail gracefully if need be */
  58. if (err)
  59. printk (KERN_NOTICE "Error %d adding simple%d", err, minor);
  60. }
  61.  
  62. static int sjDevInit(void)
  63. {
  64.  
  65. int result;
  66. dev_t dev;
  67.  
  68. printk("Device Init now..");
  69.  
  70.  
  71. /** int alloc_chrdev_region(dev_t *dev, unsigned int firstminor,unsigned int count, char *name); **/
  72. /** dev -> The dev_t variable type,which will get the major number that the kernel allocates. **/
  73. /**The same name will appear in /proc/devices. **/
  74. result = alloc_chrdev_region(&dev, 0, 1, "simple");
  75. if( result < 0 )
  76. {
  77. printk("Error in allocating device");
  78. return -1;
  79. }
  80. // printk("simple_major ..");
  81. simple_major = MAJOR(dev);
  82. printk("simple_major number is %d ..rn",simple_major );
  83.  
  84. /* Now set up two cdevs. */
  85.  
  86. simple_setup_cdev(SimpleDevs, 0, &fops);
  87. simple_setup_cdev(SimpleDevs + 1, 1, &fops);
  88.  
  89. return 0;
  90.  
  91. }
  92.  
  93.  
  94. static void sjDevRel(void)
  95. {
  96. printk("Releasing Simple Devsrn");
  97. cdev_del(SimpleDevs);
  98.  
  99. }
  100.  
  101. static int sj_open(struct inode *inode, struct file *file)
  102. {
  103.  
  104. printk("Kernel..Sj_open ..I am openedrn");
  105.  
  106. return 0;
  107. }
  108.  
  109. module_init(sjDevInit);
  110. module_exit(sjDevRel);
  111.  
  112. err = cdev_add (dev, devno, 1);
  113. /* Fail gracefully if need be */
  114. if (err)
  115. printk (KERN_NOTICE "Error %d adding simple%d", err, minor);
  116. kobject_uevent(&dev->kobj, KOBJ_ADD);
  117.  
  118. kobject_uevent(&SimpleDevs[0]->kobj, KOBJ_REMOVE);
  119. printk("Releasing Simple Devsrn");
  120. cdev_del(SimpleDevs[0]);
  121.  
  122. char event[] = "DISK_RO=1";
  123. char *envp[] = { event, NULL };
  124.  
  125. if (!ro)
  126. event[8] = '0';
  127. kobject_uevent_env(&disk_to_dev(gd)->kobj, KOBJ_CHANGE, envp);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement