首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在yocto linux系统中包括蓝牙?

如何在yocto linux系统中包括蓝牙?
EN

Stack Overflow用户
提问于 2022-03-17 16:25:23
回答 2查看 1.2K关注 0票数 0

有没有任何好的说明说明如何在yocto构建中实现蓝牙。

我已经将蓝牙添加到machine.conf中的机器变量中,并将bluez添加到位于构建目录中的local.conf中的local.conf中。在构建新映像之后,由于没有满足ConditionPathIsDirectory=/sys/class/蓝牙的条件,蓝牙将不会启动,这是正确的,因为我的系统中不存在该位置。

我是约克托的新手,所以任何的指导都是非常感谢的。

编辑

因此,/conf/bblayers具有以下内容:

代码语言:javascript
运行
复制
  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包含:

代码语言:javascript
运行
复制
    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文件包含:

代码语言:javascript
运行
复制
#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文件包含:

代码语言:javascript
运行
复制
MACHINE_FEATURES = "apm ext2 ext3 pcmcia usbhost usbgadget"

正在运行

代码语言:javascript
运行
复制
bitbake -e packagegroup-base | grep ^ADD_BT

返回

代码语言:javascript
运行
复制
ADD_BT="packagegroup-base-bluetooth"
代码语言:javascript
运行
复制
bitbake -e <image-name> | grep ^IMAGE_INSTALL=

返回

代码语言:javascript
运行
复制
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  "
代码语言:javascript
运行
复制
bitbake -e packagegroup-base-extended | grep ^RDEPENDS_packagegroup-base-extended=

返回

代码语言:javascript
运行
复制
RDEPENDS_packagegroup-base-extended="    packagegroup-base     packagegroup-base-wifi     packagegroup-base-bluetooth               "
EN

回答 2

Stack Overflow用户

发布于 2022-03-17 17:03:07

首先,MACHINE专用于有一个值,即您的板的配置文件,您不能在其中添加蓝牙。

Yocto有一个自动蓝牙功能,可以处理将蓝牙添加到您的构建中。但它只适用于有builtin蓝牙模块的板。

有关更多信息,请查看官方的Yocto 这里中的机器功能。

现在让我解释一下蓝牙是如何集成的:

基本上,您只需要一些内核配置和bluez5实用程序。

如果将以下行添加到local.conf或自定义计算机文件中:

代码语言:javascript
运行
复制
DISTRO_FEATURES_append = " bluetooth"

如果您构建基于core-image类(如core-image-minimal )的映像,它将生效,因为它包含如下所示的packagegroup-base-bluetooth

代码语言:javascript
运行
复制
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

  1. 如果bluetoothDISTRO_FEATRUES中而不是在MACHINE_FEATURES中,则在MACHINE_FEATURES中为(pcmciapciusbhost)之一
  2. 如果bluetoothCOMBINED_FEATURES

有关COMBINED_FEATURES的更多信息,请查看此链接

所以,你只需要把其中一个条件变成现实。

您可以深入了解更多细节,请查看:

  • poky/meta/classes/core-image.bbclass
  • poky/meta/recipes-core/packagegroups/packagegroup-base.bb

注意事项

例如,如果蓝牙模块有专用的内核驱动程序,则需要通过片段文件在内核配置中激活它。

或者为它创建一个模块配方。

编辑

为了增加蓝牙,只需:

代码语言:javascript
运行
复制
DISTRO_FEATURES_append = " bluetooth"

在此之后,您可以检查是否添加了蓝牙包。详情如下:

packagegroup-base-extended总是添加到基于core-image.bbclass的图像中,下面是它的内容:

代码语言:javascript
运行
复制
RDEPENDS_packagegroup-base-extended = "\
    packagegroup-base \
    ${ADD_WIFI} \
    ${ADD_BT} \
    ${ADD_3G} \
    ${ADD_NFC} \
    "

看到ADD_BT变量了吗?默认情况下,它是空的,只有当第一个条件为真时,它才会填充packagegroup-base-bluetooth,下面是菜谱中的详细信息:

代码语言:javascript
运行
复制
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")

现在,要检查是否添加了它,请运行:

代码语言:javascript
运行
复制
bitbake -e packagegroup-base | grep ^ADD_BT

您应该看到:ADD_BT="packagegroup-base-bluetooth"

此外,您还可以检查packagegroup-base-extended是否添加到您的图像中:

代码语言:javascript
运行
复制
bitbake -e <your_image> | grep ^IMAGE_INSTALL=

此外,您还可以检查packagegroup-base-extended是否已经打包了蓝牙包:

代码语言:javascript
运行
复制
bitbake -e packagegroup-base-extended | grep ^RDEPENDS_packagegroup-base-extended=

EDIT2

您的配置看起来很好,特别是当packagegroup-base-bluetoothIMAGE_INSTALL一起提供时。

无论如何,我有一些评论你需要考虑:

local.conf

  • bluez5中删除CORE_IMAGE_EXTRA_INSTALL
  • 更改:
代码语言:javascript
运行
复制
DISTRO_FEATURES_append = " systemd bluetooth"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VURTUAL-RUNTIME_initscripts = "systemd-compat-units"

通过以下方式:

代码语言:javascript
运行
复制
INIT_MANAGER = "systemd"
DISTRO_FEATURES_append = " bluetooth"
  • 在自定义图像文件中:

inherit core-image放在IMAGE_INSTALL之前,因为IMAGE_INSTALL of core-image不会生效,因为它是?=。所以:

代码语言:javascript
运行
复制
inherit core-image
IMAGE_INSTALL += "\
    packagegroup-core-full-cmdline \    
    kernel-modules \
    libgpiod \
    ntp \
    sqlite3 \
    openssl \
    mtd-utils \
  "

现在,提到bluetooth的唯一部分是:

代码语言:javascript
运行
复制
DISTRO_FEATURES_append = " bluetooth"

现在,再次检查变量测试。

票数 1
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71515834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档