S32 SDK
sai_driver.h
Go to the documentation of this file.
1 /*
2  * Copyright 2017 NXP
3  * All rights reserved.
4  *
5  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
6  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
7  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
8  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
9  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
10  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
11  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
12  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
13  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
14  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
15  * THE POSSIBILITY OF SUCH DAMAGE.
16  */
25 #ifndef SAI_DRIVER_H_
26 #define SAI_DRIVER_H_
27 
28 #include <stddef.h>
29 #include <stdbool.h>
30 #include "device_registers.h"
31 #include "clock_manager.h"
32 #include "interrupt_manager.h"
33 #include "edma_driver.h"
34 #include "osif.h"
35 #include "sai_hw_access.h"
36 
42 /*******************************************************************************
43  * Definitions
44  ******************************************************************************/
45 /* Bit values to use with ChannelEnable param in user config struct */
46 #define SAI_CHANNEL_0 0x1
47 #define SAI_CHANNEL_1 0x2
48 #define SAI_CHANNEL_2 0x4
49 #define SAI_CHANNEL_3 0x8
50 
53 typedef struct
54 {
56  uint32_t count;
57  uint8_t *data;
60 
63 typedef enum
64 {
70 
73 typedef enum
74 {
78 
81 typedef enum
82 {
84  SAI_MUX_LINE = 1U,
87 
90 typedef void (*sai_transfer_callback_t)(uint8_t channel, sai_report_type_t report, status_t status);
91 
98 typedef struct
99 {
101  sai_xfer_state_t ChnState[SAI_MAX_CHANNEL_COUNT]; /* store data pointer and data count of each channel transfer*/
102  status_t status;
103  uint8_t DmaChannel[SAI_MAX_CHANNEL_COUNT]; /* dma channel for each sai channel */
104  uint8_t ElementSize; /* element size used for transfer */
105  bool Blocking;
106  sai_transfer_type_t XferType;
107  semaphore_t Sema;
108  sai_mux_mode_t mux; /* mux mode using */
109  uint8_t ChannelCount; /* only used for interrupt mux line */
110  uint8_t NextChn; /* emulate hw combine mode, work around for asdk 4634 */
111  sai_transfer_callback_t Callback;
113 } sai_state_t;
114 
117 typedef enum
118 {
119  SAI_ASYNC = 0U,
122 
125 typedef enum
126 {
127  SAI_BUS_CLK = 0U,
131 
134 typedef enum
135 {
139 
144 typedef struct
145 {
150  uint16_t BitClkDiv;
152  uint8_t ChannelEnable;
153  uint8_t FrameSize;
154  uint8_t SyncWidth;
156  bool MsbFirst;
157  bool SyncEarly;
160  uint8_t Word0Width;
161  uint8_t WordNWidth;
162  uint8_t FirstBitIndex;
164  uint32_t BitClkFreq;
171  uint8_t DmaChannel[SAI_MAX_CHANNEL_COUNT];
172  uint8_t ElementSize;
173  uint8_t ChannelCount;
177 
178 /*******************************************************************************
179  * API
180  ******************************************************************************/
181 #if defined(__cplusplus)
182 extern "C" {
183 #endif
184 
203 void SAI_DRV_TxInit(uint32_t instNum,
204  const sai_user_config_t* saiUserConfig,
205  sai_state_t* StateAlloc);
206 
207 
221 void SAI_DRV_RxInit(uint32_t instNum,
222  const sai_user_config_t* saiUserConfig,
223  sai_state_t* StateAlloc);
224 
225 
235 void SAI_DRV_TxDeinit(uint32_t instNum);
236 
237 
247 void SAI_DRV_RxDeinit(uint32_t instNum);
248 
249 
257 uint32_t SAI_DRV_TxGetBitClockFreq(uint32_t instNum);
258 
259 
268 uint32_t SAI_DRV_RxGetBitClockFreq(uint32_t instNum);
269 
270 
278 uint32_t SAI_DRV_TxGetBitClockDiv(uint32_t instNum);
279 
280 
288 uint32_t SAI_DRV_RxGetBitClockDiv(uint32_t instNum);
289 
290 
302 void SAI_DRV_TxSetNextMaskWords(uint32_t instNum, uint16_t Words);
303 
304 
315 void SAI_DRV_RxSetNextMaskWords(uint32_t instNum, uint16_t Words);
316 
317 
330 status_t SAI_DRV_SendBlocking(uint32_t instNum,
331  const uint8_t* data[],
332  uint32_t count,
333  uint32_t timeout);
334 
335 
347 void SAI_DRV_Send(uint32_t instNum,
348  const uint8_t* data[],
349  uint32_t count);
350 
351 
361 status_t SAI_DRV_GetSendingStatus(uint32_t instNum,
362  uint32_t *countRemain);
363 
364 
370 void SAI_DRV_AbortSending(uint32_t instNum);
371 
372 
385 status_t SAI_DRV_ReceiveBlocking(uint32_t instNum,
386  uint8_t* data[],
387  uint32_t count,
388  uint32_t timeout);
389 
390 
402 void SAI_DRV_Receive(uint32_t instNum,
403  uint8_t* data[],
404  uint32_t count);
405 
406 
416 status_t SAI_DRV_GetReceivingStatus(uint32_t instNum,
417  uint32_t *countRemain);
418 
419 
425 void SAI_DRV_AbortReceiving(uint32_t instNum);
426 
427 
435 
437 #if defined(__cplusplus)
438 }
439 #endif
440 
442 #endif /* SAI_DRIVER_H_ */
443 /******************************************************************************/
444 /* EOF */
445 /******************************************************************************/
void(* sai_transfer_callback_t)(uint8_t channel, sai_report_type_t report, status_t status)
Sai callback function type for nonblock transfer, also called to report events (sai_report_type_t).
Definition: sai_driver.h:90
void SAI_DRV_AbortSending(uint32_t instNum)
Abort an ongoing transfer.
uint8_t ElementSize
Definition: sai_driver.h:172
sai_transfer_type_t TransferType
Definition: sai_driver.h:170
void SAI_DRV_RxInit(uint32_t instNum, const sai_user_config_t *saiUserConfig, sai_state_t *StateAlloc)
Initialize the receiver of driver.
sai_sync_mode_t SyncMode
Definition: sai_driver.h:146
status_t SAI_DRV_GetSendingStatus(uint32_t instNum, uint32_t *countRemain)
Get status of a non-blocking transfer.
uint8_t ChannelCount
Definition: sai_driver.h:173
sai_master_clk_source_t
Select master clock.
Definition: sai_driver.h:125
sai_sync_mode_t
SAI run in sync or async mode.
Definition: sai_driver.h:117
uint32_t SAI_DRV_RxGetBitClockFreq(uint32_t instNum)
Return true bit clock frequency of receiver.
status_t SAI_DRV_ReceiveBlocking(uint32_t instNum, uint8_t *data[], uint32_t count, uint32_t timeout)
Receive a block of data, return when transfer complete.
void SAI_DRV_RxSetNextMaskWords(uint32_t instNum, uint16_t Words)
Set masked word index of subsequent frames for receiver.
void SAI_DRV_GetDefaultConfig(sai_user_config_t *uc)
Get default config structure for I2S standard. Init config structure for I2S interface: Interrupt mod...
sai_transfer_callback_t callback
Definition: sai_driver.h:174
sai_mux_mode_t MuxMode
Definition: sai_driver.h:169
sai_master_clk_source_t MasterClkSrc
Definition: sai_driver.h:147
uint8_t ChannelEnable
Definition: sai_driver.h:152
Structure for internal use. This structure is used by the driver for its internal logic...
Definition: sai_driver.h:98
uint16_t BitClkDiv
Definition: sai_driver.h:150
uint32_t SAI_DRV_RxGetBitClockDiv(uint32_t instNum)
Return true bit clock divisor of receiver.
#define SAI_MAX_CHANNEL_COUNT
uint8_t WordNWidth
Definition: sai_driver.h:161
void SAI_DRV_TxInit(uint32_t instNum, const sai_user_config_t *saiUserConfig, sai_state_t *StateAlloc)
Initialize the transmitter of driver.
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
Definition: status.h:44
uint8_t FirstBitIndex
Definition: sai_driver.h:162
uint32_t SAI_DRV_TxGetBitClockDiv(uint32_t instNum)
Return true bit clock divisor of transmitter.
void SAI_DRV_AbortReceiving(uint32_t instNum)
Abort an ongoing transfer.
void SAI_DRV_RxDeinit(uint32_t instNum)
De-initialize receiver.
void SAI_DRV_Receive(uint32_t instNum, uint8_t *data[], uint32_t count)
Receive a block of data, return immidiately.
sai_mux_mode_t
Data mux line or mux memory.
Definition: sai_driver.h:81
void SAI_DRV_TxDeinit(uint32_t instNum)
De-initialize transmitter.
status_t SAI_DRV_SendBlocking(uint32_t instNum, const uint8_t *data[], uint32_t count, uint32_t timeout)
Send a block of data, return when transfer complete.
status_t SAI_DRV_GetReceivingStatus(uint32_t instNum, uint32_t *countRemain)
Get status of a non-blocking transfer.
sai_mask_mode_t MaskMode
Definition: sai_driver.h:155
sai_report_type_t
Report to enable.
Definition: sai_driver.h:63
uint32_t SAI_DRV_TxGetBitClockFreq(uint32_t instNum)
Return true bit clock frequency of transmitter.
sai_transfer_type_t
Transfer type.
Definition: sai_driver.h:73
void SAI_DRV_TxSetNextMaskWords(uint32_t instNum, uint16_t Words)
Set masked word index of subsequent frames for transmitter.
void SAI_DRV_Send(uint32_t instNum, const uint8_t *data[], uint32_t count)
Send a block of data, return immidiately.
sai_mask_mode_t
Data line state for masked word, or if data line is disabled.
Definition: sai_driver.h:134
uint8_t Word0Width
Definition: sai_driver.h:160
uint32_t BitClkFreq
Definition: sai_driver.h:164
User config structure.
Definition: sai_driver.h:144
Transmit or receive state.
Definition: sai_driver.h:53