4.3. M.2 Wi-Fi and Bluetooth module setup

This application note describes the Android build system modifications required to integrate third-party M.2 Wi-Fi and Bluetooth modules.

Warning

This guide assumes the kernel already includes the required drivers and device tree overlays. For kernel configuration, see Build Instructions.

4.3.1. Introduction

The AM62Px-SK and AM62x-SK Evaluation Modules (EVMs) include an M.2 Key E connector that supports Wi-Fi and Bluetooth combo modules. These modules typically use:

  • Secure Digital Input/Output (SDIO) interface for Wi-Fi

  • Universal Asynchronous Receiver-Transmitter (UART) interface for Bluetooth

This guide lists the files you need to change in the Android build system to add support for a new Wi-Fi and Bluetooth module.

4.3.2. Wi-Fi firmware setup

Note

Depending on your Wi-Fi module, you might also need to change the Wi-Fi Hardware Abstraction Layer (HAL) configuration in device/ti/am62x/shared/wifi/. The default configuration uses TI-specific libraries (lib_driver_cmd_ti). For other modules, you might need to update BoardConfig.mk to use the appropriate driver library (e.g., lib_driver_cmd_nl80211 for generic NL80211 drivers).

4.3.2.1. Adding firmware files

Copy the firmware files to the appropriate directory:

$ cp <firmware_file> \
    ${YOUR_PATH}/ti-aosp-16/vendor/ti/am62x/wifi/vendor/firmware/<vendor_dir>/

Common vendor directories:

  • mrvl/ for Marvell (now NXP Semiconductors)

  • ti-connectivity/ for TI

  • brcm/ for Broadcom/Cypress

  • nxp/ for NXP Semiconductors Bluetooth firmware

4.3.2.2. Change Android.bp

Edit vendor/ti/am62x/wifi/Android.bp and add a prebuilt_firmware module.

prebuilt_firmware {
    name: "<package_name>",
    vendor: true,
    src: "vendor/firmware/<vendor_dir>/<firmware_file>",
    filename: "<firmware_file>",
    sub_dir: "<vendor_dir>",
    proprietary: true,
}

4.3.2.3. Change the product Makefile

Edit vendor/ti/am62x/am62x.mk and add the firmware to PRODUCT_PACKAGES.

PRODUCT_PACKAGES += \
    <package_name>

4.3.3. Bluetooth configuration

M.2 Wi-Fi and Bluetooth combo modules typically use UART for Bluetooth communication. Change the following files to enable Bluetooth.

4.3.3.1. Change device_vendor.mk

Edit device/ti/am62x/shared/bluetooth/device_vendor.mk to enable Bluetooth permissions and HAL.

Change from disabled Bluetooth:

PRODUCT_COPY_FILES += \
    device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
    device/generic/car/common/android.hardware.disable.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml

To enabled Bluetooth:

# Bluetooth configuration

# Enable Bluetooth permissions
PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
    frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml

# Bluetooth HAL (AIDL)
PRODUCT_PACKAGES += \
    android.hardware.bluetooth-service.default

4.3.3.2. Change product.prop

Edit device/ti/am62x/product.prop and add Bluetooth properties.

Example configuration (adjust profiles based on your module capabilities):

# Bluetooth configuration
# Set the Bluetooth Class of Device
# Service Field: 0x5A -> 90
#    Bit 17: Networking
#    Bit 19: Capturing
#    Bit 20: Object Transfer
#    Bit 22: Telephony
# MAJOR_CLASS: 0x01 -> 1 (Computer)
# MINOR_CLASS: 0x04 -> 4 (Desktop workstation)
bluetooth.device.class_of_device=90,1,4

# Set supported Bluetooth profiles to enabled
bluetooth.profile.asha.central.enabled?=true
bluetooth.profile.a2dp.source.enabled?=true
bluetooth.profile.avrcp.target.enabled?=true
bluetooth.profile.gatt.enabled?=true
bluetooth.profile.hfp.ag.enabled?=true
bluetooth.profile.hid.device.enabled?=true
bluetooth.profile.hid.host.enabled?=true
bluetooth.profile.map.server.enabled?=true
bluetooth.profile.opp.enabled?=true
bluetooth.profile.pan.nap.enabled?=true
bluetooth.profile.pan.panu.enabled?=true
bluetooth.profile.pbap.server.enabled?=true

# Disable LeAudio profiles (requires specific hardware support)
bluetooth.profile.bap.broadcast.assist.enabled=false
bluetooth.profile.bap.unicast.client.enabled=false
bluetooth.profile.bas.client.enabled=false
bluetooth.profile.ccp.server.enabled=false
bluetooth.profile.csip.set_coordinator.enabled=false
bluetooth.profile.hap.client.enabled=false
bluetooth.profile.vcp.controller.enabled=false

Note

The bluetooth.profile.*.enabled?=true syntax (with ?) enables the profile by default but allows overriding. Profiles disabled with =false (without ?) cannot be overridden.

4.3.3.3. Change ueventd.rc

Edit device/ti/am62x/am62x/ueventd.am62x.rc and add UART permissions:

# Bluetooth UART
/dev/ttyS1    0660   bluetooth  bluetooth

Note

The UART device name (ttyS1, ttyS2, and so on) depends on your device tree overlay configuration.

4.3.3.4. Change file_contexts

Edit device/ti/am62x/sepolicy/common/file_contexts and add:

# Bluetooth UART
/dev/ttyS1                      u:object_r:hci_attach_dev:s0

4.3.3.5. Adding SELinux policy

Create device/ti/am62x/sepolicy/common/hal_bluetooth_default.te:

# Allow Bluetooth HAL to access UART device
allow hal_bluetooth_default hci_attach_dev:chr_file rw_file_perms;

4.3.4. Build and flash

4.3.4.1. Rebuild the Android image

$ cd ${YOUR_PATH}/ti-aosp-16
$ source build/envsetup.sh
$ lunch <BUILD_TARGET>
$ m

4.3.4.2. Flash the device

After building, flash the device again following the standard flashing procedure documented in Flashing Instruction.

4.3.4.3. Configure the device tree blob overlay (DTBO)

After flashing, configure the DTBO index from U-Boot:

=> env set adtbo_idx <your_dtbo_index>
=> saveenv
=> reset

See Device Tree Overlay Support for the list of available DTBO overlays and their indices.

4.3.5. Summary

Change the following files to add Wi-Fi and Bluetooth support:

File

Purpose

vendor/ti/am62x/wifi/Android.bp

Add prebuilt_firmware module for Wi-Fi/BT firmware

vendor/ti/am62x/am62x.mk

Add firmware to PRODUCT_PACKAGES

device/ti/am62x/shared/bluetooth/device_vendor.mk

Enable Bluetooth permissions XML and HAL

device/ti/am62x/product.prop

Add Bluetooth properties (class of device, profiles)

device/ti/am62x/am62x/ueventd.am62x.rc

Set UART device permissions for Bluetooth

device/ti/am62x/sepolicy/common/file_contexts

Add SELinux context for Bluetooth UART

device/ti/am62x/sepolicy/common/hal_bluetooth_default.te

Add SELinux policy for Bluetooth HAL UART access