diff mbox series

ALSA: firewire-motu: add support for MOTU 896 mk3 FireWire and Hybrid

Message ID 20240128122523.247084-1-o-takashi@sakamocchi.jp (mailing list archive)
State Superseded
Headers show
Series ALSA: firewire-motu: add support for MOTU 896 mk3 FireWire and Hybrid | expand

Commit Message

Takashi Sakamoto Jan. 28, 2024, 12:25 p.m. UTC
Mark of the Unicorn released 896 mk3 FireWire in 2008 as part of the third
generation of its FireWire series. In 2011, 896 mk3 hybrid was released to
support USB protocol.

It supports sampling transfer frequency up to 192.0 kHz. The packet
format differs depending on both of current sampling transfer frequency
and the type of signal in optical interfaces. The model supports
transmission of PCM frames as well as MIDI messages.

The 896 mk3 FireWire consists of below ICs:

 * Texas Instruments TSB41AB2
 * Microchip (SMSC) USB3300
 * Xilinx Spartan-3A FPGA, XC3S500E
 * Texas Instruments TMS320C6722
 * Microchip (Atmel) AT91SAM SAM7S256

It supports sampling transfer frequency up to 192.0 kHz. The packet
format differs depending on both of current sampling transfer frequency
and the type of signal in two pairs of optical interfaces. The model
supports transmission of PCM frames, while has no port for MIDi messages.

The model supports command mechanism to configure internal DSP. Hardware
meter information is available in the first 2 chunks of each data block
of tx packet.

This commit adds support for it. The 896 mk3 FireWire is just tested, but
the 896 mk3 Hybrid is not yet.

$ config-rom-pretty-printer < motu-896mk3fw.img
               ROM header and bus information block
               -----------------------------------------------------------------
1024  04100ce1  bus_info_length 4, crc_length 16, crc 3297
1028  31333934  bus_name "1394"
1032  20ff7000  irmc 0, cmc 0, isc 1, bmc 0, cyc_clk_acc 255, max_rec 7 (256)
1036  0001f200  company_id 0001f2     |
1040  00093add  device_id 0000604893  | EUI-64 0547556791237341

               root directory
               -----------------------------------------------------------------
1044  0004ef04  directory_length 4, crc 61188
1048  030001f2  vendor
1052  0c0083c0  node capabilities: per IEEE 1394
1056  d1000002  --> unit directory at 1064
1060  8d000005  --> eui-64 leaf at 1080

               unit directory at 1064
               -----------------------------------------------------------------
1064  0003998d  directory_length 3, crc 39309
1068  120001f2  specifier id
1072  13000017  version
1076  17101800  model

               eui-64 leaf at 1080
               -----------------------------------------------------------------
1080  0002cc82  leaf_length 2, crc 52354
1084  0001f200  company_id 0001f2     |
1088  00093add  device_id 0000604893  | EUI-64 0547556791237341

$ config-rom-pretty-printer < motu-896mk3hybrid.img
               ROM header and bus information block
               -----------------------------------------------------------------
1024  04103cbe  bus_info_length 4, crc_length 16, crc 15550
1028  31333934  bus_name "1394"
1032  20ff7000  irmc 0, cmc 0, isc 1, bmc 0, cyc_clk_acc 255, max_rec 7 (256)
1036  0001f200  company_id 0001f2     |
1040  000ae601  device_id 0000714241  | EUI-64 0547556791346689

               root directory
               -----------------------------------------------------------------
1044  0004ef04  directory_length 4, crc 61188
1048  030001f2  vendor
1052  0c0083c0  node capabilities: per IEEE 1394
1056  d1000002  --> unit directory at 1064
1060  8d000005  --> eui-64 leaf at 1080

               unit directory at 1064
               -----------------------------------------------------------------
1064  000394ac  directory_length 3, crc 38060
1068  120001f2  specifier id
1072  13000037  version
1076  17102800  model

               eui-64 leaf at 1080
               -----------------------------------------------------------------
1080  0002cf69  leaf_length 2, crc 53097
1084  0001f200  company_id 0001f2     |
1088  000ae601  device_id 0000714241  | EUI-64 0547556791346689

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
---
 sound/firewire/motu/motu-protocol-v3.c | 9 +++++++++
 sound/firewire/motu/motu.c             | 2 ++
 sound/firewire/motu/motu.h             | 1 +
 3 files changed, 12 insertions(+)

Comments

Takashi Sakamoto Jan. 29, 2024, 2:19 a.m. UTC | #1
Hi,

I found some mistakes in the statements of the patch comment, and forgot
to modify Kconfig. let me post take 2 so please abandon this patch,
sorry...

On Sun, Jan 28, 2024 at 09:25:23PM +0900, Takashi Sakamoto wrote:
> Mark of the Unicorn released 896 mk3 FireWire in 2008 as part of the third
> generation of its FireWire series. In 2011, 896 mk3 hybrid was released to
> support USB protocol.
> 
> It supports sampling transfer frequency up to 192.0 kHz. The packet
> format differs depending on both of current sampling transfer frequency
> and the type of signal in optical interfaces. The model supports
> transmission of PCM frames as well as MIDI messages.
> 
> The 896 mk3 FireWire consists of below ICs:
> 
>  * Texas Instruments TSB41AB2
>  * Microchip (SMSC) USB3300
>  * Xilinx Spartan-3A FPGA, XC3S500E
>  * Texas Instruments TMS320C6722
>  * Microchip (Atmel) AT91SAM SAM7S256
> 
> It supports sampling transfer frequency up to 192.0 kHz. The packet
> format differs depending on both of current sampling transfer frequency
> and the type of signal in two pairs of optical interfaces. The model
> supports transmission of PCM frames, while has no port for MIDi messages.
> 
> The model supports command mechanism to configure internal DSP. Hardware
> meter information is available in the first 2 chunks of each data block
> of tx packet.
> 
> This commit adds support for it. The 896 mk3 FireWire is just tested, but
> the 896 mk3 Hybrid is not yet.
> 
> $ config-rom-pretty-printer < motu-896mk3fw.img
>                ROM header and bus information block
>                -----------------------------------------------------------------
> 1024  04100ce1  bus_info_length 4, crc_length 16, crc 3297
> 1028  31333934  bus_name "1394"
> 1032  20ff7000  irmc 0, cmc 0, isc 1, bmc 0, cyc_clk_acc 255, max_rec 7 (256)
> 1036  0001f200  company_id 0001f2     |
> 1040  00093add  device_id 0000604893  | EUI-64 0547556791237341
> 
>                root directory
>                -----------------------------------------------------------------
> 1044  0004ef04  directory_length 4, crc 61188
> 1048  030001f2  vendor
> 1052  0c0083c0  node capabilities: per IEEE 1394
> 1056  d1000002  --> unit directory at 1064
> 1060  8d000005  --> eui-64 leaf at 1080
> 
>                unit directory at 1064
>                -----------------------------------------------------------------
> 1064  0003998d  directory_length 3, crc 39309
> 1068  120001f2  specifier id
> 1072  13000017  version
> 1076  17101800  model
> 
>                eui-64 leaf at 1080
>                -----------------------------------------------------------------
> 1080  0002cc82  leaf_length 2, crc 52354
> 1084  0001f200  company_id 0001f2     |
> 1088  00093add  device_id 0000604893  | EUI-64 0547556791237341
> 
> $ config-rom-pretty-printer < motu-896mk3hybrid.img
>                ROM header and bus information block
>                -----------------------------------------------------------------
> 1024  04103cbe  bus_info_length 4, crc_length 16, crc 15550
> 1028  31333934  bus_name "1394"
> 1032  20ff7000  irmc 0, cmc 0, isc 1, bmc 0, cyc_clk_acc 255, max_rec 7 (256)
> 1036  0001f200  company_id 0001f2     |
> 1040  000ae601  device_id 0000714241  | EUI-64 0547556791346689
> 
>                root directory
>                -----------------------------------------------------------------
> 1044  0004ef04  directory_length 4, crc 61188
> 1048  030001f2  vendor
> 1052  0c0083c0  node capabilities: per IEEE 1394
> 1056  d1000002  --> unit directory at 1064
> 1060  8d000005  --> eui-64 leaf at 1080
> 
>                unit directory at 1064
>                -----------------------------------------------------------------
> 1064  000394ac  directory_length 3, crc 38060
> 1068  120001f2  specifier id
> 1072  13000037  version
> 1076  17102800  model
> 
>                eui-64 leaf at 1080
>                -----------------------------------------------------------------
> 1080  0002cf69  leaf_length 2, crc 53097
> 1084  0001f200  company_id 0001f2     |
> 1088  000ae601  device_id 0000714241  | EUI-64 0547556791346689
> 
> Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
> ---
>  sound/firewire/motu/motu-protocol-v3.c | 9 +++++++++
>  sound/firewire/motu/motu.c             | 2 ++
>  sound/firewire/motu/motu.h             | 1 +
>  3 files changed, 12 insertions(+)
> 
> diff --git a/sound/firewire/motu/motu-protocol-v3.c b/sound/firewire/motu/motu-protocol-v3.c
> index 8a0426920a76..7254fdfe046a 100644
> --- a/sound/firewire/motu/motu-protocol-v3.c
> +++ b/sound/firewire/motu/motu-protocol-v3.c
> @@ -261,6 +261,7 @@ int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu)
>  
>  	if (motu->spec == &snd_motu_spec_828mk3_fw ||
>  	    motu->spec == &snd_motu_spec_828mk3_hybrid ||
> +	    motu->spec == &snd_motu_spec_896mk3 ||
>  	    motu->spec == &snd_motu_spec_traveler_mk3 ||
>  	    motu->spec == &snd_motu_spec_track16)
>  		return detect_packet_formats_with_opt_ifaces(motu, data);
> @@ -288,6 +289,14 @@ const struct snd_motu_spec snd_motu_spec_828mk3_hybrid = {
>  	.rx_fixed_pcm_chunks = {14, 14, 14},	// Additional 4 dummy chunks at higher rate.
>  };
>  
> +const struct snd_motu_spec snd_motu_spec_896mk3 = {
> +	.name = "896mk3",
> +	.protocol_version = SND_MOTU_PROTOCOL_V3,
> +	.flags = SND_MOTU_SPEC_COMMAND_DSP,
> +	.tx_fixed_pcm_chunks = {18, 14, 10},
> +	.rx_fixed_pcm_chunks = {18, 14, 10},
> +};
> +
>  const struct snd_motu_spec snd_motu_spec_traveler_mk3 = {
>  	.name = "TravelerMk3",
>  	.protocol_version = SND_MOTU_PROTOCOL_V3,
> diff --git a/sound/firewire/motu/motu.c b/sound/firewire/motu/motu.c
> index d73599eb7d5a..d14ab5dd5bea 100644
> --- a/sound/firewire/motu/motu.c
> +++ b/sound/firewire/motu/motu.c
> @@ -168,10 +168,12 @@ static const struct ieee1394_device_id motu_id_table[] = {
>  	SND_MOTU_DEV_ENTRY(0x00000d, &snd_motu_spec_ultralite),
>  	SND_MOTU_DEV_ENTRY(0x00000f, &snd_motu_spec_8pre),
>  	SND_MOTU_DEV_ENTRY(0x000015, &snd_motu_spec_828mk3_fw), // FireWire only.
> +	SND_MOTU_DEV_ENTRY(0x000017, &snd_motu_spec_896mk3), // FireWire only.
>  	SND_MOTU_DEV_ENTRY(0x000019, &snd_motu_spec_ultralite_mk3), // FireWire only.
>  	SND_MOTU_DEV_ENTRY(0x00001b, &snd_motu_spec_traveler_mk3),
>  	SND_MOTU_DEV_ENTRY(0x000030, &snd_motu_spec_ultralite_mk3), // Hybrid.
>  	SND_MOTU_DEV_ENTRY(0x000035, &snd_motu_spec_828mk3_hybrid), // Hybrid.
> +	SND_MOTU_DEV_ENTRY(0x000037, &snd_motu_spec_896mk3), // Hybrid.
>  	SND_MOTU_DEV_ENTRY(0x000033, &snd_motu_spec_audio_express),
>  	SND_MOTU_DEV_ENTRY(0x000039, &snd_motu_spec_track16),
>  	SND_MOTU_DEV_ENTRY(0x000045, &snd_motu_spec_4pre),
> diff --git a/sound/firewire/motu/motu.h b/sound/firewire/motu/motu.h
> index 3b1dc98a7be0..c66be0a89ccf 100644
> --- a/sound/firewire/motu/motu.h
> +++ b/sound/firewire/motu/motu.h
> @@ -138,6 +138,7 @@ extern const struct snd_motu_spec snd_motu_spec_8pre;
>  
>  extern const struct snd_motu_spec snd_motu_spec_828mk3_fw;
>  extern const struct snd_motu_spec snd_motu_spec_828mk3_hybrid;
> +extern const struct snd_motu_spec snd_motu_spec_896mk3;
>  extern const struct snd_motu_spec snd_motu_spec_traveler_mk3;
>  extern const struct snd_motu_spec snd_motu_spec_ultralite_mk3;
>  extern const struct snd_motu_spec snd_motu_spec_audio_express;
> -- 
> 2.40.1


Thanks

Takashi Sakamoto
diff mbox series

Patch

diff --git a/sound/firewire/motu/motu-protocol-v3.c b/sound/firewire/motu/motu-protocol-v3.c
index 8a0426920a76..7254fdfe046a 100644
--- a/sound/firewire/motu/motu-protocol-v3.c
+++ b/sound/firewire/motu/motu-protocol-v3.c
@@ -261,6 +261,7 @@  int snd_motu_protocol_v3_cache_packet_formats(struct snd_motu *motu)
 
 	if (motu->spec == &snd_motu_spec_828mk3_fw ||
 	    motu->spec == &snd_motu_spec_828mk3_hybrid ||
+	    motu->spec == &snd_motu_spec_896mk3 ||
 	    motu->spec == &snd_motu_spec_traveler_mk3 ||
 	    motu->spec == &snd_motu_spec_track16)
 		return detect_packet_formats_with_opt_ifaces(motu, data);
@@ -288,6 +289,14 @@  const struct snd_motu_spec snd_motu_spec_828mk3_hybrid = {
 	.rx_fixed_pcm_chunks = {14, 14, 14},	// Additional 4 dummy chunks at higher rate.
 };
 
+const struct snd_motu_spec snd_motu_spec_896mk3 = {
+	.name = "896mk3",
+	.protocol_version = SND_MOTU_PROTOCOL_V3,
+	.flags = SND_MOTU_SPEC_COMMAND_DSP,
+	.tx_fixed_pcm_chunks = {18, 14, 10},
+	.rx_fixed_pcm_chunks = {18, 14, 10},
+};
+
 const struct snd_motu_spec snd_motu_spec_traveler_mk3 = {
 	.name = "TravelerMk3",
 	.protocol_version = SND_MOTU_PROTOCOL_V3,
diff --git a/sound/firewire/motu/motu.c b/sound/firewire/motu/motu.c
index d73599eb7d5a..d14ab5dd5bea 100644
--- a/sound/firewire/motu/motu.c
+++ b/sound/firewire/motu/motu.c
@@ -168,10 +168,12 @@  static const struct ieee1394_device_id motu_id_table[] = {
 	SND_MOTU_DEV_ENTRY(0x00000d, &snd_motu_spec_ultralite),
 	SND_MOTU_DEV_ENTRY(0x00000f, &snd_motu_spec_8pre),
 	SND_MOTU_DEV_ENTRY(0x000015, &snd_motu_spec_828mk3_fw), // FireWire only.
+	SND_MOTU_DEV_ENTRY(0x000017, &snd_motu_spec_896mk3), // FireWire only.
 	SND_MOTU_DEV_ENTRY(0x000019, &snd_motu_spec_ultralite_mk3), // FireWire only.
 	SND_MOTU_DEV_ENTRY(0x00001b, &snd_motu_spec_traveler_mk3),
 	SND_MOTU_DEV_ENTRY(0x000030, &snd_motu_spec_ultralite_mk3), // Hybrid.
 	SND_MOTU_DEV_ENTRY(0x000035, &snd_motu_spec_828mk3_hybrid), // Hybrid.
+	SND_MOTU_DEV_ENTRY(0x000037, &snd_motu_spec_896mk3), // Hybrid.
 	SND_MOTU_DEV_ENTRY(0x000033, &snd_motu_spec_audio_express),
 	SND_MOTU_DEV_ENTRY(0x000039, &snd_motu_spec_track16),
 	SND_MOTU_DEV_ENTRY(0x000045, &snd_motu_spec_4pre),
diff --git a/sound/firewire/motu/motu.h b/sound/firewire/motu/motu.h
index 3b1dc98a7be0..c66be0a89ccf 100644
--- a/sound/firewire/motu/motu.h
+++ b/sound/firewire/motu/motu.h
@@ -138,6 +138,7 @@  extern const struct snd_motu_spec snd_motu_spec_8pre;
 
 extern const struct snd_motu_spec snd_motu_spec_828mk3_fw;
 extern const struct snd_motu_spec snd_motu_spec_828mk3_hybrid;
+extern const struct snd_motu_spec snd_motu_spec_896mk3;
 extern const struct snd_motu_spec snd_motu_spec_traveler_mk3;
 extern const struct snd_motu_spec snd_motu_spec_ultralite_mk3;
 extern const struct snd_motu_spec snd_motu_spec_audio_express;