1 // SPDX-License-Identifier: GPL-2.0-only
3 * amdtp-dot.c - a part of driver for Digidesign Digi 002/003 family
5 * Copyright (c) 2014-2015 Takashi Sakamoto
6 * Copyright (C) 2012 Robin Gareus <robin@gareus.org>
7 * Copyright (C) 2012 Damien Zammit <damien@zamaudio.com>
10 #include <sound/pcm.h>
13 #define CIP_FMT_AM 0x10
15 /* 'Clock-based rate control mode' is just supported. */
16 #define AMDTP_FDF_AM824 0x00
19 * Nominally 3125 bytes/second, but the MIDI port's clock might be
20 * 1% too slow, and the bus clock 100 ppm too fast.
22 #define MIDI_BYTES_PER_SECOND 3093
25 * Several devices look only at the first eight data blocks.
26 * In any case, this is more than enough for the MIDI data rate.
28 #define MAX_MIDI_RX_BLOCKS 8
30 /* 3 = MAX(DOT_MIDI_IN_PORTS, DOT_MIDI_OUT_PORTS) + 1. */
31 #define MAX_MIDI_PORTS 3
34 * The double-oh-three algorithm was discovered by Robin Gareus and Damien
35 * Zammit in 2012, with reverse-engineering for Digi 003 Rack.
44 unsigned int pcm_channels
;
45 struct dot_state state
;
47 struct snd_rawmidi_substream
*midi
[MAX_MIDI_PORTS
];
48 int midi_fifo_used
[MAX_MIDI_PORTS
];
53 * double-oh-three look up table
55 * @param idx index byte (audio-sample data) 0x00..0xff
56 * @param off channel offset shift
57 * @return salt to XOR with given data
59 #define BYTE_PER_SAMPLE (4)
60 #define MAGIC_DOT_BYTE (2)
61 #define MAGIC_BYTE_OFF(x) (((x) * BYTE_PER_SAMPLE) + MAGIC_DOT_BYTE)
62 static u8
dot_scrt(const u8 idx
, const unsigned int off
)
65 * the length of the added pattern only depends on the lower nibble
66 * of the last non-zero data
68 static const u8 len
[16] = {0, 1, 3, 5, 7, 9, 11, 13, 14,
69 12, 10, 8, 6, 4, 2, 0};
72 * the lower nibble of the salt. Interleaved sequence.
73 * this is walked backwards according to len[]
75 static const u8 nib
[15] = {0x8, 0x7, 0x9, 0x6, 0xa, 0x5, 0xb, 0x4,
76 0xc, 0x3, 0xd, 0x2, 0xe, 0x1, 0xf};
78 /* circular list for the salt's hi nibble. */
79 static const u8 hir
[15] = {0x0, 0x6, 0xf, 0x8, 0x7, 0x5, 0x3, 0x4,
80 0xc, 0xd, 0xe, 0x1, 0x2, 0xb, 0xa};
83 * start offset for upper nibble mapping.
84 * note: 9 is /special/. In the case where the high nibble == 0x9,
85 * hir[] is not used and - coincidentally - the salt's hi nibble is
86 * 0x09 regardless of the offset.
88 static const u8 hio
[16] = {0, 11, 12, 6, 7, 5, 1, 4,
89 3, 0x00, 14, 13, 8, 9, 10, 2};
91 const u8 ln
= idx
& 0xf;
92 const u8 hn
= (idx
>> 4) & 0xf;
93 const u8 hr
= (hn
== 0x9) ? 0x9 : hir
[(hio
[hn
] + off
) % 15];
98 return ((nib
[14 + off
- len
[ln
]]) | (hr
<< 4));
101 static void dot_encode_step(struct dot_state
*state
, __be32
*const buffer
)
103 u8
* const data
= (u8
*) buffer
;
105 if (data
[MAGIC_DOT_BYTE
] != 0x00) {
107 state
->idx
= data
[MAGIC_DOT_BYTE
] ^ state
->carry
;
109 data
[MAGIC_DOT_BYTE
] ^= state
->carry
;
110 state
->carry
= dot_scrt(state
->idx
, ++(state
->off
));
113 int amdtp_dot_set_parameters(struct amdtp_stream
*s
, unsigned int rate
,
114 unsigned int pcm_channels
)
116 struct amdtp_dot
*p
= s
->protocol
;
119 if (amdtp_stream_running(s
))
123 * A first data channel is for MIDI messages, the rest is Multi Bit
124 * Linear Audio data channel.
126 err
= amdtp_stream_set_parameters(s
, rate
, pcm_channels
+ 1);
130 s
->ctx_data
.rx
.fdf
= AMDTP_FDF_AM824
| s
->sfc
;
132 p
->pcm_channels
= pcm_channels
;
135 * We do not know the actual MIDI FIFO size of most devices. Just
136 * assume two bytes, i.e., one byte can be received over the bus while
137 * the previous one is transmitted over MIDI.
138 * (The value here is adjusted for midi_ratelimit_per_packet().)
140 p
->midi_fifo_limit
= rate
- MIDI_BYTES_PER_SECOND
* s
->syt_interval
+ 1;
145 static void write_pcm_s32(struct amdtp_stream
*s
, struct snd_pcm_substream
*pcm
,
146 __be32
*buffer
, unsigned int frames
,
147 unsigned int pcm_frames
)
149 struct amdtp_dot
*p
= s
->protocol
;
150 unsigned int channels
= p
->pcm_channels
;
151 struct snd_pcm_runtime
*runtime
= pcm
->runtime
;
152 unsigned int pcm_buffer_pointer
;
153 int remaining_frames
;
157 pcm_buffer_pointer
= s
->pcm_buffer_pointer
+ pcm_frames
;
158 pcm_buffer_pointer
%= runtime
->buffer_size
;
160 src
= (void *)runtime
->dma_area
+
161 frames_to_bytes(runtime
, pcm_buffer_pointer
);
162 remaining_frames
= runtime
->buffer_size
- pcm_buffer_pointer
;
165 for (i
= 0; i
< frames
; ++i
) {
166 for (c
= 0; c
< channels
; ++c
) {
167 buffer
[c
] = cpu_to_be32((*src
>> 8) | 0x40000000);
168 dot_encode_step(&p
->state
, &buffer
[c
]);
171 buffer
+= s
->data_block_quadlets
;
172 if (--remaining_frames
== 0)
173 src
= (void *)runtime
->dma_area
;
177 static void read_pcm_s32(struct amdtp_stream
*s
, struct snd_pcm_substream
*pcm
,
178 __be32
*buffer
, unsigned int frames
,
179 unsigned int pcm_frames
)
181 struct amdtp_dot
*p
= s
->protocol
;
182 unsigned int channels
= p
->pcm_channels
;
183 struct snd_pcm_runtime
*runtime
= pcm
->runtime
;
184 unsigned int pcm_buffer_pointer
;
185 int remaining_frames
;
189 pcm_buffer_pointer
= s
->pcm_buffer_pointer
+ pcm_frames
;
190 pcm_buffer_pointer
%= runtime
->buffer_size
;
192 dst
= (void *)runtime
->dma_area
+
193 frames_to_bytes(runtime
, pcm_buffer_pointer
);
194 remaining_frames
= runtime
->buffer_size
- pcm_buffer_pointer
;
197 for (i
= 0; i
< frames
; ++i
) {
198 for (c
= 0; c
< channels
; ++c
) {
199 *dst
= be32_to_cpu(buffer
[c
]) << 8;
202 buffer
+= s
->data_block_quadlets
;
203 if (--remaining_frames
== 0)
204 dst
= (void *)runtime
->dma_area
;
208 static void write_pcm_silence(struct amdtp_stream
*s
, __be32
*buffer
,
209 unsigned int data_blocks
)
211 struct amdtp_dot
*p
= s
->protocol
;
212 unsigned int channels
, i
, c
;
214 channels
= p
->pcm_channels
;
217 for (i
= 0; i
< data_blocks
; ++i
) {
218 for (c
= 0; c
< channels
; ++c
)
219 buffer
[c
] = cpu_to_be32(0x40000000);
220 buffer
+= s
->data_block_quadlets
;
224 static bool midi_ratelimit_per_packet(struct amdtp_stream
*s
, unsigned int port
)
226 struct amdtp_dot
*p
= s
->protocol
;
229 used
= p
->midi_fifo_used
[port
];
233 used
-= MIDI_BYTES_PER_SECOND
* s
->syt_interval
;
235 p
->midi_fifo_used
[port
] = used
;
237 return used
< p
->midi_fifo_limit
;
240 static inline void midi_use_bytes(struct amdtp_stream
*s
,
241 unsigned int port
, unsigned int count
)
243 struct amdtp_dot
*p
= s
->protocol
;
245 p
->midi_fifo_used
[port
] += amdtp_rate_table
[s
->sfc
] * count
;
248 static void write_midi_messages(struct amdtp_stream
*s
, __be32
*buffer
,
249 unsigned int data_blocks
, unsigned int data_block_counter
)
251 struct amdtp_dot
*p
= s
->protocol
;
252 unsigned int f
, port
;
256 for (f
= 0; f
< data_blocks
; f
++) {
257 port
= (data_block_counter
+ f
) % 8;
258 b
= (u8
*)&buffer
[0];
261 if (port
< MAX_MIDI_PORTS
&&
262 midi_ratelimit_per_packet(s
, port
) &&
263 p
->midi
[port
] != NULL
)
264 len
= snd_rawmidi_transmit(p
->midi
[port
], b
+ 1, 2);
268 * Upper 4 bits of LSB represent port number.
269 * - 0000b: physical MIDI port 1.
270 * - 0010b: physical MIDI port 2.
271 * - 1110b: console MIDI port.
280 midi_use_bytes(s
, port
, len
);
288 buffer
+= s
->data_block_quadlets
;
292 static void read_midi_messages(struct amdtp_stream
*s
, __be32
*buffer
,
293 unsigned int data_blocks
)
295 struct amdtp_dot
*p
= s
->protocol
;
296 unsigned int f
, port
, len
;
299 for (f
= 0; f
< data_blocks
; f
++) {
300 b
= (u8
*)&buffer
[0];
305 * Upper 4 bits of LSB represent port number.
306 * - 0000b: physical MIDI port 1. Use port 0.
307 * - 1110b: console MIDI port. Use port 2.
314 if (port
< MAX_MIDI_PORTS
&& p
->midi
[port
])
315 snd_rawmidi_receive(p
->midi
[port
], b
+ 1, len
);
318 buffer
+= s
->data_block_quadlets
;
322 int amdtp_dot_add_pcm_hw_constraints(struct amdtp_stream
*s
,
323 struct snd_pcm_runtime
*runtime
)
327 /* This protocol delivers 24 bit data in 32bit data channel. */
328 err
= snd_pcm_hw_constraint_msbits(runtime
, 0, 32, 24);
332 return amdtp_stream_add_pcm_hw_constraints(s
, runtime
);
335 void amdtp_dot_midi_trigger(struct amdtp_stream
*s
, unsigned int port
,
336 struct snd_rawmidi_substream
*midi
)
338 struct amdtp_dot
*p
= s
->protocol
;
340 if (port
< MAX_MIDI_PORTS
)
341 WRITE_ONCE(p
->midi
[port
], midi
);
344 static unsigned int process_ir_ctx_payloads(struct amdtp_stream
*s
,
345 const struct pkt_desc
*descs
,
346 unsigned int packets
,
347 struct snd_pcm_substream
*pcm
)
349 unsigned int pcm_frames
= 0;
352 for (i
= 0; i
< packets
; ++i
) {
353 const struct pkt_desc
*desc
= descs
+ i
;
354 __be32
*buf
= desc
->ctx_payload
;
355 unsigned int data_blocks
= desc
->data_blocks
;
358 read_pcm_s32(s
, pcm
, buf
, data_blocks
, pcm_frames
);
359 pcm_frames
+= data_blocks
;
362 read_midi_messages(s
, buf
, data_blocks
);
368 static unsigned int process_it_ctx_payloads(struct amdtp_stream
*s
,
369 const struct pkt_desc
*descs
,
370 unsigned int packets
,
371 struct snd_pcm_substream
*pcm
)
373 unsigned int pcm_frames
= 0;
376 for (i
= 0; i
< packets
; ++i
) {
377 const struct pkt_desc
*desc
= descs
+ i
;
378 __be32
*buf
= desc
->ctx_payload
;
379 unsigned int data_blocks
= desc
->data_blocks
;
382 write_pcm_s32(s
, pcm
, buf
, data_blocks
, pcm_frames
);
383 pcm_frames
+= data_blocks
;
385 write_pcm_silence(s
, buf
, data_blocks
);
388 write_midi_messages(s
, buf
, data_blocks
,
389 desc
->data_block_counter
);
395 int amdtp_dot_init(struct amdtp_stream
*s
, struct fw_unit
*unit
,
396 enum amdtp_stream_direction dir
)
398 amdtp_stream_process_ctx_payloads_t process_ctx_payloads
;
399 enum cip_flags flags
;
401 // Use different mode between incoming/outgoing.
402 if (dir
== AMDTP_IN_STREAM
) {
403 flags
= CIP_NONBLOCKING
;
404 process_ctx_payloads
= process_ir_ctx_payloads
;
406 flags
= CIP_BLOCKING
;
407 process_ctx_payloads
= process_it_ctx_payloads
;
410 return amdtp_stream_init(s
, unit
, dir
, flags
, CIP_FMT_AM
,
411 process_ctx_payloads
, sizeof(struct amdtp_dot
));
414 void amdtp_dot_reset(struct amdtp_stream
*s
)
416 struct amdtp_dot
*p
= s
->protocol
;
418 p
->state
.carry
= 0x00;