summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/SOURCES4
-rw-r--r--firmware/target/arm/ata-as-arm.S3
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c102
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/ata-target.h9
-rw-r--r--firmware/target/arm/tms320dm320/creative-zvm/audio-creativezvm.c44
-rwxr-xr-xfirmware/target/arm/tms320dm320/i2c-dm320.c9
6 files changed, 107 insertions, 64 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 5a82cd3216..c788f8d2d4 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -101,7 +101,9 @@ drivers/lcd-remote-2bit-vi.c
101drivers/led.c 101drivers/led.c
102drivers/button.c 102drivers/button.c
103#ifndef SIMULATOR 103#ifndef SIMULATOR
104#ifdef HAVE_DAC3550A
104drivers/dac.c 105drivers/dac.c
106#endif
105drivers/serial.c 107drivers/serial.c
106#endif /* SIMULATOR */ 108#endif /* SIMULATOR */
107 109
@@ -715,10 +717,10 @@ target/arm/tms320dm320/mrobe-500/usb-mr500.c
715 717
716#ifdef CREATIVE_ZVM 718#ifdef CREATIVE_ZVM
717#ifndef SIMULATOR 719#ifndef SIMULATOR
720target/arm/ata-as-arm.S
718target/arm/lcd-as-memframe.S 721target/arm/lcd-as-memframe.S
719target/arm/mmu-arm.c 722target/arm/mmu-arm.c
720target/arm/tms320dm320/creative-zvm/adc-creativezvm.c 723target/arm/tms320dm320/creative-zvm/adc-creativezvm.c
721target/arm/tms320dm320/creative-zvm/audio-creativezvm.c
722target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c 724target/arm/tms320dm320/creative-zvm/lcd-creativezvm.c
723target/arm/tms320dm320/creative-zvm/ata-creativezvm.c 725target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
724target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c 726target/arm/tms320dm320/creative-zvm/pcm-creativezvm.c
diff --git a/firmware/target/arm/ata-as-arm.S b/firmware/target/arm/ata-as-arm.S
index 5c0a1f9660..5de6ddb5c9 100644
--- a/firmware/target/arm/ata-as-arm.S
+++ b/firmware/target/arm/ata-as-arm.S
@@ -33,6 +33,9 @@
33 /* Untested */ 33 /* Untested */
34 .text 34 .text
35 .equ .ata_port, 0x18000000 35 .equ .ata_port, 0x18000000
36#elif defined(CREATIVE_ZVM)
37 .text
38 .equ .ata_port, 0x50FEE000
36#endif 39#endif
37 40
38 .align 2 41 .align 2
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c b/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
index 331803360f..252239b62b 100644
--- a/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
+++ b/firmware/target/arm/tms320dm320/creative-zvm/ata-creativezvm.c
@@ -25,11 +25,18 @@
25#include "power.h" 25#include "power.h"
26#include "panic.h" 26#include "panic.h"
27#include "ata-target.h" 27#include "ata-target.h"
28#include "dm320.h"
29
30void sleep_ms(int ms)
31{
32 sleep(ms*HZ/1000);
33}
28 34
29void ide_power_enable(bool on) 35void ide_power_enable(bool on)
30{ 36{
37/* Disabled until figured out what's wrong */
31#if 0 38#if 0
32 IO_INTC_EINT1 &= ~INTR_EINT1_EXT2; 39 int old_level = disable_irq_save();
33 if(on) 40 if(on)
34 { 41 {
35 IO_GIO_BITSET0 = (1 << 14); 42 IO_GIO_BITSET0 = (1 << 14);
@@ -37,8 +44,7 @@ void ide_power_enable(bool on)
37 } 44 }
38 else 45 else
39 IO_GIO_BITCLR0 = (1 << 14); 46 IO_GIO_BITCLR0 = (1 << 14);
40 IO_INTC_EINT1 |= INTR_EINT1_EXT2; 47 restore_irq(old_level);
41 return;
42#else 48#else
43 (void)on; 49 (void)on;
44#endif 50#endif
@@ -55,26 +61,24 @@ inline bool ide_powered()
55 61
56void ata_reset(void) 62void ata_reset(void)
57{ 63{
58/* Disabled until figured out what's wrong */ 64 int old_level = disable_irq_save();
59 IO_INTC_EINT1 &= ~INTR_EINT1_EXT2; /*disable GIO2 interrupt */
60 if(!ide_powered()) 65 if(!ide_powered())
61 { 66 {
62 ide_power_enable(true); 67 ide_power_enable(true);
63 sleep(150); 68 sleep_ms(150);
64 } 69 }
65 else 70 else
66 { 71 {
67 IO_GIO_BITSET0 = (1 << 5); 72 IO_GIO_BITSET0 = (1 << 5);
68 IO_GIO_BITCLR0 = (1 << 3); 73 IO_GIO_BITCLR0 = (1 << 3);
69 sleep(1); 74 sleep_ms(1);
70 } 75 }
71 IO_GIO_BITCLR0 = (1 << 5); 76 IO_GIO_BITCLR0 = (1 << 5);
72 sleep(10); 77 sleep_ms(10);
73 IO_GIO_BITSET0 = (1 << 3); 78 IO_GIO_BITSET0 = (1 << 3);
74 while(!(ATA_COMMAND & STATUS_RDY)) 79 while(!(ATA_COMMAND & STATUS_RDY))
75 sleep(10); 80 sleep_ms(10);
76 IO_INTC_EINT1 |= INTR_EINT1_EXT2; //enable GIO2 interrupt 81 restore_irq(old_level);
77 return;
78} 82}
79 83
80void ata_enable(bool on) 84void ata_enable(bool on)
@@ -88,9 +92,79 @@ bool ata_is_coldstart(void)
88 return true; 92 return true;
89} 93}
90 94
95#if 0 /* Disabled as device crashes; probably due to SDRAM addresses aren't 32-bit aligned */
96#define CS1_START 0x50000000
97#define DEST_ADDR (ATA_IOBASE-CS1_START)
98static struct wakeup transfer_completion_signal;
99
100void MTC0(void)
101{
102 IO_INTC_IRQ1 = 1 << IRQ_MTC0;
103 wakeup_signal(&transfer_completion_signal);
104}
105
106void copy_read_sectors(unsigned char* buf, int wordcount)
107{
108 bool lasthalfword = false;
109 unsigned short tmp;
110 if(wordcount < 16)
111 {
112 _copy_read_sectors(buf, wordcount);
113 return;
114 }
115 else if((unsigned long)buf % 32) /* Not 32-byte aligned */
116 {
117 unsigned char* bufend = buf + ((unsigned long)buf % 32);
118 if( ((unsigned long)buf % 32) % 2 )
119 lasthalfword = true;
120 wordcount -= ((unsigned long)buf % 32) / 2;
121 do
122 {
123 tmp = ATA_DATA;
124 *buf++ = tmp >> 8;
125 *buf++ = tmp & 0xff;
126 } while (buf < bufend); /* tail loop is faster */
127 }
128 IO_SDRAM_SDDMASEL = 0x0830; /* 32-byte burst mode transfer */
129 IO_EMIF_AHBADDH = ((unsigned)buf >> 16) & ~(1 << 15); /* Set variable address */
130 IO_EMIF_AHBADDL = (unsigned)buf & 0xFFFF;
131 IO_EMIF_DMAMTCSEL = 1; /* Select CS1 */
132 IO_EMIF_MTCADDH = ( (1 << 15) | (DEST_ADDR >> 16) ); /* Set fixed address */
133 IO_EMIF_MTCADDL = DEST_ADDR & 0xFFFF;
134 IO_EMIF_DMASIZE = wordcount*2;
135 IO_EMIF_DMACTL = 3; /* Select MTC->AHB and start transfer */
136 //wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK);
137 while(IO_EMIF_DMACTL & 1)
138 nop;
139 if(lasthalfword)
140 {
141 *buf += wordcount * 2;
142 tmp = ATA_DATA;
143 *buf++ = tmp >> 8;
144 *buf++ = tmp & 0xff;
145 }
146}
147void copy_write_sectors(const unsigned char* buf, int wordcount)
148{
149 IO_EMIF_DMAMTCSEL = 1; /* Select CS1 */
150 IO_SDRAM_SDDMASEL = 0x0820; /* Temporarily set to standard value */
151 IO_EMIF_AHBADDH = ((int)buf >> 16) & ~(1 << 15); /* Set variable address */
152 IO_EMIF_AHBADDL = (int)buf & 0xFFFF;
153 IO_EMIF_MTCADDH = ( (1 << 15) | (DEST_ADDR >> 16) ); /* Set fixed address */
154 IO_EMIF_MTCADDL = DEST_ADDR & 0xFFFF;
155 IO_EMIF_DMASIZE = wordcount;
156 IO_EMIF_DMACTL = 1; /* Select AHB->MTC and start transfer */
157 wakeup_wait(&transfer_completion_signal, TIMEOUT_BLOCK);
158}
159#endif
160
91void ata_device_init(void) 161void ata_device_init(void)
92{ 162{
93 IO_INTC_EINT1 |= INTR_EINT1_EXT2; //enable GIO2 interrupt 163 IO_INTC_EINT1 |= INTR_EINT1_EXT2; /* enable GIO2 interrupt */
164#if 0
165 IO_INTC_EINT1 |= 1 << IRQ_MTC0; /* enable MTC interrupt */
166 wakeup_init(&transfer_completion_signal);
167#endif
94 //TODO: mimic OF inits... 168 //TODO: mimic OF inits...
95 return; 169 return;
96} 170}
@@ -98,8 +172,8 @@ void ata_device_init(void)
98void GIO2(void) 172void GIO2(void)
99{ 173{
100#ifdef DEBUG 174#ifdef DEBUG
101 //printf("GIO2 interrupt..."); 175 logf("GIO2 interrupt...");
102#endif 176#endif
103 IO_INTC_IRQ1 = INTR_IRQ1_EXT2; //Mask GIO2 interrupt 177 IO_INTC_IRQ1 = INTR_IRQ1_EXT2; /* Mask GIO2 interrupt */
104 return; 178 return;
105} 179}
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h b/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h
index b098396d5e..67bc9de101 100644
--- a/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h
+++ b/firmware/target/arm/tms320dm320/creative-zvm/ata-target.h
@@ -20,10 +20,13 @@
20#ifndef ATA_TARGET_H 20#ifndef ATA_TARGET_H
21#define ATA_TARGET_H 21#define ATA_TARGET_H
22 22
23/* Plain C read & write loops */ 23/* ASM optimized reading and writing */
24#define PREFER_C_READING 24#define ATA_OPTIMIZED_READING
25#define PREFER_C_WRITING 25#define ATA_OPTIMIZED_WRITING
26void copy_read_sectors(unsigned char* buf, int wordcount);
27void copy_write_sectors(const unsigned char* buf, int wordcount);
26 28
29/* General purpose memory region #1 */
27#define ATA_IOBASE 0x50FEE000 30#define ATA_IOBASE 0x50FEE000
28#define ATA_DATA (*((volatile unsigned short*)(ATA_IOBASE))) 31#define ATA_DATA (*((volatile unsigned short*)(ATA_IOBASE)))
29#define ATA_ERROR (*((volatile unsigned char*)(ATA_IOBASE+0x2))) 32#define ATA_ERROR (*((volatile unsigned char*)(ATA_IOBASE+0x2)))
diff --git a/firmware/target/arm/tms320dm320/creative-zvm/audio-creativezvm.c b/firmware/target/arm/tms320dm320/creative-zvm/audio-creativezvm.c
deleted file mode 100644
index 1e5676b19e..0000000000
--- a/firmware/target/arm/tms320dm320/creative-zvm/audio-creativezvm.c
+++ /dev/null
@@ -1,44 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id: audio-c200_e200.c 14624 2007-09-06 03:01:41Z lowlight $
9 *
10 * Copyright (C) 2007 by Michael Sevakis
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#include "cpu.h"
20#include "kernel.h"
21#include "sound.h"
22
23const struct sound_settings_info audiohw_settings[] = {
24 [SOUND_VOLUME] = {"dB", 0, 1, -74, 6, -25},
25 [SOUND_BASS] = {"dB", 1, 15, -60, 90, 0},
26 [SOUND_TREBLE] = {"dB", 1, 15, -60, 90, 0},
27 [SOUND_BALANCE] = {"%", 0, 1,-100, 100, 0},
28 [SOUND_CHANNELS] = {"", 0, 1, 0, 5, 0},
29 [SOUND_STEREO_WIDTH] = {"%", 0, 5, 0, 250, 100},
30};
31
32
33void audiohw_init(void)
34{
35}
36
37void audiohw_close(void)
38{
39}
40
41void audiohw_mute(bool mute)
42{
43 (void) mute;
44}
diff --git a/firmware/target/arm/tms320dm320/i2c-dm320.c b/firmware/target/arm/tms320dm320/i2c-dm320.c
index cb6411e412..a87019c69c 100755
--- a/firmware/target/arm/tms320dm320/i2c-dm320.c
+++ b/firmware/target/arm/tms320dm320/i2c-dm320.c
@@ -26,7 +26,7 @@
26#define I2C_SCS_COND_STOP 0x0002 26#define I2C_SCS_COND_STOP 0x0002
27#define I2C_SCS_XMIT 0x0004 27#define I2C_SCS_XMIT 0x0004
28 28
29#define I2C_TX_ACK (1 << 20) 29#define I2C_TX_ACK (1 << 8)
30 30
31static struct mutex i2c_mtx; 31static struct mutex i2c_mtx;
32 32
@@ -42,7 +42,12 @@ static inline void i2c_end(void)
42 42
43static inline bool i2c_getack(void) 43static inline bool i2c_getack(void)
44{ 44{
45 return (IO_I2C_RXDATA & 0x100)>>8; 45 return (IO_I2C_RXDATA >> 8) & 1;
46}
47
48static inline void i2c_ack(void)
49{
50 IO_I2C_TXDATA |= I2C_TX_ACK;
46} 51}
47 52
48#define WAIT_FOR_I2C if(IO_I2C_SCS & 0x4){ \ 53#define WAIT_FOR_I2C if(IO_I2C_SCS & 0x4){ \