Saturday, September 16, 2023

The Fossil Wrist PDA becomes a tiny Gopher client (with Overbite Palm 0.3)

I don't always often wear watches. But when I do, I prefer Palm PDAs. Wired to my wrist.
Announced at COMDEX in 2001 but infamously stalled, cancelled and revived prior to release in January 2005, it's still not much bigger than my wife's Apple watch:
The opinion of reviewers at the time was something like "nice try anyway." Battery estimates were overoptimistic, some buttons were missing, and the CPU and operating system were already outdated. Nevertheless, it was a real Palm OS PDA that could sync to your desktop and run real Palm OS applications, complete with a tiny screen and a ludicrously tiny stylus.

But little was said at the time about connectivity and networking. It could IR-beam (consuming the battery) and sync, but other than muted complaints about missing Bluetooth (which would have consumed even more battery), no one said anything one way or the other about getting it on the Internet. And I'm all about Palm devices on the Internet.

It turns out there's a reason for that, and we're going to patch the operating system so we can make the Fossil Wrist PDA into what may be the smallest (and first wrist-mounted) Gopher client. That also required an update to the Overbite Palm Gopher client (which you'll want for your 68K Palm anyway), and then there's the matter of the battery refusing to charge as well. And finally, we want to make all of this portable!

But let's start with the history first ...

Fossil (still around) had been founded in 1984 as importer-wholesaler Overseas Products; Far East-produced fashion watches were initially only part of their early product lines. The company noticed that the Swatch-esque watches sold poorly in a market then saturated with them, but their retro-styled ones sold rather better and eventually dominated their entire sales mix. In 1987 the business was formally renamed Fossil and expanded the watch line with personal accessories like keychains and organizers and leather goods like wallets and belts, selling from their own brick-and-mortar stores in 1995. By 2000 they would offer a full line of luxury goods including sunglasses, backpacks, clothing, handbags and jewelry. In 2002 Fossil made four out of every ten fashion watches sold in the United States with total sales of over US$650 million (in 2023 about $1.1 billion). Their watches sold under their Fossil (still are) and Abacus (retired) brands, among others, as well as manufacturing and importing watches for other fashion retailers.

The history of the smartwatch is nearly as long as the laptop. That might be another story for another day, but many of you either know or had the 1980s Seiko and Seiko Epson watches like the Data-2000 and RC-1000, the first of the series to sync with a computer (using RS-232); the 1994 Timex Datalink offered optical synchronization — i.e., your monitor flashed signals at its photodetector — with Microsoft Schedule+, and Steve Mann developed what is considered the first Linux-based smartwatch in 1999.

In that context it's not so strange that Fossil was looking at a high-tech watch as a hook for new customers, and the Fossil Wrist PDA actually was only one of two smartwatch initiatives the company was then working on. In 1999, Fossil's VP of technology development Donald Brewer started experimenting with Palm OS, at that time the PDA market leader, to determine its suitability in a watch form factor. Microsoft had its own separate idea, an FM radio-transmitted one-way communications platform that came to be known as SPOT (Smart Personal Objects Technology), and approached the company as a potential partner in 2000. Fossil management decided to pursue both concepts.

The Palm device was rushed to the public first in COMDEX 2001. What was called the FX2001 was a humongous device even for the time, measuring 60mm x 47mm x 16mm, or nearly two and a half inches in its greatest dimension and two-thirds of an inch thick. It had 2MB of RAM and 2MB of flash, and like most low-end Palms of the era ran a Motorola DragonBall VZ MC68VZ328 as the CPU at 33MHz.

Attendees were impressed at what it could do but not at its size or weight, and neither was Microsoft, concerned about what the SPOT watch prototype might end up looking like, nor upper Fossil executives. Brewer placated Microsoft and managed to wangle a second chance in 2002, working with Microsoft contractor Flextronics to shrink down the case, PCB and battery. Because the Palm OS at the time could not cope with screen sizes smaller than 160x160, and the only suitably sized screen then on the market was a 90x126 LCD for cell phones, Fossil had to get new, smaller one-inch square 160x160 LCDs custom-made; embarking on a rewrite of the OS would have been impractical and fraught with compatibility issues. On top of all that, the prototype cases had to be hand-tooled the day before the next COMDEX in November 2002 because of a manufacturing error where the internal cavity was too thin.

This new iteration was better received and even won a Best of COMDEX award, but Fossil continued to have technical issues with the display's digitizer and backlight, and kept pushing the release date forward — first into June of 2003, then July, then into September, and finally on indefinite hiatus. Meanwhile, the first Fossil Wrist PDA came out in 2002 — for PocketPC. The FX2002, sold as the "Fossil Wrist PDA PC" and which required a less demanding screen and form factor, was a one-way device that could receive PDA data either beamed from a compatible PocketPC handheld or synced to your Windows desktop. It was limited in functionality and didn't sell well. However, Fossil's Microsoft SPOT watch shipped to good reviews as the Fossil Wrist NET in January 2004. It and other vendors' SPOT watches required a subscription to Microsoft's MSN Direct service at $59/year [2023 dollars about $95]; these watches are essentially doorstops now as MSN Direct transmissions on partner FM radio stations ceased in 2012. (Too bad, since Microsoft essentially billed it as the official watch of sex and Spike Lee. Who knew staring at your watch all the time could get you girls? My wife says I can't have one.)

As for the Palm device, Fossil separately announced in January 2004 that the manufacturing problems it was having with Flextronics were intractable, and it would scrap the unit and cancel all existing preorders. Instead, Fossil stated they intended to release a cheaper, upgraded version later that year partially to overcome the production issues but also to upgrade the CPU and RAM. In November the new device was announced and started shipping in January 2005. Released in both Fossil and cheaper Abacus versions, primarily distinguished by case and finish, the Fossil FX2008 had an MSRP of $249 (about $390 in 2023) and the Abacus AU5005 went for $199 ($310).

There were eventually multiple style variants of both, though the Abacus devices had the widest range (AU5005 through at least AU5011) and sold in the largest numbers; this unit here is an AU5006 with a vinyl "croc" leatherette strap. I should note that it calls itself a "Wrist PDA with Palm OS" v2.0 (with the quotes), though my suspicion is this is referring to the original FX2001 as "v1.0".
Fossil had done a good job getting the size down. While it's still a large watch, it's not excessively so compared with my 2002 solar-powered radio Casio G-Shock Wave Ceptor 2688. (Which, by the way, still keeps faultless time and maintains a charge, and Casio still makes them.)
92 grams is certainly more than I used to have on my wrist, but it's not terrible, especially for a solid steel case.
On the left side is a dual back/home/on/hold-for-backlight button and the flap covering the USB mini-B connector, used for sync (and those other things we'll force it to do). A small indentation on the flap's fulcrum is the reset button. A clever idea since that doesn't require you to take the watch off to do a soft reset.
On the right side, the Wrist PDA has somewhat different buttons than a Palm of the era. The middle rocker is the same as the traditional Palm up and down buttons; you can press in for select. The top and bottom buttons are page up and down, though in my Palm event tester app they seem to send the same keydown codes as the rocker. That said, the Launcher can distinguish them and uses them for faster jumps through the application menu. They cannot be redefined.
Nevertheless, it's still basically a Palm, and you'll still need a stylus. The stylus actually clips into the buckle. On second thought this is not so clever because it makes it a little harder to remove when it's on your wrist and the excess strap covers it up (hope you have good fingernails).
The stylus is also really small. It folds out like a pocketknife and can lock in 45 degree increments, but even fully extended is only about a third as long as the stylus I have for my m505. With my big hands it's much easier to just use a regular Palm stylus, especially since not keeping it in the buckle means you're going to lose it (and they only include one spare in the box).
Speaking of, here's what comes in the box: some reminder cards for how to write Jot characters on the screen (in multiple languages); the warranty, EULA and manual; the spare stylus in a little plastic bag; a CD with the Palm Desktop software for Windows and Power Mac, also multi-lingual; and a USB "Y" sync cable with a tail to connect the 5V power adapter using a 5.5mm barrel jack (tip positive). This was to supplement USB power back in the day when getting sufficient amperage from your computer's port was not guaranteed. We'll exploit this later.
Another thing: not water resistant despite the sturdy steel case and back. The cover for the USB port and the case enclosure are most definitely not compatible with swimming, showering or surfing. The manual says you shouldn't even get it damp, "much as you would any other Palm OS device."

No surprise that this unit no longer holds a charge. Let's have a brief and fortunately non-destructive look at the innards and the battery situation.

Get out your jeweler's screwdrivers and flip open the USB cover, and the back easily removes with four small Phillips-heads. Notice the Kapton tape on the USB housing.

The battery is a PD3032, a rechargeable 3.7V Li-Ion battery with a capacity of 180mAh. That's not a lot even for a small device, and Fossil's battery life estimates were consistently denounced as unrealistic. They claimed that the battery "should last 3 to 4 days with an average of 30 minutes of PDA usage per day with no infrared port beaming and no backlight usage" but the unit ships with the IR receiver on and you could easily exceed that reading documents or playing games. One reviewer only achieved three to four days of use by barely using it. Plus, even the default watch face would use up juice. Naturally, if the battery runs out, then all apps and databases are lost and must be restored via HotSync (you did sync it recently, didn't you?).

As far as replacing it, there's no getting around the need to desolder it. Even if you pry the top negative lead off the battery, the bottom positive lead is held on by a full-cell sticker, and unless you do plan to use this every day (like I say, nowadays I hardly ever wear a watch at all) you're going to have to weigh the risk of damaging it and your skill at replacement versus any convenience to you. There are projects to upgrade the unit with bigger batteries, but both of those also require fabricating a bigger back, making the unit even chunkier. On the other hand, if you decide to keep the same sized battery then you'll have the same problem with capacity.

In this case, we're not going to replace this battery, at least not this time (I have a mint AU5009 in a box as well anyhow), because as you'll see a little later we're going to need to be constantly connected to its USB port to do the networking and so we can just provide all the power we want over that. But if you're still determined to replace the battery in your device anyway, replacement PD3032 cells and equivalents fortunately remain easy to come by.

Let's plug it in. While we could use the charger and Y-sync cable, with most modern computers the amount of juice on the USB port is usually enough to power it on without that, so for now I'll just use a spare USB-A to USB-mini-B I have in the junk drawer.

Assuming there's enough amperage available, the Indiglo-style electroluminescent backlight will illuminate briefly and then the Palm logo will appear. This screen and logo strongly indicate it's still a Palm OS 4 device. I photographed this in natural light to show you what the screen looks like under ideal environmental conditions. Unfortunately, rarely are they this ideal, and also remember that I'm using macro mode.
The Fossil logo follows. For this and subsequent photos, I will use a flash as appropriate so that you can see the screen clearly.
After that comes the standard Palm digitizer calibration screen, except in multiple languages. To avoid multiple SKUs (aside from the wristbands, that is), Fossil chose to load multiple languages onto the unit, taking up precious ROM capacity. It has on-board support for English, French, Italian, German and Spanish. Do be accurate here; the watch is much easier to use if you can use a regular stylus.
Here's that same screen with the backlight, in a dark room (conversely, in sunlight and bright environments it tends to make the display more illegible). In fairness this unit's backlight has somewhat dimmed with age but is still serviceable. It automatically turns off after a short period.
On the next two screens you select your default language (aquí vamos a elegir inglés). Notice the warning that it needs to match what you're syncing with on the desktop, but also the difference in font size. In most of the operating system, Fossil has wisely used a larger default font for prompts, but this is only true of system-generated dialogue boxes and Fossil's own ROM apps; other apps retain the traditional appearance and smaller default Palm font. Fossil's changes to the PDA/PIM apps also support using different fonts if you prefer.

A couple more setup screens to tap through, and you're at the Launcher.

By default, the Launcher uses big icons you can tap with your fingers if necessary. The rocker goes through each app one by one and the page up/down buttons jump entire pages, while the left side button advances through the groups as well as serving as the home button in apps. The upshot is you can actually navigate the entire directory of apps without even touching the screen. Well done, Fossil.

Alternatively, you can navigate by drawing letters on the screen (it supports both Jot and Graffiti), such as writing a W to jump to the apps starting with W. This is how text entry is done generally.

Of course, if you want to make things harder on yourself, you can go to a more traditional Palm launcher layout, which is difficult to use ...
... or the small list layout, which is nearly impossible (there is also a large list layout). Still, the rocker works with any of these modes, though it is very slow going through the list.
We can also confirm from the About Applications screen that this is indeed Palm OS 4. That means the CPU must be a 68000-series core, almost certainly a DragonBall.
If you let it sit around, the watch eventually becomes ... a watch. Of course when the battery runs out, then it loses the time and you're perpetually in 2004, as everyone says I am. Or perhaps that was 1984.

This was a serious missed opportunity for innovation, by the way. Since you're syncing from a computer, why not let the computer set the device's clock at the same time?

There are eleven faces supported in the software which you can select with the rocker, some analogue but mostly digital. It remembers the last face you selected as long as the battery still works. These faces differed between the Fossil and Abacus versions.
The watch face is actually generated by an application in ROM called (surprise!) Watch.
The modified OS automatically runs the designated watch application after a timeout period (on the Abacus systems this is WatchA.prc and on the Fossils it's WatchF.prc, but both have a creator code of Foss and show up in the Launcher as "Watch"; only the official apps are supported), or it can keep the current running app on screen, or blank the screen. Blanking it uses the least power but is also the least useful. Unexpectedly, you press the rocker select to exit the clock or blank screen, not the back button. These are set in a custom panel in the Preferences application.
But some things are missing from Preferences, too. On my m505, also running Palm OS 4.1.2, the drop down shows Buttons, Connection, Date & Time, Digitizer, Formats, General, Network, Owner, Phone, ShortCuts and Web Clipping. On this unit, however, we only see Connection, Date & Time, Digitizer, Formats, General, Owner, ShortCuts and the WristPDA panel we were just in.

There's a lot missing! We need to get some tools on to dig around a bit, but to do that, we're going to need to get HotSync working.

While I have a number of Power Macs perfectly capable of running the Palm Desktop (and did), I don't need the PIM features anymore, so we'll just use command line pilot-xfer. If you're using a Power Mac running Mac OS X Tiger 10.4 or Leopard 10.5 (Panther 10.3 or Jaguar 10.2 may work), you can get this and other useful tools from the Floodgap gopher server (but read this first). If you're on an Intel or Apple silicon Mac, I got this fork to compile on my M1 MacBook Air; run ./configure --enable-libusb --enable-conduits to build pilot-xfer in src/.

Once installed either way, pushing files to the unit works with pilot-xfer -p usb: -i [files] to push PRCs and PDBs, or pilot-xfer -p usb: -s [directory] to run a standard HotSync. Both my iMac G4 and M1 MacBook Air sync fine using pilot-xfer to all of my Palm devices, including the ARM-based Palm OS 5 devices.

On my Fedora Linux 38 workstation, of course, things were more complicated. Fedora does have pilot-xfer in the repositories and it runs fine on this POWER9 Raptor Talos II, but some configuration is naturally necessary. If you have an early Palm with a serial cradle, which this isn't, then you can just use your real serial port or any USB-serial dongle and point pilot-xfer at it (pilot-xfer -p /dev/ttyUSB0 ... or whatnot, assuming your udev rules put the device in a group you can access). That's the easy part.

For USB-capable 68K Palms, either facultatively (the m505, for example, which came with a USB cradle but had a serial cradle as an option) or obligatorily (this unit), you'll need to use the visor kernel module to set up serial emulation. If it's not showing as loaded in lsmod, then sudo modprobe visor and you should see this in your dmesg:

[1233544.033140] usbserial: USB Serial support registered for Handspring Visor / Palm OS
[1233544.033155] usbserial: USB Serial support registered for Sony Clie 5.0
[1233544.033170] usbserial: USB Serial support registered for Sony Clie 3.5

Next, put these rules, adjusted as you need to, into udev (mine are in /etc/udev/rules.d/99_my.rules):

# for pilot-xfer to work with Palm devices, creates /dev/pilot and /dev/palm
# remember to modprobe visor if not already loaded
# adjust the group from dialout if you need to
ACTION=="add", DRIVERS=="visor", GROUP="dialout", MODE="0664"
# usually HotSync needs to be on the second port (/dev/pilot)  ...
ACTION=="add", DRIVERS=="visor", ATTRS{port_number}=="1", SYMLINK+="pilot"
# ... but give the first port /dev/palm just in case (some Clies, etc.)
ACTION=="add", DRIVERS=="visor", ATTRS{port_number}=="0", SYMLINK+="palm"

and reload everything as root with udevadm control --reload-rules && udevadm trigger (this will enumerate USB devices, so don't panic if your keyboard stops working for a second).

Here's what those rules are doing. The Visor kernel module is a special case of a serial driver. Palm devices over USB act like serial devices but only assert themselves when making a connection, such as HotSync or other cradle/cable communication. When you connect and start a HotSync on the Palm device — nothing shows up until you start the sync — you'll see something like this in dmesg:

[1302169.726098] usb 1-2.4.1: new full-speed USB device number 72 using xhci_hcd
[1302169.914405] usb 1-2.4.1: New USB device found, idVendor=0e67, idProduct=0002, bcdDevice= 0.01
[1302169.914414] usb 1-2.4.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[1302169.914419] usb 1-2.4.1: Product: Wrist PDA
[1302169.914424] usb 1-2.4.1: Manufacturer: Fossil, Inc.
[1302169.924267] visor 1-2.4.1:1.0: Handspring Visor / Palm OS converter detected
[1302169.925577] usb 1-2.4.1: Handspring Visor / Palm OS converter now attached to ttyUSB1
[1302169.926885] usb 1-2.4.1: Handspring Visor / Palm OS converter now attached to ttyUSB2

Visor then dynamically hooks up new USB serial devices to these incoming ports; there are always at least two. Because the actual device path can vary depending on what serial devices you already had connected, those rules globally symlink the first port to /dev/palm and the second to /dev/pilot, no matter what serial device they actually came in on. (This means you can't have multiple serial connections going to multiple Palms simultaneously. If you're the type of person who does that, you're also probably the type of person who can write their own udev rules, smartypants.)

In most cases you'll want the second port, i.e., /dev/pilot, but for some devices, most notoriously some Cliés because Sony, you may need the first port, i.e., /dev/palm. Assuming you're in the first category, while you have HotSync running and waiting for a connection on the Palm device, you can then pilot-xfer -p /dev/pilot ... and sync or install as needed.

When the transaction finishes and the Palm drops the link, then this appears in dmesg:

[1302174.179447] usb 1-2.4.1: USB disconnect, device number 72
[1302174.180918] visor ttyUSB1: Handspring Visor / Palm OS converter now disconnected from ttyUSB1
[1302174.181077] visor ttyUSB2: Handspring Visor / Palm OS converter now disconnected from ttyUSB2
This will work fine with the Linux box for the watch, so let's send over pilot-xfer -p /dev/pilot -i Benchmark.prc pBench.prc FileZ.prc and do a little spelunking in the hardware.

(Unfortunately none of this seems to work properly on Linux right now with ARM Palms, only ones with a DragonBall CPU, even if you try -p usb: using libusb, with or without Visor. If it's loaded, the Visor module will assign serial ports, but nothing ever answers and I don't know why. I may dig into the source for pilot-link and figure this out later. Meanwhile, the Macs have no problem, so for the time being the ARM Palms will still sync with the iMac G4.)

We can get the CPU type fairly easily, and since we're running Palm OS 4, it must be a 68K. Remember this was released in 2005, so we were already squarely in the ARM Palm age by that time (I bought my original Zire 72 in 2004 and Palm hadn't released a 68K device since 2002). If we select Info in the Launcher and then touch Version, it will tell us the CPU indirectly by what serial driver is in use: a DragonBall Super VZ MC68SZ328.
Now how fast is it? Quartus Benchmark 3.1 gives the CPU as 214% of a Palm IIIc (a 20MHz DragonBall EZ MC68EZ328), compared to 309% for the 144MHz TI OMAP1510 Tungsten T, originally named the m550 and the first Palm OS 5 device. As another point of comparison, my trusty 2001 Palm m505 and my very first Palm, a 33MHz DragonBall VZ MC68VZ328, gets 129%. I ran the test several times and got stable unchanging numbers.

Both the VZ and the SZ use the same FLX68000 core (the EZ uses an older 68EC000 core); the only other major processing difference is that the SZ has 100K of SRAM on-die, though this just seems to be regular memory in the datasheet and not cache. Ignoring the obvious outlier of the T|T, if we use the values between the VZ m505 and the SZ Wrist PDA as proportional, we get something like 54.74MHz for the clock speed.

Palm Bench uses a multifaceted test, normalized to the m500. (The m505 gets 100% on all of them except for 115% for data access, which is good proof of validity. Unlike Quartus Benchmark they do wander a bit, but only within a few percentage points.) Here it reports in the ballpark of 150% except for heap management, which is 172%. Again, using the results proportionally, that would yield a clock speed between 49.5 and 56.76MHz consistent with Quartus Benchmark. Thus we'll conclude 54.74MHz.

As such, although the SZ is capable of running up to 66.32MHz, it seems it's been downclocked here likely for power consumption reasons. It's still easily the fastest 68K Palm I've ever used, and if it had come out on time it would have been a serious contender. Instead it's getting shown up by the T|T and blown away by the 416MHz PXA270 monster Tungsten T5 — which came out the year before.

Now we'll turn to FileZ for ROM and RAM. Both received substantial increases from the original specification: ROM ballooned to 4MB, and RAM quadrupled to 8MB. Still, except for the anaemic Zire 21 in 2003, no ARM Palm ever shipped with less than 16MB; even the 2002 m515, a 68K Palm, had 16MB too.

I mentioned when we were looking at the Preferences panels that there seemed to be a lot of stuff missing. Palm system components are PRCs like anything else and the OS can load them from either ROM or RAM. Those missing panels are also system components. They aren't there:

After paging through everything in Info and FileZ, I confirmed that most of the networking components had indeed been stripped from the OS (except, oddly, the Loopback NetIF network interface driver, which was still uselessly present with nothing that would ever call it). In particular, there were no phone drivers, no network command tools, no Web Clipping, no PPP or SLIP NetIF drivers, no NetSync and no Network panel (and no Buttons panel either, for what that's worth).

Most likely these were removed to make space for the watch faces and extra language support, and also because only wackjob nerds like me would ever try using one plugged in from our wrist. Bluetooth and WiFi just wouldn't be in the power budget and there probably wasn't enough space on the board for them either.

So how can we "upgrade" the operating system with the missing ROM components? Easy: we'll use the IR port to beam them to RAM! The m505 has everything we need and the same major version of the OS, so we'll just get it from that.

The trick is not to use the Launcher to beam the ROM components (which will refuse), but to use FileZ. FileZ will beam any database to anything from anywhere, even ROM, and will blithely ignore the Copy Protect bit in a PRC as well. Since the checking all occurs on the sender's side, the receiver will simply accept the component, and it will become a full-fledged member of the system.

After some trial and error, I narrowed down the number of necessary files to just four: Network.prc (and Network_enUS.prc, sorry if you're not using English), and PPP NetIF.prc (and PPP NetIF_enUS.prc). That set is sufficient to allow a PPP link over the USB cable. (Does that sound familiar?) To ensure everything is up to date, after beaming the files over, soft-reset the watch by poking the little silver indented button where the USB cover flap attaches.

Now Network shows up in Preferences!
But, because it's not built by Fossil, the new pirated Network panel still uses the default Palm appearance that it would have on the m505, and it doesn't respond to the back/home button (you'll have to go to another panel to exit Preferences). This is also a reminder that Preference panels are themselves just special cases of regular Palm apps, responsible for drawing the entire screen and maintaining a consistent interface with the other panels — assuming they weren't provided by an alien device.

Where this gets a little sticky is syncing. ROM components and OS files are usually skipped, but since this device will lose its memory the instant the cord comes out, we'd like to keep a copy to avoid having to beam everything over from the m505 all the time. If, say, certain Palm PRCs were to be copied by FileZ to the m505's SD card and then edited on, maybe, an iMac G4 with a hex editor to remove the read-only (0x02) and copy-protection (0x40) bits at byte offset 33/0x21, then these certain files could simply be synced to the Abacus watch without needing the m505. You know, theoretically speaking, because we certainly follow the DMCA around here.

Meanwhile, back on the Wrist PDA, ensure the connection type is Cradle/Cable and leave the username and password blank. Tap Details to instantiate basic setup; the connection type is PPP, the IP and DNS checkboxes should be checked, and the idle timeout is as you like it. Tap Script once to make sure there is exactly one entry, namely End. Tap OK, but don't start the connection yet.

With the client software prepared, now we'll want to ensure we can get the PPP serial link up on the server side. In our previous exploration of Palm networking we did this on an iMac G4 running OS X Tiger and a tool called USB-TCP Bridge. This talked to a local socket that was running pppd and passed data back and forth to the Palm's serial port emulation.

USB-TCP Bridge will work for the Wrist PDA also, but it doesn't recognize the watch as a Palm OS device (having been released before the watch existed) and needs to have Fossil's vendor and product codes 0e67:0002 added to the source code and recompiled. It builds fine with Xcode 2.5 on Tiger, and once updated, those same steps I used for my m505 in that post work for the Wrist PDA. I have not tested it on any later version of Mac OS X or macOS.

If we want to do it on Linux, the prerequisite is logical: if you can sync you can run PPP, so make sure you have udev configured and Visor loaded, and that you were able to successfully HotSync. From our BURLAP project for the Brother GeoBook, download and compile usb2ppp.c. This is a tool that can run any arbitrary program over a serial port but was originally written to do this over a USB serial link using pppd, hence the name. We'll create a small shell script to start up pppd with the right arguments just like we did for the GeoBook, though this script is slightly different.

% cat do_ppp
sudo ./usb2ppp /dev/pilot 115200 \
        /usr/sbin/pppd :PALM_IP \
        local ms-dns PALM_DNS netmask PALM_NETMASK \
        passive noauth proxyarp notty debug \
        persist nodetach asyncmap 0 ktune

Replace PALM_IP with the local IP address you want to assign to the Palm device, PALM_DNS with the local DNS server and PALM_NETMASK with your local netmask. ktune, as before, enables IP forwarding on your local system for the life of the pppd process (without it the Palm will only be able to talk to the computer it's directly connected to). If you needed to use /dev/palm or some other port name to sync, then use that instead of /dev/pilot. The 115200 baud rate is the default speed for the cradle/cable link in the Connection Preference panel, but you can make this number here lower than that if it makes things more reliable (9600 worked fine, for example).

Now we can try a test connection. On the Power Mac, start USB-TCP Bridge before tapping Connect. On Linux, do ./do_ppp (and enter your superuser password) after tapping Connect.

Qapla'! (Klingon: the official language of people who wear Wrist PDAs.)

If usb2ppp gives you tcgetattr: Bad file descriptor, then /dev/pilot isn't set up. Stop the connection on the Palm side and make sure Visor properly assigned serial ports. If you see errors like device descriptor read/64, error -110 in dmesg, then Visor barfed and needs to be reset (sudo modprobe -r visor and sudo modprobe visor).

If usb2ppp starts up, but the Palm side sits at "Signing on" and everything looks okay in dmesg, then stop usb2ppp with Ctrl-C, soft-reset the Palm and try again. You can also try this if the connection won't work in USB-TCP Bridge.

Let's try a network application! Naturally we'll load Overbite Palm, our Gopher client for Palm OS 3.5 and up.

The main menu comes up. Exciting! But the select button doesn't work and for some reason the home button doesn't either.
Additionally, trying to go anywhere with a text document gets the internal low memory bailout message — or worse, other menus crash Plua with "not enough memory" — or worse still, sometimes browsing about crashes PalmOS entirely. Much as we encountered trying to cram the Bluetooth libraries into the m505 in the previous post, running these libraries on the user side has a cost and that cost is paid for in diminished dynamic heap. You'll recall that PalmOS devices dedicate the majority of their memory to databases and to applications, which are run in place; very little of the ROM prior to Palm OS 5 was available as working memory, which in this version of the OS was a fixed allocation based on the total amount of RAM. We were already requiring heroic measures before to squeeze the working set into a 68K Palm, but we're going to make this watch work, darn it.

After a lot of tinkering, I've got Overbite Palm 0.3 now available from Github. This fixes the buttons for the all two of you that will try this on a Fossil watch, but also adjusts the heuristics for intercepting low memory conditions and runs the network stack in smaller bites to avoid overruns (ARM Palms run at the previous speed; they could probably run faster).

In fact, with this change it's possible to operate Gopherspace without a stylus at all. Proof demands a video. This is real-time, no tricks.

Here you can see us scroll with either the rocker (beeping) or top/bottom buttons (quiet), enter with the rocker switch (which also serves for "Yes" on the dialogue boxes), and back out with the back button. I also showed you a little of the menu and how you can use the side keys to access apps that way. Take that, Apple Watch!

Of course, all of this is no good if you're chained to a desk, so the last and greatest piece is to now go completely mobile. The first part is power.

It so happens that many, if not most, modern rechargeable battery packs won't work connected to the barrel jack in this application; they probably expect something on the data lines which the design of this particular Y-cable doesn't provide. On the other hand, if it comes with its own USB-to-barrel jack cable, then odds are excellent it can be made to work. I had an old 5400mAh 0.5A pack in the closet that does provide such a cable, and while 500mA isn't enough for many modern devices (which is why it was in the closet) it turns out it's more than sufficient for the watch. I suppose you could do something similar with real batteries too.

The second part is providing portable connectivity, and like everyone else does I settled on the workhorse Raspberry Pi 3B I use as a demonstration microserver. Pretty much any distro will work as long as it has the Visor kernel module, which I imagine almost all of them do (I used Ubuntu). I then threw together a watchdog shell script that ensures Visor is loaded, watches for the presence of /dev/pilot, and starts up usb2ppp (which starts pppd) when it appears. When the port /dev/pilot is symlinked to goes away, the watchdog kills usb2ppp (which kills pppd), automatically bounces Visor with modprobe for paranoia, and goes back to waiting for /dev/pilot to appear. The net effect is to provide a link on demand so you don't have to start or stop anything manually.

The RPi is connected to the house Wi-Fi, so it just shares that connection with the Wrist PDA, assigning it a fixed address that I pre-allocated on the Wi-Fi (i.e., it's basically a bridge). On the road, however, I'd probably need to set up some sort of internal NAT so the RPi can get its external address over DHCP but hand out an internal address under its control to the watch (i.e., basically a router). That's a wrinkle I'll iron out some other time.

Meanwhile, powering them both required a bit more thought. It is certainly possible to power the RPi and then the watch off the RPi's ports; the maximum current that can be passed is 1.2A which is far more than the Wrist PDA will draw, and then we only need one battery pack to run them both. Unfortunately that means if you power down the RPi, then you'll lose the watch memory.

After dithering over whether I should have the RPi start syncing stuff to the watch too, I decided to go back to the barrel jack and a separate battery. The RPi gets powered by its own modern USB rechargeable battery pack and the 0.5A pack provides power to the watch. This allows me to sync the watch and load its software on my workstation, then keep power on it while I transfer it to the RPi. As a nice side effect, since the RPi still provides power on its USB ports anyway, the watch now effectively has a backup battery.

Here's the prototype in action stuffed into a camera bag. The camera bag also contains cameras. Hey, we want this to be practical. Why else would I have a camera bag?

I didn't tie the wires to my arm or otherwise bundle the cables so that you can see where everything is running, but if I were doing this for real (like at a future Vintage Computer Festival), I'd probably have a jacket on and use zip ties to cinch the wires to the sleeve with enough play to allow my arm to bend. Both the cable to the 0.5A pack and the main USB line to the RPi run up my arm and over my shoulder into the camera bag. It's all very light, and it's at least somewhat practical ... right? Right??

An interesting alternative to the RPi might be to find a Wireless USB unit that doesn't require drivers. Yes, wireless USB devices actually existed, but they weren't very common. In this application they would essentially replace the serial cable tether between the computer/RPi and the watch, but that also would require setting up the same automatic stop and start script on my workstation or the iMac, and thus it could only be done in the house. It's also debatable whether using such a device would be any lighter or more flexible.

I'm also not sure how much more fat I can trim from Overbite Palm. For future versions I may put the cache and/or the working set into a database and stream that from "storage RAM." However, memory would still be needed to build the menu GUI, and the text gadget used to scroll text documents must necessarily still have the entire text in memory too (up to the hard operating system limit of 32K). As such, I don't see it expanding the set of compatible 68K Palms much because you'd still likely need a system with 4MB of RAM (that is, a system with the standard amount of dynamic heap provided on a 4MB device) or more to run it. Changes like this would only make it run better on the devices that already could. In the meantime, you can get the new release from Github.

Sadly, the Fossil Wrist PDA didn't set the world on fire and the relatively unfavourable reviews probably didn't help. Fossil attempted to jumpstart sales by slashing the Abacus variant to just $80 in August 2005 but to no avail, and completely cancelled the line in February 2006, liquidating remaining stock for just $49 each. To this day the Fossil Wrist PDA remains the only wrist-mounted Palm device ever made.

Stay nerdy, my friends.


  1. Interesting read; I always wanted one of the Fossil watches that ran Palm OS when they were new, but they were always out of my price range.
    Getting pilot-xfer working on a modern 64-bit Ubuntu is quite a pain; I ended up building from source, using pilot-link from github, but I think I had to make a few changes (not pushed upstream yet) to get it to build.
    On my Clie UX50, when I start a sync connected with USB, it creates a /dev/ttyUSB0, and I can use that as the port for pilot-xfer directly, if I'm running pilot-xfer as root (udev could probably fix that I suppose). It seems fairly unreliable - if I'm running it multiple times, subsequent connects takes a while to appear in /dev, and once or twice the Clie has just locked up on the sync screen and required a reset.

    1. I suppose knowing the PCs you usually prefer I should clarify that when I said 64-bit, I meant x64...

    2. Haha. However, the pilot-xfer I'm using on my POWER9 is out of the Fedora repos. I don't know if they have local fixes. The github link I gave compiled out of the box on my M1 MacBook Air.

      For your UX50, are you using visor or no kernel module at all? If you're using visor, the first udev rule above should handle permissions, assuming you're in that group, of course. If you're not, you could modify it to any ttyUSB* device.

    3. I didn't explicitly load anything, but it looks like after plugging it in, visor and usbserial are loaded, and visor seems to be handling it, so I can probably use your udev rules:
      visor 1-3:1.0: Sony Clie 5.0 converter detected
      usb 1-3: Sony Clie 5.0 converter now attached to ttyUSB0
      usb 1-3: Sony Clie 5.0 converter now attached to ttyUSB1

  2. Turns out that J-Pilot ( is still maintained, and has a PPA for Ubuntu 20.04/22.04 for the application, the full pilot-link suite, and libpisock9. Installing pilot-link also seems to set up some udev rules, since when I start HotSync, my device now has permissions allowing anyone in the dialout group to access it when I use USB to connect. Haven't had time / craziness yet to try Bluetooth or wifi/TCP sync yet.

  3. Do you actually own an FX2001? Do you know whether it can sync the time from the pda, or can the time only be set on the watch?


Comments are subject to moderation. Be nice.