diff options
Diffstat (limited to 'firmware/target/arm/tms320dm320')
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/Makefile | 55 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/aic23.c | 58 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/arm.c | 49 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/arm.h | 32 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/audio.h | 26 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/dma.c | 87 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/dma.h | 28 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/ipc.h | 69 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/linker.cmd | 29 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/main.c | 145 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/registers.h | 93 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/tsc2100.c | 40 | ||||
-rw-r--r-- | firmware/target/arm/tms320dm320/dsp/vectors.asm | 143 |
13 files changed, 854 insertions, 0 deletions
diff --git a/firmware/target/arm/tms320dm320/dsp/Makefile b/firmware/target/arm/tms320dm320/dsp/Makefile new file mode 100644 index 0000000000..8f016378fd --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/Makefile | |||
@@ -0,0 +1,55 @@ | |||
1 | # __________ __ ___. | ||
2 | # Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
3 | # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
4 | # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
5 | # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
6 | # \/ \/ \/ \/ \/ | ||
7 | # $Id: Makefile 12058 2007-01-18 00:46:52Z dave $ | ||
8 | # | ||
9 | |||
10 | # http://daniel.haxx.se/blog/2007/11/18/free-to-use-compiler-from-ti/ | ||
11 | CC = cl500 | ||
12 | LD = lnk500 | ||
13 | CFLAGS = $(BUILDDATE) | ||
14 | # There's more in linker.cmd. | ||
15 | LDFLAGS = -w | ||
16 | |||
17 | OBJS = arm.obj main.obj vectors.obj dma.obj | ||
18 | |||
19 | ifeq ($(findstring -DCREATIVE_ZV,$(TARGET)), -DCREATIVE_ZV) | ||
20 | OBJS += aic23.obj | ||
21 | else | ||
22 | OBJS += tsc2100.obj | ||
23 | endif | ||
24 | |||
25 | OBJS := $(patsubst %.obj, $(OBJDIR)/%.obj, $(OBJS)) | ||
26 | |||
27 | all: $(BUILDDIR)/dsp-image.h | ||
28 | |||
29 | clean: | ||
30 | $(call PRINTS,cleaning DSP firmware)rm -f $(OBJS) $(OBJDIR)/dsp-image.out $(OBJDIR)/dsp-image.xml | ||
31 | |||
32 | $(BUILDDIR)/dsp-image.h: $(OBJS) linker.cmd | ||
33 | $(call PRINTS,LNK500 dsp-image.out)lnk500 $(LDFLAGS) -o $(OBJDIR)/dsp-image.out $^ | ||
34 | $(call PRINTS,OFD500+XML2H $(@F))ofd500 -x -o /dev/stdout $(OBJDIR)/dsp-image.out | python $(TOOLSDIR)/xml2h.py $(OBJDIR)/dsp-image.xml > $@ | ||
35 | |||
36 | $(OBJDIR)/%.obj: %.asm | ||
37 | $(SILENT)mkdir -p $(dir $@) | ||
38 | $(call PRINTS,CL500 $<)$(CC) $(CFLAGS) -fr $(dir $@) $< | ||
39 | |||
40 | $(OBJDIR)/%.obj: %.c | ||
41 | $(SILENT)mkdir -p $(dir $@) | ||
42 | $(call PRINTS,CL500 $<)$(CC) $(CFLAGS) -fr $(dir $@) $< | ||
43 | |||
44 | $(OBJDIR)/arm.obj: arm.c arm.h registers.h ipc.h | ||
45 | |||
46 | $(OBJDIR)/main.obj: main.c arm.h registers.h ipc.h dma.h audio.h | ||
47 | |||
48 | $(OBJDIR)/aic23.obj: aic23.c audio.h registers.h | ||
49 | |||
50 | $(OBJDIR)/tsc2100.obj: tsc2100.c audio.h registers.h | ||
51 | |||
52 | $(OBJDIR)/dma.obj: dma.c dma.h registers.h ipc.h | ||
53 | |||
54 | # For PRINTS. | ||
55 | include $(TOOLSDIR)/make.inc | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/aic23.c b/firmware/target/arm/tms320dm320/dsp/aic23.c new file mode 100644 index 0000000000..e6eb8b4c29 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/aic23.c | |||
@@ -0,0 +1,58 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Maurus Cuelenaere | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #include "audio.h" | ||
21 | #include "registers.h" | ||
22 | |||
23 | /* based on http://archopen.svn.sourceforge.net/viewvc/archopen/ArchOpen/trunk/libdsp/aic23.c?revision=213&view=markup */ | ||
24 | void audiohw_init(void) | ||
25 | { | ||
26 | /* port config */ | ||
27 | #if 0 | ||
28 | SPCR10 = 0; /* DLB = 0 ** RJUST = 0 ** CLKSTP = 0 ** DXENA = 0 ** ABIS = 0 ** RINTM = 0 ** RSYNCER = 0 ** RFULL = 0 ** RRDY = 0 ** RRST = 0 */ | ||
29 | SPCR20 = (1 << 9); /* FREE = 1 ** SOFT = 0 ** FRST = 0 ** GRST = 0 ** XINTM = 0 ** XSYNCER = 0 ** XEMPTY = 0 ** XRDY = 0 ** XRST = 0 */ | ||
30 | RCR10 = (1 << 8) | (2 << 5); /* RFRLEN1 = 1 ** RWDLEN1 = 2 */ | ||
31 | RCR20 = 0; /* RPHASE = 0 ** RFRLEN2 = 0 ** RWDLEN2 = 0 ** RCOMPAND = 0 ** RFIG = 0 ** RDATDLY = 0 */ | ||
32 | XCR10 = (1 << 8) | (2 << 5); /* XFRLEN1 = 1 ** XWDLEN1 = 2 */ | ||
33 | XCR20 = 0; /* XPHASE = 0 ** XFRLEN2 = 0 ** XWDLEN2 = 0 ** XCOMPAND = 0 ** XFIG = 0 ** XDATDLY = 0 */ | ||
34 | SRGR10 = 0; /* FWID = 0 ** CLKGDV = 0 */ | ||
35 | SRGR20 = 0; /* FREE = 0 ** CLKSP = 0 ** CLKSM = 0 ** FSGM = 0 ** FPER = 0 */ | ||
36 | PCR0 = (1 << 1) | 1; /* IDLEEN = 0 ** XIOEN = 0 ** RIOEN = 0 ** FSXM = 0 ** FSRM = 0 ** SCLKME = 0 ** CLKSSTAT = 0 ** DXSTAT = 0 ** DRSTAT = 0 ** CLKXM = 0 ** CLKRM = 0 ** FSXP = 0 ** FSRP = 0 ** CLKXP = 1 ** CLKRP = 1 */ | ||
37 | #else | ||
38 | SPCR10 = 0; | ||
39 | SPCR20 = 0x0200; /* SPCR : free running mode */ | ||
40 | |||
41 | RCR10 = 0x00A0; | ||
42 | RCR20 = 0x00A1; /* RCR : 32 bit receive data length */ | ||
43 | |||
44 | XCR10 = 0x00A0; | ||
45 | XCR20 = 0x00A0; /* XCR : 32 bit transmit data length */ | ||
46 | |||
47 | SRGR10 = 0; | ||
48 | SRGR20 = 0x3000; /* SRGR 1 & 2 */ | ||
49 | |||
50 | PCR0 = 0x000E - 8; /* PCR : FSX, FSR active low, external FS/CLK source */ | ||
51 | #endif | ||
52 | } | ||
53 | |||
54 | void audiohw_postinit(void) | ||
55 | { | ||
56 | /* Trigger first XEVT0 */ | ||
57 | SPCR20 |= 1; | ||
58 | } | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/arm.c b/firmware/target/arm/tms320dm320/dsp/arm.c new file mode 100644 index 0000000000..eedff7d439 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/arm.c | |||
@@ -0,0 +1,49 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #include <stdio.h> | ||
21 | #include "arm.h" | ||
22 | #include "registers.h" | ||
23 | #include "ipc.h" | ||
24 | |||
25 | volatile struct ipc_message status; | ||
26 | |||
27 | volatile int acked; | ||
28 | interrupt void handle_int0(void) { | ||
29 | IFR = 1; | ||
30 | acked = 1; | ||
31 | } | ||
32 | |||
33 | void debugf(const char *fmt, ...) { | ||
34 | va_list args; | ||
35 | va_start(args, fmt); | ||
36 | status.msg = MSG_DEBUGF; | ||
37 | vsnprintf((char *)status.payload.debugf.buffer, sizeof(status), fmt, args); | ||
38 | va_end(args); | ||
39 | |||
40 | /* Wait until ARM has picked up data. */ | ||
41 | acked = 0; | ||
42 | int_arm(); | ||
43 | while (!acked) { | ||
44 | /* IDLE alone never seems to wake up :( */ | ||
45 | asm(" IDLE 1"); | ||
46 | asm(" NOP"); | ||
47 | } | ||
48 | acked = 2; | ||
49 | } | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/arm.h b/firmware/target/arm/tms320dm320/dsp/arm.h new file mode 100644 index 0000000000..515c75ad26 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/arm.h | |||
@@ -0,0 +1,32 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #ifndef ARM_H | ||
21 | #define ARM_H | ||
22 | #include "registers.h" | ||
23 | |||
24 | extern volatile struct ipc_message status; | ||
25 | |||
26 | void debugf(const char *fmt, ...); | ||
27 | |||
28 | inline void int_arm(void) { | ||
29 | CP_INTC = 1 << 3; | ||
30 | } | ||
31 | |||
32 | #endif | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/audio.h b/firmware/target/arm/tms320dm320/dsp/audio.h new file mode 100644 index 0000000000..e5bf003301 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/audio.h | |||
@@ -0,0 +1,26 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Maurus Cuelenaere | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #ifndef AUDIO_H | ||
21 | #define AUDIO_H | ||
22 | |||
23 | void audiohw_init(void); | ||
24 | void audiohw_postinit(void); | ||
25 | |||
26 | #endif | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/dma.c b/firmware/target/arm/tms320dm320/dsp/dma.c new file mode 100644 index 0000000000..fe39dc3b21 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/dma.c | |||
@@ -0,0 +1,87 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * Copyright (C) 2008 by Maurus Cuelenaere | ||
12 | * | ||
13 | * All files in this archive are subject to the GNU General Public License. | ||
14 | * See the file COPYING in the source tree root for full license agreement. | ||
15 | * | ||
16 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
17 | * KIND, either express or implied. | ||
18 | * | ||
19 | ****************************************************************************/ | ||
20 | |||
21 | #include "registers.h" | ||
22 | #include "arm.h" | ||
23 | #include "dma.h" | ||
24 | |||
25 | /* This is placed at the right (aligned) address using linker.cmd. */ | ||
26 | #pragma DATA_SECTION (data, ".dma") | ||
27 | signed short data[PCM_SIZE / 2]; | ||
28 | |||
29 | /* Filled in by loader. */ | ||
30 | unsigned short sdem_addrh; | ||
31 | unsigned short sdem_addrl; | ||
32 | |||
33 | interrupt void handle_dma0(void) { | ||
34 | unsigned long sdem_addr; | ||
35 | /* Byte offset to half-buffer locked by DMA0. | ||
36 | 0 for top, PCM_SIZE/2(0x4000) for bottom */ | ||
37 | unsigned short dma0_locked; | ||
38 | unsigned short dma0_unlocked; | ||
39 | |||
40 | IFR = 1 << 6; | ||
41 | |||
42 | /* DMSRC0 is the beginning of the DMA0-locked SARAM half-buffer. */ | ||
43 | DMSA = 0x00 /* DMSRC0 */; | ||
44 | dma0_locked = (DMSDN << 1) & (PCM_SIZE / 2); | ||
45 | dma0_unlocked = dma0_locked ^ (PCM_SIZE / 2); | ||
46 | |||
47 | /* ARM, decode into same half, in SDRAM. */ | ||
48 | status.msg = MSG_REFILL; | ||
49 | status.payload.refill.topbottom = dma0_locked; | ||
50 | int_arm(); | ||
51 | |||
52 | /* DMAC, copy opposite halves from SDRAM to SARAM. */ | ||
53 | sdem_addr = ((unsigned long)sdem_addrh << 16 | sdem_addrl) + dma0_unlocked; | ||
54 | SDEM_ADDRL = sdem_addr & 0xffff; | ||
55 | SDEM_ADDRH = sdem_addr >> 16; | ||
56 | DSP_ADDRL = (unsigned short)data + (dma0_unlocked >> 1); | ||
57 | DSP_ADDRH = 0; | ||
58 | DMA_SIZE = PCM_SIZE / 2; | ||
59 | DMA_CTRL = 0; | ||
60 | |||
61 | status.payload.refill._DMA_TRG = DMA_TRG; | ||
62 | status.payload.refill._SDEM_ADDRH = SDEM_ADDRH; | ||
63 | status.payload.refill._SDEM_ADDRL = SDEM_ADDRL; | ||
64 | status.payload.refill._DSP_ADDRH = DSP_ADDRH; | ||
65 | status.payload.refill._DSP_ADDRL = DSP_ADDRL; | ||
66 | |||
67 | DMA_TRG = 1; | ||
68 | } | ||
69 | |||
70 | interrupt void handle_dmac(void) { | ||
71 | IFR = 1 << 11; | ||
72 | } | ||
73 | |||
74 | void dma_init(void) { | ||
75 | /* Configure DMA */ | ||
76 | DMSFC0 = 2 << 12 | 1 << 11; /* Event XEVT0, 32-bit transfers, 0 frame count */ | ||
77 | DMMCR0 = 1 << 14 | 1 << 13 | /* Interrupts generated, Half and full buffer */ | ||
78 | 1 << 12 | 1 << 8 | 1 << 6 | 1; /* ABU mode, | ||
79 | From data space with postincrement, | ||
80 | To data space with no mod */ | ||
81 | DMSRC0 = (unsigned short)&data; | ||
82 | DMDST0 = (unsigned short)&DXR20; /* First of two-word register pair */ | ||
83 | DMCTR0 = sizeof(data); | ||
84 | |||
85 | /* Run, Rudolf, run! (with DMA0 interrupts) */ | ||
86 | DMPREC = 2 << 6 | 1; | ||
87 | } | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/dma.h b/firmware/target/arm/tms320dm320/dsp/dma.h new file mode 100644 index 0000000000..d776302796 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/dma.h | |||
@@ -0,0 +1,28 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Maurus Cuelenaere | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #ifndef DMA_H | ||
21 | #define DMA_H | ||
22 | |||
23 | #include "ipc.h" | ||
24 | |||
25 | extern signed short data[PCM_SIZE / 2]; | ||
26 | void dma_init(void); | ||
27 | |||
28 | #endif | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/ipc.h b/firmware/target/arm/tms320dm320/dsp/ipc.h new file mode 100644 index 0000000000..ada4f17f61 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/ipc.h | |||
@@ -0,0 +1,69 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #ifndef IPC_H | ||
21 | #define IPC_H | ||
22 | |||
23 | /* Inter-Processor Communication */ | ||
24 | |||
25 | /* Meant to be included by both DSP and ARM code. */ | ||
26 | #ifdef __GNUC__ | ||
27 | /* aligned(2) is VERY IMPORTANT. It ensures gcc generates code with "STRH" | ||
28 | instead of with "STRB". STRB in the DSP memory range is broken because | ||
29 | the HPI is in 16-bit mode. */ | ||
30 | #define PACKED __attribute__((packed)) __attribute__((aligned (2))) | ||
31 | #else | ||
32 | #define PACKED | ||
33 | #endif | ||
34 | |||
35 | #define PCM_SIZE 32768 /* bytes */ | ||
36 | |||
37 | struct sdram_buffer { | ||
38 | unsigned long addr; | ||
39 | unsigned short bytes; | ||
40 | } PACKED; | ||
41 | |||
42 | #define SDRAM_BUFFERS 4 | ||
43 | |||
44 | struct ipc_message { | ||
45 | unsigned short msg; | ||
46 | union { | ||
47 | #define MSG_INIT 1 | ||
48 | struct msg_init { | ||
49 | unsigned short sdem_addrl; | ||
50 | unsigned short sdem_addrh; | ||
51 | } init PACKED; | ||
52 | #define MSG_DEBUGF 2 | ||
53 | struct { | ||
54 | short buffer[80]; | ||
55 | } debugf PACKED; | ||
56 | #define MSG_REFILL 3 | ||
57 | struct { | ||
58 | unsigned short topbottom; /* byte offset to unlocked half-buffer */ | ||
59 | |||
60 | unsigned short _DMA_TRG; | ||
61 | unsigned short _SDEM_ADDRH; | ||
62 | unsigned short _SDEM_ADDRL; | ||
63 | unsigned short _DSP_ADDRH; | ||
64 | unsigned short _DSP_ADDRL; | ||
65 | unsigned short _DMA_SIZE; | ||
66 | } refill PACKED; | ||
67 | } payload PACKED; | ||
68 | } PACKED; | ||
69 | #endif | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/linker.cmd b/firmware/target/arm/tms320dm320/dsp/linker.cmd new file mode 100644 index 0000000000..844fe25903 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/linker.cmd | |||
@@ -0,0 +1,29 @@ | |||
1 | -c | ||
2 | -x | ||
3 | -stack 0x1000 | ||
4 | -heap 0x100 | ||
5 | -l rts500.lib | ||
6 | |||
7 | MEMORY | ||
8 | { | ||
9 | PAGE 0: | ||
10 | DARAM: origin = 80h, length = 7F80h | ||
11 | SARAM: origin = 8000h, length = 4000h | ||
12 | } | ||
13 | |||
14 | SECTIONS | ||
15 | { | ||
16 | .text PAGE 0 | ||
17 | .cinit PAGE 0 | ||
18 | .switch PAGE 0 | ||
19 | |||
20 | .bss PAGE 0 | ||
21 | .const PAGE 0 | ||
22 | .sysmem PAGE 0 | ||
23 | .stack PAGE 0 | ||
24 | |||
25 | .vectors : PAGE 0 load = 7F80h | ||
26 | |||
27 | /* DMA buffers for ABU mode must start on a 2*size boundary. */ | ||
28 | .dma : PAGE 0 load = 0x8000 | ||
29 | } | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/main.c b/firmware/target/arm/tms320dm320/dsp/main.c new file mode 100644 index 0000000000..6ba001db2f --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/main.c | |||
@@ -0,0 +1,145 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #include "registers.h" | ||
21 | #include "arm.h" | ||
22 | #include "ipc.h" | ||
23 | #include "dma.h" | ||
24 | #include "audio.h" | ||
25 | #include <math.h> | ||
26 | |||
27 | void main(void) { | ||
28 | register int i; | ||
29 | register signed short *p; | ||
30 | |||
31 | TCR = 1 << 4; /* Stop the timer. */ | ||
32 | IMR = 0xffff; /* Unmask all interrupts. */ | ||
33 | IFR = IFR; /* Clear all pending interrupts. */ | ||
34 | asm(" rsbx INTM"); /* Globally enable interrupts. */ | ||
35 | |||
36 | audiohw_init(); | ||
37 | |||
38 | dma_init(); | ||
39 | |||
40 | audiohw_postinit(); | ||
41 | |||
42 | #if 0 | ||
43 | for (i = 0; i < 32; i++) | ||
44 | { | ||
45 | double ratio = ((double)i)/32.0; | ||
46 | double rad = 3.0*3.141592*ratio; | ||
47 | double normal = sin(rad); | ||
48 | double scaled = 32767.0*(normal); | ||
49 | data[2*i + 0] = -(signed short)scaled; | ||
50 | data[2*i + 1] = (signed short)scaled; | ||
51 | } | ||
52 | |||
53 | debugf("starting write"); | ||
54 | |||
55 | i = 0; | ||
56 | p = data; | ||
57 | SPSA0 = 0x01; | ||
58 | for (;;) { | ||
59 | while ((SPSD0 & (1 << 1)) == 0); | ||
60 | DXR20 = *p++; // left channel | ||
61 | DXR10 = *p++; // right channel | ||
62 | if (++i == 32) | ||
63 | { | ||
64 | p = data; | ||
65 | i = 0; | ||
66 | } | ||
67 | } | ||
68 | #endif | ||
69 | debugf("DSP inited..."); | ||
70 | |||
71 | for (;;) { | ||
72 | asm(" IDLE 1"); | ||
73 | asm(" NOP"); | ||
74 | } | ||
75 | } | ||
76 | |||
77 | /* Obsoleted/testing snippets: */ | ||
78 | #ifdef REMAP_VECTORS | ||
79 | /* Remap vectors to 0x3F80 (set in linker.cmd). */ | ||
80 | PMST = (PMST & 0x7f) | 0x3F80; | ||
81 | |||
82 | /* Make sure working interrupts aren't a fluke. */ | ||
83 | memset((unsigned short *)0x7f80, 0, 0x80); | ||
84 | #endif | ||
85 | |||
86 | #ifdef DATA_32_SINE | ||
87 | for (i = 0; i < 32; i++) { | ||
88 | double ratio = ((double)i)/32.0; | ||
89 | double rad = 3.0*3.141592*ratio; | ||
90 | double normal = sin(rad); | ||
91 | double scaled = 32767.0*(normal); | ||
92 | data[2*i + 0] = -(signed short)scaled; | ||
93 | data[2*i + 1] = (signed short)scaled; | ||
94 | } | ||
95 | #endif | ||
96 | |||
97 | #ifdef MANUAL_TRANSFER | ||
98 | register signed short *p; | ||
99 | |||
100 | debugf("starting write"); | ||
101 | |||
102 | i = 0; | ||
103 | p = data; | ||
104 | SPSA0 = 0x01; | ||
105 | for (;;) { | ||
106 | while ((SPSD0 & (1 << 1)) == 0); | ||
107 | DXR20 = *p++; // left channel | ||
108 | DXR10 = *p++; // right channel | ||
109 | if (++i == 32) { | ||
110 | p = data; | ||
111 | i = 0; | ||
112 | } | ||
113 | } | ||
114 | #endif | ||
115 | |||
116 | #ifdef INIT_MSG | ||
117 | /* Copy codec init data (before debugf, which clobbers status). */ | ||
118 | if (status.msg != MSG_INIT) { | ||
119 | debugf("No init message (%04x: %04x %04x %04x %04x instead)", | ||
120 | (unsigned short)&status, | ||
121 | ((unsigned short *)&status)[0], | ||
122 | ((unsigned short *)&status)[1], | ||
123 | ((unsigned short *)&status)[2], | ||
124 | ((unsigned short *)&status)[3]); | ||
125 | return; | ||
126 | } | ||
127 | |||
128 | memcpy(&init, (void *)&status.payload.init, sizeof(init)); | ||
129 | #endif | ||
130 | |||
131 | #ifdef IPC_SIZES | ||
132 | debugf("sizeof(ipc_message)=%uw offset(ipc_message.payload)=%uw", | ||
133 | sizeof(struct ipc_message), (int)&((struct ipc_message*)0)->payload); | ||
134 | #endif | ||
135 | |||
136 | #ifdef VERBOSE_INIT | ||
137 | debugf("codec started with PCM at SDRAM offset %04x:%04x", | ||
138 | sdem_addrh, sdem_addrl); | ||
139 | #endif | ||
140 | |||
141 | #ifdef SPIKE_DATA | ||
142 | for (i = 0; i < 0x2000; i++) { | ||
143 | data[2*i ] = data[2*i+1] = ((i % 32) == 0) * 32767; | ||
144 | } | ||
145 | #endif | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/registers.h b/firmware/target/arm/tms320dm320/dsp/registers.h new file mode 100644 index 0000000000..57e32be490 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/registers.h | |||
@@ -0,0 +1,93 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #ifndef REGISTERS_H | ||
21 | #define REGISTERS_H | ||
22 | |||
23 | #define C5409_REG(addr) (*(volatile unsigned short *)(addr)) | ||
24 | |||
25 | /* This is NOT good for reading, only for writing. */ | ||
26 | #define BANKED_REG(spsa, spsd, subaddr) spsa = (subaddr), spsd | ||
27 | |||
28 | #define IMR C5409_REG(0x00) | ||
29 | #define IFR C5409_REG(0x01) | ||
30 | |||
31 | #define PMST C5409_REG(0x1D) | ||
32 | |||
33 | #define TCR C5409_REG(0x26) | ||
34 | |||
35 | /* McBSP 0 (SPRU302 Chapter 2) */ | ||
36 | #define DXR20 C5409_REG(0x22) | ||
37 | #define DXR10 C5409_REG(0x23) | ||
38 | #define SPSA0 C5409_REG(0x38) | ||
39 | #define SPSD0 C5409_REG(0x39) | ||
40 | #define SPCR10 BANKED_REG(SPSA0, SPSD0, 0x00) | ||
41 | #define SPCR20 BANKED_REG(SPSA0, SPSD0, 0x01) | ||
42 | #define RCR10 BANKED_REG(SPSA0, SPSD0, 0x02) | ||
43 | #define RCR20 BANKED_REG(SPSA0, SPSD0, 0x03) | ||
44 | #define XCR10 BANKED_REG(SPSA0, SPSD0, 0x04) | ||
45 | #define XCR20 BANKED_REG(SPSA0, SPSD0, 0x05) | ||
46 | #define SRGR10 BANKED_REG(SPSA0, SPSD0, 0x06) | ||
47 | #define SRGR20 BANKED_REG(SPSA0, SPSD0, 0x07) | ||
48 | #define PCR0 BANKED_REG(SPSA0, SPSD0, 0x0e) | ||
49 | |||
50 | /* McBSP 1 */ | ||
51 | #define DXR21 C5409_REG(0x42) | ||
52 | #define DXR11 C5409_REG(0x43) | ||
53 | #define SPSA1 C5409_REG(0x48) | ||
54 | #define SPSD1 C5409_REG(0x49) | ||
55 | #define SPCR11 BANKED_REG(SPSA1, SPSD1, 0x00) | ||
56 | #define SPCR21 BANKED_REG(SPSA1, SPSD1, 0x01) | ||
57 | #define XCR11 BANKED_REG(SPSA1, SPSD1, 0x04) | ||
58 | #define XCR21 BANKED_REG(SPSA1, SPSD1, 0x05) | ||
59 | #define PCR1 BANKED_REG(SPSA1, SPSD1, 0x0e) | ||
60 | |||
61 | /* DMA */ | ||
62 | #define DMPREC C5409_REG(0x54) | ||
63 | #define DMSA C5409_REG(0x55) | ||
64 | #define DMSDI C5409_REG(0x56) | ||
65 | #define DMSDN C5409_REG(0x57) | ||
66 | #define DMSRC0 BANKED_REG(DMSA, DMSDN, 0x00) | ||
67 | #define DMDST0 BANKED_REG(DMSA, DMSDN, 0x01) | ||
68 | #define DMCTR0 BANKED_REG(DMSA, DMSDN, 0x02) | ||
69 | #define DMSFC0 BANKED_REG(DMSA, DMSDN, 0x03) | ||
70 | #define DMMCR0 BANKED_REG(DMSA, DMSDN, 0x04) | ||
71 | |||
72 | |||
73 | /* DM320 */ | ||
74 | ioport unsigned short port280; | ||
75 | #define CP_INTC port280 | ||
76 | ioport unsigned short port8000; | ||
77 | #define SDEM_ADDRL port8000 | ||
78 | ioport unsigned short port8001; | ||
79 | #define SDEM_ADDRH port8001 | ||
80 | ioport unsigned short port8002; | ||
81 | #define DSP_ADDRL port8002 | ||
82 | ioport unsigned short port8003; | ||
83 | #define DSP_ADDRH port8003 | ||
84 | ioport unsigned short port8004; | ||
85 | #define DMA_SIZE port8004 | ||
86 | ioport unsigned short port8005; | ||
87 | #define DMA_CTRL port8005 | ||
88 | ioport unsigned short port8006; | ||
89 | #define DMA_TRG port8006 | ||
90 | ioport unsigned short port8007; | ||
91 | #define DMA_REST port8007 | ||
92 | |||
93 | #endif | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/tsc2100.c b/firmware/target/arm/tms320dm320/dsp/tsc2100.c new file mode 100644 index 0000000000..f9c7a2d724 --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/tsc2100.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id$ | ||
9 | * | ||
10 | * Copyright (C) 2008 by Catalin Patulea | ||
11 | * | ||
12 | * All files in this archive are subject to the GNU General Public License. | ||
13 | * See the file COPYING in the source tree root for full license agreement. | ||
14 | * | ||
15 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
16 | * KIND, either express or implied. | ||
17 | * | ||
18 | ****************************************************************************/ | ||
19 | |||
20 | #include "audio.h" | ||
21 | #include "registers.h" | ||
22 | |||
23 | void audiohw_init(void) | ||
24 | { | ||
25 | /* Configure McBSP */ | ||
26 | SPCR10 = 0; /* Receiver reset */ | ||
27 | SPCR20 = 3 << 4; /* Rate gen disabled, RINT=XSYNCERR, TX disabled for now */ | ||
28 | PCR0 = 1 << 1; /* Serial port pins, external frame sync, external clock, | ||
29 | frame sync FSX is active-high, | ||
30 | TX data sampled on falling clock */ | ||
31 | XCR10 = 0x00a0; /* 1 word per frame, 32 bits per word */ | ||
32 | XCR20 = 0; /* Single-phase, unexpected frame pulse restarts xfer, | ||
33 | 0-bit data delay */ | ||
34 | } | ||
35 | |||
36 | void audiohw_postinit(void) | ||
37 | { | ||
38 | /* Trigger first XEVT0 */ | ||
39 | SPCR20 |= 1; | ||
40 | } | ||
diff --git a/firmware/target/arm/tms320dm320/dsp/vectors.asm b/firmware/target/arm/tms320dm320/dsp/vectors.asm new file mode 100644 index 0000000000..1551d996fc --- /dev/null +++ b/firmware/target/arm/tms320dm320/dsp/vectors.asm | |||
@@ -0,0 +1,143 @@ | |||
1 | ;* Copyright (c) 2007, C.P.R. Baaij | ||
2 | ;* All rights reserved. | ||
3 | ;* | ||
4 | ;* Redistribution and use in source and binary forms, with or without | ||
5 | ;* modification, are permitted provided that the following conditions are met: | ||
6 | ;* * Redistributions of source code must retain the above copyright | ||
7 | ;* notice, this list of conditions and the following disclaimer. | ||
8 | ;* * Redistributions in binary form must reproduce the above copyright | ||
9 | ;* notice, this list of conditions and the following disclaimer in the | ||
10 | ;* documentation and/or other materials provided with the distribution. | ||
11 | ;* | ||
12 | ;* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | ||
13 | ;* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||
14 | ;* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||
15 | ;* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
16 | ;* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
17 | ;* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
18 | ;* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
19 | ;* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
20 | ;* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
21 | ;* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
22 | |||
23 | ;*-----------------------------------------------------------------------------* | ||
24 | ;* Interrupt Vectors * | ||
25 | ;*-----------------------------------------------------------------------------* | ||
26 | .mmregs | ||
27 | |||
28 | ; External Functions | ||
29 | .global _handle_int0 | ||
30 | .global _c_int00 | ||
31 | .global _handle_dma0 | ||
32 | .global _handle_dmac | ||
33 | |||
34 | .sect ".vectors" | ||
35 | ; Reset Interrupt | ||
36 | RS_V: BD _c_int00 | ||
37 | NOP | ||
38 | NOP | ||
39 | |||
40 | ; Non-Maskable Interrupt | ||
41 | NMI_V: RETE | ||
42 | NOP | ||
43 | NOP | ||
44 | NOP | ||
45 | |||
46 | ; Software Interrupts | ||
47 | SINt17_V: .space 4*16 | ||
48 | SINt18_V: .space 4*16 | ||
49 | SINt19_V: .space 4*16 | ||
50 | SINt20_V: .space 4*16 | ||
51 | SINt21_V: .space 4*16 | ||
52 | SINt22_V: .space 4*16 | ||
53 | SINt23_V: .space 4*16 | ||
54 | SINt24_V: .space 4*16 | ||
55 | SINt25_V: .space 4*16 | ||
56 | SINt26_V: .space 4*16 | ||
57 | SINt27_V: .space 4*16 | ||
58 | SINt28_V: .space 4*16 | ||
59 | SINt29_V: .space 4*16 | ||
60 | SINt30_V: .space 4*16 | ||
61 | ; INT0 - ARM Interrupting DSP via HPIB | ||
62 | INT0_V: BD _handle_int0 | ||
63 | NOP | ||
64 | NOP | ||
65 | ; INT1 - Interrupt is generated based on the settings of DSP_SYNC_STATE and | ||
66 | ; DSP_SYNC_MASK register of the coprocessor subsystem or when DSPINT1 bit in | ||
67 | ; CP_INTC is set. | ||
68 | INT1_V: RETE | ||
69 | NOP | ||
70 | NOP | ||
71 | NOP | ||
72 | ; INT2 - Interrupt is generated when DSPINT2 bit in CP_INTC register of the | ||
73 | ; coprocessor subsystem is set. | ||
74 | INT2_V: RETE | ||
75 | NOP | ||
76 | NOP | ||
77 | NOP | ||
78 | ; Timer Interrupt | ||
79 | TINT_V: RETE | ||
80 | NOP | ||
81 | NOP | ||
82 | NOP | ||
83 | ; McBSP0 receive interrupt | ||
84 | BRINT0_V: RETE | ||
85 | NOP | ||
86 | NOP | ||
87 | NOP | ||
88 | ; McBSP0 transmit interrupt | ||
89 | BXINT0_V: RETE | ||
90 | NOP | ||
91 | NOP | ||
92 | NOP | ||
93 | ; DMA Channel-0 interrupt | ||
94 | DMAC0_V: BD _handle_dma0 | ||
95 | NOP | ||
96 | NOP | ||
97 | ; DMA Channel-1 interrupt | ||
98 | DMAC1_V: RETE | ||
99 | NOP | ||
100 | NOP | ||
101 | NOP | ||
102 | ; INT3 - Interrupt is generated when DSPINT3 bit in CP_INTC register of the | ||
103 | ; coprocessor subsystem is set or on write of any value to BRKPT_TRG | ||
104 | INT3_V: RETE | ||
105 | NOP | ||
106 | NOP | ||
107 | NOP | ||
108 | ; HPIB HINT to DSP | ||
109 | HINT_V: RETE | ||
110 | NOP | ||
111 | NOP | ||
112 | NOP | ||
113 | ; BRINT1/DMAC2 McBSP1 receive interrupt | ||
114 | BRINT1_V: RETE | ||
115 | NOP | ||
116 | NOP | ||
117 | NOP | ||
118 | ; BXINT1/DMAC3 McBSP1 transmit interrupt | ||
119 | BXINT1_V: RETE | ||
120 | NOP | ||
121 | NOP | ||
122 | NOP | ||
123 | ; DMA Channel-4 interrupt | ||
124 | DMAC4_V: RETE | ||
125 | NOP | ||
126 | NOP | ||
127 | NOP | ||
128 | ; DMA Channel-5 interrupt | ||
129 | DMAC5_V: RETE | ||
130 | NOP | ||
131 | NOP | ||
132 | NOP | ||
133 | ; HPIB DMAC interrupt | ||
134 | HPIB_DMA_V: BD _handle_dmac | ||
135 | NOP | ||
136 | NOP | ||
137 | |||
138 | ; EHIF interrupt to DSP | ||
139 | EHIV_V: RETE | ||
140 | NOP | ||
141 | NOP | ||
142 | NOP | ||
143 | .end | ||