Radiosender HAL

In den folgenden Abschnitten wird beschrieben, wie Sie mit der Hardwareabstraktionsschicht (HAL) arbeiten, um Radiofunk implementieren.

HAL-Schnittstelle für Funkschnittstelle

HAL stellt Datenstrukturen und Schnittstellen auf Hardwareebene bereit, Radiosender implementieren, z. B. AM/FM und DAB.

HIDL 2.0- und AIDL-Schnittstellen

Der HAL verwendet die in den folgenden Abschnitten beschriebenen Schnittstellen.

IAnkündigungListener

IAnnouncementListener ist die Callback-Oberfläche für den Ankündigungs-Listener, die können beim Rundfunkradio HAL für den Empfang von Ankündigungen registriert werden. Die Benutzeroberfläche hat Folgendes: Methoden:

IAnkündigungListener
Beschreibung: Wird immer aufgerufen, wenn in der Ankündigungsliste geändert.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
Logo: AIDL oneway void onListUpdated(in Announcement[] announcements)

Geschlossener Griff

ICloseHandle ist das allgemeine Handle zum Schließen eines Callbacks, für den kein aktive Oberfläche.

Geschlossener Griff
Beschreibung:Schließe den Ziehpunkt.
HIDL 2.0 close()
Logo: AIDL void close()

ITunerCallback

ITunerCallback ist die Callback-Schnittstelle, die vom Broadcast-Radio HAL aufgerufen wird, Aktualisierungen an den HAL-Clientdienst senden.

ITunerCallback
Beschreibung:Wird vom HAL bei einem Abstimmungsvorgang aufgerufen (Abstimmung, Suche (in AIDL) oder Scan (in HIDL) und Schritt erfolgreich) schlägt asynchron fehl.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
Logo: AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Beschreibung: Wird beim Abstimmen, Suchen (in AIDL) oder Scan aufgerufen (in HIDL) oder der Schritt erfolgreich ist.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
Logo: AIDL void onTuneFailed(in Result result, in ProgramSelector selector)
Beschreibung: Wird beim Abstimmen, Suchen (in AIDL) oder Scan aufgerufen (in HIDL) oder der Schritt erfolgreich ist.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
Logo: AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Beschreibung: Wird bei der Aktualisierung der Programmliste aufgerufen. die sollte die Größe jedes Blocks auf 500 KiB begrenzt werden.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
Logo: AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
Beschreibung:Wird aufgerufen, wenn die Antenne verbunden ist oder nicht verbunden.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
Logo: AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Beschreibung: Wird aufgerufen, wenn anbieterspezifischer Parameter werden intern im HAL aktualisiert (nicht nach Aufruf von setParameters durch HAL-Client).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
Logo: AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
Beschreibung: Neu in AIDL. Wird aufgerufen, wenn das Konfigurations-Flag intern im HAL aktualisiert werden (sollte nicht aufgerufen wird, nachdem setConfigFlag durch den HAL-Client aufgerufen wurde).
HIDL 2.0 Nicht zutreffend
Logo: AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

iBroadcastRadio

IBroadcastRadio ist die primäre Schnittstelle für das HAL. Im HIDL 2.0 HAL, verwende die ITunerSession-Schnittstelle zum Tuner, um Vorgänge aufzurufen. In die meisten Tuner gleichzeitig aktiv sind (vorausgesetzt, dass jede HAL-Instanz des Radiosenders nur einen Tuner hat) Chip). ITunerSession wurde aus den AIDL-Schnittstellen entfernt und ihre Schnittstellen wurden verschoben nach IBroadcastRadio.

iBroadcastRadio
Beschreibung: Rufen Sie die Beschreibung eines Moduls und Funktionen.
HIDL 2.0 getProperties() generates (Properties properties)
Logo: AIDL Properties getProperties()
Beschreibung:Ruft den aktuellen oder möglichen AM/FM ab Konfiguration der Region.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
Logo: AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Beschreibung: Ruft die aktuelle DAB-Region ab Konfiguration.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
Logo: AIDL DabTableEntry[] getDabRegionConfig()
Beschreibung: Ruft ein Bild aus dem Cache des Funkmoduls ab. In AIDL muss die Bildgröße kleiner als 1 MB sein aufgrund eines festen Limits für den Zwischenspeicher-Transaktionspuffer.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
Logo: AIDL byte[] getImage(in int id)
Beschreibung: Registriert den Ankündigungs-Listener.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
Logo: AIDL ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
Beschreibung:
  • HIDL HAL: Wenn eine neue Tuner-Sitzung geöffnet wird, muss die alte Sitzung beendet werden.
  • AIDL HAL: Da keine Tuner-Sitzung verfügbar ist, muss nur der Tuner-Callback eingerichtet werden. Wenn der alte Callback vorhanden ist, sollte er nicht mehr festgelegt werden.
HIDL 2.0 openSession(ITunerCallback callback) generiert (Result result, ITunerSession session)
Logo: AIDL void setTunerCallback(in ITunerCallback callback)
Beschreibung:
  • HIDL HAL: Das Schließen einer Tuner-Sitzung darf nicht fehlschlagen und darf nur einmal ausgeführt werden.
  • AIDL HAL: Es gibt keinen Tuner und nur der Tuner-Callback muss deaktiviert werden.
HIDL 2.0 close()
Logo: AIDL unsetTunerCallback()
Beschreibung: Passt auf ein bestimmtes Programm an.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
Logo: AIDL void tune(in ProgramSelector program)
Beschreibung: Sucht nach dem nächsten gültigen Programm auf der air. Um Verwirrung in AIDL zu vermeiden, scan wurde in seek umbenannt.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
Logo: AIDL void seek(in boolean directionUp, in boolean skipSubChannel)
Beschreibung:Schritte zum angrenzenden Kanal, der unter Umständen nicht Programm beschäftigt sein.
HIDL 2.0 step(bool directionUp) generates (Result result)
Logo: AIDL void step(in boolean directionUp)
Beschreibung:Bricht die ausstehende Feinabstimmung, den Scan (in HIDL) oder die Suche ab. (in AIDL) oder Schrittvorgängen.
HIDL 2.0 cancel()
Logo: AIDL void cancel()
Beschreibung: Wendet einen Filter auf die Programmliste an und sendet Aktualisierungen der Programmliste über onProgramListUpdated-Callback.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
Logo: AIDL void startProgramListUpdates(in ProgramFilter filter)
Beschreibung: Es werden keine Aktualisierungen der Programmliste mehr gesendet.
HIDL 2.0 stopProgramListUpdates()
Logo: AIDL void stopProgramListUpdates()
Beschreibung: Ruft die aktuelle Einstellung einer bestimmten config an.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
Logo: AIDL boolean isConfigFlagSet(in ConfigFlag flag)
Beschreibung: Legt das angegebene Konfigurations-Flag fest.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
Logo: AIDL void setConfigFlag(in ConfigFlag flag, boolean value)
Beschreibung: Legt anbieterspezifische Parameterwerte fest.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

generiert,

(vec<VendorKeyValue> results)
Logo: AIDL VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Beschreibung: Ruft anbieterspezifische Parameterwerte ab.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
Logo: AIDL VendorKeyValue[] getParameters(in String[] keys)

Erläuterungen zur Benutzeroberfläche

Asynchrones Verhalten

Da jeder Abstimmungsvorgang (z. B. Feinabstimmung, Scan (in HIDL) oder Suche (in AIDL) und Schritt) zeitraubend sein und der Thread nicht für lange Zeit blockiert sein sollte, sollte der Vorgang zeitraubende Vorgänge später einplanen und schnell einen Status oder ein Ergebnis zurückgeben. Im Detail sollte jeder Vorgang:

  • Brechen Sie alle ausstehenden Abstimmungsvorgänge ab.
  • Prüfen Sie anhand der Methodeneingaben und des Status der Methode, ob der Vorgang verarbeitet werden kann. Tuner.
  • Plane die Abstimmungsaufgabe und gib dann Result (in HIDL) oder status (in AIDL) sofort. Wenn Result oder status den Wert OK hat, ist der Tuner-Callback tuneFailed oder currentProgramInfoChanged muss bei der Abstimmung aufgerufen werden Aufgabe fehlgeschlagen (z. B. aufgrund einer Zeitüberschreitung) oder abgeschlossen ist.

In ähnlicher Weise plant startProgramListUpdates auch die zeitaufwendige Aufgabe der Aktualisierung der Programmliste so, dass sie später stattfindet und um schnell einen Status oder ein Ergebnis zurückzugeben. Die Methode bricht zuerst ausstehende Aktualisierungsanfragen ab, plant dann die Aktualisierungsaufgabe und gibt schnell den Ergebnis.

Race-Bedingung

Aufgrund des asynchronen Verhaltens von Abstimmungsvorgängen (z. B. Feinabstimmung, Scan (in HIDL) oder Suche (in AIDL) und Schritt), gibt es eine Wettlaufbedingung zwischen dem Abbruch des Vorgangs und der Abstimmung. Geschäftsabläufe. Wenn cancel aufgerufen wird, nachdem der HAL einen Abstimmungsvorgang abgeschlossen hat und bevor der Callback abgeschlossen ist, kann der Abbruch ignoriert werden und der Callback sollte abgeschlossen sein und empfangen werden. durch den HAL-Client.

Das Gleiche gilt, wenn stopProgramListUpdates aufgerufen wird, nachdem der HAL ein Programm abgeschlossen hat und bevor der onCurrentProgramInfoChanged-Callback abgeschlossen ist, stopProgramListUpdates kann ignoriert werden und der Callback sollte abgeschlossen sein.

Limit für Datengröße

Da es ein festes Limit für den Binder-Transaktionszwischenspeicher gibt, -Methoden, die Daten einer potenziell großen Größe übergeben, werden in AIDL HAL erläutert.

  • getImage erfordert, dass das zurückgegebene Bild kleiner als 1 MB ist.
  • onProgramListUpdate erfordert, dass jede chunk kleiner als 500 KiB sein muss. Größere Programmlisten müssen durch die HAL-Implementierung in mehrere Blöcke aufgeteilt und mehrere Callbacks verwenden.

Änderungen an AIDL HAL-Datenstrukturen

Diese Änderungen wurden nicht nur an der Benutzeroberfläche, sondern auch auf die Datenstrukturen definiert in Rundfunk-AIDL HAL, das AIDL nutzt.

  • Die Aufzählung Constant wird in AIDL entfernt und in „const int“ als „const int“ definiert IBroadcastRadio. ANTENNA_DISCONNECTED_TIMEOUT_MS wurde umbenannt an ANTENNA_STATE_CHANGE_TIMEOUT_MS. Eine neue Konstante int TUNER_TIMEOUT_MS ist hinzugefügt. Alle Feinabstimmungs-, Such- und Schrittvorgänge müssen innerhalb dieser Zeit abgeschlossen sein.
  • Enum RDS und Deemphasis werden in AIDL entfernt und als const int definiert in AmFmRegionConfig. Entsprechend sind sowohl fmDeemphasis als auch fmRds in ProgramInfo werden als Ganzzahl deklariert, ein Bit-Berechnungsergebnis von die entsprechenden Flags. In der Zwischenzeit werden D50 und D75 umbenannt in DEEMPHASIS_D50 bzw. DEEMPHASIS_D75.
  • Die Aufzählung ProgramInfoFlags wird in AIDL entfernt und in „const int“ als „const int“ definiert ProgramInfo mit dem Präfix FLAG_ hinzugefügt. Entsprechend infoFlags in ProgramInfo wird als Ganzzahl deklariert, ein Bit-Berechnungsergebnis. von Flags. TUNED wurde ebenfalls in FLAG_TUNABLE umbenannt, um die Beschreibung besser zu beschreiben dessen Definition, auf die der Sender abgestimmt werden kann.
  • Im AmFmBandRange wird scanSpacing umbenannt in seekSpacing, da scan in AIDL in seek umbenannt wurde.
  • Da das Konzept der Union in AIDL eingeführt wurde, können MetadataKey und Metadata, die in HIDL HAL definiert sind, werden nicht mehr verwendet. AIDL-Union-Metadata ist in AIDL HAL definiert. Jeder Aufzählungswert, der zuvor in MetadataKey enthalten war, ist jetzt ein Feld in Metadata durch den String- oder Ganzzahltyp, je nach deren Definitionen.