Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.19 KB | None | 0 0
  1. #include <linux/kernel.h>
  2. #include <linux/module.h>
  3. #include <linux/fs.h>
  4. #include <asm/uaccess.h>
  5. #include <linux/types.h>
  6. #include <linux/kdev_t.h>
  7. #include <linux/cdev.h>
  8.  
  9. #define MOD_AUTHOR "Legierski Michal"
  10. #define MOD_DESC "Hello world"
  11.  
  12.  
  13. static int __init chardev_init ( void );
  14. static void __exit chardev_exit ( void );
  15. static int device_open ( struct inode *, struct file * );
  16. static int device_release( struct inode *, struct file * );
  17. static ssize_t device_read ( struct file *, char * , size_t , loff_t * );
  18. static ssize_t device_write( struct file *, const char * , size_t , loff_t * );
  19. #define SUCCESS 0
  20. #define DEVICE_NAME " chardev "
  21. #define BUF_LEN 100
  22.  
  23. static int Major = 122;
  24. DEFINE_MUTEX( Device_Open );
  25. static char msg [ BUF_LEN ] ;
  26. static char *msg_Ptr;
  27. static int licznik = 0;
  28. static struct cdev * chcdev;
  29.  
  30. static struct file_operations fops = {
  31. .read = device_read,
  32. .write = device_write,
  33. .open = device_open,
  34. .release = device_release
  35. };
  36.  
  37. static int __init chardev_init( void ){
  38. int ret;
  39. dev_t num;
  40.  
  41. num=MKDEV(Major,0);
  42.  
  43. ret=register_chrdev_region(num,3,DEVICE_NAME);
  44. if(ret<0){
  45. printk(KERN_ALERT"Nieudana próba przydziału urządzenia w jądrze - zwrócony numer %d\n", ret);
  46. return ret;
  47. }
  48.  
  49. chcdev=cdev_alloc();
  50. chcdev->owner = THIS_MODULE;
  51. chcdev->ops = &fops;
  52.  
  53. ret = cdev_add(chcdev,num,3);
  54.  
  55. if(ret<0){
  56. printk(KERN_ALERT "Nieudana próba zarejestrowania urządzenia w jądrze - zwrócony numer %d\n", ret);
  57. return ret;
  58. }
  59.  
  60. printk(KERN_INFO "Przydzielono mi numer urządzenia %d. Otwórz plik\n", Major);
  61. printk(KERN_INFO "urządzenia za pomoc!"
  62. "'mknod/dev/%s c %d 0', a potem\n", DEVICE_NAME, Major);
  63. printk(KERN_INFO "z inną ostatnią cyfrą. Próbuj czytać i pisać do tego\n");
  64. printk(KERN_INFO "urządzania. Po usunięciu urządzenia usuń i plik\n");
  65. return SUCCESS;
  66. }
  67.  
  68. static void __exit chardev_exit(void){
  69. dev_t num;
  70.  
  71. num = MKDEV(Major,0);
  72.  
  73. cdev_del(chcdev);
  74.  
  75. unregister_chrdev_region(num,3);
  76. printk(KERN_INFO"Żegnaj, świecie!\n");
  77. }
  78.  
  79. static int device_open(struct inode *inoda, struct file *plik){
  80.  
  81. printk(KERN_INFO "Otwarcie pliku urządzenia o numerze pobocznym"
  82. "%d\n",iminor(inoda));
  83.  
  84. if(mutex_lock_interruptible(&Device_Open)){
  85. printk(KERN_INFO "Próba przejęcia semafora przerwana!\n");
  86. return -ERESTARTSYS;
  87. }
  88.  
  89. try_module_get(THIS_MODULE);
  90.  
  91. sprintf(msg, "Hello, world! mówię poraz%d\n",++licznik);
  92. msg_Ptr=msg;
  93.  
  94. return SUCCESS;
  95. }
  96.  
  97. static int device_release( struct inode *inoda, struct file *plik){
  98.  
  99. mutex_unlock(&Device_Open);
  100.  
  101. module_put(THIS_MODULE);
  102. return 0;
  103. }
  104.  
  105. static ssize_t device_read( struct file *plik, char *buforUz, size_t dlugosc, loff_t *offset){
  106.  
  107. int odczytano = 0;
  108.  
  109. if(*msg_Ptr == 0)
  110. {
  111. return 0;
  112. }
  113.  
  114. while(dlugosc && *msg_Ptr){
  115. put_user( *(msg_Ptr++), buforUz++);
  116. dlugosc--;
  117. odczytano++;
  118. }
  119. *offset += odczytano;
  120. return odczytano;
  121. }
  122.  
  123. static ssize_t device_write( struct file *plik, const char *bufor, size_t dlugosc, loff_t *offset){
  124.  
  125. printk(KERN_ALERT "To urządzenie nie obsługuje zapisu!\n");
  126. return -EINVAL;
  127. }
  128.  
  129.  
  130.  
  131.  
  132.  
  133. module_init(chardev_init);
  134. module_exit(chardev_exit);
  135.  
  136. MODULE_LICENSE("GPL v2");
  137. MODULE_AUTHOR(MOD_AUTHOR);
  138. MODULE_DESCRIPTION(MOD_DESC);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement