我正在尝试为Banana Pi M2 ultra的Linux内核4.13.x编写以太网驱动程序。 前段时间,Linux内核基础架构中引入了所谓的“设备树”(DT)。 我在编写设备驱动程序时没有太多使用DT的经验,因此 我有几个问题。
据我所知 - 在香蕉π系统的情况下 - 需要为给定的时钟源提供一些时钟源 外围设备。香蕉pi中的CCU的功能是提供这样的时钟。 CCU是内存映射的 资源可以在linux内核的某个地址获得。我想为以太网编写驱动程序 需要CCU的一些时钟。
我知道CCU的物理地址必须通过ioremap()或类似功能映射到虚拟地址。
我的问题是如何在以太网驱动程序中获取CCU的虚拟地址?有可能做通过 设备树?如果是的话 - 怎么做?或者也许这个虚拟地址可以通过另一种方式获得?
我只是不确定是通过DT还是通过某些程序或通过全局指针完成(获取virt地址)。
有任何想法或建议吗?
答案 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
希望这对你有所帮助。
设备树可能被认为与之前的平台数据类似