0


9.20 作业

myplatform.c

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/of.h>
  4. #include <linux/of_irq.h>
  5. #include <linux/of_gpio.h>
  6. #include <linux/interrupt.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/mod_devicetable.h>
  9. #include <linux/cdev.h>
  10. char number = 1;
  11. struct gpio_desc *led1;
  12. unsigned int irqno;
  13. struct timer_list timer;
  14. unsigned int major = 0;
  15. unsigned int minor = 0;
  16. char *devname = "myplatform";
  17. struct cdev *cdev;
  18. struct class *cls;
  19. struct device *dev;
  20. // 封装操作方法
  21. int led_open(struct inode *inode, struct file *file)
  22. {
  23. return 0;
  24. }
  25. ssize_t led_read(struct file *file, char *ubuf, size_t size, loff_t *lof)
  26. {
  27. unsigned long res = copy_to_user(ubuf, &number, size < sizeof(number) ? size : sizeof(number));
  28. return res;
  29. }
  30. int led_close(struct inode *inode, struct file *file)
  31. {
  32. return 0;
  33. }
  34. // 定义一个操作方法结构体对象并且初始化
  35. struct file_operations fops = {
  36. .open = led_open,
  37. .read = led_read,
  38. .release = led_close,
  39. };
  40. irqreturn_t key_handler(int irq, void *dev)
  41. {
  42. number = !number;
  43. gpiod_set_value(led1, !gpiod_get_value(led1));
  44. return IRQ_HANDLED;
  45. }
  46. int pdrv_probe(struct platform_device *pdev)
  47. {
  48. unsigned int dnub;
  49. printk("%s%s%d\n", __FILE__, __func__, __LINE__);
  50. cdev = cdev_alloc();
  51. if (!cdev)
  52. {
  53. printk("字符设备驱动对象申请空间失败\n");
  54. return -1;
  55. }
  56. printk("字符设备驱动对象申请空间成功\n");
  57. cdev_init(cdev, &fops);
  58. if (alloc_chrdev_region(&dnub, minor, 1, devname))
  59. {
  60. printk("动态申请设备号失败\n");
  61. return -1;
  62. }
  63. printk("动态申请设备号成功\n");
  64. major = MAJOR(dnub);
  65. if (cdev_add(cdev, MKDEV(major, minor), 1))
  66. {
  67. printk("注册驱动失败\n");
  68. return -1;
  69. }
  70. printk("注册驱动成功\n");
  71. cls = class_create(THIS_MODULE, devname);
  72. if (IS_ERR(cls))
  73. {
  74. printk("向上提交目录失败\n");
  75. return -1;
  76. }
  77. printk("向上提交目录成功\n");
  78. dev = device_create(cls, NULL, MKDEV(major, minor), NULL, devname);
  79. if (IS_ERR(cls))
  80. {
  81. printk("向上提交设备节点信息失败\n");
  82. return -1;
  83. }
  84. printk("向上提交设备节点信息成功\n");
  85. led1 = gpiod_get_from_of_node(pdev->dev.of_node, "led1-gpio", 0, GPIOD_OUT_HIGH, NULL);
  86. if (IS_ERR(led1))
  87. {
  88. printk("解析GPIO失败\n");
  89. return -1;
  90. }
  91. printk("解析GPIO成功\n");
  92. irqno = irq_of_parse_and_map(pdev->dev.of_node, 0);
  93. if (!irqno)
  94. {
  95. printk("中断号解析失败\n");
  96. return -1;
  97. }
  98. printk("中断号解析成功\n");
  99. if (request_irq(irqno, key_handler, IRQF_TRIGGER_FALLING, "key", NULL))
  100. {
  101. printk("中断注册失败\n");
  102. return -1;
  103. }
  104. printk("中断注册成功\n");
  105. return 0;
  106. };
  107. int pdrv_remove(struct platform_device *pdev)
  108. {
  109. printk("%s%s%d\n", __FILE__, __func__, __LINE__);
  110. gpiod_set_value(led1, 0);
  111. gpiod_put(led1);
  112. device_destroy(cls, MKDEV(major, minor));
  113. class_destroy(cls);
  114. cdev_del(cdev);
  115. unregister_chrdev_region(MKDEV(major, minor), 1);
  116. kfree(cdev);
  117. free_irq(irqno, NULL);
  118. return 0;
  119. }
  120. struct of_device_id oftable[] = {
  121. {
  122. .name = "myplatform",
  123. //.compatible = "hqyj,myplatform",
  124. },
  125. {},
  126. };
  127. struct platform_driver pdrv = {
  128. .probe = pdrv_probe,
  129. .remove = pdrv_remove,
  130. .driver = {
  131. .name = "abcd",
  132. .of_match_table = oftable,
  133. },
  134. };
  135. module_platform_driver(pdrv);
  136. MODULE_LICENSE("GPL");

test.c

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <unistd.h>
  4. #include <sys/ioctl.h>
  5. #include "head.h"
  6. int main()
  7. {
  8. int fd;
  9. char number;
  10. fd = open("/dev/myplatform", O_RDWR);
  11. if (fd < 0)
  12. {
  13. printf("文件打开失败\n");
  14. return -1;
  15. }
  16. read(fd,&number,sizeof(number));
  17. printf("number=%d\n",number);
  18. close(fd);
  19. return 0;
  20. }

设备树

结果

标签: linux c

本文转载自: https://blog.csdn.net/Remi____/article/details/133094259
版权归原作者 Remi____ 所有, 如有侵权,请联系我们删除。

“9.20 作业”的评论:

还没有评论