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 TIbrcm/for Broadcom/Cypressnxp/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 |
|---|---|
|
Add prebuilt_firmware module for Wi-Fi/BT firmware |
|
Add firmware to PRODUCT_PACKAGES |
|
Enable Bluetooth permissions XML and HAL |
|
Add Bluetooth properties (class of device, profiles) |
|
Set UART device permissions for Bluetooth |
|
Add SELinux context for Bluetooth UART |
|
Add SELinux policy for Bluetooth HAL UART access |