• 9.20 作业


    myplatform.c

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    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
    2. #include
    3. #include
    4. #include
    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. }

    设备树

    结果

  • 相关阅读:
    滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
    UNIAPP框架中使用BLE蓝牙连接
    帐号授权助力软件产业打造独有商业优势
    Shell 输入/输出重定向学习笔记
    Java进阶学习各种经典书籍电子版
    leetcode 挑七
    34.Python从入门到精通—Python3 正则表达式检索和替换
    简明 SQL 组合查询指南:掌握 UNION 实现数据筛选
    【考研】数据结构考点——折半查找和折半插入排序
    Linux —— 线程
  • 原文地址:https://blog.csdn.net/Remi____/article/details/133094259