无法将简单的内核模块添加到 Yocto 映像

Mic*_*ied 5 kernel-module embedded-linux bitbake yocto

目标

我想将linux 内核源代码树中提供的触摸屏驱动程序添加到我的 Yocto 映像中(该链接会将您带到goodix.c)。我基本上需要将其添加为内核模块。

解决方案

我遵循Yocto Mega 手册的合并树外模块部分。我的基础是他们的示例内核模块配方,称为hello-mod

  1. 在食谱中goodix-9271_0.1.bbRPROVIDES_${PN} = "kernel-module-goodix"
  2. layer.confMACHINE_EXTRA_RDEPENDS += "kernel-module-goodix"

问题

我的构建始终失败do_rootfs

Error: 
 Problem: package packagegroup-base-1.0-r83.imx6ul_var_dart requires packagegroup-machine-base, but none of the providers can be installed
  - package packagegroup-base-extended-1.0-r83.imx6ul_var_dart requires packagegroup-base, but none of the providers can be installed
  - package packagegroup-machine-base-1.0-r83.imx6ul_var_dart requires kernel-module-goodix, but none of the providers can be installed
  - conflicting requests
  - nothing provides kernel-module-goodix-5.4.3-imx6ul+gb40ccfdb73ea needed by goodix-9271-0.1-r0.imx6ul_var_dart
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
Run Code Online (Sandbox Code Playgroud)

阅读本节的文档后,我无法理解为什么会发生此错误。我尝试调整配方名称(删除内核模块前缀等),但似乎没有任何效果。出了什么问题?


来源

inherit module logging

# Driver for Goodix touchscreens
SUMMARY = "Generic driver for Goodix touchscreens"
DESCRIPTION = "Support for Goodix 1151, 5663, 5688, 917S, 9286, 911, 9271, 9110, 927, 928, 912, 9147, and 967 touchscreens"

# License
LICENSE = "GPL-2.0"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"

# Compatibility
COMPATIBLE_MACHINE = "(imx)"

# Package name 
RPROVIDES_${PN} = "kernel-module-goodix"

# Source
S = "${WORKDIR}"
SRC_URI = "file://Makefile \
           file://goodix.c"

# Functions

do_install() {
    bbwarn "Installing Goodix kernel module ..."
    bbwarn "KERNEL_SRC = ${KERNEL_SRC}"
    bbwarn "KERNEL_VERSION = ${KERNEL_VERSION}"
    bbwarn "WORKDIR = ${WORKDIR}"
    cd ${S}
    xz goodix.ko
    install --verbose -d ${D}/lib/modules/${KERNEL_VERSION}/kernel/drivers/input/touchscreen
    install --verbose -m 0644 goodix.ko.xz ${D}/lib/modules/${KERNEL_VERSION}/kernel/drivers/input/touchscreen
}

# Reference included files
FILES_${PN} = "/lib/modules/${KERNEL_VERSION}/kernel/drivers/input/touchscreen/*"
Run Code Online (Sandbox Code Playgroud)

编辑

  1. 该错误基本上表明kernel-module-goodix-5.3.4-imx6ul+gb40ccfdb73ea未提供。不过我并没有这样命名我的包裹。那么为什么它要寻找带有后缀的东西呢5.3.4-imx6ul+gb40ccfdb73ea

编辑(解决方案)

对于任何对已接受的答案不满意的阅读本文的人。只要知道我原来的食谱的问题在于我没有命名我的实际食谱"kernel-module-<name>.bb"。这实际上就是所需要的。

Tal*_*LEM 2

我之前为 UART 蓝牙驱动程序创建了一个配方,它对我来说效果很好,下面是配方:

#
# FNLINK BLUETOOTH 8822 KERNEL DRIVER
#

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""

SRC_URI = "file://uart_bt.zip"

S = "${WORKDIR}/bluetooth_uart_driver"

inherit module

EXTRA_OEMAKE_append_task-install = " -C ${STAGING_KERNEL_DIR} M=${S}"
EXTRA_OEMAKE += "KDIR=${STAGING_KERNEL_DIR}"
Run Code Online (Sandbox Code Playgroud)

将 S 更改为“bluetooth_uart_driver”,因为 zip 文件包含该目录,其内容为:

ifneq ($(KERNELRELEASE),)
    obj-m       := hci_uart.o
    hci_uart-y  := hci_ldisc.o hci_h4.o hci_rtk_h5.o rtk_coex.o
    #EXTRA_CFLAGS += -DDEBUG

else
    PWD := $(shell pwd)
    KVER := $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build

all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
    rm -rf *.o *.mod.c *.mod.o *.ko *.symvers *.order *.a

endif
Run Code Online (Sandbox Code Playgroud)

这对我来说效果很好,并且 .ko 文件已生成并发送到 /lib/modules/${KVER}/extra 中,因此您可以覆盖 do_install 函数并将其安装在您想要的位置。

简单测试:

我下载了goodix.c驱动程序并使用这个Makefile为其创建了一个自定义配方(我修改了我的旧BT Makefile):

ifneq ($(KERNELRELEASE),)
    obj-m       := goodix.o

else
    PWD := $(shell pwd)
    KVER := $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build

all:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
    rm -rf *.o *.mod.c *.mod.o *.ko *.symvers *.order *.a

endif
Run Code Online (Sandbox Code Playgroud)

我的食谱:

|meta-test/
    |--> recipes-driver/
         |--> files/
              |--> goodix.c
              |--> Makefile
         |--> goodix-driver_0.1.bb
Run Code Online (Sandbox Code Playgroud)

Goodix-driver_0.1.bb:

LICENSE = "CLOSED"
LIC_FILES_CHKSUM = ""
SRC_URI = "file://goodix.c file://Makefile"
S = "${WORKDIR}"
inherit module
EXTRA_OEMAKE_append_task-install = " -C ${STAGING_KERNEL_DIR} M=${S}"
EXTRA_OEMAKE += "KDIR=${STAGING_KERNEL_DIR}"
Run Code Online (Sandbox Code Playgroud)

通过这个简单的构建,我能够生成 .ko 文件。

笔记:

如果 goodix.c 存在于您的上游 Linux 内核中,这意味着您可以在以下位置找到它:

tmp/work/.../linux-../../git/drivers/input/touchscreen/goodix.c
Run Code Online (Sandbox Code Playgroud)

这意味着您可以直接修补它,而无需为其创建整个配方,您只需直接编辑它,然后返回 git 文件夹并:

git add drivers/input/touchscreen/goodix.c
git commit -m "My-updates"
git format-patch -1 -o /path/to/meta-custom/recipes-kernel/linux/files
Run Code Online (Sandbox Code Playgroud)

现在,在 /path/to/meta-custom/recipes-kernel/linux/linux-xx_%.bbappend 添加:

SRC_URI_append = " file://My-updates.patch"
Run Code Online (Sandbox Code Playgroud)

现在,不要忘记通过 menuconfig 激活它,并将其标志添加到内核 defconfig 文件中,以便它在 rootfs 中进行编译和传送。