aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/dsp56k.c84
-rw-r--r--firmware/Makefile1
-rw-r--r--firmware/WHENCE12
-rw-r--r--firmware/dsp56k/bootstrap.asm98
-rw-r--r--firmware/dsp56k/bootstrap.bin.ihex26
5 files changed, 170 insertions, 51 deletions
diff --git a/drivers/char/dsp56k.c b/drivers/char/dsp56k.c
index a69c65283260..d716c78f0ff4 100644
--- a/drivers/char/dsp56k.c
+++ b/drivers/char/dsp56k.c
@@ -33,6 +33,8 @@
33#include <linux/mm.h> 33#include <linux/mm.h>
34#include <linux/init.h> 34#include <linux/init.h>
35#include <linux/device.h> 35#include <linux/device.h>
36#include <linux/firmware.h>
37#include <linux/platform_device.h>
36 38
37#include <asm/atarihw.h> 39#include <asm/atarihw.h>
38#include <asm/traps.h> 40#include <asm/traps.h>
@@ -92,49 +94,6 @@
92 } \ 94 } \
93} 95}
94 96
95/* DSP56001 bootstrap code */
96static char bootstrap[] = {
97 0x0c, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x60, 0xf4, 0x00, 0x00, 0x00, 0x4f, 0x61, 0xf4,
117 0x00, 0x00, 0x7e, 0xa9, 0x06, 0x2e, 0x80, 0x00, 0x00, 0x47,
118 0x07, 0xd8, 0x84, 0x07, 0x59, 0x84, 0x08, 0xf4, 0xa8, 0x00,
119 0x00, 0x04, 0x08, 0xf4, 0xbf, 0x00, 0x0c, 0x00, 0x00, 0xfe,
120 0xb8, 0x0a, 0xf0, 0x80, 0x00, 0x7e, 0xa9, 0x08, 0xf4, 0xa0,
121 0x00, 0x00, 0x01, 0x08, 0xf4, 0xbe, 0x00, 0x00, 0x00, 0x0a,
122 0xa9, 0x80, 0x00, 0x7e, 0xad, 0x08, 0x4e, 0x2b, 0x44, 0xf4,
123 0x00, 0x00, 0x00, 0x03, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x01,
124 0x0e, 0xa0, 0x00, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb5, 0x08,
125 0x50, 0x2b, 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xb8, 0x08, 0x46,
126 0x2b, 0x44, 0xf4, 0x45, 0x00, 0x00, 0x02, 0x0a, 0xf0, 0xaa,
127 0x00, 0x7e, 0xc9, 0x20, 0x00, 0x45, 0x0a, 0xf0, 0xaa, 0x00,
128 0x7e, 0xd0, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xc6, 0x0a, 0xa9,
129 0x80, 0x00, 0x7e, 0xc4, 0x08, 0x58, 0x6b, 0x0a, 0xf0, 0x80,
130 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xcd, 0x0a,
131 0xa9, 0x80, 0x00, 0x7e, 0xcb, 0x08, 0x58, 0xab, 0x0a, 0xf0,
132 0x80, 0x00, 0x7e, 0xad, 0x06, 0xc6, 0x00, 0x00, 0x7e, 0xd4,
133 0x0a, 0xa9, 0x80, 0x00, 0x7e, 0xd2, 0x08, 0x58, 0xeb, 0x0a,
134 0xf0, 0x80, 0x00, 0x7e, 0xad};
135static int sizeof_bootstrap = 375;
136
137
138static struct dsp56k_device { 97static struct dsp56k_device {
139 unsigned long in_use; 98 unsigned long in_use;
140 long maxio, timeout; 99 long maxio, timeout;
@@ -164,18 +123,40 @@ static int dsp56k_reset(void)
164 123
165static int dsp56k_upload(u_char __user *bin, int len) 124static int dsp56k_upload(u_char __user *bin, int len)
166{ 125{
126 struct platform_device *pdev;
127 const struct firmware *fw;
128 const char fw_name[] = "dsp56k/bootstrap.bin";
129 int err;
167 int i; 130 int i;
168 u_char *p; 131
169
170 dsp56k_reset(); 132 dsp56k_reset();
171 133
172 p = bootstrap; 134 pdev = platform_device_register_simple("dsp56k", 0, NULL, 0);
173 for (i = 0; i < sizeof_bootstrap/3; i++) { 135 if (IS_ERR(pdev)) {
136 printk(KERN_ERR "Failed to register device for \"%s\"\n",
137 fw_name);
138 return -EINVAL;
139 }
140 err = request_firmware(&fw, fw_name, &pdev->dev);
141 platform_device_unregister(pdev);
142 if (err) {
143 printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
144 fw_name, err);
145 return err;
146 }
147 if (fw->size % 3) {
148 printk(KERN_ERR "Bogus length %d in image \"%s\"\n",
149 fw->size, fw_name);
150 release_firmware(fw);
151 return -EINVAL;
152 }
153 for (i = 0; i < fw->size; i = i + 3) {
174 /* tx_wait(10); */ 154 /* tx_wait(10); */
175 dsp56k_host_interface.data.b[1] = *p++; 155 dsp56k_host_interface.data.b[1] = fw->data[i];
176 dsp56k_host_interface.data.b[2] = *p++; 156 dsp56k_host_interface.data.b[2] = fw->data[i + 1];
177 dsp56k_host_interface.data.b[3] = *p++; 157 dsp56k_host_interface.data.b[3] = fw->data[i + 2];
178 } 158 }
159 release_firmware(fw);
179 for (; i < 512; i++) { 160 for (; i < 512; i++) {
180 /* tx_wait(10); */ 161 /* tx_wait(10); */
181 dsp56k_host_interface.data.b[1] = 0; 162 dsp56k_host_interface.data.b[1] = 0;
@@ -534,3 +515,4 @@ static void __exit dsp56k_cleanup_driver(void)
534module_exit(dsp56k_cleanup_driver); 515module_exit(dsp56k_cleanup_driver);
535 516
536MODULE_LICENSE("GPL"); 517MODULE_LICENSE("GPL");
518MODULE_FIRMWARE("dsp56k/bootstrap.bin");
diff --git a/firmware/Makefile b/firmware/Makefile
index a162b2928fbd..782c499a3738 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -20,6 +20,7 @@ fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE))
20# accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all). 20# accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all).
21# But be aware that the config file might not be included at all. 21# But be aware that the config file might not be included at all.
22 22
23fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin
23fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw 24fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw
24fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin 25fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin
25fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin 26fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin
diff --git a/firmware/WHENCE b/firmware/WHENCE
index 79e62e2fea5d..5c1dc159639a 100644
--- a/firmware/WHENCE
+++ b/firmware/WHENCE
@@ -309,3 +309,15 @@ Licence:
309Found in hex form in kernel source. 309Found in hex form in kernel source.
310 310
311-------------------------------------------------------------------------- 311--------------------------------------------------------------------------
312
313Driver: ATARI_DSP56K - Atari DSP56k support
314
315File: dsp56k/bootstrap.bin
316Source: dsp56k/bootstrap.asm
317
318Licence: GPLv2 or later
319
320DSP56001 assembler, possibly buildable with a56 from
321http://www.zdomain.com/a56.html
322
323--------------------------------------------------------------------------
diff --git a/firmware/dsp56k/bootstrap.asm b/firmware/dsp56k/bootstrap.asm
new file mode 100644
index 000000000000..10d891929cd3
--- /dev/null
+++ b/firmware/dsp56k/bootstrap.asm
@@ -0,0 +1,98 @@
1; Author: Frederik Noring <noring@nocrew.org>
2;
3; This file is subject to the terms and conditions of the GNU General Public
4; License. See the file COPYING in the main directory of this archive
5; for more details.
6
7; DSP56k loader
8
9; Host Interface
10M_BCR EQU $FFFE ; Port A Bus Control Register
11M_PBC EQU $FFE0 ; Port B Control Register
12M_PBDDR EQU $FFE2 ; Port B Data Direction Register
13M_PBD EQU $FFE4 ; Port B Data Register
14M_PCC EQU $FFE1 ; Port C Control Register
15M_PCDDR EQU $FFE3 ; Port C Data Direction Register
16M_PCD EQU $FFE5 ; Port C Data Register
17
18M_HCR EQU $FFE8 ; Host Control Register
19M_HSR EQU $FFE9 ; Host Status Register
20M_HRX EQU $FFEB ; Host Receive Data Register
21M_HTX EQU $FFEB ; Host Transmit Data Register
22
23; SSI, Synchronous Serial Interface
24M_RX EQU $FFEF ; Serial Receive Data Register
25M_TX EQU $FFEF ; Serial Transmit Data Register
26M_CRA EQU $FFEC ; SSI Control Register A
27M_CRB EQU $FFED ; SSI Control Register B
28M_SR EQU $FFEE ; SSI Status Register
29M_TSR EQU $FFEE ; SSI Time Slot Register
30
31; Exception Processing
32M_IPR EQU $FFFF ; Interrupt Priority Register
33
34 org P:$0
35start jmp <$40
36
37 org P:$40
38; ; Zero 16384 DSP X and Y words
39; clr A #0,r0
40; clr B #0,r4
41; do #64,<_block1
42; rep #256
43; move A,X:(r0)+ B,Y:(r4)+
44;_block1 ; Zero (32768-512) Program words
45; clr A #512,r0
46; do #126,<_block2
47; rep #256
48; move A,P:(r0)+
49;_block2
50
51 ; Copy DSP program control
52 move #real,r0
53 move #upload,r1
54 do #upload_end-upload,<_copy
55 move P:(r0)+,x0
56 move x0,P:(r1)+
57_copy movep #>4,X:<<M_HCR
58 movep #>$c00,X:<<M_IPR
59 and #<$fe,mr
60 jmp upload
61
62real
63 org P:$7ea9
64upload
65 movep #>1,X:<<M_PBC
66 movep #>0,X:<<M_BCR
67
68next jclr #0,X:<<M_HSR,*
69 movep X:<<M_HRX,A
70 move #>3,x0
71 cmp x0,A #>1,x0
72 jeq <$0
73_get_address
74 jclr #0,X:<<M_HSR,_get_address
75 movep X:<<M_HRX,r0
76_get_length
77 jclr #0,X:<<M_HSR,_get_length
78 movep X:<<M_HRX,y0
79 cmp x0,A #>2,x0
80 jeq load_X
81 cmp x0,A
82 jeq load_Y
83
84load_P do y0,_load
85 jclr #0,X:<<M_HSR,*
86 movep X:<<M_HRX,P:(r0)+
87_load jmp next
88load_X do y0,_load
89 jclr #0,X:<<M_HSR,*
90 movep X:<<M_HRX,X:(r0)+
91_load jmp next
92load_Y do y0,_load
93 jclr #0,X:<<M_HSR,*
94 movep X:<<M_HRX,Y:(r0)+
95_load jmp next
96
97upload_end
98 end
diff --git a/firmware/dsp56k/bootstrap.bin.ihex b/firmware/dsp56k/bootstrap.bin.ihex
new file mode 100644
index 000000000000..233f21fe72b0
--- /dev/null
+++ b/firmware/dsp56k/bootstrap.bin.ihex
@@ -0,0 +1,26 @@
1:100000000C004000000000000000000000000000A4
2:1000100000000000000000000000000000000000E0
3:1000200000000000000000000000000000000000D0
4:1000300000000000000000000000000000000000C0
5:1000400000000000000000000000000000000000B0
6:1000500000000000000000000000000000000000A0
7:100060000000000000000000000000000000000090
8:100070000000000000000000000000000000000080
9:100080000000000000000000000000000000000070
10:100090000000000000000000000000000000000060
11:1000A0000000000000000000000000000000000050
12:1000B0000000000000000000000000000000000040
13:1000C00060F40000004F61F400007EA9062E80005D
14:1000D000004707D88407598408F4A800000408F4EE
15:1000E000BF000C0000FEB80AF080007EA908F4A052
16:1000F00000000108F4BE0000000AA980007EAD08DF
17:100100004E2B44F40000000344F4450000010EA00F
18:10011000000AA980007EB508502B0AA980007EB88D
19:1001200008462B44F4450000020AF0AA007EC920CC
20:1001300000450AF0AA007ED006C600007EC60AA9C5
21:1001400080007EC408586B0AF080007EAD06C600B1
22:10015000007ECD0AA980007ECB0858AB0AF0800053
23:100160007EAD06C600007ED40AA980007ED2085863
24:07017000EB0AF080007EADF8
25:00000001FF
26/* DSP56001 bootstrap code */