我有一个实现字符设备驱动程序的Linux内核模块。我已阅读Linux Device Drivers并阅读了几篇教程。此时,我有一个简单的模块,提供open
,release
和write
文件操作。
我试图使用通用DMA层来创建流式DMA映射。我对LDD的以下摘录感到困惑:
以下许多功能需要
struct device
。这种结构 是Linux设备中设备的低级表示 模型。这不是司机经常需要处理的事情 直接,但在使用通用DMA层时确实需要。 通常,您可以找到埋在公交车内的这种结构 描述您的设备。例如,它可以作为dev
找到struct pci_device
或struct usb_device
中的字段。
我进一步阅读了Linux设备模型,并遇到了以下内容:
在最低级别,Linux系统中的每个设备都由表示 结构设备的一个实例。
如何为我的角色设备获取struct device
?是否有一个在幕后为我创建,或者我是否需要创建它?
我尝试使用class_create()
手动创建一个类,然后使用它创建一个device_create()
的设备,但是当我使用该设备设置DMA映射时,我认为我只是一个伪造的地址。这是正确的方法吗?
有关我的平台的更多信息,我正在使用Altera SoCFPGA平台(ARM),因此我的设备不是真正的硬件设备,如USB或PCI设备,而是逻辑实现在FPGA中。
我在Chapter 14 of LDD找到了很多我认为可能相关的信息(公交车,设备,司机等),但我不知道何时或如何使用它。对我而言,似乎该章正在讨论所有设备和驱动程序使用的大量数据结构,但我感到困惑,因为我还没有使用任何它
答案 0 :(得分:2)
我最终创建了一个平台驱动程序和平台设备。平台设备结构使其拥有与平台总线相关联的struct device
,这是一种“伪总线”。完全是为这样的东西设计的。平台驱动程序的官方documentation在这里很有帮助。
最后,我的模块最终实现了平台驱动程序和字符设备驱动程序。给我带来最多麻烦的部分是创建平台设备并将其与我的平台驱动程序相关联。我首先使用platform_device_alloc
和platform_device_register
手动创建设备(在模块安装时)。一旦我完成这项工作,我最终删除了手动设备创建,而是依靠设备树条目来创建我的设备。
答案 1 :(得分:1)
这取决于。在一种情况下,您可能会获得由核心创建的设备,而在其他情况下您必须这样做。 (我认为你是第一组)
您用于DMA的设备指针应代表在硬件中执行实际DMA 的设备。所以,你的方法是错误的。
预先订购LDD4可能会有好处。
答案 2 :(得分:0)
我也遇到了这个问题。这几乎不是一个完整的答案,但似乎大多数这些文档中的基本假设是基本字符设备(不是由某些更高级别的总线驱动程序等实例化)将不需要访问DMA。我找到了另一种快捷方式,可以在没有struct device
的情况下获取所需内容,但看起来您可以使用device_register()
或类似内容创建自己的设备。