This page is about getting the Tascam US-122L (and US-144) work under Linux. If you have some more information, feel free to mail me at samuel.mimram@ens-lyon.org.
This page was last updated on 2009-10-14.
His predecessor, the US-122, has an alsa driver but has been discontinued. Loading a firmware was needed to get it running.
The hardware has apparently changed much between the US-122 and the US-122L. On the request of Derek Pidhirnyj, Martin Langer, who developed the firmware for the US-122, has looked at the usbsnoop logs and lsusb output. He thinks that the US-122L uses a different chip compared to the old usx2y boxes, and that firmware is not loaded at connection. Possibly the device fits better into the USB audio specification (snd-usb-audio driver) and may only need an entry into usbquirks.h (and possibly also usbaudio.c and usbaudio.h). Effectively, the logs show that the driver does hardly only isochronous transfers of data.
For example, here is a data reception:
[367 ms] <<< URB 33 coming back <<<
-- URB_FUNCTION_ISOCH_TRANSFER:
PipeHandle = 896f89bc [endpoint 0x00000081]
TransferFlags = 00000003 (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK
TransferBufferLength = 00000528
TransferBuffer = 89143000
TransferBufferMDL = 897078d0
StartFrame = 00037009
NumberOfPackets = 00000028
ErrorCount = 00000000
IsoPacket[0].Offset = 0
IsoPacket[0].Length = 30
IsoPacket[0].Status = 00000000
00000000: 75 fb 00 5b f4 00 39 fd 00 d1 f4 00 c7 fb 00 1b
00000010: f6 00 03 fc 00 da f5 00 a6 fb 00 83 f6 00
IsoPacket[1].Offset = 78
IsoPacket[1].Length = 36
IsoPacket[1].Status = 00000000
00000000: 8d f9 00 26 f6 00 8c fb 00 9c f5 00 7d fb 00 b9
00000010: f6 00 bd fc 00 a2 f6 00 03 fc 00 38 f6 00 1a fb
00000020: 00 e8 f6 00
IsoPacket[2].Offset = 156
IsoPacket[2].Length = 30
IsoPacket[2].Status = 00000000
00000000: b1 fc 00 ed f5 00 72 fb 00 2d f6 00 ed fa 00 21
00000010: f6 00 d9 fb 00 2a f5 00 61 fc 00 23 f7 00
IsoPacket[3].Offset = 234
IsoPacket[3].Length = 36
IsoPacket[3].Status = 00000000
00000000: ae fa 00 90 f5 00 47 fb 00 66 f6 00 5f fb 00 7a
00000010: f6 00 7e fc 00 74 f6 00 a0 fb 00 d8 f7 00 8f f9
00000020: 00 bb f7 00
[...]
Notice that by grouping the bytes by series of 3 you get similar values, and that the rightmost byte does not change much. This makes me think that the format of samples is S24_3LE (i.e. stereo, 24 bits per sample, grouped by 3 bytes, in little endian).
This lead me to the following entry in usbquirks.h:
{
USB_DEVICE(0x644, 0x800e),
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
.vendor_name = "Tascam",
.product_name = "US-122L",
.ifnum = QUIRK_ANY_INTERFACE,
.type = QUIRK_COMPOSITE,
.data = (const struct snd_usb_audio_quirk[]) {
{
.ifnum = 0,
.type = QUIRK_IGNORE_INTERFACE
},
{
.ifnum = 1,
.type = QUIRK_AUDIO_FIXED_ENDPOINT,
.data = & (const struct audioformat) {
.format = SNDRV_PCM_FORMAT_S24_3LE,
.channels = 2,
.iface = 1,
.altsetting = 1,
.altset_idx = 1,
.attributes = 0,
.endpoint = 0x02,
.ep_attr = 0x01,
.rates = SNDRV_PCM_RATE_CONTINUOUS,
.rate_min = 44100,
.rate_max = 44100,
}
},
{
.ifnum = -1
}
}
}
},
The good news is that aplay now accepts to play files using command lines like aplay --device=hw:1,0 -f S24_3LE -r 44100 -c 2 /tmp/test.raw. The bad news is that it only produces a very low noise... If someone has comments about how to improve this, I'd be glad to hear them!
An other idea would be to modify the usx2y module. I've made a simple patch to add support for the US-122L to this module but unfortunately, it makes my linux slow down and eventually crash after a few seconds as soon as I plug the US-122L...
A nice people opened up its US-144 and wrote a webpage about what he found inside. Maybe is it of interest for some of you?
Output of lsusb -vv:
Bus 002 Device 002: ID 0644:800e TEAC Corp.
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0644 TEAC Corp.
idProduct 0x800e
bcdDevice 1.00
iManufacturer 1 TASCAM
iProduct 2 US-122L
iSerial 3 no serial number
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 72
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
MaxPower 480mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 4
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x0126 1x 294 bytes
bInterval 1
bRefresh 0
bSynchAddress 0
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x02 EP 2 OUT
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x0126 1x 294 bytes
bInterval 1
bRefresh 0
bSynchAddress 0
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0009 1x 9 bytes
bInterval 1
bRefresh 0
bSynchAddress 0
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
bRefresh 0
bSynchAddress 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
bNumConfigurations 1
Infos given by usbfs:
T: Bus=01 Lev=01 Prnt=01 Port=04 Cnt=01 Dev#= 16 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0644 ProdID=800e Rev= 1.00
S: Manufacturer=TASCAM
S: Product=US-122L
S: SerialNumber=no serial number
C:* #Ifs= 2 Cfg#= 1 Atr=80 MxPwr=480mA
I: If#= 0 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
I: If#= 1 Alt= 0 #EPs= 0 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
I: If#= 1 Alt= 1 #EPs= 4 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
E: Ad=81(I) Atr=05(Isoc) MxPS= 78 Ivl=125us
E: Ad=02(O) Atr=05(Isoc) MxPS= 78 Ivl=125us
E: Ad=83(I) Atr=02(Bulk) MxPS= 9 Ivl=0ms
E: Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=500us