• platform和led中断项目


    设备树根节点下添加 

    1. myledIrqPlatform{
    2. compatible="hqyj,myledIrqPlatform";
    3. reg=<0x22334455 59>;
    4. interrupt-parent=<&gpiof>;
    5. interrupts=<9 0>;
    6. led1-gpio=<&gpioe 10 0>;//10表示使用的gpioe第几个管脚 0,表示gpio默认属性
    7. };

    驱动程序代码

    1. #include <linux/init.h>
    2. #include <linux/module.h>
    3. #include <linux/platform_device.h>
    4. #include <linux/mod_devicetable.h>
    5. #include <linux/of_gpio.h>
    6. #include <linux/interrupt.h>
    7. struct resource *res;
    8. unsigned int irqno;//中断号
    9. struct gpio_desc *gpiono;
    10. unsigned int number = 0;
    11. // 定义中断处理函数
    12. irqreturn_t key_handler(int irq, void *dev)
    13. {
    14. printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    15. int which = (int)dev;
    16. printk("which=%d number=%d\n",which,number);
    17. //灯状态取反
    18. gpiod_set_value(gpiono,!gpiod_get_value(gpiono));
    19. //变量 在 01之间切换
    20. number = (number == 0) ? 1 : 0;
    21. return IRQ_HANDLED;
    22. }
    23. // 封装probe函数
    24. int pdrv_probe(struct platform_device *pdev){
    25. //设备树匹配成功后,设备树节点指针可以通过pdev->dev.of_node获取
    26. //基于设备树节点信息获取gpio_desc对象指针
    27. //申请GPIO LED1
    28. gpiono = gpiod_get_from_of_node(pdev->dev.of_node,"led1-gpio",0,GPIOD_OUT_HIGH,NULL);
    29. if(IS_ERR(gpiono)){
    30. printk("解析GPIO管脚信息失败\n");
    31. return -ENXIO;
    32. }
    33. printk("解析GPIO管脚信息成功\n");
    34. //获取软中断号
    35. irqno = platform_get_irq(pdev,0);
    36. if(irqno < 0){
    37. printk("获取中断LED类型资源失败\n");
    38. return -ENXIO;
    39. }
    40. printk("irq资源/软中断号%d\n",irqno);
    41. printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    42. // 注册中断 按键KEY1 PE10
    43. int ret = request_irq(irqno, key_handler, IRQF_TRIGGER_FALLING|IRQF_SHARED, "key_int", (void *)1);
    44. if (ret < 0)
    45. {
    46. printk("注册按键1中断失败\n");
    47. return ret;
    48. }
    49. printk("注册按键1中断成功\n");
    50. return 0;
    51. }
    52. int pdrv_remove(struct platform_device *pdev){
    53. // 注销中断 按键KEY1 PE10
    54. free_irq(irqno, 0);
    55. //灭灯
    56. gpiod_set_value(gpiono,0);
    57. //释放GPIO信息 LED
    58. gpiod_put(gpiono);
    59. printk("%s:%s:%d\n", __FILE__, __func__, __LINE__);
    60. return 0;
    61. }
    62. //构建设备树匹配表
    63. struct of_device_id oftable[] = {
    64. {.compatible = "hqyj,myledIrqPlatform"},
    65. {},//防止数组越界
    66. };
    67. // 定义驱动信息对象并初始化
    68. struct platform_driver pdrv = {
    69. .probe = pdrv_probe,
    70. .remove = pdrv_remove,
    71. .driver = {
    72. .name = "bbbbb",
    73. .of_match_table = oftable,//用于设备树匹配
    74. },
    75. };
    76. //一键注册宏
    77. module_platform_driver(pdrv);
    78. MODULE_LICENSE("GPL");

  • 相关阅读:
    4、CSS立体盒子动画——复仇者联盟
    网络安全—小白自学笔记
    【计算机毕业设计】331基于微信小程序的家庭财务管理系统
    postgis ST_CoverageInvalidEdges用法
    C语言编程小知识分享,希望对你有用
    el-tabs切换按钮定位不准确,部分内容被遮挡(前端vue实战踩坑记录)
    SSM公司企业绩效考核管理系统
    华为认证HCIP的持证人数
    WT588F02B-8S(C006_03)单芯片语音ic方案为智能门铃设计降本增效赋能
    量子电动力学和量子场论,多体系统的量子场论
  • 原文地址:https://blog.csdn.net/sunmumu122212222/article/details/133103617