Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 基于Hello Word设备树的设备驱动程序_Linux Kernel_Linux Device Driver_Embedded Linux_Device Tree - Fatal编程技术网

Linux kernel 基于Hello Word设备树的设备驱动程序

Linux kernel 基于Hello Word设备树的设备驱动程序,linux-kernel,linux-device-driver,embedded-linux,device-tree,Linux Kernel,Linux Device Driver,Embedded Linux,Device Tree,我已经阅读并几乎浏览了所有关于设备树和设备树覆盖的linux内核文档。我无法理解我们是否必须在平台的设备树中创建一个新的entre,或者为基于设备树的新驱动程序创建一个新的设备覆盖。 我正在寻找一个简单的led发光驱动程序示例,其中led连接到GPIO引脚,其配置在电路板平台上的设备树覆盖或设备树片段中提到。如何使用用户空间应用程序构建/推送和测试它 我在设备树中创建了自定义设备: my_device@ffdf0000 { compatible = "my_driver"; re

我已经阅读并几乎浏览了所有关于设备树和设备树覆盖的linux内核文档。我无法理解我们是否必须在平台的设备树中创建一个新的entre,或者为基于设备树的新驱动程序创建一个新的设备覆盖。 我正在寻找一个简单的led发光驱动程序示例,其中led连接到GPIO引脚,其配置在电路板平台上的设备树覆盖或设备树片段中提到。如何使用用户空间应用程序构建/推送和测试它

  • 我在设备树中创建了自定义设备:

    my_device@ffdf0000 {
        compatible = "my_driver";
        reg = <0xffdf0000 0x1000> 
        /* 
         * reg = address of device and size 
         * (Minimum is System's Pagesize = 0x1000 Byte in my case
         */
    }
    
    以及驱动程序结构本身:

    static struct platform_driver my_platform_driver = {
            .probe = my_probe,
            .remove = my_remove,
            .driver = {
                    .name = "my_driver",
                    .owner = THIS_MODULE,
                    .of_match_table = of_match_ptr(my_match_table),
            },
    };
    
  • 现在,我可以在探测函数中访问设备树的属性:

    static int my_probe(struct platform_device *dev)
    {
            struct uio_info *uioinfo;
            struct resource *r = &dev->resource[0];
            [...]
            uioinfo->name = dev->dev.of_node->name /* name from device tree: "my_device" */
            uioinfo->mem[0].addr = r->start; /* device address from device tree */
            uioinfo->mem[0].size = resource_size(r); /* size from device tree */
            [...]
    }
    

  • compatible
    与内核存根的条目和设备树都匹配时,将调用探测函数。

    将QEMU与最小的自定义硬件设备一起使用。

    我建议您编写自己的最小平台设备代码,以控制硬件并充分了解

    我在GitHub上提供了一个完整的可运行Buildroot QEMU示例,其源代码如下:


    该示例还记录在上。

    我遇到了一个类似的问题,并通过
    kernel\u src/drivers/uio/uio\u pdrv\u genirq.c
    的示例解决了它。通过功能(打开固件)的
    接收来自设备树的信息。您还需要一个内核存根,在这里我推荐Hans J.Koch:实时上下文中的用户空间I/O驱动程序(通常这位作者写了几篇关于UIO的文章)。您可以将插入到平台的dts文件内容从dtsi发布到平台吗?您是如何做的,以及如何构建/测试它的?我刚刚使用了一个自定义dtsi,具有自定义兼容和适当的reg属性。在设备驱动程序中,我在设备id的
    结构中获取了Compatible。您能否在回答部分用示例详细说明?关于dtsi文件?我认为我的知识太模糊了,我不知道它是否对您有帮助。请在raulpblooper以gmail.com的速度向我发送邮件,主题行为您的用户名:h0ch5tr4355:设备树。我想讨论更多关于它的内容。感谢分享示例!!等待您的邮件。再次感谢!我也是设备树的新手。我只是想知道你是怎么知道
    reg
    酒店的地址的?。或者我可以设置任意地址?
    static int my_probe(struct platform_device *dev)
    {
            struct uio_info *uioinfo;
            struct resource *r = &dev->resource[0];
            [...]
            uioinfo->name = dev->dev.of_node->name /* name from device tree: "my_device" */
            uioinfo->mem[0].addr = r->start; /* device address from device tree */
            uioinfo->mem[0].size = resource_size(r); /* size from device tree */
            [...]
    }