• 华清远见上海中心22071班--11.28作业


    题目:三个按键实现按键中断,key1>>led1,key2>>led2, key3>>led3。按键按一下灯亮,再按一下灯灭 。

    1. #include <linux/init.h>
    2. #include <linux/module.h>
    3. #include <linux/of.h>
    4. #include <linux/gpio.h>
    5. #include <linux/of_gpio.h>
    6. #include <linux/timer.h>
    7. #include <linux/of_irq.h>
    8. #include <linux/interrupt.h>
    9. //定义指针指向获取的设备树节点信息空间
    10. struct device_node *node;
    11. struct gpio_desc *gpiono1;
    12. struct gpio_desc *gpiono2;
    13. struct gpio_desc *gpiono3;
    14. int ret;
    15. unsigned int irqno1;
    16. unsigned int irqno2;
    17. unsigned int irqno3;
    18. struct device_node *node_irq;
    19. //中断处理函数
    20. irqreturn_t irq_handler1(int irqno, void *dev)
    21. {
    22. printk("key1 interrupt....\n");
    23. gpiod_set_value(gpiono1, !gpiod_get_value(gpiono1));
    24. return IRQ_HANDLED;
    25. }
    26. irqreturn_t irq_handler2(int irqno, void *dev)
    27. {
    28. printk("key2 interrupt...\n");
    29. gpiod_set_value(gpiono2, !gpiod_get_value(gpiono2));
    30. return IRQ_HANDLED;
    31. }
    32. irqreturn_t irq_handler3(int irqno, void *dev)
    33. {
    34. printk("key3 interrupt....\n");
    35. gpiod_set_value(gpiono3, !gpiod_get_value(gpiono3));
    36. return IRQ_HANDLED;
    37. }
    38. static int __init mycdev_init(void)
    39. {
    40. //通过名字获取设备树节点信息
    41. node = of_find_node_by_name(NULL, "myleds");
    42. if (node == NULL)
    43. {
    44. printk("通过名字解析设备树节点失败\n");
    45. return -EFAULT;
    46. }
    47. printk("成功解析到设备树节点\n");
    48. //获取并申请gpio编号
    49. gpiono1 = gpiod_get_from_of_node(node, "myled1", 0, GPIOD_OUT_LOW, NULL);
    50. if (IS_ERR(gpiono1))
    51. {
    52. printk("获取gpio编号失败\n");
    53. return PTR_ERR(gpiono1);
    54. }
    55. printk("成功获取到编号1\n");
    56. gpiono2 = gpiod_get_from_of_node(node, "myled2", 0, GPIOD_OUT_LOW, NULL);
    57. if (IS_ERR(gpiono2))
    58. {
    59. printk("获取gpio编号失败\n");
    60. return PTR_ERR(gpiono2);
    61. }
    62. printk("成功获取到编号2\n");
    63. gpiono3 = gpiod_get_from_of_node(node, "myled3", 0, GPIOD_OUT_LOW, NULL);
    64. if (IS_ERR(gpiono3))
    65. {
    66. printk("获取gpio编号失败\n");
    67. return PTR_ERR(gpiono3);
    68. }
    69. printk("成功获取到编号3\n");
    70. //通过名字获取中断设备树节点信息
    71. node_irq = of_find_node_by_name(NULL, "myirq");
    72. if (node_irq == NULL)
    73. {
    74. printk("通过名字解析设备树节点失败\n");
    75. return -EFAULT;
    76. }
    77. printk("成功解析到中断设备树节点\n");
    78. //根据设备树获取key1软中断号
    79. irqno1 = irq_of_parse_and_map(node_irq, 2);
    80. if (irqno1 == 0)
    81. {
    82. printk("获取软中断号失败\n");
    83. return EINVAL;
    84. }
    85. printk("获取key1软中断号成功\n");
    86. //根据设备树获取key2软中断号
    87. irqno2 = irq_of_parse_and_map(node_irq, 0);
    88. if (irqno2 == 0)
    89. {
    90. printk("获取软中断号失败\n");
    91. return EINVAL;
    92. }
    93. printk("获取key2软中断号成功\n");
    94. //根据设备树获取key2软中断号
    95. irqno3 = irq_of_parse_and_map(node_irq, 1);
    96. if (irqno3 == 0)
    97. {
    98. printk("获取软中断号失败\n");
    99. return EINVAL;
    100. }
    101. printk("获取key3软中断号成功\n");
    102. //将中断号注册进内核
    103. ret = request_irq(irqno1, irq_handler1, IRQF_TRIGGER_FALLING, "key1_inte", NULL);
    104. if (ret)
    105. {
    106. printk("注册中断失败\n");
    107. return ret;
    108. }
    109. ret = request_irq(irqno2, irq_handler2, IRQF_TRIGGER_FALLING, "key2_inte", NULL);
    110. if (ret)
    111. {
    112. printk("注册中断失败\n");
    113. return ret;
    114. }
    115. ret = request_irq(irqno3, irq_handler3, IRQF_TRIGGER_FALLING, "key3_inte", NULL);
    116. if (ret)
    117. {
    118. printk("注册中断失败\n");
    119. return ret;
    120. }
    121. printk("注册中断成功\n");
    122. return 0;
    123. }
    124. static void __exit mycdev_exit(void)
    125. {
    126. //中断注销
    127. free_irq(irqno1, NULL);
    128. free_irq(irqno2, NULL);
    129. free_irq(irqno3, NULL);
    130. //熄灭led
    131. gpiod_set_value(gpiono1, 0);
    132. gpiod_set_value(gpiono2, 0);
    133. gpiod_set_value(gpiono3, 0);
    134. //释放gpio编号
    135. gpiod_put(gpiono1);
    136. gpiod_put(gpiono2);
    137. gpiod_put(gpiono3);
    138. }
    139. module_init(mycdev_init);
    140. module_exit(mycdev_exit);
    141. MODULE_LICENSE("GPL");

    测试结果:

     

     

     

     

     

  • 相关阅读:
    阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布
    docker版jxTMS使用指南:4.6版升级内容
    ideaSSM在线商务管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
    Bootstrap对段落和文本的设置(与段落-和文本相关的类)
    B站季报图解:营收58亿净亏收窄36% 日活突破9000万
    【报错】overleaf不能成功编译中文(在线latex)
    LeetCode每日一题——791. 自定义字符串排序
    C# Task任务详解
    个人开源项目如何上传maven中央仓库
    【LeetCode每日一题:1769. 移动所有球到每个盒子所需的最小操作数~~~双重循环遍历模拟】
  • 原文地址:https://blog.csdn.net/guangyinAA/article/details/128084968