162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2017-2021 NXP 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci ****************************************************************************** 662306a36Sopenharmony_ci * Communication stack of audio with rpmsg 762306a36Sopenharmony_ci ****************************************************************************** 862306a36Sopenharmony_ci * Packet structure: 962306a36Sopenharmony_ci * A SRTM message consists of a 10 bytes header followed by 0~N bytes of data 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * +---------------+-------------------------------+ 1262306a36Sopenharmony_ci * | | Content | 1362306a36Sopenharmony_ci * +---------------+-------------------------------+ 1462306a36Sopenharmony_ci * | Byte Offset | 7 6 5 4 3 2 1 0 | 1562306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 1662306a36Sopenharmony_ci * | 0 | Category | 1762306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 1862306a36Sopenharmony_ci * | 1 ~ 2 | Version | 1962306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 2062306a36Sopenharmony_ci * | 3 | Type | 2162306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 2262306a36Sopenharmony_ci * | 4 | Command | 2362306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 2462306a36Sopenharmony_ci * | 5 | Reserved0 | 2562306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 2662306a36Sopenharmony_ci * | 6 | Reserved1 | 2762306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 2862306a36Sopenharmony_ci * | 7 | Reserved2 | 2962306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 3062306a36Sopenharmony_ci * | 8 | Reserved3 | 3162306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 3262306a36Sopenharmony_ci * | 9 | Reserved4 | 3362306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 3462306a36Sopenharmony_ci * | 10 | DATA 0 | 3562306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 3662306a36Sopenharmony_ci * : : : : : : : : : : : : : 3762306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 3862306a36Sopenharmony_ci * | N + 10 - 1 | DATA N-1 | 3962306a36Sopenharmony_ci * +---------------+---+---+---+---+---+---+---+---+ 4062306a36Sopenharmony_ci * 4162306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 4262306a36Sopenharmony_ci * | Field | Byte | | 4362306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 4462306a36Sopenharmony_ci * | Category | 0 | The destination category. | 4562306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 4662306a36Sopenharmony_ci * | Version | 1 ~ 2 | The category version of the sender of the | 4762306a36Sopenharmony_ci * | | | packet. | 4862306a36Sopenharmony_ci * | | | The first byte represent the major version of | 4962306a36Sopenharmony_ci * | | | the packet.The second byte represent the minor | 5062306a36Sopenharmony_ci * | | | version of the packet. | 5162306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 5262306a36Sopenharmony_ci * | Type | 3 | The message type of current message packet. | 5362306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 5462306a36Sopenharmony_ci * | Command | 4 | The command byte sent to remote processor/SoC. | 5562306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 5662306a36Sopenharmony_ci * | Reserved | 5 ~ 9 | Reserved field for future extension. | 5762306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 5862306a36Sopenharmony_ci * | Data | N | The data payload of the message packet. | 5962306a36Sopenharmony_ci * +----------+------------+------------------------------------------------+ 6062306a36Sopenharmony_ci * 6162306a36Sopenharmony_ci * Audio control: 6262306a36Sopenharmony_ci * SRTM Audio Control Category Request Command Table: 6362306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 6462306a36Sopenharmony_ci * | Category | Version | Type | Command | Data | Function | 6562306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 6662306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x00 | Data[0]: Audio Device Index | Open a TX Instance. | 6762306a36Sopenharmony_ci * | | | | | Data[1]: format | | 6862306a36Sopenharmony_ci * | | | | | Data[2]: channels | | 6962306a36Sopenharmony_ci * | | | | | Data[3-6]: samplerate | | 7062306a36Sopenharmony_ci * | | | | | Data[7-10]: buffer_addr | | 7162306a36Sopenharmony_ci * | | | | | Data[11-14]: buffer_size | | 7262306a36Sopenharmony_ci * | | | | | Data[15-18]: period_size | | 7362306a36Sopenharmony_ci * | | | | | Data[19-22]: buffer_tail | | 7462306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 7562306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x01 | Data[0]: Audio Device Index | Start a TX Instance. | 7662306a36Sopenharmony_ci * | | | | | Same as above command | | 7762306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 7862306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x02 | Data[0]: Audio Device Index | Pause a TX Instance. | 7962306a36Sopenharmony_ci * | | | | | Same as above command | | 8062306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 8162306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x03 | Data[0]: Audio Device Index | Resume a TX Instance. | 8262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 8362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x04 | Data[0]: Audio Device Index | Stop a TX Instance. | 8462306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 8562306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x05 | Data[0]: Audio Device Index | Close a TX Instance. | 8662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 8762306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x06 | Data[0]: Audio Device Index | Set Parameters for | 8862306a36Sopenharmony_ci * | | | | | Data[1]: format | a TX Instance. | 8962306a36Sopenharmony_ci * | | | | | Data[2]: channels | | 9062306a36Sopenharmony_ci * | | | | | Data[3-6]: samplerate | | 9162306a36Sopenharmony_ci * | | | | | Data[7-22]: reserved | | 9262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 9362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x07 | Data[0]: Audio Device Index | Set TX Buffer. | 9462306a36Sopenharmony_ci * | | | | | Data[1-6]: reserved | | 9562306a36Sopenharmony_ci * | | | | | Data[7-10]: buffer_addr | | 9662306a36Sopenharmony_ci * | | | | | Data[11-14]: buffer_size | | 9762306a36Sopenharmony_ci * | | | | | Data[15-18]: period_size | | 9862306a36Sopenharmony_ci * | | | | | Data[19-22]: buffer_tail | | 9962306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 10062306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x08 | Data[0]: Audio Device Index | Suspend a TX Instance | 10162306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 10262306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x09 | Data[0]: Audio Device Index | Resume a TX Instance. | 10362306a36Sopenharmony_ci * | | | | | Data[1]: format | | 10462306a36Sopenharmony_ci * | | | | | Data[2]: channels | | 10562306a36Sopenharmony_ci * | | | | | Data[3-6]: samplerate | | 10662306a36Sopenharmony_ci * | | | | | Data[7-10]: buffer_addr | | 10762306a36Sopenharmony_ci * | | | | | Data[11-14]: buffer_size | | 10862306a36Sopenharmony_ci * | | | | | Data[15-18]: period_size | | 10962306a36Sopenharmony_ci * | | | | | Data[19-22]: buffer_tail | | 11062306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 11162306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x0A | Data[0]: Audio Device Index | Open a RX Instance. | 11262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 11362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x0B | Data[0]: Audio Device Index | Start a RX Instance. | 11462306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 11562306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x0C | Data[0]: Audio Device Index | Pause a RX Instance. | 11662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 11762306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x0D | Data[0]: Audio Device Index | Resume a RX Instance. | 11862306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 11962306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x0E | Data[0]: Audio Device Index | Stop a RX Instance. | 12062306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 12162306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x0F | Data[0]: Audio Device Index | Close a RX Instance. | 12262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 12362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x10 | Data[0]: Audio Device Index | Set Parameters for | 12462306a36Sopenharmony_ci * | | | | | Data[1]: format | a RX Instance. | 12562306a36Sopenharmony_ci * | | | | | Data[2]: channels | | 12662306a36Sopenharmony_ci * | | | | | Data[3-6]: samplerate | | 12762306a36Sopenharmony_ci * | | | | | Data[7-22]: reserved | | 12862306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 12962306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x11 | Data[0]: Audio Device Index | Set RX Buffer. | 13062306a36Sopenharmony_ci * | | | | | Data[1-6]: reserved | | 13162306a36Sopenharmony_ci * | | | | | Data[7-10]: buffer_addr | | 13262306a36Sopenharmony_ci * | | | | | Data[11-14]: buffer_size | | 13362306a36Sopenharmony_ci * | | | | | Data[15-18]: period_size | | 13462306a36Sopenharmony_ci * | | | | | Data[19-22]: buffer_tail | | 13562306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 13662306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x12 | Data[0]: Audio Device Index | Suspend a RX Instance.| 13762306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 13862306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x13 | Data[0]: Audio Device Index | Resume a RX Instance. | 13962306a36Sopenharmony_ci * | | | | | Data[1]: format | | 14062306a36Sopenharmony_ci * | | | | | Data[2]: channels | | 14162306a36Sopenharmony_ci * | | | | | Data[3-6]: samplerate | | 14262306a36Sopenharmony_ci * | | | | | Data[7-10]: buffer_addr | | 14362306a36Sopenharmony_ci * | | | | | Data[11-14]: buffer_size | | 14462306a36Sopenharmony_ci * | | | | | Data[15-18]: period_size | | 14562306a36Sopenharmony_ci * | | | | | Data[19-22]: buffer_tail | | 14662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 14762306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x14 | Data[0]: Audio Device Index | Set register value | 14862306a36Sopenharmony_ci * | | | | | Data[1-6]: reserved | to codec | 14962306a36Sopenharmony_ci * | | | | | Data[7-10]: register | | 15062306a36Sopenharmony_ci * | | | | | Data[11-14]: value | | 15162306a36Sopenharmony_ci * | | | | | Data[15-22]: reserved | | 15262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 15362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x00 | 0x15 | Data[0]: Audio Device Index | Get register value | 15462306a36Sopenharmony_ci * | | | | | Data[1-6]: reserved | from codec | 15562306a36Sopenharmony_ci * | | | | | Data[7-10]: register | | 15662306a36Sopenharmony_ci * | | | | | Data[11-22]: reserved | | 15762306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 15862306a36Sopenharmony_ci * Note 1: See <List of Sample Format> for available value of 15962306a36Sopenharmony_ci * Sample Format; 16062306a36Sopenharmony_ci * Note 2: See <List of Audio Channels> for available value of Channels; 16162306a36Sopenharmony_ci * Note 3: Sample Rate of Set Parameters for an Audio TX Instance 16262306a36Sopenharmony_ci * Command and Set Parameters for an Audio RX Instance Command is 16362306a36Sopenharmony_ci * in little-endian format. 16462306a36Sopenharmony_ci * 16562306a36Sopenharmony_ci * SRTM Audio Control Category Response Command Table: 16662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 16762306a36Sopenharmony_ci * | Category | Version | Type | Command | Data | Function | 16862306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 16962306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x00 | Data[0]: Audio Device Index | Reply for Open | 17062306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 17162306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 17262306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x01 | Data[0]: Audio Device Index | Reply for Start | 17362306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 17462306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 17562306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x02 | Data[0]: Audio Device Index | Reply for Pause | 17662306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 17762306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 17862306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x03 | Data[0]: Audio Device Index | Reply for Resume | 17962306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 18062306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 18162306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x04 | Data[0]: Audio Device Index | Reply for Stop | 18262306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 18362306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 18462306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x05 | Data[0]: Audio Device Index | Reply for Close | 18562306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 18662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 18762306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x06 | Data[0]: Audio Device Index | Reply for Set Param | 18862306a36Sopenharmony_ci * | | | | | Data[1]: Return code | for a TX Instance. | 18962306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 19062306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x07 | Data[0]: Audio Device Index | Reply for Set | 19162306a36Sopenharmony_ci * | | | | | Data[1]: Return code | TX Buffer | 19262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 19362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x08 | Data[0]: Audio Device Index | Reply for Suspend | 19462306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 19562306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 19662306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x09 | Data[0]: Audio Device Index | Reply for Resume | 19762306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 19862306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 19962306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x0A | Data[0]: Audio Device Index | Reply for Open | 20062306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 20162306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 20262306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x0B | Data[0]: Audio Device Index | Reply for Start | 20362306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 20462306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 20562306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x0C | Data[0]: Audio Device Index | Reply for Pause | 20662306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a TX Instance | 20762306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 20862306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x0D | Data[0]: Audio Device Index | Reply for Resume | 20962306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a RX Instance | 21062306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 21162306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x0E | Data[0]: Audio Device Index | Reply for Stop | 21262306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a RX Instance | 21362306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 21462306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x0F | Data[0]: Audio Device Index | Reply for Close | 21562306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a RX Instance | 21662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 21762306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x10 | Data[0]: Audio Device Index | Reply for Set Param | 21862306a36Sopenharmony_ci * | | | | | Data[1]: Return code | for a RX Instance. | 21962306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 22062306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x11 | Data[0]: Audio Device Index | Reply for Set | 22162306a36Sopenharmony_ci * | | | | | Data[1]: Return code | RX Buffer | 22262306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 22362306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x12 | Data[0]: Audio Device Index | Reply for Suspend | 22462306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a RX Instance | 22562306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 22662306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x13 | Data[0]: Audio Device Index | Reply for Resume | 22762306a36Sopenharmony_ci * | | | | | Data[1]: Return code | a RX Instance | 22862306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 22962306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x14 | Data[0]: Audio Device Index | Reply for Set codec | 23062306a36Sopenharmony_ci * | | | | | Data[1]: Return code | register value | 23162306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 23262306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x01 | 0x15 | Data[0]: Audio Device Index | Reply for Get codec | 23362306a36Sopenharmony_ci * | | | | | Data[1]: Return code | register value | 23462306a36Sopenharmony_ci * | | | | | Data[2-6]: reserved | | 23562306a36Sopenharmony_ci * | | | | | Data[7-10]: register | | 23662306a36Sopenharmony_ci * | | | | | Data[11-14]: value | | 23762306a36Sopenharmony_ci * | | | | | Data[15-22]: reserved | | 23862306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 23962306a36Sopenharmony_ci * 24062306a36Sopenharmony_ci * SRTM Audio Control Category Notification Command Table: 24162306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 24262306a36Sopenharmony_ci * | Category | Version | Type | Command | Data | Function | 24362306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 24462306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x02 | 0x00 | Data[0]: Audio Device Index | Notify one TX period | 24562306a36Sopenharmony_ci * | | | | | | is finished | 24662306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 24762306a36Sopenharmony_ci * | 0x03 | 0x0100 | 0x02 | 0x01 | Data[0]: Audio Device Index | Notify one RX period | 24862306a36Sopenharmony_ci * | | | | | | is finished | 24962306a36Sopenharmony_ci * +----------+---------+------+---------+-------------------------------+-----------------------+ 25062306a36Sopenharmony_ci * 25162306a36Sopenharmony_ci * List of Sample Format: 25262306a36Sopenharmony_ci * +------------------+-----------------------+ 25362306a36Sopenharmony_ci * | Sample Format | Description | 25462306a36Sopenharmony_ci * +------------------+-----------------------+ 25562306a36Sopenharmony_ci * | 0x0 | S16_LE | 25662306a36Sopenharmony_ci * +------------------+-----------------------+ 25762306a36Sopenharmony_ci * | 0x1 | S24_LE | 25862306a36Sopenharmony_ci * +------------------+-----------------------+ 25962306a36Sopenharmony_ci * 26062306a36Sopenharmony_ci * List of Audio Channels 26162306a36Sopenharmony_ci * +------------------+-----------------------+ 26262306a36Sopenharmony_ci * | Audio Channel | Description | 26362306a36Sopenharmony_ci * +------------------+-----------------------+ 26462306a36Sopenharmony_ci * | 0x0 | Left Channel | 26562306a36Sopenharmony_ci * +------------------+-----------------------+ 26662306a36Sopenharmony_ci * | 0x1 | Right Channel | 26762306a36Sopenharmony_ci * +------------------+---------------- ------+ 26862306a36Sopenharmony_ci * | 0x2 | Left & Right Channel | 26962306a36Sopenharmony_ci * +------------------+-----------------------+ 27062306a36Sopenharmony_ci * 27162306a36Sopenharmony_ci */ 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci#ifndef _IMX_PCM_RPMSG_H 27462306a36Sopenharmony_ci#define _IMX_PCM_RPMSG_H 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci#include <linux/pm_qos.h> 27762306a36Sopenharmony_ci#include <linux/interrupt.h> 27862306a36Sopenharmony_ci#include <sound/dmaengine_pcm.h> 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci#define RPMSG_TIMEOUT 1000 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci/* RPMSG Command (TYPE A)*/ 28362306a36Sopenharmony_ci#define TX_OPEN 0x0 28462306a36Sopenharmony_ci#define TX_START 0x1 28562306a36Sopenharmony_ci#define TX_PAUSE 0x2 28662306a36Sopenharmony_ci#define TX_RESTART 0x3 28762306a36Sopenharmony_ci#define TX_TERMINATE 0x4 28862306a36Sopenharmony_ci#define TX_CLOSE 0x5 28962306a36Sopenharmony_ci#define TX_HW_PARAM 0x6 29062306a36Sopenharmony_ci#define TX_BUFFER 0x7 29162306a36Sopenharmony_ci#define TX_SUSPEND 0x8 29262306a36Sopenharmony_ci#define TX_RESUME 0x9 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci#define RX_OPEN 0xA 29562306a36Sopenharmony_ci#define RX_START 0xB 29662306a36Sopenharmony_ci#define RX_PAUSE 0xC 29762306a36Sopenharmony_ci#define RX_RESTART 0xD 29862306a36Sopenharmony_ci#define RX_TERMINATE 0xE 29962306a36Sopenharmony_ci#define RX_CLOSE 0xF 30062306a36Sopenharmony_ci#define RX_HW_PARAM 0x10 30162306a36Sopenharmony_ci#define RX_BUFFER 0x11 30262306a36Sopenharmony_ci#define RX_SUSPEND 0x12 30362306a36Sopenharmony_ci#define RX_RESUME 0x13 30462306a36Sopenharmony_ci#define SET_CODEC_VALUE 0x14 30562306a36Sopenharmony_ci#define GET_CODEC_VALUE 0x15 30662306a36Sopenharmony_ci#define TX_POINTER 0x16 30762306a36Sopenharmony_ci#define RX_POINTER 0x17 30862306a36Sopenharmony_ci/* Total msg numver for type A */ 30962306a36Sopenharmony_ci#define MSG_TYPE_A_NUM 0x18 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci/* RPMSG Command (TYPE C)*/ 31262306a36Sopenharmony_ci#define TX_PERIOD_DONE 0x0 31362306a36Sopenharmony_ci#define RX_PERIOD_DONE 0x1 31462306a36Sopenharmony_ci/* Total msg numver for type C */ 31562306a36Sopenharmony_ci#define MSG_TYPE_C_NUM 0x2 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci#define MSG_MAX_NUM (MSG_TYPE_A_NUM + MSG_TYPE_C_NUM) 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci#define MSG_TYPE_A 0x0 32062306a36Sopenharmony_ci#define MSG_TYPE_B 0x1 32162306a36Sopenharmony_ci#define MSG_TYPE_C 0x2 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci#define RESP_NONE 0x0 32462306a36Sopenharmony_ci#define RESP_NOT_ALLOWED 0x1 32562306a36Sopenharmony_ci#define RESP_SUCCESS 0x2 32662306a36Sopenharmony_ci#define RESP_FAILED 0x3 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci#define RPMSG_S16_LE 0x0 32962306a36Sopenharmony_ci#define RPMSG_S24_LE 0x1 33062306a36Sopenharmony_ci#define RPMSG_S32_LE 0x2 33162306a36Sopenharmony_ci#define RPMSG_DSD_U16_LE 49 /* SNDRV_PCM_FORMAT_DSD_U16_LE */ 33262306a36Sopenharmony_ci#define RPMSG_DSD_U24_LE 0x4 33362306a36Sopenharmony_ci#define RPMSG_DSD_U32_LE 50 /* SNDRV_PCM_FORMAT_DSD_U32_LE */ 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci#define RPMSG_CH_LEFT 0x0 33662306a36Sopenharmony_ci#define RPMSG_CH_RIGHT 0x1 33762306a36Sopenharmony_ci#define RPMSG_CH_STEREO 0x2 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci#define WORK_MAX_NUM 0x30 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* Category define */ 34262306a36Sopenharmony_ci#define IMX_RMPSG_LIFECYCLE 1 34362306a36Sopenharmony_ci#define IMX_RPMSG_PMIC 2 34462306a36Sopenharmony_ci#define IMX_RPMSG_AUDIO 3 34562306a36Sopenharmony_ci#define IMX_RPMSG_KEY 4 34662306a36Sopenharmony_ci#define IMX_RPMSG_GPIO 5 34762306a36Sopenharmony_ci#define IMX_RPMSG_RTC 6 34862306a36Sopenharmony_ci#define IMX_RPMSG_SENSOR 7 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci/* rpmsg version */ 35162306a36Sopenharmony_ci#define IMX_RMPSG_MAJOR 1 35262306a36Sopenharmony_ci#define IMX_RMPSG_MINOR 0 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci#define TX SNDRV_PCM_STREAM_PLAYBACK 35562306a36Sopenharmony_ci#define RX SNDRV_PCM_STREAM_CAPTURE 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci/** 35862306a36Sopenharmony_ci * struct rpmsg_head: rpmsg header structure 35962306a36Sopenharmony_ci * 36062306a36Sopenharmony_ci * @cate: category 36162306a36Sopenharmony_ci * @major: major version 36262306a36Sopenharmony_ci * @minor: minor version 36362306a36Sopenharmony_ci * @type: message type (A/B/C) 36462306a36Sopenharmony_ci * @cmd: message command 36562306a36Sopenharmony_ci * @reserved: reserved space 36662306a36Sopenharmony_ci */ 36762306a36Sopenharmony_cistruct rpmsg_head { 36862306a36Sopenharmony_ci u8 cate; 36962306a36Sopenharmony_ci u8 major; 37062306a36Sopenharmony_ci u8 minor; 37162306a36Sopenharmony_ci u8 type; 37262306a36Sopenharmony_ci u8 cmd; 37362306a36Sopenharmony_ci u8 reserved[5]; 37462306a36Sopenharmony_ci} __packed; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci/** 37762306a36Sopenharmony_ci * struct param_s: sent rpmsg parameter 37862306a36Sopenharmony_ci * 37962306a36Sopenharmony_ci * @audioindex: audio instance index 38062306a36Sopenharmony_ci * @format: audio format 38162306a36Sopenharmony_ci * @channels: audio channel number 38262306a36Sopenharmony_ci * @rate: sample rate 38362306a36Sopenharmony_ci * @buffer_addr: dma buffer physical address or register for SET_CODEC_VALUE 38462306a36Sopenharmony_ci * @buffer_size: dma buffer size or register value for SET_CODEC_VALUE 38562306a36Sopenharmony_ci * @period_size: period size 38662306a36Sopenharmony_ci * @buffer_tail: current period index 38762306a36Sopenharmony_ci */ 38862306a36Sopenharmony_cistruct param_s { 38962306a36Sopenharmony_ci unsigned char audioindex; 39062306a36Sopenharmony_ci unsigned char format; 39162306a36Sopenharmony_ci unsigned char channels; 39262306a36Sopenharmony_ci unsigned int rate; 39362306a36Sopenharmony_ci unsigned int buffer_addr; 39462306a36Sopenharmony_ci unsigned int buffer_size; 39562306a36Sopenharmony_ci unsigned int period_size; 39662306a36Sopenharmony_ci unsigned int buffer_tail; 39762306a36Sopenharmony_ci} __packed; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci/** 40062306a36Sopenharmony_ci * struct param_s: send rpmsg parameter 40162306a36Sopenharmony_ci * 40262306a36Sopenharmony_ci * @audioindex: audio instance index 40362306a36Sopenharmony_ci * @resp: response value 40462306a36Sopenharmony_ci * @reserved1: reserved space 40562306a36Sopenharmony_ci * @buffer_offset: the consumed offset of buffer 40662306a36Sopenharmony_ci * @reg_addr: register addr of codec 40762306a36Sopenharmony_ci * @reg_data: register value of codec 40862306a36Sopenharmony_ci * @reserved2: reserved space 40962306a36Sopenharmony_ci * @buffer_tail: current period index 41062306a36Sopenharmony_ci */ 41162306a36Sopenharmony_cistruct param_r { 41262306a36Sopenharmony_ci unsigned char audioindex; 41362306a36Sopenharmony_ci unsigned char resp; 41462306a36Sopenharmony_ci unsigned char reserved1[1]; 41562306a36Sopenharmony_ci unsigned int buffer_offset; 41662306a36Sopenharmony_ci unsigned int reg_addr; 41762306a36Sopenharmony_ci unsigned int reg_data; 41862306a36Sopenharmony_ci unsigned char reserved2[4]; 41962306a36Sopenharmony_ci unsigned int buffer_tail; 42062306a36Sopenharmony_ci} __packed; 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci/* Struct of sent message */ 42362306a36Sopenharmony_cistruct rpmsg_s_msg { 42462306a36Sopenharmony_ci struct rpmsg_head header; 42562306a36Sopenharmony_ci struct param_s param; 42662306a36Sopenharmony_ci}; 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci/* Struct of received message */ 42962306a36Sopenharmony_cistruct rpmsg_r_msg { 43062306a36Sopenharmony_ci struct rpmsg_head header; 43162306a36Sopenharmony_ci struct param_r param; 43262306a36Sopenharmony_ci}; 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci/* Struct of rpmsg */ 43562306a36Sopenharmony_cistruct rpmsg_msg { 43662306a36Sopenharmony_ci struct rpmsg_s_msg s_msg; 43762306a36Sopenharmony_ci struct rpmsg_r_msg r_msg; 43862306a36Sopenharmony_ci}; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci/* Struct of rpmsg for workqueue */ 44162306a36Sopenharmony_cistruct work_of_rpmsg { 44262306a36Sopenharmony_ci struct rpmsg_info *info; 44362306a36Sopenharmony_ci /* Sent msg for each work */ 44462306a36Sopenharmony_ci struct rpmsg_msg msg; 44562306a36Sopenharmony_ci struct work_struct work; 44662306a36Sopenharmony_ci}; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci/* Struct of timer */ 44962306a36Sopenharmony_cistruct stream_timer { 45062306a36Sopenharmony_ci struct timer_list timer; 45162306a36Sopenharmony_ci struct rpmsg_info *info; 45262306a36Sopenharmony_ci struct snd_pcm_substream *substream; 45362306a36Sopenharmony_ci}; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_citypedef void (*dma_callback)(void *arg); 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci/** 45862306a36Sopenharmony_ci * struct rpmsg_info: rpmsg audio information 45962306a36Sopenharmony_ci * 46062306a36Sopenharmony_ci * @rpdev: pointer of rpmsg_device 46162306a36Sopenharmony_ci * @dev: pointer for imx_pcm_rpmsg device 46262306a36Sopenharmony_ci * @cmd_complete: command is finished 46362306a36Sopenharmony_ci * @pm_qos_req: request of pm qos 46462306a36Sopenharmony_ci * @r_msg: received rpmsg 46562306a36Sopenharmony_ci * @msg: array of rpmsg 46662306a36Sopenharmony_ci * @notify: notification msg (type C) for TX & RX 46762306a36Sopenharmony_ci * @notify_updated: notification flag for TX & RX 46862306a36Sopenharmony_ci * @rpmsg_wq: rpmsg workqueue 46962306a36Sopenharmony_ci * @work_list: array of work list for workqueue 47062306a36Sopenharmony_ci * @work_write_index: write index of work list 47162306a36Sopenharmony_ci * @work_read_index: read index of work list 47262306a36Sopenharmony_ci * @msg_drop_count: counter of dropped msg for TX & RX 47362306a36Sopenharmony_ci * @num_period: period number for TX & RX 47462306a36Sopenharmony_ci * @callback_param: parameter for period elapse callback for TX & RX 47562306a36Sopenharmony_ci * @callback: period elapse callback for TX & RX 47662306a36Sopenharmony_ci * @send_message: function pointer for send message 47762306a36Sopenharmony_ci * @lock: spin lock for TX & RX 47862306a36Sopenharmony_ci * @wq_lock: lock for work queue 47962306a36Sopenharmony_ci * @msg_lock: lock for send message 48062306a36Sopenharmony_ci * @stream_timer: timer for tigger workqueue 48162306a36Sopenharmony_ci */ 48262306a36Sopenharmony_cistruct rpmsg_info { 48362306a36Sopenharmony_ci struct rpmsg_device *rpdev; 48462306a36Sopenharmony_ci struct device *dev; 48562306a36Sopenharmony_ci struct completion cmd_complete; 48662306a36Sopenharmony_ci struct pm_qos_request pm_qos_req; 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_ci /* Received msg (global) */ 48962306a36Sopenharmony_ci struct rpmsg_r_msg r_msg; 49062306a36Sopenharmony_ci struct rpmsg_msg msg[MSG_MAX_NUM]; 49162306a36Sopenharmony_ci /* period done */ 49262306a36Sopenharmony_ci struct rpmsg_msg notify[2]; 49362306a36Sopenharmony_ci bool notify_updated[2]; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci struct workqueue_struct *rpmsg_wq; 49662306a36Sopenharmony_ci struct work_of_rpmsg work_list[WORK_MAX_NUM]; 49762306a36Sopenharmony_ci int work_write_index; 49862306a36Sopenharmony_ci int work_read_index; 49962306a36Sopenharmony_ci int msg_drop_count[2]; 50062306a36Sopenharmony_ci int num_period[2]; 50162306a36Sopenharmony_ci void *callback_param[2]; 50262306a36Sopenharmony_ci dma_callback callback[2]; 50362306a36Sopenharmony_ci int (*send_message)(struct rpmsg_msg *msg, struct rpmsg_info *info); 50462306a36Sopenharmony_ci spinlock_t lock[2]; /* spin lock for resource protection */ 50562306a36Sopenharmony_ci spinlock_t wq_lock; /* spin lock for resource protection */ 50662306a36Sopenharmony_ci struct mutex msg_lock; /* mutex for resource protection */ 50762306a36Sopenharmony_ci struct stream_timer stream_timer[2]; 50862306a36Sopenharmony_ci}; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci#define IMX_PCM_DRV_NAME "imx_pcm_rpmsg" 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci#endif /* IMX_PCM_RPMSG_H */ 513