NetBurner 3.5.6
PDF Version
ssc_i2s.h
1#ifndef __SSC_I2S_H
2#define __SSC_I2S_H
3/*NB_REVISION*/
4
5/*NB_COPYRIGHT*/
6
7#include <predef.h>
8#include <sim.h> /*on-chip register definitions*/
9#include <pins.h>
10#include <nbrtos.h>
11#include <xdmac.h>
12
13// class SSC_I2S : private Ssc {
14//
15//
16// public:
17// inline void Reset() { SSC_CR = SSC_CR_SWRST; }
18// inline void EnableTx(bool enable) {
19// SSC_CR = (enable ? SSC_CR_TXEN : SSC_CR_TXDIS);
20// }
21// inline void EnableRx(bool enable) {
22// SSC_CR = (enable ? SSC_CR_RXEN : SSC_CR_RXDIS);
23// }
24// inline uint16_t SetClkDiv(uint16_t div) {
25// return SSC_CMR = div & SSC_CMR_DIV_Msk;
26// }
27//
28// static Ssc *get() { return reinterpret_cast<SSC_I2S*>(SSC); }
29// Ssc &GetRegisers() { return *this; }
30//
31// } __attribute__((packed));
32//
33// static_assert( sizeof (SSC_I2S == sizeof(Ssc) );
34//
35
36typedef void (*SSC_BufferDoneFn_t)(void *buffer, bool valid);
37/****************************************/
38/* SSC Configuration Enums */
39/****************************************/
43enum clkSrc_t
44{
45 CLK_SRC_MCK,
46 CLK_SRC_RK,
47 CLK_SRC_TK
48};
49
73enum startCond_t
74{
75 START_CONTINUOUS,
76 START_SYNC_RX_TX,
77 START_FRAME_LOW,
78 START_FRAME_HIGH,
79 START_FRAME_FALLING,
80 START_FRAME_RISING,
81 START_FRAME_LEVEL,
82 START_FRAME_EDGE,
83 START_CMP_0
84};
85
89enum clkGate_t
90{
91 CLK_GATE_CONTINUOUS,
92 CLK_GATE_FRAME_LOW,
93 CLK_GATE_FRAME_HIGH,
94};
95
99enum dataValid_t
100{
101 DATA_VALID_RISING,
102 DATA_VALID_FALLING,
103};
104
108enum frameEdge_t
109{
110 FRAME_SYNC_RISING,
111 FRAME_SYNC_FALLING
112};
113
117enum clkOut_t
118{
119 CLK_OUT_INPUT,
121 CLK_OUT_CONTINUOUS,
122 CLK_OUT_TRANSFER
123};
124
128enum frameSyncOut_t
129{
130 FRAME_SYNC_INPUT,
132 FRAME_SYNC_NEGATIVE,
134 FRAME_SYNC_POSITIVE,
136 FRAME_SYNC_LOW,
137 FRAME_SYNC_HIGH,
138 FRAME_SYNC_TOGGLE
139};
140
144enum bitOrder_t
145{
146 LEAST_SIG_FIRST,
147 MOST_SIG_FIRST
148};
149
160enum bufferDepletionBehavior_t
161{
162 DEPLETED_PAUSE,
163 DEPLETED_REPEAT_LAST,
164};
165
166/****************************************/
167/* SSC Configuration Struct */
168/****************************************/
169
213{
214 bool enable{false};
215 uint8_t period{64};
216 uint8_t startDly{1};
217 startCond_t startCond{START_FRAME_EDGE};
218 clkGate_t clkGate{CLK_GATE_CONTINUOUS};
219 dataValid_t dataValid{DATA_VALID_RISING};
220 clkOut_t clkOut{CLK_OUT_INPUT};
221 clkSrc_t clkSrc{CLK_SRC_RK};
222
223 uint8_t syncLen{0};
224 frameEdge_t syncEdge{FRAME_SYNC_FALLING};
225 bool syncDataEnabled{false};
226 frameSyncOut_t syncOut{FRAME_SYNC_INPUT};
227 uint8_t wordsPerFrame{1};
228 bitOrder_t bitOrder{MOST_SIG_FIRST};
230 uint8_t bitsPerWord{24};
231
232 bufferDepletionBehavior_t depletionBehavior{DEPLETED_PAUSE};
233};
234
249{
250 uint16_t clkDiv{150};
251
254};
255
296extern const SSC_cfg_t SSC_I2S_SLAVE_24_TXRX_RK;
297extern const SSC_cfg_t SSC_I2S_SLAVE_24_TXRX_TK;
298extern const SSC_cfg_t SSC_I2S_SLAVE_24_TXRX_TKRK;
299extern const SSC_cfg_t SSC_I2S_SLAVE_16_TXRX_RK;
300extern const SSC_cfg_t SSC_I2S_SLAVE_16_TXRX_TK;
301extern const SSC_cfg_t SSC_I2S_SLAVE_16_TXRX_TKRK;
302extern const SSC_cfg_t SSC_I2S_SLAVE_8_TXRX_RK;
303extern const SSC_cfg_t SSC_I2S_SLAVE_8_TXRX_TK;
304extern const SSC_cfg_t SSC_I2S_SLAVE_8_TXRX_TKRK;
305
306extern const SSC_cfg_t SSC_LJUST_SLAVE_24_TXRX_RK;
307extern const SSC_cfg_t SSC_LJUST_SLAVE_24_TXRX_TK;
308extern const SSC_cfg_t SSC_LJUST_SLAVE_24_TXRX_TKRK;
309extern const SSC_cfg_t SSC_LJUST_SLAVE_16_TXRX_RK;
310extern const SSC_cfg_t SSC_LJUST_SLAVE_16_TXRX_TK;
311extern const SSC_cfg_t SSC_LJUST_SLAVE_16_TXRX_TKRK;
312extern const SSC_cfg_t SSC_LJUST_SLAVE_8_TXRX_RK;
313extern const SSC_cfg_t SSC_LJUST_SLAVE_8_TXRX_TK;
314extern const SSC_cfg_t SSC_LJUST_SLAVE_8_TXRX_TKRK;
315
316/****************************************/
317/* SSC Driver Context Object */
318/****************************************/
319
327{
328 public:
329 enum ctxState_t
330 {
331 CTX_STATE_STOPPED,
332 CTX_STATE_INIT,
333 CTX_STATE_TX,
334 CTX_STATE_RX,
335 CTX_STATE_TXRX,
336 };
337
338 private:
339 XdmaCh_t *txCh;
340 XdmaCh_t *rxCh;
341 OS_SEM txSem;
342 OS_SEM rxSem;
343 SSC_BufferDoneFn_t txBufDone;
344 SSC_BufferDoneFn_t rxBufDone;
345 uint32_t txReadyCount;
346 uint32_t rxReadyCount;
347 uint32_t nTxIrq;
348 uint32_t nTxErr;
349 uint32_t nTxPost;
350 uint32_t nTxCall;
351 uint32_t nTxStart;
352 uint32_t nTxAdd;
353
354 uint32_t nRxIrq;
355 uint32_t nRxErr;
356 uint32_t nRxPost;
357 uint32_t nRxCall;
358 uint32_t nRxStart;
359 uint32_t nRxAdd;
360
361 Desc0Ring TxRing;
362 Desc0Ring RxRing;
363 uint8_t rxByteWidth;
364 uint8_t txByteWidth;
365
366 ctxState_t state;
367 void initBDs(bool loopRx, bool loopTx);
368 void initHw_Pins(const SSC_cfg_t &cfg);
369 void initHw_SSC(const SSC_cfg_t &cfg);
370 void initHw_DMA(const SSC_cfg_t &cfg);
371
372 public:
379 int Init(const SSC_cfg_t &cfg);
383 void Shutdown();
384
396 ctxState_t getState();
397
409 int TransmitBuffer(void *buffer, uint32_t bufferLen, bool waitIfNeeded);
421 int ReadyReceiveBuffer(void *buffer, uint32_t bufferLen, bool waitIfNeeded);
422
426 void RegisterTxBufferDoneCB(SSC_BufferDoneFn_t cb);
430 void RegisterRxBufferDoneCB(SSC_BufferDoneFn_t cb);
431
432 void TxIsr();
433 void RxIsr();
434
435 void dump();
436};
437
438extern SSCCtx_t ssc;
439
440#endif /* ----- #ifndef __SSC_I2S_H ----- */
Definition ssc_i2s.h:327
ctxState_t getState()
Returns the current driver state.
int ReadyReceiveBuffer(void *buffer, uint32_t bufferLen, bool waitIfNeeded)
Hands off a buffer to be written to by the SSC driver.
Definition ssc_i2s.cpp:429
void RegisterRxBufferDoneCB(SSC_BufferDoneFn_t cb)
Registers a callback for when a receive buffer is finished.
Definition ssc_i2s.cpp:500
void RegisterTxBufferDoneCB(SSC_BufferDoneFn_t cb)
Registers a callback for when a transmit buffer is finished.
Definition ssc_i2s.cpp:495
int TransmitBuffer(void *buffer, uint32_t bufferLen, bool waitIfNeeded)
Hands off a buffer to be transmitted by the SSC driver.
Definition ssc_i2s.cpp:367
int Init(const SSC_cfg_t &cfg)
Initializes the SSC hardware and driver context.
Definition ssc_i2s.cpp:309
void Shutdown()
Shuts down the SSC hardware and driver.
Definition ssc_i2s.cpp:331
int getCurrentConfig(SSC_cfg_t &cfg)
Fills in the config object with the current active configuration.
Configuration structure for the SSC driver. Passed to the initialize function to configure the hardwa...
Definition ssc_i2s.h:249
uint16_t clkDiv
Definition ssc_i2s.h:250
SSC_rxtx_cfg_t rx
Definition ssc_i2s.h:252
SSC_rxtx_cfg_t tx
Definition ssc_i2s.h:253
Configuration structure for a given direction (rx or tx) of the SSC module. Passed to the initialize ...
Definition ssc_i2s.h:213
uint8_t bitsPerWord
Definition ssc_i2s.h:230
uint8_t wordsPerFrame
Definition ssc_i2s.h:227
uint8_t syncLen
Definition ssc_i2s.h:223
clkSrc_t clkSrc
Definition ssc_i2s.h:221
frameSyncOut_t syncOut
Definition ssc_i2s.h:226
clkGate_t clkGate
Definition ssc_i2s.h:218
dataValid_t dataValid
Definition ssc_i2s.h:219
uint8_t startDly
Definition ssc_i2s.h:216
bitOrder_t bitOrder
Definition ssc_i2s.h:228
bool syncDataEnabled
Definition ssc_i2s.h:225
startCond_t startCond
Definition ssc_i2s.h:217
bool lineIdleState
Definition ssc_i2s.h:229
frameEdge_t syncEdge
Definition ssc_i2s.h:224
bufferDepletionBehavior_t depletionBehavior
Definition ssc_i2s.h:232
bool enable
Definition ssc_i2s.h:214
uint8_t period
Definition ssc_i2s.h:215
clkOut_t clkOut
Definition ssc_i2s.h:220