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 Entwürfe von 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 werden die beiden Hauptoberflächen im android.hardware.uwb-Paket beschrieben.

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

Starten und Beenden von UWB-Sitzungen

Abbildung 3: Ablauf zum Starten/Beenden einer UWB-Sitzung

Konfiguration des UWB-Landescodes

Wie in Abbildung 1 dargestellt, konfiguriert das UWB-Framework den UWB-Landescode während der UWB-Stack-Initialisierung mit dem UCI-Befehl ANDROID_SET_COUNTRY_CODE (GID=0xC, OID=0x1) aus dem Anbieterbereich. Das UWB-Framework versucht, den UWB-Landescode anhand der folgenden Quellen zu ermitteln (in Prioritätsreihenfolge aufgeführt). Das UWB-Framework stoppt bei der ersten Quelle, an der der Ländercode ermittelt 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. Letzte bekannte Ländervorwahl für Telefonie: Letzte bekannte Ländervorwahl, die ü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. Später, wenn das UWB-Framework einen gültigen Ländercode ermitteln kann, konfiguriert es den neuen Ländercode mit dem Befehl ANDROID_SET_COUNTRY_CODE und benachrichtigt UWB-Apps, 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 reist, 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 (basierend auf den UWB-Bestimmungen im neuen Land) kann dies zu einer Änderung des UWB-Stack-Status führen.

Befehlsformat gemäß FIRA UCI-Spezifikation

Das Format von UCI-Kontrollpaketen findest du in 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 eine Reihe von Gruppen-IDs (GIDs) und Opcode-IDs (OIDs) für alle in der 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 in der Spezifikation nicht 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 Anbieteroberfläche

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-Gruppen-IDs und -Objekt-IDs

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.

GIDOIDDefinition
ANDROID = 0xCANDROID_GET_POWER_STATS = 0x0Wird 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 = 0x2Wird von der Benachrichtigung verwendet, um UWB-Diagnosestatistiken für die Entfernungsmessung abzurufen. Nur unterstützt, wenn UwbVendorCapabilityTlvTypes.SUPPORTED_DIAGNOSTICS auf 1 gesetzt ist.
OEM = 0xE,0xF0x00 - 0x3FFü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 UWB-Sitzungskonfigurationsnachrichten aufgeführt.

ParameternameLänge
(Oktette)
Tag
(IDs)
Version der AnbieteroberflächeBeschreibung
NB_OF_RANGE_MEASUREMENTS10xE31Interleaving-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_MEASUREMENTS10xE41
NB_OF_ELEVATION_MEASUREMENTS10xE51
ENABLE_DIAGNOSTICS10xE82

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_FIELDS1 oder 40xE92

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 finden Sie die vom AOSP-Stack im vom Anbieter reservierten Teil der TLVs in CAPS_INFO definierten TLVs:

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

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

ParameternameLänge
(Oktette)
Tag
(IDs)
Version der AnbieteroberflächeBeschreibung
SUPPORTED_POWER_STATS_QUERY10xC01

Ein Wert von 1 Byte, der die Unterstützung für Abfragen zu Leistungsstatistiken angibt.

Werte:

  • 1: Funktion unterstützt
  • 0: Funktion nicht unterstützt
SUPPORTED_AOA_RESULT_REQ_ANTENNA_INTERLEAVING10xE31

Ein Wert von 1 Byte, der die Unterstützung der Antennen-Interleaving-Funktion angibt.

Werte:

  • 1: Funktion unterstützt
  • 0: Funktion nicht unterstützt
SUPPORTED_MIN_RANGING_INTERVAL_MS40xE42Ein 4-Byte-Wert, der das unterstützte Mindestintervall für die Reichweitenmessung in Millisekunden angibt.
SUPPORTED_RANGE_DATA_NTF_CONFIG40xE524-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_REPORTING10xE62

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

Werte:

  • 1: Funktion unterstützt
  • 0: Funktion nicht unterstützt
SUPPORTED_DIAGNOSTICS10xE72

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

Werte:

  • 1: Funktion unterstützt
  • 0: Funktion nicht unterstützt
SUPPORTED_MIN_SLOT_DURATION_RSTU40xE82Ein 4-Byte-Wert, der die unterstützte Mindestdauer eines Slots in RSTU angibt.
SUPPORTED_MAX_RANGING_SESSION_NUMBER40xE92Ein 4-Byte-Wert, der die maximal unterstützte Anzahl von FiRa-Messsitzungen angibt.
SUPPORTED_CHANNELS_AOA20xEA2

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: Kanal 8 wird unterstützt
  • 0x08: Kanal 9 wird unterstützt
  • 0x10: Kanal 10 wird unterstützt
  • 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 codeWertBeschreibung
STATUS_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT0x52

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_OFF0x53

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änderungWertBeschreibung
REASON_ERROR_INVALID_CHANNEL_WITH_AOA0x80

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

REASON_ERROR_STOPPED_DUE_TO_OTHER_SESSION_CONFLICT0x81

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

REASON_REGULATION_UWB_OFF0x82

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