Is it possible to take obsolete Android device and port it to mainline kernel with Debian? (make RaspberryPi-like device)
Personal weblog about technology, Open Source, perl, GNU etc...
Is it possible to take obsolete Android device and port it to mainline kernel with Debian? (make RaspberryPi-like device)
I have been toying around with idea of having real Linux stack (X11 and friends) on Nook Color. While this seems like a silly thing to do, it does allow me to use x2x and transfer keyboard and mouse from my laptop to tablet which is handy. If also allows me to run X11 applications on tablet screen using DISPLAY=nook.lan:0. I was fortunate enough to find blog post how to run Linux framebuffer X server on Android but I wanted to use touchscreen so I decided to write my own xorg.conf (this brings back memories...).
To get full-blown Debian-based distribution on your Android take a look at BotBrew Basil. It's Emdebian based distribution which will setup mount points and various other stuff so you don't have to do that manually. Since it's Debian based, you are not limited to Emdebian packages -- you can (and will have to) add normal sid:
(BotBrew)root@localhost:/# cat /etc/apt/sources.list.d/sid.list deb [arch=armel] http://ftp.debian.org/debian sid main contrib non-freeIf you want to know more about Emdebian hop over to DebConf 12: Integrating Emdebian into Debian [video].
With all this prepared, we are ready to shut down Android stack:
adb shell setprop ctl.stop media adb shell setprop ctl.stop zygote adb shell setprop ctl.stop surfaceflinger adb shell setprop ctl.stop drmNext step is installation of required packages:
dpavlin@t61p:~$ adb shell root@android:/ # TERM=xterm chroot /data/botbrew-basil/ /bin/bash --login (BotBrew)root@localhost:/# apt-get install xserver-xorg-video-fbdev xserver-xorg-input-evdev \ xserver-xorg-input-multitouch x11-xserver-utils xinit \ matchbox matchbox-keyboard xtermI decided to use matchbox, mostly becuase it's only window manager which comes with on-screen keyboard which is useful on touch screen device.
After installation you will need to setup X symlink and create .xinitrc:
root@android:/ # ln -s /usr/bin/Xorg /usr/bin/X root@android:/ # cat ~/.xinitrc ( sleep 1 ; matchbox-keyboard -o portrait ) & xhost 192.168.1.61 matchbox-sessionFinally, you need to create xorg.conf:
Section "ServerLayout" Identifier "Layout0" Screen "Screen0" InputDevice "cyttsp-i2c" "CorePointer" InputDevice "gpio-keys" "CoreKeyboard" InputDevice "twl4030-keypad" "CoreKeyboard" EndSection Section "InputDevice" Identifier "gpio-keys" Driver "evdev" Option "Device" "/dev/input/event0" # code 102 (KEY_HOME) # code 116 (KEY_POWER) EndSection Section "InputDevice" Identifier "twl4030-keypad" Driver "evdev" Option "Device" "/dev/input/event1" # code 114 (KEY_VOLUMEDOWN) # code 115 (KEY_VOLUMEUP) EndSection Section "InputDevice" Identifier "cyttsp-i2c" Driver "multitouch" Option "Device" "/dev/input/event2" # mouse should move as fast as finger and not faster Option "AccelerationScheme" "none" # evdev has it, multitouch doesn't so it behaves like touchpad # Option "IgnoreRelativeAxes" "True" EndSection Section "Device" Identifier "Card0" Driver "fbdev" Option "fbdev" "/dev/graphics/fb0" # rotate screen to be in sync with touchpad orientation Option "Rotate" "CCW" # CW=90 UD=180 CCW=270 EndSection Section "Screen" Identifier "Screen0" Device "Card0" EndSectionThis will map all hardware keys and use mutitouch driver for screen. To make it work, I used evtest package which allows you to see events from input devices so you will know which device produce keyboard events and which produce multitouch events. To be honest, this solution isn't prefect, because screen behaves like touchpad, so you can't just point to screen and expect your cursor to just to that position.
Following video shows X server in action.
This is simple unaccelerated frame buffer. This makes performance less then desirable. There are a few implementations of OMAP xorg server:
As you all know by now, last week we had another DORS/CLUC conference. This time I had two talks and one workshop.
I never proparly introduced this project here, but if you want to know more about my convention based documentation examine the presentation of hop over to https://sysadmin-cookbook.rot13.org/ and take a look at generated documentation.
Basic idea is to document changes in easy to write files on file system (preserving symlinks to files on system which allows you to quickly see if cookbook is deployed or not and diff between template and deployed configuration). I know that my cookbook is mix of various things I did in last three years, but I do find it useful, so hopefully it might be useful to you also.
This was a workshop which doesn't have much with web (it's about monitoring ADSL CPE devices and provider equipment in-between), but it shows (I hope) nice way to integrate several project to provide nice scalable monitoring infrastructure. It's composed of:
For quote some time I have been using x2x to have single keyboard and mouse for multiple machines (EeePC or third monitor at work), but I had problem with selection buffers. x2x was written for scenario where all X servers are listening to network connections, so if you had two machines klin and t42 and you wanted to use keyboard and mouse on klin you would have to do something like this:
dpavlin@t42:~$ xhost klin dpavlin@klin:~$ x2x -to klin:0 -westHowever, recent Debian systems are not listening to TCP connections, so you will have to modify xserverrc for this to work:
dpavlin@t42:~$ cat /etc/X11/xinit/xserverrc #!/bin/sh exec /usr/bin/X11/X #-nolisten tcpHowever, it's much nicer to depend on ssh X11 forwarding to provide encryption using:
dpavlin@klin:~$ ssh -X t42 x2x -to :0 -westTo finish this post, I have to include small patch which allows to switch copy/paste direction (which I don't need any more, but it proved useful in at least one case):
diff -r 2ce6789a43da x2x.c --- a/x2x.c Tue Mar 18 22:47:34 2008 +0600 +++ b/x2x.c Tue Nov 24 14:08:16 2009 +0100 @@ -1125,7 +1125,7 @@ if (doSel) { // pDpyInfo->initialClipboardSeen = False; pDpyInfo->winSelText = NULL; - pDpyInfo->hwndNextViewer = SetClipboardViewer(pDpyInfo->edgewindow); + pDpyInfo->hwndNextViewer = SetClipboardViewer(pDpyInfo->bigwindow); } pDpyInfo->onedge = 0;
If you have any objection your X11 setup (especially if you are not running Gnome or KDE) it's probably:
Firefox menu font size is too big!
However, that's really not right complaint. If you create your own userChrome.css and install it in correct location, you will notice that rest of applications still won't look good. But, Firefox was biggest problem, so you move on...
But, solution is really simple:
dpavlin@t61p:~$ cat .gtkrc-2.0 gtk-font-name = "Verdana 7"This will change all GTK application's (including FIrefox, OpenOffice.org and others) to sane font size for huge monitors with high DPI settings. It's a single line fix to all your problems!, take a look:
One of first differences when you start using X11 is that you can just select any text on screen and press middle mouse button to paste it back. But, after a while you end up in situation where you did ctrl+c in application, and somehow you expect that middle mouse button will paste it back.
X11 implementation of copy/paste is much more complicated, as you might read from excellent X Selections, Cut Buffers, and Kill Rings.
Most of the time, having two different clipboards is very useful. Think about copy/pasting url and title at the same time from one web page to another (like I do often when writing blog posts like this one).
So, how to we manage buffers more efficiently? First, install xclip and try it out:
dpavlin@t61p:~$ xclip -h Usage: xclip [OPTION] [FILE]... Access an X server selection for reading or writing. -i, -in read text into X selection from standard input or files (default) -o, -out prints the selection to standard out (generally for piping to a file or program) -l, -loops number of selection requests to wait for before exiting -d, -display X display to connect to (eg localhost:0") -h, -help usage information -selection selection to access ("primary", "secondary", "clipboard" or "buffer-cut") -noutf8 don't treat text as utf-8, use old unicode -version version information -silent errors only, run in background (default) -quiet run in foreground, show what's happening -verbose running commentaryHelp output is probably a little verbose, but just remember following things:
# display selected text xclip -out # display clipboard (copy/paste in applications) xclip -out -selection clipbaord # transfer selection into copy/paste buffer xclip -out | xclip -selection clipboard # transfer selection into copy/paste buffer xclip -out -selection clipboard | xclipLast example is useful if you want to paste something back in terminal and it somehow ended up in copy/paste buffer, following is Zotero example:
Just let your imagination go wild: what if you have only textarea and you want to do some massive editing for which vi whould be better? You can install excellent It's All Text! Firefox extension but, you could also write something like this:
xclip -out > /tmp/$$.txt && vi /tmp/$$.txt && xclip -in -selection clipboard < /tmp/$$.txtYou could bind that to a key in your window manager or start different editor if you wanted to... or I guess live can be simple again if you just install autocutsel
Few days after I wrote this blog post, I had interesting problem. I was trying to decrease font size in firefox and I found instructions which included filename and content itself. I copied content with Ctrl+C and selected filename and used this little gem:
xclip -sel clipboard -out > `xclip -out`
I wanted to have full-screen presentation with two video files in-between slides. And I didn't really want to depend on network to present it. I even wanted to use properly scaled video depending on projector resolution.
In my expirience, best way to preserve presentation format is to export it into pdf. And than with a little bit of shell scripting...
xpdf -fullscreen /home/dpavlin/Desktop/sf3-2009_oslobodimo_hardware.pdf mplayer -fs /home/dpavlin/llin/RFID/ffzg-promo-knjiznica.avi xpdf -fullscreen /home/dpavlin/Desktop/sf3-2009_oslobodimo_hardware.pdf 3 mplayer -fs /home/dpavlin/llin/RFID/comet-meteor-koha-rfid.ogv xpdf -fullscreen /home/dpavlin/Desktop/sf3-2009_oslobodimo_hardware.pdf 6I got exactly what I needed. Both xpdf and mplayer have full screen options and xpdf can jump to specific slide. Even keyboard shortcut to exit programs (q) are the same!
So, I just flip first two slides, press q and play first video in full screen. When it ends, I will be on next slide in xpdf. You will see background for a bit (so switch to empty virtual desktop or something), but other than that it works nicely and predictably.
I rarely use X11 for system administration. There is one tool, however, which was always invaluable to me: xlax. Sure, there are other solutions but somehow, I got addicted to xlax ever since I was introduced to it by fellow sysadmin.
Until today, that is. I always have source on the disk since it was such a hard thing to find. I run quick xmkmf on it, and... it didn't work! However, since xlax now has a home page which explains everything about XTerm*allowSendEvents I was on right track.
But, now so fast, grasshopper!dpavlin@llin:/rest/unix/x11/xlax2.4$ make gcc -m32 -o xlax -g -O2 -fno-strict-aliasing xlax.o -lXaw -lXmu -lXt -lSM -lICE -lXpm -lXext -lX11 xlax.o: In function `SetupInterface': /rest/unix/x11/xlax2.4/xlax.c:173: undefined reference to `strlcpy' collect2: ld returned 1 exit status make: *** [xlax] Error 1Argh. I started with Digital UNIX (called OSF/1 back then) and part of my brain which deals with minor adjustments hasn't died yet, so I decided to do quick google search for strlcpy which which has handy link to strlcpy implementation in OpenBSD. Licensing terms aside, I decided to give it a try.
After applying following patch:
diff -urw xlax2.4/Imakefile xlax2.4.strlcpy/Imakefile --- xlax2.4/Imakefile 2008-07-31 22:18:25.000000000 +0200 +++ xlax2.4.strlcpy/Imakefile 2009-04-30 21:32:15.000000000 +0200 @@ -5,8 +5,8 @@ # DEFINES = -DDEBUG DEPLIBS = XawClientDepLibs LOCAL_LIBRARIES = XawClientLibs - SRCS = xlax.c - OBJS = xlax.o + SRCS = xlax.c strlcpy.c + OBJS = xlax.o strlcpy.c ComplexProgramTarget(xlax)and quick xmkmf && make and I got it compiled.
Another trivial change was to implement automatic ssh to each host in mkxlax by adding -e 'ssh $ARGV[$i]' to system xterm line so I will have remote reminals opened by default.
And now, back to real work :-)
It seems that Intel driver for Xorg allocates virtual destop as maximum rectangular size of biggest attached screen. In my example, I have:
I want to have VGA output above internal LVDS with something like
xrandr --output VGA --auto --above LVDSIt should be 1290*2000 = 1920*(1200+800) so I had to add following in /etc/X11/xorg.conf:
Section "Screen" Identifier "Default Screen" Monitor "Configured Monitor" SubSection "Display" Virtual 1920 2000 EndSubSection EndSectionNice and simple. I really love new x.org configuration files with much less clutter...
I'm preparing walk-through screencasts for workshop about virtualization so I needed easy way to produce console screencasts.
First, I found TTYShare which displays ttyrec files using flash, but I really wanted to copy/paste parts of commands and disliked flash plugin requirement.
It seems that I wasn't only one who wanted JavaScript client for ttyrec. jsttplay can produce screencasts like this one about OpenVZ using plain copy/paste friendly JavaScript within browser.
But, for some parts (like Debian installation under VirtualBox) I really needed movie capture. x11grab option from ffmpeg seemed easy enough to use:
ffmpeg -f x11grab -s 640x480 -r 10 -i :0.0 /tmp/screencast.avibut getting right window size isn't something I want to do by hand. So, I wrote small perl script record-screencast.pl which extract window position and size using xwininfo and pass it to ffmpeg so I don't have to.