• 11.8代码


    利用gpiod子系统实现开发板六盏灯,安装驱动点亮,卸载驱动熄灭

    1. #include
    2. #include
    3. #include
    4. #include
    5. /*
    6. myleds{
    7. core-leds{
    8. leds = <&gpioz 5 0>,<&gpioz 6 0>,<&gpioz 7 0>;
    9. };
    10. extend-leds{
    11. led1 = <&gpioe 10 0>;
    12. led2 = <&gpiof 10 0>;
    13. led3 = <&gpioe 8 0>;
    14. };
    15. };
    16. */
    17. struct device_node *node;
    18. struct device_node *core_node;
    19. struct device_node *extend_node;
    20. struct gpio_desc *core_desc[3];
    21. struct gpio_desc *extend_desc[3];
    22. char *extend_leds[3] = {"led1", "led2", "led3"};
    23. // 入口
    24. static int __init demo_init(void)
    25. {
    26. int i;
    27. // 获取父结点
    28. node = of_find_node_by_path("/myleds");
    29. if (node == NULL)
    30. {
    31. printk("of_find_node_by_path is error\n");
    32. return -EIO;
    33. }
    34. // 获取core子节点
    35. core_node = of_get_child_by_name(node, "core-leds");
    36. if (core_node == NULL)
    37. {
    38. printk("core of_get_child_by_name is error\n");
    39. return -EIO;
    40. }
    41. // 获取extend子节点
    42. extend_node = of_get_child_by_name(node, "extend-leds");
    43. if (node == NULL)
    44. {
    45. printk("extend of_get_child_by_name is error\n");
    46. return -EIO;
    47. }
    48. for (i = 0; i < 3; i++)
    49. {
    50. // 获取gpio结构体
    51. core_desc[i] = gpiod_get_from_of_node(core_node, "leds", i, GPIOD_OUT_HIGH, NULL);
    52. // 申请gpio编号
    53. gpiod_get_value(core_desc[i]);
    54. // 设置gpio输出为1
    55. gpiod_direction_output(core_desc[i], 1);
    56. }
    57. for (i = 0; i < 3; i++)
    58. {
    59. // 获取gpio结构体
    60. extend_desc[i] = gpiod_get_from_of_node(extend_node, extend_leds[i], 0, GPIOD_OUT_HIGH, NULL);
    61. // 申请gpio编号
    62. gpiod_get_value(extend_desc[i]);
    63. // 设置gpio输出为1
    64. gpiod_direction_output(extend_desc[i], 1);
    65. }
    66. return 0;
    67. }
    68. // 出口
    69. static void __exit demo_exit(void)
    70. {
    71. int i;
    72. for (i = 0; i < 3; i++)
    73. {
    74. // 设置gpio输出为0
    75. gpiod_direction_output(core_desc[i], 0);
    76. // 释放gpio编号
    77. gpiod_put(core_desc[i]);
    78. }
    79. for (i = 0; i < 3; i++)
    80. {
    81. // 设置gpio输出为0
    82. gpiod_direction_output(extend_desc[i], 0);
    83. // 释放gpio编号
    84. gpiod_put(extend_desc[i]);
    85. }
    86. }
    87. module_init(demo_init);
    88. module_exit(demo_exit);
    89. MODULE_LICENSE("GPL"); // 许可证

    使用linux中断子系统完成三个按键编写

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. /*
    7. mykeys{
    8. interrupt-parent=<&gpiof>;
    9. interrupts = <9 0>,<7 0>,<8 0>;
    10. };
    11. */
    12. irqreturn_t key1_irq_handler(int irq, void *dev)
    13. {
    14. int key = (int)dev;
    15. switch (key)
    16. {
    17. case 0:
    18. printk("key1 down!!!\n");
    19. break;
    20. case 1:
    21. printk("key2 down!!!\n");
    22. break;
    23. case 2:
    24. printk("key3 down!!!\n");
    25. break;
    26. default:
    27. break;
    28. }
    29. return IRQ_HANDLED;
    30. }
    31. unsigned int irqnu[3];
    32. char *irname[3] = {"key1", "key2", "key3"};
    33. struct device_node *node;
    34. // 入口
    35. static int __init demo_init(void)
    36. {
    37. int i;
    38. int ret;
    39. // 获取结点
    40. node = of_find_node_by_path("/mykeys");
    41. if (node == NULL)
    42. {
    43. printk("of_find_node_by_path is error\n");
    44. return -EIO;
    45. }
    46. for (i = 0; i < 3; i++)
    47. {
    48. // 获取软中断号
    49. irqnu[i] = irq_of_parse_and_map(node, i);
    50. // 注册中断子系统
    51. ret = request_irq(irqnu[i], key1_irq_handler, IRQF_TRIGGER_FALLING, irname[i], (void *)i);
    52. if (ret < 0)
    53. {
    54. printk("%d request_irq is error\n", irqnu[i]);
    55. return -EIO;
    56. }
    57. }
    58. return 0;
    59. }
    60. // 出口
    61. static void __exit demo_exit(void)
    62. {
    63. int i;
    64. for (i = 0; i < 3; i++)
    65. {
    66. // 注销中断
    67. free_irq(irqnu[i], NULL);
    68. }
    69. }
    70. module_exit(demo_exit);
    71. module_init(demo_init);
    72. MODULE_LICENSE("GPL"); // 许可证

  • 相关阅读:
    数据结构 | 队列的实现
    2022人工智能数学基础1-2(许志钦
    Redis源码解析-通信协议
    重学Elasticsearch第2章 : ElasticSearch客户端操作索引、映射、文档
    VS2015模块库交接出现环境报错 error MSB8031 和 error C1189
    计算机毕业设计Java智能家电商城(系统+源码+mysql数据库+lw文档)
    【JavaEE】MyBaits(注解方式实现映射)
    OpenGL之图形流水线中的光照计算、明暗处理
    排序算法-冒泡排序
    win11 无法登录微软账户 终极解决方案
  • 原文地址:https://blog.csdn.net/mcslll/article/details/134296075