Out-of-tree 模块和 yocto 中的 dt-bindings

Out-of-tree module and dt-bindings in yocto

我在单独的内核配方中构建了一个新内核模块 out-of-tree - 请参阅下面的文件夹结构。作为此 driver 的一部分,有一个 header 将在生成最终设备树(即它具有常量)时由设备树编译器使用,以及我的 driver.

安装这些文件的正常位置是dt-bindings/clock/clk-driver.h我创建了一个新的header文件,用于编译设备树;但是,如果在模块的配置阶段将其复制到内核源代码,对于设备树编译器来说就太晚了。

我通过向设备树配方 (device-tree.bbappend) 添加一个新的 configure_prepend 来解决这个问题,以将其复制到 work-shared 内核源代码。但是,这感觉不对,因为我的 header 现在与它所指的内核模块处于不同的配方中。我尝试添加一个依赖项,以便设备树编译器在内核构建之后运行,但这会产生循环依赖性错误。

在正确的阶段将设备树编译器使用的 out-of-tree 模块 header 添加到内核源代码中的正确方法是什么?

文件夹结构:

meta-mylayer/
├── conf
│   └── layer.conf
│       └── status-report.bb
├── recipes-bsp
│   ├── device-tree
│   │   ├── device-tree.bbappend
│   │   └── files
│   │       └── dt-clock.h
└── recipes-modules
    └── clock
        ├── files
        │   ├── clock.c
        │   ├── COPYING
        │   ├── Makefile
        │   └── clock.h
        ├── README
        └── clock.bb

我找到了自己的解决方案。

以下三个步骤是我为使其正常工作所做的。请注意,这基本上会延迟设备树配方,直到编译内核模块之后(根据我的理解)。

  1. 在内核模块配方中添加了一个依赖创建了 共享工作目录(即提取内核源代码
  2. 在内核模块配方中添加了一个配置步骤,以将文件复制到内核源代码中的正确位置。
  3. 在设备树配方中添加了一个步骤,添加了对内核模块编译的依赖。

设备树(.bbappend 文件)

do_configure[depends] += "virtual/kernel:do_compile_kernelmodules"

内核模块配方(.bb 文件)

do_configure[depends] += "virtual/kernel:do_shared_workdir"
do_configure_append() {
        cp ${S}/clk.h ${TMPDIR}/work-shared/${MACHINE}/kernel-source/include/linux/platform_data/clk.h
        cp ${S}/clk-dts.h ${TMPDIR}/work-shared/${MACHINE}/kernel-source/include/dt-bindings/clock/clk-dts.h    
}