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