分支自 DSP/ADSP21569/DSP-21569

graydon
2023-09-20 d40b58b3ecbfb79e015f55755127849335e289b7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <sys/platform.h>
#include <sys/adi_core.h>
#include <stdio.h>
#include <stdlib.h>
#include "adi_initialize.h"
#include "memory.h"
#include "sport.h"
#include "config.h"
#include "dma.h"
 
struct sport_regs{
    volatile uint32_t ctl;
    volatile uint32_t div;
    volatile uint32_t mctl;
    volatile uint32_t cs0;
    volatile uint32_t cs1;
    volatile uint32_t cs2;
    volatile uint32_t cs3;
    uint32_t pad2[2];
    volatile uint32_t err;
    volatile uint32_t mstat;
    volatile uint32_t ctl2;
    uint32_t pad[6];
    volatile uint32_t txpri;
    volatile uint32_t rxpri;
    volatile uint32_t txsec;
    volatile uint32_t rxsec;
};
 
 
#define TDM_SLOT SLOTS
 
#define SLEN 31
#define PACK 0
#define ICLK 0 //Internal Clock.
#define OPMODE 0 //0-tdm ,1 - IIS mode
#define CKRE  1 //0-Clock falling edge,1-Clock rising edge
#define FSR 1 //0-No frame sync required, 1- Frame sync required
#define IFS 0 //0-External frame sync,1 - Internal frame sync
#define LFS 1 //0-active high Frame sync ,1- Active-Low Frame Sync
#define MFD 1 //Multichannel Frame Delay.
#define SPENSEC 1 //Serial Port Enable (Secondary)
 
 
 
struct DMA_Desc{
     struct DMA_Desc *next;
     void * buffer;
};
 
unsigned int SAMPLE_NUM = 32;
u16 mCodecNum = 0;
struct AudioCodec mAudioCodec[16];
 
static struct DMA_Desc sp_desc[32];//0a_ping,0a_pong,0b_ping,0b_pong,...
 
static volatile SportRegsDef*  gSports[16] = {
        SPORT0a,SPORT0b,SPORT1a,SPORT1b,SPORT2a,SPORT2b,SPORT3a,SPORT3b,
        SPORT4a,SPORT4b,SPORT5a,SPORT5b,SPORT6a,SPORT6b,SPORT7a,SPORT7b
};
 
volatile SportRegsDef* get_sport_regs(uint32_t sportid)
{
    if(sportid < 16) {
        return gSports[sportid];
    }
 
    return 0;
}
 
void sport_config(volatile SportRegsDef* regs , struct SportDef *  config)
{
    u32 i;
 
    volatile DMARegsDef* dma = get_dma_regs(config->spid);
    struct DMA_Desc* desca_0 = &sp_desc[config->spid*2 + 0];
    struct DMA_Desc* desca_1 = &sp_desc[config->spid*2 + 1];
    u32 dmaBufferLen = config->slots*SAMPLE_NUM;
    s32* dmaBuffer_ping, *dmaBuffer_pong;
 
    if(config->enable_sec) {
        dmaBufferLen *= 2;
    }
    dmaBuffer_ping = sram_malloc(SRAM_L1 , mem_any ,dmaBufferLen*2*sizeof(s32));//for ping-pong.
    if(dmaBuffer_ping == NULL) {
        printf("dmaBuffer malloc fail.\n");
    }
    dmaBuffer_pong = dmaBuffer_ping + dmaBufferLen;
    mAudioCodec[mCodecNum].dataPtr[0] = dmaBuffer_ping;
    mAudioCodec[mCodecNum].dataPtr[1] = dmaBuffer_pong;
    mAudioCodec[mCodecNum].slot_num = config->slots;
    mAudioCodec[mCodecNum].channel_num = config->vld;
    mAudioCodec[mCodecNum].rx  = config->rx;
    mAudioCodec[mCodecNum].enable_sec = config->enable_sec;
    mCodecNum++;
 
    desca_0->next = (uint32_t)desca_1|MP_OFFSET;
    desca_0->buffer = (uint32_t)dmaBuffer_ping|MP_OFFSET;
    desca_1->next = (uint32_t)desca_0|MP_OFFSET;
    desca_1->buffer = (uint32_t)dmaBuffer_pong|MP_OFFSET;
 
 
    //dma config.
    dma_config((DMARegsDef *)dma, (uint32_t)desca_0|MP_OFFSET, dmaBufferLen, config->rx);
 
    regs->div = 0;//(511<<16)|0 ;
 
    regs->ctl = (SLEN<<4) | (PACK<<9) | (ICLK<<10) | (config->opmode<<11) | (config->clke << 12) | (FSR<<13) | (IFS<<14) | (config->lfs<<16)  ;
    if(config->rx ) {
        regs->ctl |= (0<<25);
 
    }
    else {
        regs->ctl |= (1<<25);
    }
 
    if(! config->opmode ) { //tdm.
        regs->cs0 = 0;
        for(i=0 ;i < config->slots ;i ++ ){
            regs->cs0 |= (1<<i);
        }
 
        regs->mctl =  1 | (config->mfd<<4) | ((config->slots-1)<<8) ;
    }
}
 
 
void sport_enable(volatile SportRegsDef* regs, ubool enable_sec)
{
    regs->ctl |= 1 |(enable_sec<<24);
}