UWB-HAL-Schnittstelle

Der Ultrabreitband-Stack (UWB) von AOSP verwendet die von FiRa definierte UCI-Schnittstelle als HAL-Oberfläche. Die HAL-Schnittstelle verwendet eine opake Pipe (IUwbChip::sendUciMessage() und IUwbClientCallback::onUciMessage()), um UWB-Befehle, ‑Antworten und ‑Benachrichtigungen zu senden und zu empfangen. Alle Android-UWB-Anbieter müssen alle in der FiRa-Spezifikation definierten Nachrichten unterstützen. Das UWB-Framework ist abwärtskompatibel und funktioniert mit jeder UCI-Version, die vom UWB-Anbieter auf dem Gerät implementiert wurde. Da das AOSP UWB-Framework ein Modul ist, kann es auch selektiv Unterstützung für genehmigte Änderungsanfragen (Change Requests, CRs) aus UCI-Entwurfsspezifikationen hinzufügen, die auf wichtige FiRa-Standardveröffentlichungen ausgerichtet sind. Alle implementierten solchen ausgestellten Antwortvorlagen können sich ändern.

Schnittstellendefinition

Die UWB HAL-Schnittstelle wird mit stabilem AIDL definiert. Die Hauptoberfläche verwendet das Paket android.hardware.uwb.

Im Folgenden sind die beiden Hauptschnittstellen im Paket android.hardware.uwb aufgeführt.

IUwbChip.aidl

package android.hardware.uwb;

interface IUwbChip {

 String getName();

 void open(in android.hardware.uwb.IUwbClientCallback clientCallback);

 void close();

 void coreInit();

 void sessionInit(int sessionId);

 int getSupportedAndroidUciVersion();

 int sendUciMessage(in byte[] data);

}

IUwbClientCallback.aidl

package android.hardware.uwb;

interface IUwbClientCallback {

 oneway void onUciMessage(in byte[] data);

 oneway void onHalEvent(in android.hardware.uwb.UwbEvent event, in android.hardware.uwb.UwbStatus status);

}

HAL-Aufrufablauf vom UWB-Framework

Die folgenden Bilder veranschaulichen den Aufrufablauf vom UWB-Framework für die UWB-Stack-Initialisierung, die UWB-Stack-Deinitialisierung und die UWB-Sitzungsstart- und -Stopp-Prozesse.

UWB-Stack-Initialisierung

Abbildung 1. Aufrufablauf für die UWB-Stack-Initialisierung (UWB-Schalter aktiviert)

Deinitialisierung des UWB-Stacks

Abbildung 2. Aufrufabfolge für die Deinitialisierung des UWB-Stacks (UWB-Schalter deaktiviert)

UWB-Sitzung starten und beenden

Abbildung 3 Ablauf zum Starten/Beenden einer UWB-Sitzung

Konfiguration des UWB-Ländercodes

Wie in Abbildung 1 gezeigt, konfiguriert das UWB-Framework den UWB-Ländercode während der Initialisierung des UWB-Stacks mit dem UCI-Befehl ANDROID_SET_COUNTRY_CODE (GID=0xC, OID=0x1). Das UWB-Framework versucht, den UWB-Ländercode anhand der folgenden Quellen zu ermitteln (nach Priorität aufgelistet). Das UWB-Framework stoppt an der ersten Quelle, in der der Ländercode bestimmt wird.

  1. Ländercode überschreiben: Der Ländercode wird über einen adb-Shell-Befehl erzwungen (lokale oder automatisierte Tests).
  2. Landesvorwahl für Telefonie: Landesvorwahl, die über das Mobilfunknetz abgerufen wird. Wenn mehrere SIM-Karten unterschiedliche Codes zurückgeben, ist der ausgewählte Ländercode nicht deterministisch.
  3. WLAN-Ländercode: Über WLAN (80211.ad) abgerufener Ländercode.
  4. Letzter bekannter Ländercode der Telefonie: Letzter bekannter Ländercode, der über das Mobilfunknetz abgerufen wurde. Wenn mehrere SIM-Karten unterschiedliche Codes zurückgeben, ist der ausgewählte Ländercode nicht deterministisch.
  5. Standort – Ländercode: Der Ländercode, der vom LocationManager-Dienstleister für den kombinierten Standort abgerufen wurde.
  6. OEM-Standard-Ländercode: Der vom Gerätehersteller festgelegte Ländercode.

Wenn das UWB-Framework keinen UWB-Landescode ermitteln kann, ruft es den UCI-Befehl ANDROID_SET_COUNTRY_CODE mit dem Wert DEFAULT_COUNTRY_CODE ("00") auf und benachrichtigt UWB-Apps, dass der UWB-Stack-Status DISABLED ist. Wenn das UWB-Framework später einen gültigen Ländercode ermitteln kann, konfiguriert es den neuen Ländercode mit dem Befehl ANDROID_SET_COUNTRY_CODE und benachrichtigt UWB-Anwendungen, dass der UWB-Stack READY ist.

Wenn UWB aufgrund lokaler Bestimmungen in einem Land nicht verwendet werden kann, gibt der UWB-Controller den Statuscode STATUS_CODE_ANDROID_REGULATION_UWB_OFF zurück. Das UWB-Framework benachrichtigt dann UWB-Apps, dass der UWB-Stack-Status DISABLED ist.

Wenn ein Nutzer in ein anderes Land verreist, konfiguriert das UWB-Framework mit dem UCI-Befehl ANDROID_SET_COUNTRY_CODE einen neuen Ländercode. Je nach dem vom UWB-Controller zurückgegebenen Statuscode (gemäß den UWB-Bestimmungen im neuen Land) kann dies zu einer Änderung des UWB-Stackstatus führen.

Befehlsformat gemäß FIRA UCI-Spezifikation

Das Format von UCI-Kontrollpaketen findest du im Abschnitt 4.4.2 der UCI-Spezifikation.

Versionierung der Benutzeroberfläche

Mit der UCI-Spezifikation können UWB-Anbieter die Version des vom Gerät implementierten UCI-Stacks mit den Befehlen UCI_GET_DEVICE_INFO_RSP und UCI_GET_CAPS_INFO_RSP freigeben. Das Framework verwendet diese Befehle, um die UCI-Version des Geräts abzurufen und das Verhalten entsprechend zu ändern.

Liste der vom UWB-Modul unterstützten Entwurfs-CRs

Die folgenden CR-Entwürfe für FiRa 2.0 werden vom UWB-Modul Version 330810000 unterstützt:

Android-UCI-Oberfläche (FiRa-Anbieterbereich)

Die UCI-Spezifikation definiert einen Satz von Gruppenkennungen (GIDs) und Opcode-Identifikatoren (OIDs) für alle durch die Spezifikation definierten Nachrichten. Die Spezifikation reserviert auch eine Reihe von GIDs, die ausschließlich für die Nutzung durch Anbieter reserviert sind. Der AOSP-UWB-Stack verwendet einige dieser Anbieter-GIDs und OIDs für Android-spezifische Befehle, die nicht in der Spezifikation definiert sind. Weitere Informationen finden Sie im Abschnitt 8.4 der UCI-Spezifikation.

Diese von Android verwendeten Anbieternachrichten sind im HAL-Paket android.hardware.uwb.fira_android definiert.

Versionierung der Anbieterschnittstelle

UWB-Anbieter müssen die Version des android.hardware.uwb.fira_android-HAL-Pakets, das auf dem Gerät unterstützt wird, über IUwbChip.getSupportedAndroidUciVersion() offenlegen. Das Framework verwendet diese Versionsinformationen, um die Abwärtskompatibilität zu gewährleisten.

Liste der Android-GIDs und OIDs

In der folgenden Tabelle sind die GIDs und OIDs für Android aufgeführt. Die GIDs 0xE und 0xF sind für Android-OEMs reserviert.

GID OID Definition
ANDROID = 0xC ANDROID_GET_POWER_STATS = 0x0 Wird vom Befehl und der Antwort verwendet, um UWB-bezogene Statistiken zur Stromversorgung abzurufen. Wird nur unterstützt, wenn UwbVendorCapabilityTlvTypes.SUPPORTED_POWER_STATS_QUERY auf 1 gesetzt ist.
ANDROID_SET_COUNTRY_CODE = 0x1

Wird verwendet, um den aktuellen länderspezifischen Code festzulegen (wird über die SIM oder das WLAN ermittelt oder vom OEM hartcodiert). Der Ländercode wird als 2-Byte-Wert gesendet, der dem ISO-3166-Ländercode entspricht. Der Wert 00 gibt an, dass der Ländercode unbekannt ist.

ANDROID_RANGE_DIAGNOSTICS = 0x2 Wird von der Benachrichtigung verwendet, um UWB-Diagnosestatistiken für die Entfernungsmessung abzurufen. Wird nur unterstützt, wenn UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS auf 1 gesetzt ist.
OEM = 0xE,0xF 0x00 - 0x3F Für die Verwendung durch OEMs reserviert.

Anbietererweiterungen für in der UCI-Spezifikation definierte Nachrichten

In diesem Abschnitt werden Details zu Anbietererweiterungen für von der UCI-Spezifikation definierte Nachrichten beschrieben.

SESSION_SET_APP_CONFIG_[CMD|RSP] und SESSION_GET_APP_CONFIG_[CMD|RSP]

Im vom AOSP-Stack im vom Anbieter reservierten Teil der TLVs in APP_CONFIG definierten Typlängenwerte (TLVs):

  • GID: 0001b (UWB-Sitzungskonfigurationsgruppe)
  • OID: 000011b (SESSION_SET_APP_CONFIG_CMD)
  • OID: 000100b (SESSION_GET_APP_CONFIG_CMD)

In der folgenden Tabelle sind die Parameter für Konfigurationsnachrichten für UWB-Sitzungen aufgeführt.

Parametername Länge
(Oktette)
Tag
(IDs)
Version der Anbieterschnittstelle Beschreibung
NB_OF_RANGE_MEASUREMENTS 1 0xE3 1 Interleaving-Verhältnis, wenn AOA_RESULT_REQ auf 0xF0 gesetzt ist. Wird nur unterstützt, wenn UwbVendorCapabilityTlvTypes.SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING auf 1 gesetzt ist.
NB_OF_AZIMUTH_MEASUREMENTS 1 0xE4 1
NB_OF_ELEVATION_MEASUREMENTS 1 0xE5 1
ENABLE_DIAGNOSTICS 1 0xE8 2

Ein Byte-Wert, mit dem Diagnoseberichte aktiviert oder deaktiviert werden. Konfigurieren Sie diesen Parameter nur, wenn CORE_GET_CAPS_INFO_RSP SUPPORTED_DIAGNOSTICS mit dem Wert 1 zurückgibt, was bedeutet, dass die Funktion für Diagnoseberichte unterstützt wird.

Werte:

  • 1: Funktion aktiviert
  • 0: Funktion deaktiviert

DIAGRAMS_FRAME_REPORTS_FIELDS 1 oder 4 0xE9 2

1-Byte- oder 4-Byte-Bitmaske zum Konfigurieren der Diagnoseberichte. Diese Bitmaske ist 1 Byte unter Android 14 oder höher und 4 Byte unter Android 13 oder niedriger.

Konfigurieren Sie diesen Parameter nur, wenn CORE_GET_CAPS_INFO_RSP SUPPORTED_DIAGNOSTICS mit dem Wert 1 zurückgibt, was bedeutet, dass die Funktion für Diagnoseberichte unterstützt wird.

Bitdefinitionen:

  • b0 (0x01): RSSI-Felder aktivieren
  • b1 (0x02): AoA-Felder aktivieren
  • b2 (0x04): CIR-Felder aktivieren

CORE_GET_CAPS_INFO_RSP

Im Folgenden sind die vom AOSP-Stack im vom Anbieter reservierten Teil der TLVs in CAPS_INFO definierten TLVs aufgeführt:

  • GID: 0000b (UWB-Kerngruppe)
  • OID: 000011b (CORE_GET_CAPS_INFO_RSP)

In der folgenden Tabelle sind die Parameter für UWB-Funktionsnachrichten aufgeführt.

Parametername Länge
(Oktette)
Tag
(IDs)
Version der Anbieterschnittstelle Beschreibung
SUPPORTED_POWER_STATS_QUERY 1 0xC0 1

1-Byte-Wert, der angibt, dass die Abfrage für Leistungsstatistiken unterstützt wird.

Werte:

  • 1: Unterstützte Funktion
  • 0: Funktion nicht unterstützt
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING 1 0xE3 1

1 Byte-Wert, der die Unterstützung der Antennenverschränkungsfunktion angibt.

Werte:

  • 1: Unterstützte Funktion
  • 0: Funktion nicht unterstützt
SUPPORTED_MIN_RANGING_INTERVAL_MS 4 0xE4 2 Ein 4-Byte-Wert, der das unterstützte minimale Intervall für die Reichweitenmessung in Millisekunden angibt.
SUPPORTED_RANGE_DATA_NTF_CONFIG 4 0xE5 2 4-Byte-Bitmaske, die die unterstützten RANGE_DATA_NTF_CONFIG-Werte angibt. Bitmaske, bei der jedes Bit den Werten in RANGE_DATA_NTF_CONFIG in SET_APP_CFG_CMD entspricht.
SUPPORTED_RSSI_REPORTING 1 0xE6 2

1-Byte-Wert, der die Unterstützung von RSSI-Berichten angibt.

Werte:

  • 1: Unterstützte Funktion
  • 0: Funktion nicht unterstützt
SUPPORTED_DIAGNOSTICS 1 0xE7 2

Ein Byte-Wert, der die Unterstützung von Diagnoseberichten angibt.

Werte:

  • 1: Unterstützte Funktion
  • 0: Funktion nicht unterstützt
SUPPORTED_MIN_SLOT_DURATION_RSTU 4 0xE8 2 Ein 4-Byte-Wert, der die unterstützte Mindestdauer des Slots in RSTU angibt.
SUPPORTED_MAX_RANGING_SESSION_NUMBER 4 0xE9 2 Ein 4-Byte-Wert, der die maximal unterstützte Anzahl von FiRa-Messsitzungen angibt.
SUPPORTED_CHANNELS_AOA 2 0xEA 2

2‑Byte-Bitmaske, die die Kanäle angibt, die AoA unterstützen. Jede 1 in der Bitmaske entspricht einem bestimmten UWB-Kanal.

Werte:

  • 0x01: Kanal 5 wird unterstützt
  • 0x02: Kanal 6 wird unterstützt
  • 0x04: Version 8 wird unterstützt
  • 0x08: Version 9 wird unterstützt
  • 0x10: Unterstützung von Kanal 10
  • 0x20: Kanal 12 wird unterstützt
  • 0x40: Kanal 13 wird unterstützt
  • 0x80: Kanal 14 wird unterstützt

Status codes

Im Folgenden finden Sie die Statuscodes im Anbieterbereich. Diese werden vom UWB-Subsystem (UWBS) in UCI-Antworten (z. B. SESSION_START_RSP) zurückgegeben.

Status code Wert Beschreibung
STATUS_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT 0x52

Statuscode, der zurückgegeben wird, wenn die aktuelle Rangierungssitzung aufgrund eines Konflikts mit anderen CCC- oder FiRa-Rangierungssitzungen nicht gestartet werden kann.

STATUS_REGULATION_UWB_OFF 0x53

Statuscode, der zurückgegeben wird, wenn die aktuelle Messsitzung aus UWB-rechtlichen Gründen nicht gestartet werden kann.

Code für den Grund der Statusänderung in SESSION_STATUS_NTF

Im Anbieterbereich sind die folgenden Statusänderungsgrundcodes für das Statusfeld definiert, das von einem UWBS in SESSION_STATUS_NTF zurückgegeben wird. Diese Benachrichtigung wird vom UWBS gesendet, wenn sich der Status einer Messsitzung ändert (z. B. von ACTIVE zu IDLE).

Code für den Grund der Statusänderung Wert Beschreibung
REASON_ERROR_INVALID_CHANNEL_WITH_AOA 0x80

Der Sitzungsstatus hat sich geändert, da der konfigurierte Kanal die AoA-Messung nicht unterstützt.

REASON_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT 0x81

Der Sitzungsstatus hat sich aufgrund eines Konflikts mit anderen CCC- oder FiRa-Bereichssitzungen geändert.

REASON_REGULATION_UWB_OFF 0x82

Der Sitzungsstatus hat sich geändert, da UWB aus rechtlichen Gründen deaktiviert werden muss.