Linux USB multiseat audio support
Posted on 20. Jan, 2010 by Bernie Thompson in udlfb
Here’s how to add audio support on top of the previous instructions for getting USB multiseat running on Linux, with a Plugable UD-160-A type device.
Add the following line to the bottom of the /lib/udev/rules.d/50-usbseat.rules file created per the previous instructions.
KERNEL=="control*", SUBSYSTEM=="sound", SUBSYSTEMS=="usb", PROGRAM="/bin/cat /sys/%p/../../../../../devnum", SYMLINK+="usbseat/%c/sound"
Then create a new /etc/X11/Xsession.d/50usbseat file which will be run at Xsession create time, with the following contents
oldIFS=$IFS IFS=: set $DISPLAY IFS=. set $2 SEAT_ID=$1 LN=`ls -al /dev/usbseat/$SEAT_ID/sound` IFS=C set $LN CARD_ID=$2 export ALSA_CARD=$2 export ALSA_PCM_CARD=$2 IFS=$oldIFS
Each of the users who might need access to the USB devices needs to be added to the ‘audio’ group. On Ubuntu 9.04, this can be done with these commands to backup and then modify the groups (replace MY_USERNAME, of course) …
sudo cp /etc/group /etc/group_backup sudo chmod a-wx /etc/group_backup sudo adduser MY_USERNAME audio
See Ubuntu Sound TroubleShooting for details on that step.
Now, as you connect UD-160-A terminals, a new X instance and GDM login will pop up as before, but also each of them will have /dev/usbseat/%SEAT_ID%/sound linking to their sound device, and the ALSA_CARD environment variable for all processes off of that X session, set to the matching sound card ID. For apps which support ALSA/Pulse (like most browsers, flash, etc.), audio will now come out the correct terminal — all in a completely plug-and-play fashion.
If you’re wondering what the strange IFS stuff is in the above script, it’s bash’s built-in Internal Field Separator variable, which is an easy way to split strings without having to launch a separate sed or awk process.
Note, as before, these instructions are specific to and tested on an older version of Ubuntu: 9.04, and may need to be ported to other distros until the distros themselves integrate these scripts.
Thanks to Alexander Todorov’s earlier work on multiseat sound support, which demonstrated how to match the USB audio devices in udev, and which ALSA_ environment variables to set. Alexander reported some problems reliably matching the audio devices, but with these scripts (with limited testing so far), things are working as expected.
DisplayLink Linux Rotation
Posted on 02. Jan, 2010 by Bernie Thompson in UGA-2K-A
[updated 8/14/2011 with latest udlfb info]
The xorg generic fbdev driver (xf86-video-fbdev) supports rotation with a custom option (note it disables DGA and xrandr when it rotated mode). DisplayLink devices can use this driver two ways:
- With the udlfb fb_defio option enabled to detect framebuffer writes based on page faults
- With the fbdev xorg server patched to report damage (writes to the framebuffer). Instructions for compiling and adding the ReportDamage option to xorg.conf are at the end of this post.
To enable rotation, in the xorg.conf “Device” section, add a Rotate option, setting it to CW, CCW, or UD.
Section "Device" Identifier "dl" Driver "fbdev" Option "rotate" "CCW" Option "ReportDamage" "true" Option "fbdev" "/dev/fb1" EndSection
One downside is rendering is significantly slower, as the extra work of rotation is done at the X level and the page-fault behavior of defio means even small updates refresh much of the screen. Here’s some numbers that can be compared to earlier posts (in non-rotate mode):
bernie@bernie-aspireone:~/git/misc-udlfb$ ./udlfb-perf.sh fb0 gtkperf -a Xlib: extension "RANDR" missing on display ":3.0". GtkPerf 0.40 - Starting testing: Fri Jan 1 09:47:20 2010 GtkEntry - time: 0.00 GtkComboBox - time: 3.73 GtkComboBoxEntry - time: 2.08 GtkSpinButton - time: 0.49 GtkProgressBar - time: 0.69 GtkToggleButton - time: 0.47 GtkCheckButton - time: 0.44 GtkRadioButton - time: 0.79 GtkTextView - Add text - time: 2.30 GtkTextView - Scroll - time: 1.24 GtkDrawingArea - Lines - time: 4.14 GtkDrawingArea - Circles - time: 4.56 GtkDrawingArea - Text - time: 4.11 GtkDrawingArea - Pixbufs - time: 0.90 --- Total time: 25.96 Quitting.. model name : Intel(R) Atom(TM) CPU N270 @ 1.60GHz model name : Intel(R) Atom(TM) CPU N270 @ 1.60GHz cpu MHz : 800.000 cpu MHz : 800.000 MemTotal: 2052144 kB Framebuffer Mode: 1920,1080 Rendered bytes: 1238913024 (total pixels * Bpp) Identical bytes: 1070725304 (skipped via shadow buffer check) sent bytes: 125732225 (compressed usb data, including overhead) K CPU cycles: 7478653 (transpired, may include context switches) % pixels found to be unchanged: 86.00 % Compression of changed pixels : 25.00 % Total CPU cycles spent per input pixel: 6 Total CPU cycles spent per output pixel: 59 USB Mbps: 35.52 (theoretical USB 2.0 peak 480)
Linux USB quirks on 2.6.32
Posted on 02. Jan, 2010 by Bernie Thompson in Programming
Doing development on udlfb on Linux 2.6.32, crossed paths with these two quirks.
The usb_skeleton.c sample driver appears to run afoul of this problem, resulting in a warn_on during bulk transfer completion, if done the way the sample recommends. Because completion routines can be called with irqs disabled, usb_buffer_free on dma-ready buffers can’t be called from them — which pushed the udlfb implementation to diverge from the skeleton model and pre-allocate a small set of urbs, and free only on driver disconnect.
Calls to usb_bulk_msg (simple synchronous bulk out) appeared to be silently failing for largish transfers (generally 16-32K). Nasty to track down, since no errors are returned. Caused removal all use of usb_bulk_msg from udlfb, except for transactions that are known to be small.


Recent Comments