linux/sound/firewire/tascam/tascam.h
Takashi Sakamoto 47faeea25e ALSA: firewire-tascam: add data block processing layer
TASCAM FireWire series uses non-blocking transmission for AMDTP packet
streaming, while the format of data blocks is unique.

The CIP headers includes specific value in FMT field and no SYT
information.

In transmitted packets, the first data channel represents event counter,
and the last data channel has status and control information. The rest
has 24bit PCM samples with right padding.

In received packets, all of data channels include 16, 24, 32bit PCM
samples. There's no other kind of information.

This commit adds support for this protocol. For convenience, the size of
PCM samples in outgoing packet is limited by 16 and 24bit. The status and
control information will be supported in future commits.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2015-10-02 18:17:01 +02:00

67 lines
1.7 KiB
C

/*
* tascam.h - a part of driver for TASCAM FireWire series
*
* Copyright (c) 2015 Takashi Sakamoto
*
* Licensed under the terms of the GNU General Public License, version 2.
*/
#ifndef SOUND_TASCAM_H_INCLUDED
#define SOUND_TASCAM_H_INCLUDED
#include <linux/device.h>
#include <linux/firewire.h>
#include <linux/firewire-constants.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/compat.h>
#include <sound/core.h>
#include <sound/initval.h>
#include <sound/info.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include "../lib.h"
#include "../amdtp-stream.h"
struct snd_tscm_spec {
const char *const name;
bool has_adat;
bool has_spdif;
unsigned int pcm_capture_analog_channels;
unsigned int pcm_playback_analog_channels;
unsigned int midi_capture_ports;
unsigned int midi_playback_ports;
bool is_controller;
};
struct snd_tscm {
struct snd_card *card;
struct fw_unit *unit;
struct mutex mutex;
const struct snd_tscm_spec *spec;
};
#define TSCM_ADDR_BASE 0xffff00000000ull
#define TSCM_OFFSET_FIRMWARE_REGISTER 0x0000
#define TSCM_OFFSET_FIRMWARE_FPGA 0x0004
#define TSCM_OFFSET_FIRMWARE_ARM 0x0008
#define TSCM_OFFSET_FIRMWARE_HW 0x000c
int amdtp_tscm_init(struct amdtp_stream *s, struct fw_unit *unit,
enum amdtp_stream_direction dir, unsigned int pcm_channels);
int amdtp_tscm_set_parameters(struct amdtp_stream *s, unsigned int rate);
int amdtp_tscm_add_pcm_hw_constraints(struct amdtp_stream *s,
struct snd_pcm_runtime *runtime);
void amdtp_tscm_set_pcm_format(struct amdtp_stream *s, snd_pcm_format_t format);
void snd_tscm_proc_init(struct snd_tscm *tscm);
#endif