1: int32_t AG903_SSPMgrSetI2sMode(
AG903_SSPMgrHandle* handle,
AG903_SSPMgrI2sParam* param)
2: {
3:
AG903_SSPPrmCtrl ctrl = {0};
4: int32_t retval =
AG903_ENONE;
5: _Bool idle;
6: uint8_t ch;
7:
8: retval = SSPMgr_CheckHandle(handle, &ch);
9:
if(
AG903_ENONE != retval) {
10:
return -
AG903_EINVAL;
11: }
12:
if(NULL == param) {
13:
return -
AG903_EINVAL;
14: }
15:
if( (
AG903_SSP_SDL_MAX < param->wordlen) ||
16: (
AG903_SSP_SSPDIV_MIN > param->clkdiv) ||
17: (0x01 & param->clkdiv) ||
18: (AG903_SSP_POL_TYPENUM <= param->polarity) ||
19: (AG903_SSP_FIRSTBIT_TYPENUM <= param->firstbit) ||
20: (AG903_SSP_JUSTIFIED_TYPENUM <= param->justified) ) {
21:
return -
AG903_EINVAL;
22: }
23: idle = SSPMgr_CheckIdle(ch);
24:
if(
true != idle) {
25:
return -
AG903_EBUSY;
26: }
27:
28: ctrl.format = AG903_SSP_FORMAT_I2S;
29: ctrl.fsdist = 1;
30:
if(AG903_SSP_FIRSTBIT_LSB == param->firstbit) {
31: ctrl.lsb = 1;
32: }
33:
if(AG903_SSP_POL_NEGATIVE == param->polarity) {
34: ctrl.fspo = 1;
35: }
36:
if(AG903_SSP_RIGHT_JUSTIFIED == param->justified) {
37: ctrl.fsjstfy = 1;
38: }
39:
if(
true == param->slave) {
40:
if(
true == param->mono) {
41: ctrl.opm = AG903_SSP_OPM_SLAVE;
42: }
43:
else {
44: ctrl.opm = AG903_SSP_OPM_SLAVE_STEREO;
45: }
46: }
47:
else {
48:
if(
true == param->mono) {
49: ctrl.opm = AG903_SSP_OPM_MASTER;
50: }
51:
else {
52: ctrl.opm = AG903_SSP_OPM_MASTER_STEREO;
53: }
54: }
55: ctrl.sdl = param->wordlen-1;
56: ctrl.pdl = param->padlen;
57: ctrl.sclk_div = (param->clkdiv>>1)-1;
58:
59:
AG903_SSPPrmSetControl(ch, &ctrl);
60:
61: SspChStat[ch].format = AG903_SSP_FORMAT_I2S;
62: SspChStat[ch].wordlen = param->wordlen;
63: SspChStat[ch].slave = param->slave;
64: SspChStat[ch].tx_thod =
AG903_SSP_TXFIFO_THRESHOLD;
65: SspChStat[ch].rx_thod =
AG903_SSP_RXFIFO_THRESHOLD;
66:
67:
return retval;
68: }