Re: [Line6linux-devel] POD HD500x working
Status: Pre-Alpha
Brought to you by:
mgrabner
From: Andrej K. <de...@an...> - 2017-06-10 08:48:34
|
Hi Hans Peter, On Sat, Jun 10, 2017 at 5:05 AM, Hans Peter Möller <hm...@gm...> wrote: > I made the tests, > - Removing LINE6_CAP_CONTROL disable playback in the unit, I can still > capture but no sound come out of the unit. The "receive length failed (error > -11)" disappear. Since Initialization is required for playback, the .ctrl_if > is needed and thus the simple patch will only work in Kernel 4.9 and above. I'm not sure it would be accepted into the maintenance branches (<4.13) anyway, so that shouldn't matter. In the end .ctrl_if is not needed for the <4.12 kernels anyhow (it's basically there just to lock the USB device access for the kernel). > -Removing LINE6_CAP_IN_NEEDS_OUT has no effect, so it's not needed. > > We still have the "receive length failed (error -11)" error, any other ideas > of how to solve it? Or is not necessary? > Probably the init protocol is different then (no way to tell unless you sniff some stuff from windows). You can check one last thing - whether line6_read_serial_number() returns a reasonable value. Most likely not, but... I would say the best solution will be to add another flag, something like LINE6_CAP_CONTROL_INIT - and adjust podhd_init() like: - if (!(pod->line6.properties->capabilities & LINE6_CAP_CONTROL)) { + if (!(pod->line6.properties->capabilities & LINE6_CAP_CONTROL_INIT)) { /* register USB audio system directly */ return podhd_startup_finalize(pod); } The flag would be only set for POD X3 for now... > Just of curiosity, is there any difference in the usb_device_id > podhd_id_table[] if I use > { LINE6_DEVICE(0x4159), .driver_info = LINE6_PODHD500X }, > instead of: > { LINE6_IF_NUM(0x4159, 0), .driver_info = LINE6_PODHD500X }, > > The current table is: > /* table of devices that work with this driver */ > static const struct usb_device_id podhd_id_table[] = { > /* TODO: no need to alloc data interfaces when only audio is used */ > { LINE6_DEVICE(0x5057), .driver_info = LINE6_PODHD300 }, > { LINE6_DEVICE(0x5058), .driver_info = LINE6_PODHD400 }, > { LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500_0 }, > { LINE6_IF_NUM(0x414D, 1), .driver_info = LINE6_PODHD500_1 }, > { LINE6_IF_NUM(0x414A, 0), .driver_info = LINE6_PODX3 }, > { LINE6_IF_NUM(0x414B, 0), .driver_info = LINE6_PODX3LIVE }, > { LINE6_IF_NUM(0x4159, 0), .driver_info = LINE6_PODHD500X }, > {} > }; > This depends on how the device looks like. If there is only one USB interface, LINE6_DEVICE should be sufficient. However, POD X3 has one interface for audio (isochronous endpoints) and one for bulk transfers, so it needs LINE6_IF_NUM() to match the right device=interface (plus .ctrl_if for locking of the other one...). -- Best regards, Andrej > On Fri, Jun 9, 2017 at 11:50 AM, Andrej Kruták <de...@an...> wrote: >> >> Ah yes, that one patch... I already forgot about it (and of course >> didn't check the sources at the time of merge in 4.12 :)) Ok, but you >> shouldn't need the ctrl_if thing if you only use the audio stuff. >> >> Regarding the maxpacket error, my prints the same - Line6 apparently >> violates the USB specification (AFAIR bulk endpoints on HS USB 64 is >> invalid maxsize (aka only valid for FullSpeed USB)...). In any case, >> nothing to worry about... >> >> >> -- >> Greetings, >> >> Andrej >> >> >> On Fri, Jun 9, 2017 at 4:42 PM, Hans Peter Möller <hm...@gm...> >> wrote: >> > Hi, >> > I will thest droping those things and see what happened. >> > What about the " config 1 interface 1 altsetting 0 bulk endpoint 0x1 has >> > invalid maxpacket 64" ??? It has appear since the first time I plug my >> > pod >> > with the stock kernel 4.4. >> > >> > in your kernel 4.12 the if_ctrl doesn't appear? How did they implemented >> > the >> > x3 then? >> > >> > here is the podhd.c that come in my kernel >> > >> > https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/tree/sound/usb/line6/podhd.c?h=hwe-edge >> > and this is the one from torvalds >> > https://github.com/torvalds/linux/blob/master/sound/usb/line6/podhd.c >> > >> > both have the x3 implementation with the ctr_if (and mention you). >> > >> > >> > >> > On Fri, Jun 9, 2017 at 1:51 AM, Andrej Kruták <de...@an...> wrote: >> >> >> >> Hey, >> >> >> >> On Fri, Jun 9, 2017 at 5:35 AM, Hans Peter Möller <hm...@gm...> >> >> wrote: >> >> > Hi Andrej, >> >> > good news!! >> >> > I can capture and listen from my pod. >> >> > >> >> >> >> Perfect! >> >> >> >> >> >> > I compare the lsusb from de x3 and I found that it has the same >> >> > alternative >> >> > setting issue than the hd500x, which is different from hd300 (I >> >> > couldn't >> >> > get >> >> > one from h400 nor from h500). In x3 and 500x the altsetting is >> >> > different >> >> > for >> >> > audio than for data. >> >> > Since X3 is included in kernel 4.9, I decided to go over kernel 4.9 >> >> > and >> >> > use >> >> > that code which also appear to be more updated than the one here. >> >> > >> >> > In podhd.c I copy the same configuration used for X3. The .ctr_if=1 >> >> > is >> >> > the >> >> > difference from the others and it make the difference. This are the >> >> > modifications I made: >> >> > >> >> > enum { >> >> > LINE6_PODHD300, >> >> > LINE6_PODHD400, >> >> > LINE6_PODHD500_0, >> >> > LINE6_PODHD500_1, >> >> > LINE6_PODX3, >> >> > LINE6_PODX3LIVE, >> >> > LINE6_PODHD500X >> >> > }; >> >> > >> >> > /* table of devices that work with this driver */ >> >> > static const struct usb_device_id podhd_id_table[] = { >> >> > /* TODO: no need to alloc data interfaces when only audio is used >> >> > */ >> >> > { LINE6_DEVICE(0x5057), .driver_info = LINE6_PODHD300 }, >> >> > { LINE6_DEVICE(0x5058), .driver_info = LINE6_PODHD400 }, >> >> > { LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500_0 }, >> >> > { LINE6_IF_NUM(0x414D, 1), .driver_info = LINE6_PODHD500_1 }, >> >> > { LINE6_IF_NUM(0x414A, 0), .driver_info = LINE6_PODX3 }, >> >> > { LINE6_IF_NUM(0x414B, 0), .driver_info = LINE6_PODX3LIVE }, >> >> > { LINE6_IF_NUM(0x4159, 0), .driver_info = LINE6_PODHD500X }, >> >> > {} >> >> > }; >> >> > >> >> > >> >> > >> >> > >> >> > [LINE6_PODHD500X] = { >> >> > .id = "PODHD500X", >> >> > .name = "POD HD500x", >> >> > .capabilities = LINE6_CAP_CONTROL >> >> > | LINE6_CAP_PCM | LINE6_CAP_HWMON | >> >> > LINE6_CAP_IN_NEEDS_OUT, >> >> > .altsetting = 1, >> >> > .ep_ctrl_r = 0x81, >> >> > .ep_ctrl_w = 0x01, >> >> > .ctrl_if = 1, >> >> > .ep_audio_r = 0x86, >> >> > .ep_audio_w = 0x02, >> >> > }, >> >> > >> >> > >> >> > I still get some errors/warning in dmesg, the maxpacket are the data >> >> > ep >> >> > so >> >> > that is data. The "receive length failed (error -11)" don't know what >> >> > it >> >> > is, >> >> > maybe initialization? Because it only appear this two times. >> >> > >> >> > Here is dmesg output: >> >> > >> >> > [ 4001.944114] usb 1-3: new high-speed USB device number 11 using >> >> > ehci-pci >> >> > [ 4002.063668] usb 1-3: config 1 interface 1 altsetting 0 bulk >> >> > endpoint >> >> > 0x1 >> >> > has invalid maxpacket 64 >> >> > [ 4002.063677] usb 1-3: config 1 interface 1 altsetting 0 bulk >> >> > endpoint >> >> > 0x81 >> >> > has invalid maxpacket 64 >> >> > [ 4002.064779] usb 1-3: New USB device found, idVendor=0e41, >> >> > idProduct=4159 >> >> > [ 4002.064785] usb 1-3: New USB device strings: Mfr=1, Product=2, >> >> > SerialNumber=0 >> >> > [ 4002.064790] usb 1-3: Product: POD HD500X >> >> > [ 4002.064794] usb 1-3: Manufacturer: Line 6 >> >> > [ 4002.067896] snd_usb_podhd 1-3:1.0: Line 6 POD HD500x found >> >> > [ 4002.069846] snd_usb_podhd 1-3:1.0: Line 6 POD HD500x now attached >> >> > [ 4002.577334] snd_usb_podhd 1-3:1.0: receive length failed (error >> >> > -11) >> >> > [ 4002.579660] snd_usb_podhd 1-3:1.0: receive length failed (error >> >> > -11) >> >> > >> >> >> >> I think this is caused by the device having different initial setup >> >> requirements. But it also (most likely) means that it doesn't need any >> >> setup. Thus drop the LIBE6_CAP_CONTROL thing, see if it still works. >> >> >> >> In addition, can you try also dropping LINE6_CAP_IN_NEEDS_OUT - and >> >> check whether the stand-alone recording works? >> >> >> >> Lastly, I don't see any ctrl_if in the structure? Not in 4.0 ... >> >> 4.12-rc kernels at least... >> >> >> >> >> >> > I believe this should be added to the podhd.c delivered in the kernel >> >> > but I >> >> > dont know how to do that. >> >> > >> >> >> >> Check linux/Documentation/process/submitting-patches.rst. In short - >> >> just get inspired in the commit history of sound/usb/line6, create a >> >> similar patch (git format-patch) and send it to alsa-devel >> >> mailinglist. >> >> >> >> Alternatively, once you test the above, I can submit the patch on your >> >> behalf too. >> >> >> >> >> >> -- >> >> Best regards, >> >> >> >> Andrej >> > >> > > > |