notes-computer-oqo-hardware

This page is about getting various hardware working on an OQO 01+ handheld running Debian GNU/Linux. This page is for AFTER you've successfully installed Debian. See the page [tips-computer-oqo-installingDebian installing Debian on the OQO] for information about installing Debian on the OQO in the first place.

Note that this sort of information changes with time (because the current versions of various software packages change with time). I did my install in November 2005.

What's working

What's not working (yet?)

Other stuff I haven't tried yet

Moshen's page

This page was basically my bible of information about GNU/Linux installation on the OQO:

ftp://ftp.oqo.com/unsupported/linux/OQOLinux.html

I basically just did what this page said. Some differences:

Details

Kernel

I just followed the directions on Moshen's page, except I changed used the 2.6.14.2 kernel instead of 2.6.10.

Wifi

I got a CVS snapshot from http://atmelwlandriver.sourceforge.net/ by using the commands cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/atmelwlandriver login; cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/atmelwlandriver co atmelwlandriver. As is, it wouldn't compile with gcc 4.0.2 20050808 and kernel 2.6.14.2. So, I made the following changes to the sourcecode (the following is the relevant part of the output of diff -r atmelwlandriver-cvs/ atmelwlandriver):

diff -r atmelwlandriver-cvs/src/includes/usb/config.h atmelwlandriver/src/includes/usb/config.h
54a55,60
> 
> #define R505A_DEVICES { \
>  {USB_DEVICE(0x1557,0x0002)}, /* OQO 505A id */\
>  {USB_DEVICE(VNetVID,VNetPID_R505AS)}, /* Atmel's id */\
>  { } /* end with an all-zeroes entry */\
> } /* end marker */
diff -r atmelwlandriver-cvs/src/usb/reset_device.c atmelwlandriver/src/usb/reset_device.c
410c410,411
< 			dev->epmaxpacketout[epnum] = 0;
---
> 			/* dev->epmaxpacketout[epnum] = 0; */
> 			dev->ep_out[epnum] = NULL;
413c414,415
< 			dev->epmaxpacketin[epnum] = 0;
---
> 
> 			/* dev->epmaxpacketin[epnum] = 0; */
509c511,512
< 		dev->epmaxpacketout[epnum] = maxsize;
---
> 		/* dev->epmaxpacketout[epnum] = maxsize; */
> 		dev->ep_out[epnum] = maxsize;
514c517,518
< 		dev->epmaxpacketin[epnum] = maxsize;
---
> 		/* dev->epmaxpacketin[epnum] = maxsize; */
> 		dev->ep_in[epnum] = maxsize;
1260,1261c1264,1265
< 			if (d->wMaxPacketSize > dev->epmaxpacketout[b])
< 				dev->epmaxpacketout[b] = d->wMaxPacketSize;
---
> 			if (d->wMaxPacketSize > dev->ep_out[b])
> 				dev->ep_out[b] = d->wMaxPacketSize;
1263,1264c1267,1268
< 			if (d->wMaxPacketSize > dev->epmaxpacketin[b])
< 				dev->epmaxpacketin[b] = d->wMaxPacketSize;
---
> 			if (d->wMaxPacketSize > dev->ep_in[b])
> 				dev->ep_in[b] = d->wMaxPacketSize;
diff -r atmelwlandriver-cvs/src/usb/rx.c atmelwlandriver/src/usb/rx.c
749c749
< 			(UCHAR) Adapter->ErrorCode =
---
> 			Adapter->ErrorCode =
753a754,755
> 			
> 			
diff -r atmelwlandriver-cvs/src/usb/vnetusba.c atmelwlandriver/src/usb/vnetusba.c
846c846
<   (u64) (*pTime) = timev.tv_sec * 10000000;
---
>   (*pTime) = timev.tv_sec * 10000000;
1584a1585,1587
>         // add this for iwconfig compatibility
>         wrq->u.encoding.flags |= 1;
>
2258,2260c2258,2260
< 	Adapter->rx_urb->transfer_flags &= ~USB_ASYNC_UNLINK;
< 	Adapter->tx_urb->transfer_flags &= ~USB_ASYNC_UNLINK;
< 	Adapter->ctrl_urb->transfer_flags &= ~USB_ASYNC_UNLINK;
---
> 	Adapter->rx_urb->transfer_flags &= ~0
> 	Adapter->tx_urb->transfer_flags &= ~0
> 	Adapter->ctrl_urb->transfer_flags &= ~0
2265,2267c2265,2267
< 	Adapter->rx_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
< 	Adapter->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
< 	Adapter->ctrl_urb->transfer_flags &= ~URB_ASYNC_UNLINK;
---
> 	Adapter->rx_urb->transfer_flags &= ~(0);
> 	Adapter->tx_urb->transfer_flags &= ~0;
> 	Adapter->ctrl_urb->transfer_flags &= ~0;

I am not a kernel hacker or device driver writer so some of my changes may be wrong. Basically, by looking on the internet, I guessed that in kernel 2.6.14.2,

and also that gcc 4.0.2 doesn't like it when you specify the type of the lefthand side of an equals, for instance, "(UCHAR) Adapter->ErrorCode?" is illegal and should be replaced by just "Adapter->ErrorCode?".

After making these changes I did "make usb buildonly=release; make install" in the atmelwlandriver directory, as specified in Moshen's instructions.

Sleep

I installed the Ubuntu package acpi-support (I think that required me to install some others Ubuntu packages first as prerequisites; I think I had to install xserver-xorg. Presumably because of a problem with mixing Debian and Ubuntu, I think that broke X, and I then had to (re?)install the Debian package x-window-system; I think that for some reason I may have also had to reinstall the Debian packages xfonts-base and xfonts-scalable, but I'm not sure), and then I just followed the instructions on Moshen's page.

X

I got X working, then it wasn't working after I installed xserver-xorg, then I fixed it. So far I'm just using the vesa driver, not the accelerated siliconmotion driver.

Here's my /etc/X11/xorg.conf file. This was mostly pregenerated by Debian and Ubuntu when I installed packages, but then I modified some sections in accordance with Moshen's directions, and then also added some config options to the Wacom pen:

# /etc/X11/xorg.conf (xorg X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the /etc/X11/xorg.conf manual page.
# (Type "man /etc/X11/xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
#   sudo dpkg-reconfigure -phigh xserver-xorg

Section "Files"
	FontPath	"/usr/share/X11/fonts/misc"
	FontPath	"/usr/share/X11/fonts/cyrillic"
	FontPath	"/usr/share/X11/fonts/100dpi/:unscaled"
	FontPath	"/usr/share/X11/fonts/75dpi/:unscaled"
	FontPath	"/usr/share/X11/fonts/Type1"
	FontPath	"/usr/share/X11/fonts/CID"
	FontPath	"/usr/share/X11/fonts/100dpi"
	FontPath	"/usr/share/X11/fonts/75dpi"
        # paths to defoma fonts
	FontPath	"/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
	FontPath	"/var/lib/defoma/x-ttcidfont-conf.d/dirs/CID"
EndSection

Section "Module"
	Load	"GLcore"
	Load	"bitmap"
	Load	"dbe"
	Load	"ddc"
	Load	"dri"
	Load	"extmod"
	Load	"freetype"
	Load	"glx"
	Load	"int10"
	Load	"record"
	Load	"type1"
	Load	"vbe"
EndSection

Section "InputDevice"
        Option "Suppress" "6"
        Identifier "pen0"
        Driver "wacom"
        Option "Type" "stylus"
        Option "Device" "/dev/ttyS0"
        Option "ForceDevice" "ISDV4"

#	Option "Mode" "Relative"
        Option "TopX" "100"
        Option "TopY" "150"
        Option "BottomX" "11120"
        Option "BottomY" "6752"
        
#	Option "Speed" "0.1"
#	Option "Threshold" "100"

#defaults:
#(==) Wacom using pressure threshold of 15 for button 1
#(==) Wacom General ISDV4 tablet speed=9600 maxX=11120 maxY=6752 maxZ=255 resX=2540 resY=2540 suppress=2 tilt=disabled
#(==) Wacom device "pen0" top X=0 top Y=0 bottom X=11120 bottom Y=6752


EndSection


Section "InputDevice"
	Identifier	"Generic Keyboard"
	Driver		"kbd"
	Option		"CoreKeyboard"
	Option		"XkbModel"	"pc101"
	Option		"XkbLayout"	"us"
EndSection

Section "InputDevice"
	Identifier	"Configured Mouse"
	Driver		"mouse"
	Option		"CorePointer"
	Option		"Device"		"/dev/input/mice"
	Option		"Protocol"		"ImPS/2"
	Option		"Emulate3Buttons"	"true"
	Option		"ZAxisMapping"		"4 5"
EndSection

Section "InputDevice"
	Identifier	"Synaptics Touchpad"
	Driver		"synaptics"
	Option		"SendCoreEvents"	"true"
	Option		"Device"		"/dev/psaux"
	Option		"Protocol"		"auto-dev"
	Option		"HorizScrollDelta"	"0"
EndSection


Section "Device"
        Identifier      "Silicon Motion, Inc. SM720 Lynx3DM"
        Driver          "vesa"
 #       Driver          "siliconmotion" # need to modify the driver first before using
        BusID           "PCI:0:6:0"
EndSection

Section "Monitor"
        Identifier      "Generic Monitor"
        Option          "DPMS"
        Modeline "800x480" 40 800 864 928 1088 480 481 484 509 +HSync
EndSection

Section "Screen"
	Identifier	"Default Screen"
	Device		"Silicon Motion, Inc. SM720 Lynx3DM"
	Monitor		"Generic Monitor"
	DefaultDepth	24
	SubSection "Display"
		Depth		1
		Modes		"800x480" "640x480"
	EndSubSection
	SubSection "Display"
		Depth		4
		Modes		"800x480" "640x480"
	EndSubSection
	SubSection "Display"
		Depth		8
		Modes		"800x480" "640x480"
	EndSubSection
	SubSection "Display"
		Depth		15
		Modes		"800x480" "640x480"
	EndSubSection
	SubSection "Display"
		Depth		16
		Modes		"800x480" "640x480"
	EndSubSection
	SubSection "Display"
		Depth		24
		Modes		"800x480" "640x480"
	EndSubSection
EndSection

Section "ServerLayout"
	InputDevice	"pen0" "AlwaysCore"
	Identifier	"Default Layout"
	Screen		"Default Screen"
	InputDevice	"Generic Keyboard"
	InputDevice	"Configured Mouse"
	#InputDevice	"Synaptics Touchpad"
	
EndSection

Section "DRI"
	Mode	0666
EndSection

Wacom

When I tried Moshen's directions using Moshen's 2.6.10 kernel, the wacom-kernel-source package didn't work with gcc 4.0.2 and kernel 2.6.14.2 (i think the sign that it didn't work was that, after making the kernel, if I went to the directory where the wacom.ko file was and tried to "insmod ./wacom.ko", there was an error). As I noted above, I think the problem was that Moshen's kernel was compiled with a different version of gcc than I was using. The easy thing to do would have been to recompile the wacom kernel module manually and find a way to make it use an older version of gcc. But no, I had to be difficult. So I decided to compile my own 2.6.14.2 kernel and to compile the wacom stuff with that.

It's possible that installing wacom-kernel-source did something good to my system even though it didn't get the kernel module installed, so maybe you should try that either way.

I don't remember exactly what I did, but I think I got linuxwacom-0.7.1-1 from http://prdownloads.sourceforge.net/linuxwacom/linuxwacom-0.7.1-1.tar.bz2, unpacked it (bunzip2 linuxwacom-0.7.1-1.tar.bz2), untarred it (tar xovf linuxwacom-0.7.1-1.tar), "cd linuxwacom-0.7.1-1", and then did

./configure  --enable-wacom
make
make install

(maybe I also had to load the wacom driver with "modprobe wacom"), and then followed Moshen's directions, and then restarted X (or maybe restarted the whole computer).

I had some trouble because I didn't follow Moshen's directions exactly and didn't notice (I forgot to put the "AlwaysCore?" part in the X configuration), but just be sure to type in everything he has there exactly.

After this, I tried to get either "xsetwacom" or "wacomcpl" (also provided in the linuxwacom-0.7.1-1 package) working, but I couldn't get either of them to detect my wacom, even thought X was using it fine. So I resorted to manually playing around with the X config options which are described in the linuxwacom docs. I ended up with this:

Section "InputDevice"
        Identifier "pen0"
        Driver "wacom"
        Option "Type" "stylus"
        Option "Device" "/dev/ttyS0"
        Option "ForceDevice" "ISDV4"

        Option "Suppress" "6"
        Option "TopX" "100"
        Option "TopY" "150"
        Option "BottomX" "11120"
        Option "BottomY" "6752"
EndSection

Fiddling with the TopX? and TopY? settings is how you get the pointer to track the pen correctly as it gets near the top and the lefthand edges, and I think the Suppress option makes the pointer not jiggle so much when you're trying to hold it still.

I would like to set "Suppress" to be much higher, since I can't click or right click without accidentally dragging, but a small note in the linuxwacom docs says that 6 is the max for some reason; if you set it higher than that, it gets ignored and "Suppress" gets set back to 2 (?!?).

Power management

The command "acpi" tells you how much battery is left, and how long it's supposed to last (or how long it's supposed to take to charge up, if you're charging). It's part of the Debian package "acpi".

The command "longrun" allows you to tell the Crusoe processor to speed up or slow down. By default, the processor speeds itself up when there's a lot to do and slows down otherwise. But you can override this and force it to stay fast or to stay slow. The faster it goes, the more energy it takes and the more it heats up (hence, the fan has to go more). So, there's a tradeoff between CPU speed and battery life.

"longrun" is part of the "longrun" Debian package. Kernel modules "cpuid" and "msr" must be loaded for "longrun" to work ("modprobe cpuid; modprobe msr"). Thanks to this comment for telling me about longrun.

Misc

Scrollwheel

The little wheel on the bottom of the OQO functions as a scrollwheel in X!

Brightness

The Fn-, and Fn-. keys work for adjusting the screen brightness even in GNU/Linux. I assume that dimmer screens lengthen battery life.

processor.ko

Apparently,"If for some reason you load the processor.ko acpi module you will notice that the cpu will run at max speed, the OQO will get really hot and longrun will not work. " -- http://www.handtops.com/forum/752/1/9205#9205

Windows overwrites Grub

Indeed, corroborating this comment, each time I boot into Windows XP, Windows overwrites Grub in the MBR (Master Boot Record).

However, this is easily dealt with on my setup because, as I described on [tips-computer-oqo-installingDebian installing Debian on the OQO], I had already set things up so that I could get to Grub from the Windows boot manager. So the only thing left to do was to copy my /boot/grub/menu.lst on the Debian side to /boot/grub/menu.lst on the Windows side, so that I would be able to get a menu with the correct boot options (btw, even if you don't get the right menu, in Grub you can totally edit all the boot options and make up your own during bootup; pretty the "e" key to edit; it's a little bit of a pain to type everything in each boot, though, so it's easier to copy the menu over).

Copying stuff over to the windows side requires you to be able to mount Windows' NTFS filesystem in read/write mode, which requires some extra software ("ntfsmount") -- see helpful OQO administration tips & scripts for more info on that.