Difference between revisions of "Flameman/zaurus-akita"

From eLinux.org
Jump to: navigation, search
Line 291: Line 291:
reason, system crashes in suspend (device remains registered, but some
reason, system crashes in suspend (device remains registered, but some
pointers are NULL). Later kernels fixed this problem. ... 2.6.30 is still pre commit  
pointers are NULL). Later kernels fixed this problem. ... 2.6.30 is still pre commit  
> umm, i need the IrDA, too ... but it seems the IrDA transreceiver is not
> enabled: it seems it needs a poweron/off made by the max7310 i2c port
Exactly: Irda is connected to one of three serial ports of PXA270, but
the transceiver is switched by the GPIO connected to the ioexp on akita
and to the spare pin of scoop2 (internal CF slot chip) on spitz.

Revision as of 08:13, 11 June 2009



Apologize for the poor status of this ewiki, I am developing for this board, so the wiki page will be improved and completed as soon as it it will be possible

feel free to contact me (see the contact below) in case you need support.


The Target-goal of this page is

  • install uc-gentoo into mmc-sd
  • develop devices
  • make the board able to boot it
  • optimize uc-gentoo for embedded
  • produce a uc-gentoo-uclibc
  • add framebuffer and touch screen support
  • re-target all the project into "tiny PDA"

People you could contact if you need help

  • flameman, i'm currently use this board for a project, email
    • msn daredevil-coder@hotmail.it
    • email flamemaniii@gmail.com
    • irc.nick flameman (channel #edev, #oe, #zaurus)
  • you ... if you want ;-)

About this project

embedded target

About the board


Sharp has introduced a new model in its Zaurus line of Linux PDAs. The SL-C1000 is similar to the SL-C3000, but without an internal harddrive. As with previous Japan-only Zaurus models, the SL-C1000 will be available with internationalization features from a number of global resellers.

The SL-C1000 is based on a 416MHz Intel PXA270 processor. It boots from 128MB of Flash, and includes 64MB of RAM. The 3.7-inch color VGA touchscreen (640 x 480) supports 65K colors. The keyboard uses a stardard QWERTY layout.

The SL-C1000 includes memory slots for SD/MMC cards, as well as for CompactFlash cards. Additional I/O includes IrDA, USB, and LAN ports. It measures 4.9 x 3.4 x 1 inches (124 x 87 x 25mm), and weighs 10 oz (278 grams).

Processor: Intel(r) Xscale(tm) PXA270 416Mhz processor

Memory: 128MB Flash, 64MB SDRAM work area

Display: 3.7" 640x480 VGA LCD screen with 65536 colours

Keyboard & Input: Full QWERTY keyboard, touch-sensitive screen with handwriting recognition

Expansion: One slot for CompactFlash (CF) memory cards (type I and II, 3.3V cards only), one slot for Secure Digital (SD) memory cards

Connectivity: USB host port (cable supplied separately) for connecting to printers and digital cameras. USB 1.1 link for attaching to desktop PCs - Zaurus appears as a computer in the network neighbourhood. CompactFlash (CF) card slot can take Wireless LAN (802.11b), Bluetooth, GPRS, Ethernet and Modem cards (supplied separately). Infrared port (IrDA, 115kbps) for communicating with mobile phones, laptops and cameras.

Audio: 3.5mm stereo headphone socket (headphones not included with C1000). Media player plays MP3 and WMA music files, and MPEG1 and Microsoft WMV/ASF video files. Dimensions: 124mm (width) x 87mm (depth) x 25mm (height)

Weight: 278g

Battery & power: Lithium Ion battery provides 8 hours (low brightness/contrast) Electrical:

Power Connector: gnd ----(+), ground outside, +5v inside

Power supply 240V converted to 3.2V DC by AC adapter. Power consumption 3.2W

Operational restrictions: Operating temperature 5-40 degrees centigrade

The board consists of:

  • CPU : Intel(r) Xscale(tm) PXA270 416Mhz doc.pdf
  • RAM soldered 64MB SDRAM
  • LAN USBETH 10/100Mbit/sec
  • UART RS232
  • FLASH 128MB Flash
  • POWER system=3.3V, feeder={5V DC, ___}, ___ Watt
  • System PCB ___ mm x ___ mm x ___ mm
  • RTC the real time clock chip is provided by the cpu


Memory Locations

memory map of the board will be added as soon as possible

addr begin addr end area
...  ?? ram, userspace
....  ?? ram, userspace
#0x00008000 est reprsent par : 0x80 ror 24, cod par 0xC80 ;
does it means gnueabi-objdump -p vmlinux | sed -n 's/LOAD.*vaddr \([^ ]*\).*/\1/p'
found the right address (0xA0008000)?

Open questions




Sharp CE-170TS is a null modem serial cable for Zaurus. It seems to be actually the only available IOPORT serial cable working with the latest Zauruses. A bit expensive, but voltage does not conform RS-232 standard. It works nicely as a null modem with a standard PC, using a special null modem gender changer it works with a RS-232 hardware modem, but it does not work with mobile phone or GPS client cables.

You will find it (on amazon for example, $50) and it will be indicated "for sl-5500" ... well do not trust it: it will work for your c1000, too =P

antenna shields

by utx/Stanislav



Doc around


The Fn+LeftArrow / Fn+RightArrow key combination to switch between console

escape is the cancel key

atl is ??? one of the jappo key, dunno 

varia doc http://openzaurus.berlios.de/Main_Page

















hw http://tdiedrich.de/Zaurus

uboot http://www.pdaxrom.org/?q=node/89



1) irda-utils

2) mknod /dev/ircomm0 c 161 0

3) ircomm 

modprobe pxaficp_ir
modprobe ircomm
modprobe ircomm_tty
irattach irda0 -s

4) i modprobe irda too

idea GPS





i like the idea here, but let me get a few things straight:
1. are you guys trying to use the sharp i/o port's USB port?
2. if not, is this possible?
What about stuart? In case you don;t need SIR.

C-860, kernel 2.4,  irda --> ttyS01

I believe the scoop is a proprientary Sharp's ASIC, so the datasheet most probably never would be published or made public: it is an ASIC but by EPSON GA_SLA50000, that is a gate array and we probably will never know what sharp has putted into it. It is a pity.

Any of BTUART pins can be used as usualy GPIO pins. This is so called alternate GPIO function and is described in intel's datasheet. So when BTUART is disabled all its pins are working as just any other GPIO pins. And BTUART is disabled by default in kernel source.

static void __init corgi_map_io(void)

#if 0
/* This enables the BTUART */

/* setup sleep mode values */
PWER = 0x00000002;
PFER = 0x00000000;
PRER = 0x00000002;
PGSR0 = 0x0158C000;
PGSR1 = 0x00FF0080;
PGSR2 = 0x0001C004;


Images of the board




Notes, these devices are connected to ioexp:

  • IrDA on/off
  • Backlight power on/off
  • Highest bit of baclight intensity
  • Pull-up voltage for remote on/off
  • Microphone bias on/off

These devices use I2C:

  • Akita IOEXP (PXA270 I2C bus)
  • Maxim MAX7310 gpio expander
  • Wolfson Microsystems WM8750 audio chip (PXA270 I2S bus)

you need to add WM8750 and MAX7310 chips (I2C slaves). Wolfson Microsystems WM8750 audio chip and Maxim MAX7310 gpio expander chip are used in the Spitz.

Kernel <=2.6.27 have a bug: If audio initialization fails for any reason, system crashes in suspend (device remains registered, but some pointers are NULL). Later kernels fixed this problem. ... 2.6.30 is still pre commit

> umm, i need the IrDA, too ... but it seems the IrDA transreceiver is not > enabled: it seems it needs a poweron/off made by the max7310 i2c port >expander

Exactly: Irda is connected to one of three serial ports of PXA270, but the transceiver is switched by the GPIO connected to the ioexp on akita and to the spare pin of scoop2 (internal CF slot chip) on spitz.




(.) USB CATC NetMate-based Ethernet device support (EXPERIMENTAL)
(.) USB KLSI KL5USB101-based ethernet device support
(.) USB Pegasus/Pegasus-II based ethernet device support
(.) USB RTL8150 based ethernet device support (EXPERIMENTAL)

(.) Multi-purpose USB Networking Framework
(.) ASIX AX88xxx Based USB 2.0 Ethernet Adapters
         Aten UC210T
         ASIX AX88172
         Billionton Systems,USB2AR
         Buffalo LUA-U2-KTX
         Corega FEther USB2-TX
         D-Link DUB-E100
         Hawking UF200
         Linksys USB200M
         Netgear FA120
         Sitecom LN-029
         Intellinet USB 2.0 Ethernet
         ST Lab USB 2.0 Ethernet
         TrendNet TU2-ET100       
(.) CDC Ethernet support (smart devices such as cable modems)
(*) Davicom DM9601 based USB 1.1 10/100 ethernet devices
(.) GeneSys GL620USB-A based cables
(.) NetChip 1080 based cables (Laplink, ...)
(.) Prolific PL-2301/2302 based cables
(.) MosChip MCS7830 based Ethernet adapters
(.) Host for RNDIS and ActiveSync devices (EXPERIMENTAL)
(.) Simple USB Network Links (CDC Ethernet subset)
(.) Sharp Zaurus (stock ROMs) and compatible    

macbook-air MB442Z/A Apple USB Enternet Adapter

~ ASIX AX88xxx Based

AppleUSBEthernet Chipsets inside: AX88178, AX88772

Apple USB Enternet Adapter:
Version: 0.0.1
BUS Power(mA): 500
Speed: Up to 480 MB/sec
Manufacturer: Apple Inc.
Proudct ID: 0x1402

CONFIG_USB_NET_AX8817X   += asix.o

--- a/drivers/net/usb/asix.c
+++ b/drivers/net/usb/asix.c
@@ -1444,6 +1444,10 @@  static const struct usb_device_id	produc
 	// Apple USB Ethernet Adapter
 	USB_DEVICE(0x05ac, 0x1402),
 	.driver_info = (unsigned long) &ax88772_info,
+}, {
+	// Cables-to-Go USB Ethernet Adapter
+	USB_DEVICE(0x0b95, 0x772a),
+	.driver_info = (unsigned long) &ax88772_info,
 	{ },		// END







emerge net-wireless/irda-utils

modprobe pxaficp_ir

mknod /dev/ircomm0 c 161 0

modprobe ircomm

modprobe ircomm_tty

irattach irda0 -s irattach /dev/ttySx


stage3-mips3 big endian is currently running updated to 2008

CHOST="armv5te-softfloat-linux-gnueabi" CFLAGS="-O2 -pipe -march=iwmmxt -mtune=iwmmxt -msoft-float"

A shot

@17-02-2009 root=/dev/hda3



reboot+dmesg: bootloader & kernel startup

About devtools

crossbuilder script made to build up what is needed

change chost



sys-devel/gcc config issue
4.1.2 Using built-in specs.

Target: armv5te-softfloat-linux-gnueabi Configured with: /var/tmp/portage/sys-devel/gcc-4.1.2/work/gcc-4.1.2/configure --prefix=/usr --bindir=/usr/armv5te-softfloat-linux-gnueabi/gcc-bin/4.1.2 --includedir=/usr/lib/gcc/armv5te-softfloat-linux-gnueabi/4.1.2/include --datadir=/usr/share/gcc-data/armv5te-softfloat-linux-gnueabi/4.1.2 --mandir=/usr/share/gcc-data/armv5te-softfloat-linux-gnueabi/4.1.2/man --infodir=/usr/share/gcc-data/armv5te-softfloat-linux-gnueabi/4.1.2/info --with-gxx-include-dir=/usr/lib/gcc/armv5te-softfloat-linux-gnueabi/4.1.2/include/g++-v4 --host=armv5te-softfloat-linux-gnueabi --build=armv5te-softfloat-linux-gnueabi --disable-altivec --with-float=soft --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-libunwind-exceptions --disable-multilib --enable-libmudflap --disable-libssp --disable-libgcj --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu Thread model: posix gcc version 4.1.2 (Gentoo 4.1.2 p1.0.1)

gcc-4.3.2-r4 Using built-in specs.

Target: armv4tl-softfloat-linux-gnueabi Configured with: /var/tmp/portage/sys-devel/gcc-4.3.2-r4/work/gcc-4.3.2/configure --prefix=/usr --bindir=/usr/armv4tl-softfloat-linux-gnueabi/gcc-bin/4.3.2 --includedir=/usr/lib/gcc/armv4tl-softfloat-linux-gnueabi/4.3.2/include --datadir=/usr/share/gcc-data/armv4tl-softfloat-linux-gnueabi/4.3.2 --mandir=/usr/share/gcc-data/armv4tl-softfloat-linux-gnueabi/4.3.2/man --infodir=/usr/share/gcc-data/armv4tl-softfloat-linux-gnueabi/4.3.2/info --with-gxx-include-dir=/usr/lib/gcc/armv4tl-softfloat-linux-gnueabi/4.3.2/include/g++-v4 --host=armv4tl-softfloat-linux-gnueabi --build=armv4tl-softfloat-linux-gnueabi --disable-altivec --disable-fixed-point --with-float=soft --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-multilib --enable-libmudflap --disable-libssp --enable-libgomp --disable-libgcj --enable-languages=c,c++,treelang,fortran --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --with-bugurl=http://bugs.gentoo.org/ --with-pkgversion='Gentoo 4.3.2-r4 p1.7, pie-10.1.5' Thread model: posix gcc version 4.3.2 (Gentoo 4.3.2-r4 p1.7, pie-10.1.5)

./base/gdevmpla.c:284: internal compiler error: in reload_cse_simplify_operands, at postreload.c:395

kernel status

kernel fb config fbcon=rotate:1 at the bootup suspend/resume irda uart sound net note
2.6.22-z0 working working working not tested not tested not working usbdm9601 is working, hacked driver/net/usb/dm9600.c the driver cause of an issue assumed as working kernel
2.6.23 working not working, 90 degree screen at the bootup working not tested not tested not working usbdm9601 is not working cause of the usb sense When I plug earphone, there is kernel panic for NULL pointer reference. After some

debugging, I find the sharpsl_rc driver will access spitz_pcmcia_scoop[1], but that is not initialized on Akita at all. So I think maybe we should disable sharpsl_rc on Akita until it is fixed.

2.6.24 working not working, 90 degree screen at the bootup working but system panic if "fn" + arrow is pressed on the wakeup not tested not tested not working usbdm9601 is not working cause of the usb sense -
2.6.26 working not working, 90 degree screen at the bootup not working not tested not tested not working usbdm9601 is not working cause of the usb sense there is a problem with the battery recharge

Setting the keyboard

loadkeys - load keyboard translation tables

loadkeys [ -c --clearcompose ] [ -d --default ] [ -h --help ] [ -m --mktable ] [ -s --clearstrings ] [ -v --verbose ] [ filename... ]


The program loadkeys reads the file or files specified by filename.... Its main purpose is to load the kernel keymap for the console.  
If the -d (or --default ) option is given, loadkeys loads a default keymap, probably the file defkeymap.map either in //lib/kbd/keymaps or in /usr/src/linux/drivers/char. (Probably the former was user-defined, while the latter is a qwerty keyboard map for PCs - maybe not what was desired.) Sometimes, with a strange keymap loaded (with the minus on some obscure unknown modifier combination) it is easier to type `loadkeys defkeymap'.  
The main function of loadkeys is to load or modify the keyboard driver's translation tables. When specifying the file names, standard input can be denoted by dash (-). If no file is specified, the data is read from the standard input.

For many countries and keyboard types appropriate keymaps are available already, and a command like `loadkeys uk' might do what you want. On the other hand, it is easy to construct one's own keymap. The user has to tell what symbols belong to each key. She can find the keycode for a key by use of showkey(1), while the keymap format is given in keymaps(5) and can also be seen from the output of dumpkeys(1).  
If the input file does not contain any compose key definitions, the kernel accent table is left unchanged, unless the -c (or --clearcompose ) option is given, in which case the kernel accent table is emptied. If the input file does contain compose key definitions, then all old definitions are removed, and replaced by the specified new entries. The kernel accent table is a sequence of (by default 68) entries describing how dead diacritical signs and compose keys behave. For example, a line

    compose ',' 'c' to ccedilla 

means that <ComposeKey><,><c> must be combined to <ccedilla>. The current content of this table can be see using `dumpkeys --compose-only'.  
The option -s (or --clearstrings ) clears the kernel string table. If this option is not given, loadkeys will only add or replace strings, not remove them. (Thus, the option -s is required to reach a well-defined state.) The kernel string table is a sequence of strings with names like F31. One can make function key F5 (on an ordinary PC keyboard) produce the text `Hello!', and Shift+F5 `Goodbye!' using lines

    keycode 63 = F70 F71
    string F70 = "Hello!"
    string F71 = "Goodbye!" 

in the keymap. The default bindings for the function keys are certain escape sequences mostly inspired by the VT100 terminal.  
If the -m (or --mktable ) option is given loadkeys prints to the standard output a file that may be used as /usr/src/linux/drivers/char/defkeymap.c, specifying the default key bindings for a kernel (and does not modify the current keymap).  

-h --help
    loadkeys prints its version number and a short usage message to the programs standard error output and exits. 

Note that anyone having read access to /dev/console can run loadkeys and thus change the keyboard layout, possibly making it unusable. Note that the keyboard translation table is common for all the virtual consoles, so any changes to the keyboard bindings affect all the virtual consoles simultaneously.

Note that because the changes affect all the virtual consoles, they also outlive your session. This means that even at the login prompt the key bindings may not be what the user expects.   

keymaps - keyboard table descriptions for loadkeys and dumpkeys


These files are used by loadkeys(1) to modify the translation tables used by the kernel keyboard driver and generated by dumpkeys(1) from those translation tables.

The format of these files is vaguely similar to the one accepted by xmodmap(1). The file consists of charset or key or string definition lines interspersed with comments.

Comments are introduced with ! or # characters and continue to the end of the line. Anything following one of these characters on that line is ignored. Note that comments need not begin from column one as with xmodmap(1).

The syntax of keymap files is line oriented; a complete definition must fit on a single logical line. Logical lines can, however, be split into multiple physical lines by ending each subline with the backslash character (\).  
A keymap can include other keymaps using the syntax

    include "pathname" 

A character set definition line is of the form:

    charset "iso-8859-x" 

It defines how following keysyms are to be interpreted. For example, in iso-8859-1 the symbol mu (or micro) has code 0265, while in iso-8859-7 the letter mu has code 0354.  
Each complete key definition line is of the form:

    keycode keynumber = keysym keysym keysym...

keynumber is the internal identification number of the key, roughly equivalent to the scan code of it. keynumber can be given in decimal, octal or hexadecimal notation. Octal is denoted by a leading zero and hexadecimal by the prefix 0x.

Each of the keysyms represent keyboard actions, of which up to 256 can be bound to a single key. The actions available include outputting character codes or character sequences, switching consoles or keymaps, booting the machine etc. (The complete list can be obtained from dumpkeys(1) by saying dumpkeys -l .)

Each keysym may be prefixed by a '+' (plus sign), in wich case this keysym is treated as a "letter" and therefore affected by the "CapsLock" the same way as by "Shift" (to be correct, the CapsLock inverts the Shift state). The ASCII letters ('a'-'z' and 'A'-'Z') are made CapsLock'able by default. If Shift+CapsLock should not produce a lower case symbol, put lines like

    keycode 30 = +a  A

in the map file.

Which of the actions bound to a given key is taken when it is pressed depends on what modifiers are in effect at that moment. The keyboard driver supports 8 modifiers. These modifiers are labeled (completely arbitrarily) Shift, AltGr, Control, Alt, ShiftL, ShiftR, CtrlL and CtrlR. Each of these modifiers has an associated weight of power of two according to the following table:









The effective action of a key is found out by adding up the weights of all the modifiers in effect. By default, no modifiers are in effect, so action number zero, i.e. the one in the first column in a key definition line, is taken when the key is pressed or released. When e.g. Shift and Alt modifiers are in effect, action number nine (from the 10th column) is the effective one.

Changing the state of what modifiers are in effect can be achieved by binding appropriate key actions to desired keys. For example, binding the symbol Shift to a key sets the Shift modifier in effect when that key is pressed and cancels the effect of that modifier when the key is released. Binding AltGr_Lock to a key sets AltGr in effect when the key is pressed and cancels the effect when the key is pressed again. (By default Shift, AltGr, Control and Alt are bound to the keys that bear a similar label; AltGr may denote the right Alt key.)

Note that you should be very careful when binding the modifier keys, otherwise you can end up with an unusable keyboard mapping. If you for example define a key to have Control in its first column and leave the rest of the columns to be VoidSymbols, you're in trouble. This is because pressing the key puts Control modifier in effect and the following actions are looked up from the fifth column (see the table above). So, when you release the key, the action from the fifth column is taken. It has VoidSymbol in it, so nothing happens. This means that the Control modifier is still in effect, although you have released the key. Re-pressing and releasing the key has no effect. To avoid this, you should always define all the columns to have the same modifier symbol. There is a handy short-hand notation for this, see below.

keysyms can be given in decimal, octal, hexadecimal, unicode or symbolic notation. The numeric notations use the same format as with keynumber. Unicode notation is "U+" followed by four hexadecimal digits. The symbolic notation resembles that used by xmodmap(1). Notable differences are the number symbols. The numeric symbols '0', ..., '9' of xmodmap(1) are replaced with the corresponding words 'zero', 'one', ... 'nine' to avoid confusion with the numeric notation.

It should be noted that using numeric notation for the keysyms is highly unportable as the key action numbers may vary from one kernel version to another and the use of numeric notations is thus strongly discouraged. They are intended to be used only when you know there is a supported keyboard action in your kernel for which your current version of loadkeys(1) has no symbolic name.

There is a number of short-hand notations to add readability and reduce typing work and the probability of typing-errors.

First of all, you can give a map specification line, of the form

    keymaps 0-2,4-5,8,12 

to indicate that the lines of the keymap will not specify all 256 columns, but only the indicated ones. (In the example: only the plain, Shift, AltGr, Control, Control+Shift, Alt and Control+Alt maps, that is, 7 columns instead of 256.) When no such line is given, the keymaps 0-M will be defined, where M+1 is the maximum number of entries found in any definition line.

Next, you can leave off any trailing VoidSymbol entries from a key definition line. VoidSymbol denotes a keyboard action which produces no output and has no other effects either. For example, to define key number 30 to output 'a' unshifted, 'A' when pressed with Shift and do nothing when pressed with AltGr or other modifiers, you can write

    keycode  30 = a A

instead of the more verbose

    keycode  30 = a A       VoidSymbol      VoidSymbol \
                    VoidSymbol VoidSymbol VoidSymbol ...

For added convenience, you can usually get off with still more terse definitions. If you enter a key definition line with only and exactly one action code after the equals sign, it has a special meaning. If the code (numeric or symbolic) is not an ASCII letter, it means the code is implicitly replicated through all columns being defined. If, on the other hand, the action code is an ASCII character in the range 'a', ..., 'z' or 'A', ..., 'Z' in the ASCII collating sequence, the following definitions are made for the different modifier combinations, provided these are actually being defined. (The table lists the two possible cases: either the single action code is a lower case letter, denoted by 'x' or an upper case letter, denoted by 'Y'.)

        x                      Y
        X                      y
        x                      Y
        X                      y
        Control_x              Control_y
        Control_x              Control_y
        Control_x              Control_y
        Control_x              Control_y
        Meta_x         Meta_Y
        Meta_X         Meta_y
        Meta_x         Meta_Y
        Meta_X         Meta_y
        Meta_Control_x Meta_Control_y
        Meta_Control_x Meta_Control_y
        Meta_Control_x Meta_Control_y
        Meta_Control_x Meta_Control_y

All the previous forms of key definition lines always define all the M+1 possible modifier combinations being defined, whether the line actually contains that many action codes or not. There is, however, a variation of the definition syntax for defining only single actions to a particular modifier combination of a key. This is especially useful, if you load a keymap which doesn't match your needs in only some modifier combinations, like AltGr+function keys. You can then make a small local file redefining only those modifier combinations and loading it after the main file. The syntax of this form is:

{ plain | <modifier sequence> } keycode keynumber = keysym

, e.g.,

    plain keycode 14 = BackSpace
    control alt keycode 83 = Boot
    alt keycode 105 = Decr_Console
    alt keycode 106 = Incr_Console

Using "plain" will define only the base entry of a key (i.e. the one with no modifiers in effect) without affecting the bindings of other modifier combinations of that key.  
In addition to comments and key definition lines, a keymap can contain string definitions. These are used to define what each function key action code sends. The syntax of string definitions is:

    string keysym = text 

text can contain literal characters, octal character codes in the format of backslash followed by up to three octal digits, and the three escape sequences \n, \\, and \", for newline, backslash and quote, respectively.  
Then there may also be compose definitions. They have syntax

    compose 'char' 'char' to 'char' 

and describe how two bytes are combined to form a third one (when a dead accent or compose key is used). This is used to get accented letters and the like on a standard keyboard.  
Various abbreviations can be used with kbd-0.96 and later.

strings as usual
    Defines the usual values of the strings (but not the keys they are bound to). 
compose as usual for "iso-8859-1"
    Defines the usual compose combinations. 

To find out what keysyms there are available for use in keymaps, use the command

    dumpkeys --long-info

Unfortunately, there is currently no description of what each symbol does. It has to be guessed from the name or figured out from the kernel sources.

(Be careful to use a keymaps line, like the first line of `dumpkeys`, or "keymaps 0-15" or so.)

The following entry exchanges the left Control key and the Caps Lock key on the keyboard:

    keycode  58 = Control
    keycode  29 = Caps_Lock

Key number 58 is normally the Caps Lock key, and key number 29 is normally the Control key.

The following entry sets the Shift and Caps Lock keys to behave more nicely, like in older typewriters. That is, pressing Caps Lock key once or more sets the keyboard in CapsLock state and pressing either of the Shift keys releases it.

    keycode  42 = Uncaps_Shift
    keycode  54 = Uncaps_Shift
    keycode  58 = Caps_On

The following entry sets the layout of the edit pad in the enhanced keyboard to be more like that in the VT200 series terminals:

    keycode 102 = Insert
    keycode 104 = Remove
    keycode 107 = Prior
    shift keycode 107 = Scroll_Backward
    keycode 110 = Find
    keycode 111 = Select
    control alt   keycode 111 = Boot
    control altgr keycode 111 = Boot

Here's an example to bind the string "du\ndf\n" to the key AltGr-D. We use the "spare" action code F100 not normally bound to any key.

    altgr keycode 32 = F100
    string F100 = "du\ndf\n"

showkey showkey - examine the codes sent by the keyboard

showkey [-h|--help] [-a|--ascii] [-s|--scancodes] [-k|--keycodes]  


showkey prints to standard output either the scan codes or the keycode or the `ascii' code of each key pressed. In the first two modes the program runs until 10 seconds have elapsed since the last key press or release event, or until it receives a suitable signal, like SIGTERM, from another process. In `ascii' mode the program terminates when the user types ^D.

When in scancode dump mode, showkey prints in hexadecimal format each byte received from the keyboard to the standard output. A new line is printed when an interval of about 0.1 seconds occurs between the bytes received, or when the internal receive buffer fills up. This can be used to determine roughly, what byte sequences the keyboard sends at once on a given key press. The scan code dumping mode is primarily intended for debugging the keyboard driver or other low level interfaces. As such it shouldn't be of much interest to the regular end-user. However, some modern keyboards have keys or buttons that produce scancodes to which the kernel does not associate a keycode, and, after finding out what these are, the user can assign keycodes with setkeycodes(8).

When in the default keycode dump mode, showkey prints to the standard output the keycode number or each key pressed or released. The kind of the event, press or release, is also reported. Keycodes are numbers assigned by the kernel to each individual physical key. Every key has always only one associated keycode number, whether the keyboard sends single or multiple scan codes when pressing it. Using showkey in this mode, you can find out what numbers to use in your personalized keymap files.

When in `ascii' dump mode, showkey prints to the standard output the decimal, octal, and hexadecimal value(s) of the key pressed, according to he present keymap.  

-h --help
    showkey prints to the standard error output its version number, a compile option and a short usage message, then exits. 
-s --scancodes
    Starts showkey in scan code dump mode. 
-k --keycodes
    Starts showkey in keycode dump mode. This is the default, when no command line options are present. 
-a --ascii
    Starts showkey in `ascii' dump mode. 


This describes how to give network access to Zaurus via ethernet bridging with a PC running Gentoo. This allows a USB-connected Zaurus to appear as another host on the same network as the PC. Bridging is useful only if you can allocate an IP address for the Zaurus that is on the same network as the PC (e.g. you are connected to a private network). Bridging is not appropriate if your PC is connected directly to the internet (via a cable/adsl/modem) and thus has a public IP address, in this case see this howto.

Prerequisites for Gentoo host machine

  1. Bridging is supported in the current 2.4 and 2.6 kernels. If you configure your own, you need CONFIG_BRIDGE together with whatever kernel options are necessary to get usbnet working with your Zaurus, for a SL-5500 (collie) these are CONFIG_USB_USBNET and CONFIG_USB_NET_ZAURUS. I compiled all these as modules and they get loaded automatically when required.
  2. baselayout-1.11.11 or later
  3. The brctl command is provided by the bridge-utils package: 
emerge -n net-misc/bridge-utils

Configuring the Gentoo machine

The interface with the Zaurus, usb0, will be combined with eth0 in a virtual interface called br0, this is what will be assigned the IP configuration for the PC.

First you need to tell the Gentoo RC system about usb0 and br0 (I'll assume eth0 is already configured). This is done by creating symbolic links from net.lo to net.usb0 and net.br0 in /etc/init.d.

cd /etc/init.d
ln -s net.lo net.usb0
ln -s net.lo net.br0

Next you tell Gentoo how to configure the interfaces. This is done in /etc/conf.d/net. With baselayout-1.11.x, this should contain:

# Add eth0 to the bridge.  usb0 will be added by hotplug when it comes up.

# Make sure eth0 gets configured before the bridge.
depend_br0() {
  need net.eth0

# Ensure that eth0 and usb0 don't get configured by DHCP
# The only interface needing IP configuration is br0
config_eth0=( "null" )
config_usb0=( "null" )

# Give the bridge an IP configuration, either static:
config_br0=( "" )
# or by DHCP:
# config_br0=( "dhcp" )
# This is the address by which the Gentoo machine will be known on the network

# When you plug in the Zaurus, hotplug creates the usb0 interface and
# issues a network hotplug event which causes Gentoo to configure the 
# interface.  This function causes it to be added to the bridge:
postup() {
      local iface=${1}
      if [ ${iface} == usb0 ]; then
              brctl addif br0 ${iface}
      elif [ ${iface} == br0 ] && ifconfig -a | grep usb0 > /dev/null ; then
              # if usb0 is already present when br0 is configured (i.e. the
              # Zaurus was plugged in and switched on when the PC was booted
              # then add it to the bridge.
              brctl addif br0 usb0

With baselayout-1.12 and later this simplifies to:

# Add port to bridge br0

# dynamically add usb0 when the interface comes up

# Configure the ports to null values so dhcp does not get started
config_eth0=( "null" )
config_usb0=( "null" )

# Give the bridge an address - dhcp
config_br0=( "dhcp" ) # or e.g. ( "" ) for static config

# make sure eth0 is up before configuring br0
depend_br0() {
        need net.eth0

Obviously change the IP addresses to suit.

Configuring the Zaurus

Use the Network settings GUI to configure usbd0. Either use DHCP, or a static config on the same subnet as the PC, e.g.:

Automatically bring up
IP Address =
Subnet Mask =
Gateway =      (same as the PC)
First DNS =   (same as the PC)
Second DNS =   (same as the PC)

Test the configuration

On the Gentoo box:

/etc/init.d/net.eth0 pause
/etc/init.d/net.br0 start

Then plug in and switch on the PDA and check that both the PC and the PDA have network access.

Make the configuration permanent

On the Gentoo box:

rc-update del net.eth0
rc-update add net.br0 default


I found that the MTU assigned to usbd0 on the Zaurus was diferent from that assigned to usb0 on the PC:

gentoo # ifconfig usb0
usb0    Link encap:Ethernet  HWaddr 66:5E:F2:2A:07:79
        RX packets:198 errors:0 dropped:0 overruns:0 frame:0
        TX packets:3368 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:20256 (19.7 Kb)  TX bytes:349616 (341.4 Kb)
collie # ifconfig usbd0
usbd0   Link encap:Ethernet  HWaddr 40:00:01:00:00:01
        inet addr:  Bcast:  Mask:
        RX packets:3459 errors:2 dropped:2 overruns:0 frame:2
        TX packets:251 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:100

This does not prevent logging into the Zaurus using ssh but does prevent downloading files larger than about 1kB. I am not sure why this happens, it may be related to this kernel bug report

The solution is to reduce the MTU on the Zaurus end. You can configure the Zaurus to do this automatically by editing /etc/network/interfaces. Find the section starting 'iface usbd0' and add the following line:

up ifconfig usbd0 mtu 1494


ethernet bridging http://www.linuxfoundation.org/en/Net:Bridge

usbnet Driver Framework http://www.linux-usb.org/usbnet/

Gentoo Network Configuration http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=4