【问题标题】:Linux device driver for banana pi and device tree香蕉派和设备树的 Linux 设备驱动程序
【发布时间】:2018-04-26 23:04:56
【问题描述】:

我正在尝试为 Banana Pi M2 ultra 的 Linux 内核 4.13.x 编写以太网驱动程序。 前段时间所谓的“设备树”(DT)已被引入 Linux 内核基础架构。 我在编写设备驱动程序时没有太多使用 DT 的经验,因此 我有几个问题。

据我所知 - 在香蕉派系统的情况下 - 需要为给定的提供一些时钟源 外围设备。提供这样的时钟是香蕉派中 CCU 的功能。 CCU 是内存映射的 在 linux 内核中的某个地址可用的资源。我想为以太网编写驱动程序 需要来自 CCU 的一些时钟。

我知道 CCU 的物理地址必须通过 ioremap() 或类似函数映射到虚拟地址。

我的问题是如何在我的以太网驱动程序中获取 CCU 的虚拟地址?是否可以通过 设备树?如果是 - 怎么做?或者也许这个虚拟地址可以通过另一种方式获得?

我只是不确定它是通过 DT 完成(获取 virt 地址)还是仅通过某些过程或通过全局指针完成。

有什么想法或建议吗?

【问题讨论】:

  • 您的驱动程序不应“获取 CCU 的虚拟地址”。内核使用面向对象的技术,例如数据封装,以便驱动程序不共享此类地址或数据。您的驱动程序应该可以调用一些函数来获取或启用必要的时钟。

标签: c linux linux-kernel linux-device-driver device-tree


【解决方案1】:

Linux 内核中有平台驱动程序的示例。我在树莓派上研究过 i2c 和 i2s,所以我可以引用这些例子。

http://elixir.free-electrons.com/linux/v4.3.2/source/drivers/i2c/busses/i2c-bcm2835.c

看看probe函数,它调用的是子系统api

platform_get_resource(pdev, IORESOURCE_MEM, 0);

这可以给出物理地址是ioremap ..

为此,需要在设备树中创建一个设备节点,如 https://github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/bcm283x.dtsi

检查文件 bcm283x.dtsi 中的 i2c0 设备节点。

reg 键是存储物理地址的地方

reg = <0x7e205000       0x1000>;

        physical add     size

希望对您有所帮助。

设备树可能被认为类似于以前的平台数据

【讨论】:

  • 要么我不明白你的意思,要么你错过了我的意思。我不是在寻找放置物理地址的方式,而是如何在需要使用此 CCU 的所有外围设备之间共享 CCU 的虚拟地址。每个外设驱动程序都需要使用 CCU 虚拟地址为其正确配置时钟。所以这是关系 1:n - 许多驱动程序使用来自外围设备 (CCU) 之一的虚拟地址。我的主要问题是如何访问 CCU 的这个虚拟地址?
  • 这可以通过设备树来完成。为 CCU 时钟创建一个设备节点,您可以将设备节点共享给所有需要它的外围设备。您可以使用设备树的 phandle 概念。查看时钟设备节点如何在不同节点之间共享。github.com/raspberrypi/linux/blob/rpi-4.9.y/arch/arm/boot/dts/…。希望我能理解你的问题
  • 正确的做法是正确使用点击框架,正如@sawdust所指出的那样。
猜你喜欢
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多