charDevice.c 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/fs.h> // 包含 file_operations 和 register_chrdev 函数
  4. #include <linux/cdev.h> // 包含 cdev 相关结构和函数
  5. #define DEVICE_NAME "charDevice2"
  6. #define CLASS_NAME "my_char_class2"
  7. static int majorNumber; // 设备号
  8. static struct class* myCharClass = NULL; // 设备类
  9. // 文件操作函数声明
  10. static int dev_open(struct inode *inode, struct file *file);
  11. static int dev_release(struct inode *inode, struct file *file);
  12. static ssize_t dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos);
  13. static ssize_t dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos);
  14. // 文件操作结构
  15. static struct file_operations fops = {
  16. .owner = THIS_MODULE,
  17. .open = dev_open,
  18. .release = dev_release,
  19. .read = dev_read,
  20. .write = dev_write,
  21. };
  22. // 文件操作函数的实现
  23. static int dev_open(struct inode *inode, struct file *file) {
  24. pr_info("Device opened\n");
  25. return 0;
  26. }
  27. static int dev_release(struct inode *inode, struct file *file) {
  28. pr_info("Device closed\n");
  29. return 0;
  30. }
  31. static ssize_t dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {
  32. pr_info("Reading from device\n");
  33. return 0; // 假设返回 0 表示读到文件结尾
  34. }
  35. static ssize_t dev_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {
  36. pr_info("Writing to device\n");
  37. return count; // 返回写入的字节数
  38. }
  39. static int __init helloworld_init(void) {
  40. int retvalue;
  41. // 自动申请设备号
  42. majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
  43. if (majorNumber < 0) {
  44. printk(KERN_ALERT "my_char_device failed to register a major number\n");
  45. return majorNumber;
  46. }
  47. printk(KERN_INFO "my_char_device: registered correctly with major number %d\n", majorNumber);
  48. // 创建设备类
  49. myCharClass = class_create(THIS_MODULE, CLASS_NAME);
  50. if (IS_ERR(myCharClass)) {
  51. unregister_chrdev(majorNumber, DEVICE_NAME);
  52. printk(KERN_ALERT "Failed to register device class\n");
  53. return PTR_ERR(myCharClass);
  54. }
  55. // 创建设备
  56. device_create(myCharClass, NULL, MKDEV(majorNumber, 0), NULL, DEVICE_NAME);
  57. printk(KERN_INFO "my_char_device: device class created correctly\n");
  58. pr_info("Hello world initialization!\n");
  59. return 0;
  60. }
  61. static void __exit helloworld_exit(void) {
  62. device_destroy(myCharClass, MKDEV(majorNumber, 0)); // 删除设备
  63. class_unregister(myCharClass); // 取消设备类注册
  64. class_destroy(myCharClass); // 销毁设备类
  65. // 注销字符设备驱动
  66. unregister_chrdev(200, DEVICE_NAME);
  67. pr_info("Hello world exit\n");
  68. }
  69. module_init(helloworld_init);
  70. module_exit(helloworld_exit);
  71. MODULE_LICENSE("GPL");
  72. MODULE_AUTHOR("John Madieu <john.madieu@gmail.com>");
  73. MODULE_DESCRIPTION("Linux kernel module skeleton");