// SPDX-License-Identifier: GPL-2.0-only // motu-protocol-v1.c - a part of driver for MOTU FireWire series // // Copyright (c) 2021 Takashi Sakamoto <o-takashi@sakamocchi.jp>
#include"motu.h"
#include <linux/delay.h>
// Status register for MOTU 828 (0x'ffff'f000'0b00). // // 0xffff0000: ISOC_COMM_CONTROL_MASK in motu-stream.c. // 0x00008000: mode of optical input interface. // 0x00008000: for S/PDIF signal. // 0x00000000: disabled or for ADAT signal. // 0x00004000: mode of optical output interface. // 0x00004000: for S/PDIF signal. // 0x00000000: disabled or for ADAT signal. // 0x00003f00: monitor input mode. // 0x00000800: analog-1/2 // 0x00001a00: analog-3/4 // 0x00002c00: analog-5/6 // 0x00003e00: analog-7/8 // 0x00000000: analog-1 // 0x00000900: analog-2 // 0x00001200: analog-3 // 0x00001b00: analog-4 // 0x00002400: analog-5 // 0x00002d00: analog-6 // 0x00003600: analog-7 // 0x00003f00: analog-8 // 0x00000080: enable stream input. // 0x00000040: disable monitor input. // 0x00000008: enable main out. // 0x00000004: rate of sampling clock. // 0x00000004: 48.0 kHz // 0x00000000: 44.1 kHz // 0x00000023: source of sampling clock. // 0x00000003: source packet header (SPH) // 0x00000002: S/PDIF on optical/coaxial interface. // 0x00000021: ADAT on optical interface // 0x00000001: ADAT on Dsub 9pin // 0x00000000: internal
err = snd_motu_transaction_read(motu, CLK_896_STATUS_OFFSET, ®, sizeof(reg)); if (err < 0) return err;
data = be32_to_cpu(reg);
switch (rate) { case 44100:
flag = CLK_896_STATUS_FLAG_RATE_44100; break; case 48000:
flag = CLK_896_STATUS_FLAG_RATE_48000; break; case 88200:
flag = CLK_896_STATUS_FLAG_RATE_88200; break; case 96000:
flag = CLK_896_STATUS_FLAG_RATE_96000; break; default: return -EINVAL;
}
err = snd_motu_transaction_read(motu, CLK_828_STATUS_OFFSET, ®, sizeof(reg)); if (err < 0) return err;
data = be32_to_cpu(reg) & CLK_828_STATUS_MASK;
data &= ~(CLK_828_STATUS_FLAG_FETCH_PCM_FRAMES | CLK_828_STATUS_FLAG_ENABLE_OUTPUT); if (enable) { // This transaction should be initiated after the device receives batch of packets // since the device voluntarily mutes outputs. As a workaround, yield processor over // 100 msec.
msleep(100);
data |= CLK_828_STATUS_FLAG_FETCH_PCM_FRAMES | CLK_828_STATUS_FLAG_ENABLE_OUTPUT;
}
err = snd_motu_transaction_read(motu, CLK_828_STATUS_OFFSET, ®, sizeof(reg)); if (err < 0) return err;
data = be32_to_cpu(reg) & CLK_828_STATUS_MASK;
// The number of chunks is just reduced when SPDIF is activated. if (!(data & CLK_828_STATUS_FLAG_OPT_IN_IFACE_IS_SPDIF))
motu->tx_packet_formats.pcm_chunks[0] += 8;
if (!(data & CLK_828_STATUS_FLAG_OPT_OUT_IFACE_IS_SPDIF))
motu->rx_packet_formats.pcm_chunks[0] += 8;
// No message chunk in data block.
motu->tx_packet_formats.msg_chunks = 0;
motu->rx_packet_formats.msg_chunks = 0;
// Always enable optical interface for ADAT signal since the device have no registers // to refer to current configuration.
motu->tx_packet_formats.pcm_chunks[0] += 8;
motu->tx_packet_formats.pcm_chunks[1] += 8;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.