我已阅读并几乎浏览了设备树和设备树覆盖上的所有Linux内核文档。我无法理解是否必须在平台的设备树中创建新的主菜或创建新的基于设备树为新驱动程序覆盖设备。 我正在寻找一个简单的led发光驱动器示例,其中led连接到GPIO引脚,其配置在板的平台上的设备树覆盖或设备树片段中提到。如何使用用户空间应用程序构建/推送和测试
答案 0 :(得分:12)
我在设备树中创建了一个自定义设备:
e
我为此设备编写了一个内核存根:
(这里我以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
*/
}
和kernel_src/drivers/uio/uio_pdrv_genirq.c
(设备驱动程序教程)为基础。)
此存根有以下两种结构:
of_device_id结构:
Hans J. Koch: Userspace I/O drivers in a realtime context
和驱动程序结构本身:
static struct of_device_id my_match_table[] = {
{
.compatible = "my_driver",
},
{0}
};
MODULE_DEVICE_TABLE(of, my_match_table);
现在我可以在探测功能中访问设备树的属性:
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 */
[...]
}
中存在与内核存根条目和设备树匹配时,将调用探测函数。
答案 1 :(得分:2)
将QEMU与最小的自定义硬件设备配合使用
我建议您编写自己的最小平台设备代码,以便控制硬件并充分理解。
我已经在GitHub上提供了一个完整的可运行的Buildroot QEMU示例,其中包含源代码,详情请参阅此答案:How to program Linux .dts device tree files?
该示例也记录在GitHub repository。
上