UP  |  HOME

PalmOS PDAs (Handspring Visor, Symbol)

Table of Contents

Collection

PDAs

Make Year Model OS CPU Memory Color Note
Symbol 2006 SPT1550 4.1.2 Motorola DragonBall VZ (MC68VZ328) - 33MHz 8MB Dark Blue Laser barcode scanner
Visor 2001 Neo 3.5.2H3.0 Motorola DragonBall EZ (MC68VZ328) - 33MHz 8MB Smoke  
Visor 2000 Platinum 3.5.2H1.2 Motorola DragonBall EZ (MC68VZ328) - 33MHz 8MB Silver  
Visor 1999 Deluxe 3.1H2 Motorola DragonBall EZ (MC68EZ328) - 20MHz 8MB Graphite Have 2 units
Visor 1999 Deluxe 3.1H2 Motorola DragonBall EZ (MC68EZ328) - 20MHz 8MB Translucent Blue LCD column ribbon damaged near center

Accessories

  • USB Sync cable
  • Serial Docking Cradle
  • Targus Stowaway Portable Keyboard (PA800) - supports a dvorak layout, nice
  • HandyGPS HG2000
  • Handspring 8MB Flash Module
  • SiPix Pocket Printer A6

Hardware Interchangeability

TODO: Visors share the same external shell and springboard expansion slot. I'd like to document which internal components are interchangeable between models.

PalmOS 3.1 Limitations and Fixes

  • Menu dropdown requires using graffiti area icons. This can be worked around with HackMaster and MenuHack.
  • NiMH Battery aren't natively supported even with tools like BatPrefs. Battery Meter Hack provides a battery status that replaces the stock status. Requires HackMaster
  • IR Hotsync isn't supported. Based on this macworld hint you need to install two files from Palm's IR Enhancement. A Handspring Visor Solo/Deluxe needs SerIrCommLib.prc and SerialIrPnl.prc. Loading AMX.prc or IrLib.prc will break things and require a hard reset. Additionally you need beam sync enabler. Install bsync-e.prc for the english version. The menu is a bit glitchy compared to newer Palm OS.
    • Downloads are hard to find so here are some sources (download at your own risk):
    • IR Enhancement 1 2
    • Beam Sync 1 2 3
  • Sipix A6 Print app doesn't render correctly or place it's menu items. Use IrPrint instead.

Syncing

Using a serial dock with usb-serial adapter has been the simplest experience. Other ways are more finicky, but I described my experience with them below.

USB with J-Pilot

I found with the Visor I have to start hotsyncing, count 4, then click to sync in J-pilot. Others have reported different timing so it may vary with your hardware/counting speed.

IrDA on modern Linux

I picked up a Actisys ACT-IR4002US USB IrDA adapter. This is a MosChip MCS7780 based device.

The Linux irda drivers were removed sometime prior to 4.17. I found a maintained out of tree build at https://github.com/cschramm/irda.

It's also necessary to build irattach from irda-utils

Build irda modules
git clone https://github.com/cschramm/irda
cd irda
autoconf -f
./configure
sudo dkms add src
sudo dkms install "irda/$(git show --pretty=format:"%cd~%h" --date="format:%Y%m%d" | head -1)"

For secure boot machines you may need to sign the modules to load them. This was my first time doing so, and I followed this guide to create a Machine Owner Key. For these DKMS modules you just need to sign the modules so skip the kernel signing instructions.

Build irattach
tar xf irda-utils-0.9.18.tar.gz
cd irda-utils-0.9.18/irattach
make
sudo install irattach /usr/local/sbin/

Setup and sync the manual way

Attach irda0 interface to /dev/ircomm0
sudo modprobe ircomm_tty
sudo irattach irda0 -s

In J-Pilot go to File > Preferences, Settings Tab. Set the sync port to other, and enter /dev/ircomm0. I left serial rate at 115200.

If J-Pilot crashes the process may remain behind and hold the ircomm0 device. Until it is killed a new J-Pilot instance won't be able to sync.

Attempt at creating a udev rule (failed, left for future reference)

Create a udev rule to run irattach on device connection. Since irattach is a long-running process, and needs to be killed on device removal we handle this with a systemd unit.

Unfortunately systemd or udev are broken or beyond my understanding. Device removal is broken (see https://github.com/systemd/systemd/issues/7587). Half the time systemd kills irattach after it runs it.

Listing 1: /etc/udev/rules.d/66-irda.rules (only add rule really works)
ACTION=="add", SUBSYSTEM=="net", KERNEL=="irda0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="irattach.service", ENV{SYSTEMD_ALIAS}="/sys/subsystem/net/devices/actisys"
ACTION=="remove", SUBSYSTEM=="net", KERNEL=="irda0", TAG+="systemd", +=RUN{"systemctl stop --no-block irattach.service"}
ACTION=="remove", SUBSYSTEM=="net", ENV{PRODUCT}=="9710/7780/*" TAG+="systemd", +=RUN{"systemctl stop --no-block irattach.service"}
Listing 2: /etc/systemd/system/irattach.service (not working)
[Unit]
Description=irattach for actisys (mcs7780) irda device

[Service]
GuessMainPID=yes
Type=forking
ExecStart=/usr/local/sbin/irattach irda0 -s
ExecStop=kill $MAINPID

[Install]
WantedBy=multi-user.target