有没有任何好的说明说明如何在yocto构建中实现蓝牙。
我已经将蓝牙添加到machine.conf中的机器变量中,并将bluez添加到位于构建目录中的local.conf中的local.conf中。在构建新映像之后,由于没有满足ConditionPathIsDirectory=/sys/class/蓝牙的条件,蓝牙将不会启动,这是正确的,因为我的系统中不存在该位置。
我是约克托的新手,所以任何的指导都是非常感谢的。
编辑
因此,/conf/bblayers具有以下内容:
BBLAYERS ?= " \
${BSPDIR}/poky/meta \
${BSPDIR}/poky/meta-poky \
${BSPDIR}/poky/meta-yocto-bsp \
${BSPDIR}/meta-atmel \
${BSPDIR}/meta-openembedded/meta-oe \
${BSPDIR}/meta-openembedded/meta-networking \
${BSPDIR}/meta-openembedded/meta-python \
${BSPDIR}/meta-openembedded/meta-multimedia \
${BSPDIR}/meta-swupdate \
${BSPDIR}/meta-custom \
${BSPDIR}/meta-openembedded/meta-initramfs \
local.conf包含:
CORE_IMAGE_EXTRA_INSTALL += "\
bluez5 \
rpm \
valgrind \
"
DISTRO_FEATURES_append = " systemd bluetooth"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VURTUAL-RUNTIME_initscripts = "systemd-compat-units"
我的自定义层中的.inc文件包含:
#IMAGE_FEATURES += "ssh-server-openssh package-management"
IMAGE_INSTALL = "\
packagegroup-core-boot \
packagegroup-core-full-cmdline \
packagegroup-base-bluetooth \
kernel-modules \
libgpiod \
ntp \
sqlite3 \
openssl \
mtd-utils \
${CORE_IMAGE_EXTRA_INSTALL} \
"
inherit core-image
计算机conf文件包含:
MACHINE_FEATURES = "apm ext2 ext3 pcmcia usbhost usbgadget"
正在运行
bitbake -e packagegroup-base | grep ^ADD_BT
返回
ADD_BT="packagegroup-base-bluetooth"
bitbake -e <image-name> | grep ^IMAGE_INSTALL=
返回
IMAGE_INSTALL=" packagegroup-core-boot packagegroup-core-full-cmdline packagegroup-base-bluetooth kernel-modules libgpiod ntp sqlite3 openssl mtd-utils apg-st-databases bluez5 rpm valgrind "
bitbake -e packagegroup-base-extended | grep ^RDEPENDS_packagegroup-base-extended=
返回
RDEPENDS_packagegroup-base-extended=" packagegroup-base packagegroup-base-wifi packagegroup-base-bluetooth "
发布于 2022-03-17 17:03:07
首先,MACHINE
专用于有一个值,即您的板的配置文件,您不能在其中添加蓝牙。
Yocto有一个自动蓝牙功能,可以处理将蓝牙添加到您的构建中。但它只适用于有builtin
蓝牙模块的板。
有关更多信息,请查看官方的Yocto 这里中的机器功能。
现在让我解释一下蓝牙是如何集成的:
基本上,您只需要一些内核配置和bluez5
实用程序。
如果将以下行添加到local.conf
或自定义计算机文件中:
DISTRO_FEATURES_append = " bluetooth"
如果您构建基于core-image
类(如core-image-minimal
)的映像,它将生效,因为它包含如下所示的packagegroup-base-bluetooth
:
SUMMARY_packagegroup-base-bluetooth = "Bluetooth support"
RDEPENDS_packagegroup-base-bluetooth = "\
bluez5 \
"
RRECOMMENDS_packagegroup-base-bluetooth = "\
kernel-module-bluetooth \
kernel-module-l2cap \
kernel-module-rfcomm \
kernel-module-hci-vhci \
kernel-module-bnep \
kernel-module-hidp \
kernel-module-hci-uart \
kernel-module-sco \
${@bb.utils.contains('COMBINED_FEATURES', 'usbhost', 'kernel-module-hci-usb', '',d)} \
${@bb.utils.contains('COMBINED_FEATURES', 'pcmcia', 'kernel-module-bluetooth3c-cs', '',d)} \
${@bb.utils.contains('COMBINED_FEATURES', 'pcmcia', 'kernel-module-bluecard-cs', '',d)} \
${@bb.utils.contains('COMBINED_FEATURES', 'pcmcia', 'kernel-module-bluetoothuart-cs', '',d)} \
${@bb.utils.contains('COMBINED_FEATURES', 'pcmcia', 'kernel-module-dtl1-cs', '',d)} \
"
它只在两个条件下添加packagegroup-base-bluetooth
:
bluetooth
在DISTRO_FEATRUES
中而不是在MACHINE_FEATURES
中,则在MACHINE_FEATURES
中为(pcmcia
、pci
或usbhost
)之一bluetooth
在COMBINED_FEATURES
。有关COMBINED_FEATURES
的更多信息,请查看此链接。
所以,你只需要把其中一个条件变成现实。
您可以深入了解更多细节,请查看:
poky/meta/classes/core-image.bbclass
poky/meta/recipes-core/packagegroups/packagegroup-base.bb
注意事项
例如,如果蓝牙模块有专用的内核驱动程序,则需要通过片段文件在内核配置中激活它。
或者为它创建一个模块配方。
编辑
为了增加蓝牙,只需:
DISTRO_FEATURES_append = " bluetooth"
在此之后,您可以检查是否添加了蓝牙包。详情如下:
packagegroup-base-extended
总是添加到基于core-image.bbclass
的图像中,下面是它的内容:
RDEPENDS_packagegroup-base-extended = "\
packagegroup-base \
${ADD_WIFI} \
${ADD_BT} \
${ADD_3G} \
${ADD_NFC} \
"
看到ADD_BT
变量了吗?默认情况下,它是空的,只有当第一个条件为真时,它才会填充packagegroup-base-bluetooth
,下面是菜谱中的详细信息:
if "bluetooth" in distro_features and not "bluetooth" in machine_features and ("pcmcia" in machine_features or "pci" in machine_features or "usbhost" in machine_features):
d.setVar("ADD_BT", "packagegroup-base-bluetooth")
现在,要检查是否添加了它,请运行:
bitbake -e packagegroup-base | grep ^ADD_BT
您应该看到:ADD_BT="packagegroup-base-bluetooth"
此外,您还可以检查packagegroup-base-extended
是否添加到您的图像中:
bitbake -e <your_image> | grep ^IMAGE_INSTALL=
此外,您还可以检查packagegroup-base-extended
是否已经打包了蓝牙包:
bitbake -e packagegroup-base-extended | grep ^RDEPENDS_packagegroup-base-extended=
EDIT2
您的配置看起来很好,特别是当packagegroup-base-bluetooth
随IMAGE_INSTALL
一起提供时。
无论如何,我有一些评论你需要考虑:
local.conf
bluez5
中删除CORE_IMAGE_EXTRA_INSTALL
DISTRO_FEATURES_append = " systemd bluetooth"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VURTUAL-RUNTIME_initscripts = "systemd-compat-units"
通过以下方式:
INIT_MANAGER = "systemd"
DISTRO_FEATURES_append = " bluetooth"
将inherit core-image
放在IMAGE_INSTALL
之前,因为IMAGE_INSTALL
of core-image
不会生效,因为它是?=
。所以:
inherit core-image
IMAGE_INSTALL += "\
packagegroup-core-full-cmdline \
kernel-modules \
libgpiod \
ntp \
sqlite3 \
openssl \
mtd-utils \
"
现在,提到bluetooth
的唯一部分是:
DISTRO_FEATURES_append = " bluetooth"
现在,再次检查变量测试。
发布于 2022-03-22 16:46:08
这并不像添加bluetooth
和DISTRO_FEATURE那么简单。添加这一点只会将systemd
服务和其他用户空间工具添加到构建中。实际上,您真正需要的是支持蓝牙的Linux内核(即向Linux添加必要的驱动程序和配置)。它可以通过通过CONFIG_BT
或直接在配置文件上启用menuconfig
来完成。此外,您可能希望为正在使用的特定蓝牙硬件包括内核驱动程序/插件。
要使/sys/class/bluetooth
存在,内核模块bluetooth.ko
,只有当它真正找到一个工作的蓝牙硬件设备时,才由systemd自动加载。
我建议您首先在Linux内核上添加对蓝牙的支持,重新编译和刷新。然后,如果您的BT硬件能够启动,那么所有的用户空间工具都应该开始工作。
这是一个很好的资源,可以帮助您:https://wiki.archlinux.org/title/bluetooth#Troubleshooting
https://stackoverflow.com/questions/71515834
复制相似问题