Keeping the thread alive (Wakthrough and added hardware)
The "ugly hack" as drumfix calls it, also works in the Roland Boutiq series (at least for the jx03 module, I'll try it with other modules later and post the updates)
How I made it work (for linux mint 19)- eternal thanks to drumfix (mainly) and other forum members.
I'm quite a seasoned unix admin and I didn't find the instructions to be exhaustive or easy to follow, too many side sources to read, too many pieces to put together, a lot to adapt (not a critic to all those who put in their valuable time trying to help others -specially drumfix-, but even I was hesitant to try and do the change - true... seasoned admin and quite proficient at C programming, but not a lot of experience compiling kernels or kernel modules)
Here's my contribution (hoping it's not against the forum rules)
I cannot give a detailed step by step because it's all been part of the process, but I'll do my best.
Let's just say it started with me compiling a real time (RT) kernel to see if could get latency and xruns down, I compiled version 5.4.26-rt17 (the lastest with an available RT patch when I did it 2020-03-20-ish).
And then made a tiny modification in one of the kernel source files, and built it as a kernel module (to be spared of re-compiling the kernel once again).
It "should" work on you kernel of choice (low-latency or generic kernel users I'm talking to you)
My changes to file <kernel_source>/sound/usb/pcm.c were the lines commented as "Micro BR-80" up to "Roland Boutiq" at the end of the function's "static int set_sync_ep_implicit_fb_quirk" switch statement and before the return statement, the following statement is an "if statement" (reduced context printed here for your convenience)
<kernel_source> is the directory where you downloaded the kernel source, either a new one for compilation, or the one you are about to modify (about to compile the new module for - the source you download should match exactly the kernel you want to patch - output of "# uname -r")
<kernel_source>/sound/usb/pcm.c context:
...
ifnum = 1;
goto add_sync_ep_from_ifnum;
case USB_ID(0x07fd, 0x0004): /* MOTU MicroBook II */
ep = 0x84;
ifnum = 0;
goto add_sync_ep_from_ifnum;
case USB_ID(0x07fd, 0x0008): /* MOTU M Series */
ep = 0x81;
ifnum = 2;
goto add_sync_ep_from_ifnum;
case USB_ID(0x0582, 0x01d8): /* BOSS Katana */
/* BOSS Katana amplifiers do not need quirks */
case USB_ID(0x0582, 0x0130): /* Micro BR-80 */
case USB_ID(0x0582, 0x01d6): /* BOSS GT-1 */
case USB_ID(0x0582, 0x0138): /* RC-300 */
case USB_ID(0x0582, 0x01b5): /* Roland Boutiq */
return 0;
}
if (attr == USB_ENDPOINT_SYNC_ASYNC &&
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
altsd->bInterfaceProtocol == 2 &&
...
As you can gather from the previous posts, all of these: "BOSS Katana" amplifiers, "Micro BR-80" synth(?), "BOSS GT-1" pedalboard(?), "RC-300" looper, and "Roland Boutiq" line synth modules work, so I added all of those in case I get my hands on any of that hardware in the future (FYI in 5.4.26 kernel source "BOSS Katana" case is already in the code making it easier to locate the right portion of code to modify)
If you have a Roland/BOSS device with USB connection which you suspect should work as an audio interface but can't get it to work, I would try adding a case statement for it (after Roland Boutiq case) and following this procedure (my next test will be Roland GR-55 Guitar Synth), hell... I would even try it for devices from other manufacturers that were giving me a hard time
How do you get the right values for USB_ID?
- Connect your USB device
- Run # lsusb and identify your device
i.e:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 138a:0011 Validity Sensors, Inc. VFS5011 Fingerprint Reader
Bus 001 Device 004: ID 5986:2109 Acer, Inc
Bus 001 Device 003: ID 8087:0a2b Intel Corp.
Bus 001 Device 002: ID 058f:9540 Alcor Micro Corp. AU9540 Smartcard Reader
Bus 001 Device 009: ID 0582:01b5 Roland Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
run # lsusb -v -s 001:009| egrep 'idVendor|idProduct'
(aka "-s <Bus:Device>" for your relevant entry)
i.e.:
idVendor 0x0582 Roland Corp.
idProduct 0x01b5
Those are your hex numbers for the case in the switch statement (actually the output of lsusb also shows them but without the leading 0x, in the code they must be pre-pended with the 0x)
For kernel compilation:
- I followed some of the instructions here:
https://www.linux.com/topic/desktop/how ... -kernel-0/
Part "Installing requirements"
- downloaded sources from
https://mirrors.edge.kernel.org/pub/lin ... .26.tar.gz
https://mirrors.edge.kernel.org/pub/lin ... t17.tar.gz
- and then followed some of the instructions here:
https://gnipsel.com/linuxcnc/uspace/linuxmint19-rt.html
parts: "Now extract and patch the kernel", "Now build the kernel", "...then install the kernel", etc
Now, let's get something clear... it takes a good while to compile a kernel (3 hours on my laptop although it's a bit old but quite powerful, I've read for other guys it took 8 hours plus to compile the kernel), so I'm only pasting the link here so you can make sure you have the pre-requisite software and the sources needed (if you want to compile your kernel, go for it, hopefully these sources will help you as much as they helped me)
Naturally after compiling the kernel I dind't want to do it again to get this roland patch working, so I followed Unicornblender's tip and link on how to compile the patch as a module, adapting this link:
https://wiki.archlinux.org/index.php/Co ... nel_module to my needs
Note, if you ARE planning on compiling your own kernel, just change the <kernel_source>/sound/usb/pcm.c file before compiling the whole kernel and you can skip this part about building and loading/verifying modules (since I had no experience doing any of these tasks I didn't have the strenght of heart to do it myself in one pass)
Module(s) building:
- I found my system (linux mint 19.3) don't have a /proc/config.gz file (apparently arch linux does) so I used the one that was left from my kernel compilation (if you don't plan on compiling a full kernel, maybe google where to get the current config file for your system)
- I did not use any of the EXTRAVERSION stuff
- I run (as root or using sudo and standing in the base path where the kernel image was downloaded):
In my case it was: <kernel_source>= ~/Downloads/linux-5.4.26 (That ~ is the login user home directory, not root's home directory, but it will depend where you downloaded the kernel source)
Also where it says <kernel_version> replace with your kernel version, in my case it would be <kernel_version>=5.4.26
The module(s) you are interested in is <kernel_source>/sound/usb/snd-usb-audio.ko
step by step:
- # cd <kernel_source>
- # make modules_prepare
- # make M=sound/usb
After two minutes the modules were compiled
The module you are interested in is <kernel_source>/sound/usb/snd-usb-audio.ko
- I placed the updated module in /lib/modules/<kernel_version>/updates (had to create the "updates" directory)(cp command, make sure to check permissions and keep them in line with the rest of the hierarchy)
- I noted down the version of the original module vs. the new one with modinfo to check eventually which module was loaded (specifically the line srcversion)
- # modinfo /lib/modules/<kernel_version>/kernel/sound/usb/snd-usb-audio.ko | grep srcversion
- # modinfo <kernel_source>/sound/usb/snd-usb-audio.ko | grep srcversion
The output for my newly compiled module was (Warning, I'm quite certain it's not going to be yours)
srcversion: 8EC255C68F12886B79E6B2E
I ran
# update-initramfs -u -k `uname -r`
(back quotes, or just run "# uname -r" and replace with output, in my case output was: 5.4.26-rt17)
Note: I used update-initramfs because I didn't understand the manual for mkinitcpio and how to adapt the parameters to my case, alas... it worked
- reboot
- If everything is well, your system will load and then you should connect your device via usb and the new module will get loaded automatically (I couldn't load it manually - not that I tried too hard)
- run # lsmod | grep snd_usb_audio
if the module was loaded (aka there is output from the previous command) run
# modinfo snd-usb-audio | grep srcversion
The output should match the srcversion you noted down from your compiled module a couple of steps back and not the stock module's one
I didn't hit any wall or found any problems in all the process, so "a priori" I could not help you troubleshoot if you get into trouble but my first idea would be...
- boot into a different kernel (usually old kernels are still there unless you clean up, in grub's advanced options for linux mint/Ubuntu/etc ) and
- just delete the updates folder "# rm -f /lib/modules/<kernel_version>/updates" (of course if you have othere modules updated, just delete the snd-usb-audio.ko module) and
- re-run update-initramfs with the same parameters as before
this should put you back at the starting point after a reboot into your preferred kernel
Hope it helps and hope it's not too off-topic