This document introduces both the transmitter and receiver UART advanced mode interface. Through a high-speed UART interface, the Ginseng, Saffron, Sage, and Nadja SiPs implement a set of APIs that allow a Licensee MCU (LMCU) to query and control the behaviour of a SKAA audio system. In addition to reading and writing SKAA APIs, the LMCU may subscribe to updates from APIs of interest, eliminating polling and facilitating asynchronous design.
The specification for the UART interface is as follows:
| Baud Rate | 115200 |
| Data Bits | 8 |
| Parity Bits | None |
| Stop Bits | 1 |
APIs differ depending on where they are used within the SKAA system. The following table summarizes the API types, their naming prefix and where and how they are used in the SKAA system:
| API Type | Prefix | Description |
|---|---|---|
| Host | h | Affects the host device which is connected to the transmitter |
| Global | g | Affects the transmitter which can affect the global SKAA system |
| Bay | b | Affects all receivers in an entire bay |
| Master | m | Affects the master receiver node |
| Node | n | Affects any single receiver node (both master and slave receiver nodes) |
Bay and Node APIs require an additional "Bay/Node Address" field since there can be multiple Bays and Nodes. In contrast there is only one master in a cluster, one host, and one transmitter so they don't require an address. Additionally, when connected to a Receiver's UART Interface the Bay/Node Address is ignored and only the local bay or node's value is set or returned.
The SKAA UART protocol is built around a simple request-response scheme. The LMCU issues requests to the local device. The local device ACKs valid requests, and NACKs invalid requests. Requested data, if any, is sent by the local device to the LMCU in a response packet.
An API packet is structured with a Packet Type
There are five packet types that determine the role of the packet in the SKAA system.
| Packet Type | Code | Description |
|---|---|---|
| Read | 0x50 | Requests API data from the SKAA system |
| Write | 0x51 | Sets API data in the SKAA system |
| Response | 0x52 | Contains returned data from a Read |
| ACK | 0x53 | Sent to LMCU to acknowledge the receipt of a Read or Write packet |
| NACK | 0x54 | Notifies the LMCU a received packet was corrupted or invalid |
The format of the payload for the various Packet Types is summarized below.
| Packet Type | Addressing | Byte 1 | Byte 2 | Byte 3 | Remaining bytes |
|---|---|---|---|---|---|
| Read | Unaddressed | 0x50 | API | ||
| Addressed | 0x50 | API | Bay/Node Address | ||
| Write | Unaddressed | 0x51 | API | API Data (0-8 Bytes) | |
| Addressed | 0x51 | API | Bay/Node Address | API Data (0-8 Bytes) | |
| Response | Unaddressed | 0x52 | API | API Data (0-8 Bytes) | |
| Addressed | 0x52 | API | Bay/Node Address | API Data (0-8 Bytes) | |
| ACK | 0x53 | API | |||
| NACK | 0x54 | ||||
| Packet Type | API | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
|---|---|---|---|---|---|
| Read | hVOL | 0x50 | 0x02 | ||
| bVTR | 0x50 | 0x80 | 0xFF | ||
| Write | hVOL | 0x51 | 0x02 | 0x50 | 0x50 |
| bVTR | 0x51 | 0x80 | 0xFF | 0x50 | |
| Response | hVOL | 0x52 | 0x02 | 0x50 | 0x50 |
| bVTR | 0x52 | 0x80 | 0xFF | 0x50 | |
| ACK | hVOL | 0x53 | 0x02 | ||
| bVTR | 0x53 | 0x80 | |||
| NACK | 0x54 |
The LMCU can optionally subscribe to update notifications for up to 8 APIs. When one of these APIs changes value, the local device will send a request response packet containing the new value of the API. This can be useful for subscribing to volume updates, for example.
If the local device is a transmitter, API subscriptions are managed with the gIRQ and gIRE APIs as shown below.
| Write | gIRQ | API #1 | API #2 | API #3 | API #4 | API #5 | API #6 | API #7 | API #8 | bVTR | bMUT | hVOL | nRAU | gBTS | Empty | Empty | Empty |
|---|---|---|---|---|---|---|---|---|---|
| 0x51 | 0x0C | 0x80 | 0x81 | 0x02 | 0x54 | 0x2C | 0x00 | 0x00 | 0x00 |
| Write | gIRE | Bit Mask Enable |
|---|---|---|
| 0x51 | 0x0D | 0x1F |
If the local device is a receiver, API subscriptions are manged with the nIRQ and nIRE APIs.
| Write | nIRQ | Bay/Node Address | API #1 | API #2 | API #3 | API #4 | API #5 | API #6 | API #7 | API #8 | bVTR | bMUT | hVOL | nRAU | nPST | gBTS | Empty | Empty |
|---|---|---|---|---|---|---|---|---|---|---|
| 0x51 | 0x5A | 0xFF | 0x80 | 0x81 | 0x02 | 0x54 | 0x5F | 0x2C | 0x00 | 0x00 |
| Write | nIRE | Bay/Node Address | Bit Mask Enable |
|---|---|---|---|
| 0x51 | 0x5B | 0xFF | 0x3F |