zoukankan      html  css  js  c++  java
  • 《设备树LED模板驱动程序》

    1.三种写驱动程序的方法

    1.1资源和驱动在同一文件里

    1.2资源用platform_device指定,驱动在platform_driver实现

    1.3资源用设备树指定,驱动在platform_driver实现

       以上三种的核心是file_operations结构体,不同的是指定硬件资源的方式。

    2.设备树节点与platform_driver匹配

    1. 设备树要有compatible属性,它的值是一个字符串。
    2. platform_driver中要有of_match_table,其中一项的.compatible成员设置为一个字符串。
    3. 以上2个字符串要一致。

      

    3.设备树节点指定资源,platform_driver获得资源

      在设备树节点中添加pin属性:

    #define GROUP_PIN(g,p) ((g<<16) | (p))
    100ask_led0 {
    compatible = “100ask,led”;
    pin = <GROUP_PIN(5, 3)>;
    };
    

      驱动程序中,可以从platform_device中得到device_node,再用of_property_read_u32得到属性的值:

    struct device_node* np = pdev->dev. of_node;
    int led_pin;
    int err = of_property_read_u32(np, “pin”, &led_pin);
    

      

    4.关键代码

      关键代码在 chip_demo_gpio.c,主要看里面的 platform_driver
      指定了 of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有compatile 属性,并且其值等于“100as,leddrv”,就会导致probe 函数被调用。 

    static const struct of_device_id ask100_leds[] = {
     { .compatible = "100as,leddrv" },
     { },
    };
    
     static struct platform_driver chip_demo_gpio_driver = {
     .probe = chip_demo_gpio_probe,
     .remove = chip_demo_gpio_remove,
     .driver = {
          .name = "100ask_led",
          .of_match_table = ask100_leds,
          },
    };
    
    static int __init chip_demo_gpio_drv_init(void)
    {
       int err;
    
       err = platform_driver_register(&chip_demo_gpio_driver);
       register_led_operations(&board_demo_led_opr);
    
       return 0;
    }
    

      

      




      

  • 相关阅读:
    嵌入式驱动视频2019.03.24
    wps如何输入连续的长破折号
    python绘图问题
    2.13
    2.12
    2.10
    2.9
    2.8
    2.7
    2.5
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/12610806.html
Copyright © 2011-2022 走看看