user3218909
user3218909

Reputation: 1

How do you include bluetooth in a yocto linux system

Does any know of any good instructions explaining how to implement bluetooth into a yocto build.

I've added bluetooth into the MACHINE variable within the machine.conf and bluez to CORE_IMAGE_EXTRA_INSTALL in the local.conf located in my build directory. After building a new image, bluetoothd won't start because this condition is not met ConditionPathIsDirectory=/sys/class/bluetooth which is correct because that location doesn't exist on my system.

I'm new to yocto so any guidance would be greatly appreciated.

EDIT

So the /conf/bblayers has the following content:

  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 \

The local.conf contains:

    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"

The .inc file in my custom layer contains:

#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

The machine conf file contains:

MACHINE_FEATURES = "apm ext2 ext3 pcmcia usbhost usbgadget"

Running

bitbake -e packagegroup-base | grep ^ADD_BT

Returns

ADD_BT="packagegroup-base-bluetooth"
bitbake -e <image-name> | grep ^IMAGE_INSTALL=

Returns

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=

returns

RDEPENDS_packagegroup-base-extended="    packagegroup-base     packagegroup-base-wifi     packagegroup-base-bluetooth               "

Upvotes: 0

Views: 5854

Answers (2)

Miguel Cano
Miguel Cano

Reputation: 89

This is not as simple as adding bluetooth as a DISTRO_FEATURE. Adding this only adds the systemd service and other user-space tools to the build. In fact, what you really need is your Linux kernel to support Bluetooth (i.e. add the necessary drivers and configuration to the Linux Kconfig). It can be done by means of enabling CONFIG_BT through menuconfig or directly on your config file. Additionally, you might want to include kernel drivers/plugins for the specific Bluetooth hardware you are using.

For /sys/class/bluetooth to exist, the kernel module bluetooth.ko, which is only autoloaded by systemd-udev if it actually finds a working Bluetooth hardware device.

I suggest you start by adding support for Bluetooth on your Linux kernel, recompiling and reflashing. Then all your user-space tools should start working if your BT hardware is able to be brought up.

This is a good resource that may help you: https://wiki.archlinux.org/title/bluetooth#Troubleshooting

Upvotes: 1

Talel BELHAJSALEM
Talel BELHAJSALEM

Reputation: 4294

First of all, MACHINE is dedicated to have one value which is the configuration file for your board, and you can not add bluetooth to it.

Yocto has an automatic bluetooth feature that handles adding bluetooth into your build. But it only there for boards that have a builtin bluetooth module.

For more info, check the machine features in the official Yocto doc here.

Let me now explain how bluetooth is integrated:

Basically, you only need some kernel defconfig configuration and bluez5 utility.

If you add the following line to local.conf or your custom machine file:

DISTRO_FEATURES_append = " bluetooth"

it will take effect if you build image that is based on core-image class, like core-image-minimal, because it contains a packagegroup-base-bluetooth as follows:

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)} \
    "

It will add packagegroup-base-bluetooth only in two conditions:

  1. If bluetooth in DISTRO_FEATRUES and not in MACHINE_FEATURES and one of (pcmcia, pci or usbhost) in MACHINE_FEATURES
  2. If bluetooth in COMBINED_FEATURES.

For more info on COMBINED_FEATURES check this link.

So, you just need to make true one of the conditions.

You can dig in more to understand more details, check:

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

NOTE

If your bluetooth module has a dedicated kernel driver for example, you need to activate it in the kernel configuration via a fragment file.

Or create a module recipe for it.

EDIT

In order to add bluetooth just:

DISTRO_FEATURES_append = " bluetooth"

after that, you can check that bluetooth package is added. Here are details:

packagegroup-base-extended is always added to images based on core-image.bbclass and here is its content:

RDEPENDS_packagegroup-base-extended = "\
    packagegroup-base \
    ${ADD_WIFI} \
    ${ADD_BT} \
    ${ADD_3G} \
    ${ADD_NFC} \
    "

You see the ADD_BT variable? It is by default empty, and it is filled with packagegroup-base-bluetooth only if the first condition is true, and here is the detail from the recipe:

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")

Now, to check that it is added, run:

bitbake -e packagegroup-base | grep ^ADD_BT

you should see: ADD_BT="packagegroup-base-bluetooth"

Also, you can check that packagegroup-base-extended is added to your image:

bitbake -e <your_image> | grep ^IMAGE_INSTALL=

Also, you can check if packagegroup-base-extended has packaged bluetooth package with it:

bitbake -e packagegroup-base-extended | grep ^RDEPENDS_packagegroup-base-extended=

EDIT2:

Your configuration looks okay, specially when packagegroup-base-bluetooth is shipped with in IMAGE_INSTALL.

I have some comments that you need to consider anyways:

local.conf:

  • Remove bluez5 from CORE_IMAGE_EXTRA_INSTALL
  • Change:
DISTRO_FEATURES_append = " systemd bluetooth"
DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
VIRTUAL-RUNTIME_init_manager = "systemd"
VURTUAL-RUNTIME_initscripts = "systemd-compat-units"

with:

INIT_MANAGER = "systemd"
DISTRO_FEATURES_append = " bluetooth"
  • In your custom image file:

Put inherit core-image before IMAGE_INSTALL, because IMAGE_INSTALL of core-image will not take effect because it is ?=. So:

inherit core-image
IMAGE_INSTALL += "\
    packagegroup-core-full-cmdline \    
    kernel-modules \
    libgpiod \
    ntp \
    sqlite3 \
    openssl \
    mtd-utils \
  "

Now, the only part that mention bluetooth is :

DISTRO_FEATURES_append = " bluetooth"

Now, check again for the variable tests.

Upvotes: 1

Related Questions