Advertisement
Guest User

Untitled

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