用于香蕉pi和设备树的Linux设备驱动程序

时间:2017-11-14 05:31:04

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

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

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

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

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

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

有任何想法或建议吗?

1 个答案:

答案 0 :(得分:1)

Linux内核中有一些用于平台驱动程序的示例。我曾经在覆盆子pi上研究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

希望这对你有所帮助。

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