Flameman/zaurus-akita

= zaurus-akita-Flameman =

these pages are still in proof version, be patient i am spending my free time developing for the zaurus ... i can assure we have a lot of things to fix up =P

Note
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.

Introduction
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 ;-)


 * buglist http://bugs.openembedded.net/buglist.cgi?bug_status=REOPENED&bug_status=CONFIRMED&bug_status=ASSIGNED&bug_status=UNCONFIRMED&bug_status=NEEDSINFO&field0-0-0=product&type0-0-0=substring&value0-0-0=akita&field0-0-1=component&type0-0-1=substring&value0-0-1=akita&field0-0-2=short_desc&type0-0-2=substring&value0-0-2=akita&field0-0-3=status_whiteboard&type0-0-3=substring&value0-0-3=akita&field0-0-4=longdesc&type0-0-4=substring&value0-0-4=akita&cmdtype=&remaction=&GoAheadAndLogIn=1

my bug http://bugs.openembedded.net/show_bug.cgi?id=5152

About this project
embedded target

Overview
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).

-

specifications
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

-

more specifications
SPECIFICATIONS

Display Type: DFSTN LCD, Touch Screen Finger or Stylus Operation.

Display Resolution: 320 X 240 dots (up to 65 char. X 20 lines)

Display Physical Size: 4.0" X 2.6"

On Board RAM: 1MB (approx. 665K user area) -

* Appointments capacity: Approx. 9,600 entries * Contacts capacity: Approx. 9,900 entries

These capacities assume the following average entry sizes and only apply when all the available memory is committed to a single function.

* Appointments: 32 characters/entry * Contacts: 16 characters/entry in the name field, 12 characters/entry in the number field

Maximum Data Per Entry:

* Documents: 16 Kb   * Outlines: 32Kb for an entire outline, 2Kb for each topic * Contacts/Data Files: 2 Kb for text data, 61.7Kb for graphics data * Others: 2Kb

Other Features: Secret function, data transfer, keyword search, messages, etc.

Calculator:

* Digits: 10 * Functions: Addition, subtraction, multiplication, division, constant, square root, percent, memory calculation, date calculation, paperless printer.

Operating Environment: 32 deg. F to 104 deg. F (0 deg. C to 40 deg. C)

Weight: 10.88oz.

Size: 6.3" X 3.5" X 1"

Batteries: 2X AA (operating batteries) plus 1X CR-2032 (backup battery)

Battery Life: Up to 100 hours

AC Adapter: EA-23A and CE-BK1 battery pack (both optional).

IR Send Distance:

* 50 cm (20 inches) maximum at speeds of 9600 bps to 115 Kbps using IrDA-compatible protocol. * 50 cm (20 inches) maximum at speeds of 9600 bps to 115 Kbps using Sharp IR (ASK) protocol.

IR distance may change depending on the system used.

Serial Port: 15 pin; connect to a fax/modem or transfer data to your PC.

Infrared Port: IrDA compatible Infrared Communications; connect to a PC, Macintosh, PC Printer, or another Zaurus or Wizard without wires or cables.

Akita..Spitz / Zaurus C-1000..C-3000 power questions
I did some measurements of spitz battery subsystem; maybe they are useful for someone.

Unfortunately, concistent numbers are quite hard: longer/thinner cables mean lower voltage and also lower currents :-(. I get quite consistents 5V at power supply, but it goes down to 4.5..4.2V when it reaches zaurus behind ampermeter. (Is zaurus even able to charge battery properly from such low voltage?)

One big surprise was wlan CF card, eating +200mA when initialized.

I'm working on drivers/power/spitz_battery driver, and I'll need to know conversion between ADC readings and milivolts; does someone have those?

Does someone have better/more reliable/other power consumption numbers?

Idle, charging, no backlight, linux 2.6.26: 200mA @ 4.8V bl 1:                  310mA bl 10:                 315mA bl 20                  340mA bl 30:                 390mA bl 40:                 440mA bl 47:                 445mA disk is spinning:                      +50mA find /:                               +200mA cat /dev/zero:                        +100mA make:                                 +240mA

charging, powerdown:                   380mA..440mA charging, ROM menu:                    550mA D+M monitor, not charging:             170mA D+M monitor, half charging:            280mA D+M monitor, full charging:            480mA..550mA

Charging in ROM, from empty @ 8:35:    610mA 8:38:    555mA 8:45:    545mA 8:50:    540mA 9:01:    540mA 9:18:    530mA 9:36:    520mA 9:45:    505mA 9:51:    480mA 10:15:    365mA 10:48:    250mA 11:01:    225mA 11:31:    180mA 11:38:    170mA 12:48:     80mA, charger LED is off.

Measured @ li-ion battery. ROM                                    <7mA Linux 2.6.26 suspend:                  7.5mA, 10mA?! Linux 2.6.26, fully running, charger connected: 50uA :-(                                               100mA charge

The board consists of

 * CPU : Intel(r) Xscale(tm) PXA270 416Mhz [[Media:doc.pdf|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


 * CPU_TYPE   PXA2
 * SYSTEM_TYPE ZAURUS-C1000

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

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

Open questions -- ...

uart
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

http://www.oesf.org/forum/index.php?showforum=149

http://www.oesf.org/forum/index.php?showtopic=26261

Doc around
KB

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

escape is the cancel key

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

forum http://forum.soft32.com/linux/29-rc1-zaurus-spitz-ftopict475511.html

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

http://www.oesf.org/forum/index.php?showtopic=13238

http://carme.bfh.ch/downloads/Processor_Manuals/XSCALE/XSCALE_PXA27x_Family_Design_Guide_28000102.pdf

http://digit.que.ne.jp/visit/index.cgi?Linux%A5%B6%A5%A6%A5%EB%A5%B9%B3%AB%C8%AF%A5%E1%A5%E2%2F%A5%CF%A1%BC%A5%C9%A5%A6%A5%A7%A5%A2%2FC700%A5%E1%A5%E2%A5%EA%C1%FD%C0%DF

http://www.iral.com/~albertr/linux/zaurus/wireless/

http://www.oesf.org/forum/index.php?showtopic=13562

http://www.rpsys.net/openzaurus/

http://linuxdevices.com/news/NS5128534085.html

http://www.penguin.cz/~utx/zaurus/

http://www.penguin.cz/~utx/zaurus/photos#ce-170ts

http://www.oesf.org/index.php?title=System

ftp://pda.gentoo.ru/projects/handhelds/zaurus-c1000/

http://stuvel.eu/zaurus

http://www.angstrom-distribution.org/c1000-install-instructions

http://www.angstrom-distribution.org/unstable/autobuild/akita/

http://www.angstrom-distribution.org/demo/kexecboot/

http://www.h5.dion.ne.jp/~rimemoon/zaurus/memo_003.htm

hw http://tdiedrich.de/Zaurus

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

IRDA

http://www.oesf.org/forum/index.php?s=554c57276527ae8d0ad02a12001344b1&showtopic=25313&st=0&p=173339&#entry173339

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

wiki.navit-project.org

USB

http://en.wikipedia.org/wiki/Universal_Serial_Bus#Types_of_USB_connector

http://en.wikipedia.org/wiki/USB_On-The-Go

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) { pxa_map_io; iotable_init(corgi_io_desc);

/* This enables the BTUART */ CKEN |= CKEN7_BTUART; set_GPIO_mode(GPIO42_BTRXD_MD); set_GPIO_mode(GPIO43_BTTXD_MD); set_GPIO_mode(GPIO44_BTCTS_MD); set_GPIO_mode(GPIO45_BTRTS_MD);
 * 1) if 0
 * 1) endif

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

Images of the board




hardware
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-ethernet
(.) 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 };

Hack
PCB.

irda
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

uc-gentoo
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

stage3
http://www.gtlib.gatech.edu/pub/gentoo/releases/arm/autobuilds/20090524/armv4tl-softfloat-linux-gnueabi/

About devtools
crossbuilder script made to build up what is needed

change chost
http://www.gentoo.org/doc/en/change-chost.xml

toolchain
using external toolchain http://labs.kernelconcepts.de/Tools/Toolchains/

2.6.23
the current kernel i am running

2.6.26-rp
It is pretty stable, only few crashes in year (all of them are related to hostap_cs driver). RP kernel has a few patches above vanilla: remote control and resume fix. See OpenEmbedded for the complete recipe or my web page.

2.6.26-RP has also several issues: for vanilla).
 * Frame buffer size switching does not work.
 * USB-OTG auto host/client switching is not yet implemented (still valid
 * USB client mode has a lot problems.
 * suspend/resume is still issued

about dev 2.6.30

 * email, from Stanislav Brabec a me, Pavel ***

Hallo.

I just improved my script[1] to build both spitz and akita in parallel. Configs and modules are available with the same name suffix.

http://www.penguin.cz/~utx/zaurus/feed/images/

I spent some time to provide a config file with recommended drivers for all chips.

akita and spitz images are in sync, the only differences are kernel command line and CONFIG_GPIO_PCA953X=y.

linux-2.6.30 works for me with known problems:

- Problems with resume. Pavel's patches from arm list fix resume at cost of broken offline charging and broken serial port after resume.

- UDC does not work

- frame buffer mode 320x240

- OTG is not yet implemented

kernel-build.sh
[1] http://www.penguin.cz/~utx/zaurus/feed/tools/kernel-build.sh


 * 1) !/bin/bash

OE_BUILD_DIR=/OE/build/tmp

export PATH=$PATH:$OE_BUILD_DIR/cross/armv5te/bin

function make_kernel {

rm -rf INSTALL mkdir -p INSTALL/boot make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 zImage || exit make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 || exit make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 install || exit make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 zinstall || exit make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 modules_install || exit rm 2>/dev/null INSTALL/boot/*.old cd INSTALL cd boot mkdir -p $OE_BUILD_DIR/deploy/glibc/images/$1 for KERNEL in vmlinuz* ; do	cp -a $KERNEL $OE_BUILD_DIR/deploy/glibc/images/$1/${KERNEL/vmlinuz/zImage}-$1.bin done cd .. tar -zcf $OE_BUILD_DIR/deploy/glibc/images/$1/modules${KERNEL/vmlinuz}-$1.tgz lib cp -a ../.config $OE_BUILD_DIR/deploy/glibc/images/$1/config${KERNEL/vmlinuz}-$1 tar -zcf ../../$1${KERNEL/vmlinuz}-bin.tar.gz * cd ..
 * 1) make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 oldconfig || exit

}

if test -z "$1" ; then

sed -i 's/CONFIG_GPIO_PCA953X=y/# CONFIG_GPIO_PCA953X is not set/;s@root=/dev/mtdblock2 rootfstype=jffs2@root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw@' .config make_kernel spitz sed -i 's/# CONFIG_GPIO_PCA953X is not set/CONFIG_GPIO_PCA953X=y/;s@root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw@root=/dev/mtdblock2 rootfstype=jffs2@' .config make_kernel akita
 * 1) sed -i 's/CONFIG_GPIO_PCA953X=y/# CONFIG_GPIO_PCA953X is not set/;s@root=/dev/mtdblock2 rootfstype=jffs2@root=/dev/hda1 rootfstype=ext3 rootdelay=1 rw@' .config

else make ARCH=arm CC=arm-angstrom-linux-gnueabi-gcc LD=arm-angstrom-linux-gnueabi-ld INSTALL_PATH=$PWD/INSTALL/boot INSTALL_MOD_PATH=$PWD/INSTALL -j8 "$@" fi

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

DESCRIPTION

The program loadkeys reads the file or files specified by filename.... Its main purpose is to load the kernel keymap for the console. RESET TO DEFAULT 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'. LOAD KERNEL KEYMAP 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). LOAD KERNEL ACCENT TABLE 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 <,> must be combined to. The current content of this table can be see using `dumpkeys --compose-only'. LOAD KERNEL STRING TABLE 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. CREATE KERNEL SOURCE TABLE 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). OTHER OPTIONS

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

WARNING 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
DESCRIPTION

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 (\). INCLUDE FILES A keymap can include other keymaps using the syntax

include "pathname"

CHARSET DEFINITIONS 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. COMPLETE KEYCODE DEFINITIONS 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:

modifier weight Shift

1    AltGr

2    Control

4    Alt

8    ShiftL

16    ShiftR

32    CtrlL

64    CtrlR 128

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'.)

modifier symbol none x                     Y    Shift X                     y    AltGr x                     Y    Shift+AltGr X                     y    Control Control_x             Control_y Shift+Control Control_x             Control_y AltGr+Control Control_x             Control_y Shift+AltGr+Control Control_x             Control_y Alt Meta_x        Meta_Y Shift+Alt Meta_X        Meta_y AltGr+Alt Meta_x        Meta_Y Shift+AltGr+Alt Meta_X        Meta_y Control+Alt Meta_Control_x Meta_Control_y Shift+Control+Alt Meta_Control_x Meta_Control_y AltGr+Control+Alt Meta_Control_x Meta_Control_y Shift+AltGr+Control+Alt Meta_Control_x Meta_Control_y

SINGLE MODIFIER DEFINITIONS 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 | } 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. STRING DEFINITIONS 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. COMPOSE DEFINITIONS 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. ABBREVIATIONS 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.

EXAMPLES (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]

DESCRIPTION

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. OPTIONS

-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.

bridging
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:

bridge_br0="eth0" depend_br0 { need net.eth0 } config_eth0=( "null" ) config_usb0=( "null" ) config_br0=( "192.168.2.10/24" ) gateway="br0/192.168.2.1" 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       fi }
 * 1) Add eth0 to the bridge.  usb0 will be added by hotplug when it comes up.
 * 1) Make sure eth0 gets configured before the bridge.
 * 1) Ensure that eth0 and usb0 don't get configured by DHCP
 * 2) The only interface needing IP configuration is br0
 * 1) Give the bridge an IP configuration, either static:
 * 1) or by DHCP:
 * 2) config_br0=( "dhcp" )
 * 3) This is the address by which the Gentoo machine will be known on the network
 * 1) When you plug in the Zaurus, hotplug creates the usb0 interface and
 * 2) issues a network hotplug event which causes Gentoo to configure the
 * 3) interface.  This function causes it to be added to the bridge:

With baselayout-1.12 and later this simplifies to:

bridge_br0="eth0" bridge_add_usb0="br0" config_eth0=( "null" ) config_usb0=( "null" ) config_br0=( "dhcp" ) # or e.g. ( "192.168.2.0/24" ) for static config depend_br0 { need net.eth0 }
 * 1) Add port to bridge br0
 * 1) dynamically add usb0 when the interface comes up
 * 1) Configure the ports to null values so dhcp does not get started
 * 1) Give the bridge an address - dhcp
 * 1) make sure eth0 is up before configuring br0

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 = 192.168.2.50 Subnet Mask = 255.255.255.0 Gateway = 192.168.2.1     (same as the PC) First DNS = 192.168.2.10  (same as the PC) Second DNS = 192.168.2.1  (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

Troubleshooting
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 UP BROADCAST RUNNING MULTICAST MTU:1494  Metric:1 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:192.168.2.50 Bcast:192.168.2.255  Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500  Metric:1 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