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
andSerialIrPnl.prc
. LoadingAMX.prc
orIrLib.prc
will break things and require a hard reset. Additionally you need beam sync enabler. Installbsync-e.prc
for the english version. The menu is a bit glitchy compared to newer Palm OS. - 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
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.
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
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.
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"}
[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