tea-time turns your smartwatch back into a watch… and a 3D rendering engine
A while ago this post caught my attention on Hackaday. Sony relased some hardware specifications of its smart watch, and invited people to hack it and write custom firmwares. It wasn’t the first time I’ve heard about that smart watch, as I had alreay found (thanks Daniel) a teardown of it.
The author of the teardown actually was disappointed by finding a microcontroller instead of a Linux capable processor in the watch, but being used to microcontrollers, this was no problem. Also, Sony didn’t put into the watch a tiny 8bit microcontroller, but instead chose an ARM running at 120MHz, with 128KB of RAM and 1MB of FLASH. That’s a lot to work with.
However, before Sony’s move towards openness, I wasn’t that much interested in the watch, as it takes too much time compared to the one I have available to reverse engineer a firmware to understand how to write drivers for the display, touchscreen etc. After reading that news on Hackaday, and looking at the documentation, though, I ordered the watch straight away.
This turned out to be, at least partially, a bad move. This is because if looked on the surface the documentation on Sony’s site seemed sufficient to write a custom firmware, as it says on which GPIO pins devices are connected, there’s the part number for the display controller, and some source code for driving the touchscreen. When looking deeper, though, many parts were missing. For example, searching the display controller datasheet on a search engine resulted only in links to the site of the company who produce it – and no datasheet. Also, certain parts of the watch’s hardware were missing entirely from the documentation. For example, it was later found out that the watch has a power management unit that controls battery charging and turns the watch off under software control, but this is entirely missing from the documentation.
Shortly after, however, always on Hackaday, a post showed an Arduino-like toolchain to write sketches for the smart watch. Personally, I am not very fond of the Arduino. Probably since I’m used to programming microcontrollers using an RTOS (Miosix), having to fit all my code logic in the
loop() function seems unnatural to me. Also, one of the few things I like about the Arduino: openness here was missing, as no hardware schematics of the watch have ever been released by Sony.
At least the availability of the Arduino toolchain gave me a code base to look at to understand how the watch works, it’s way better than reversing the binary of the original firmware! Quickly, I understood that the Arduino firmware was written by someone who had much more documentation than the one which is publicly available. For example, the file system.c mentions in the comments “SONY’S NAME” for each GPIO pin. Clearly they had access to the original source code of the watch. It’s by reading that code that I came to know about the existence of the power management unit.
The Arduino code, and in particular its comments, filled the gap left open by the lack of documentation and helped a lot in the process of porting the Miosix kernel and the Mxgui library to the watch, which was my end goal.
Enough talk, let’s start with a demo. Here is a simple but functional firmware, called tea-time, that turns the smart watch into… a watch. To test the hardware’s performance I ported a simple 3D rendering engine for Mxgui to the watch, it draws in real time the famous utah teapot, resulting in quite an original watch face.
There’s also a video showing the smoothness of the rendering.
Needless to say, the firmware is entirely free software/open source, and can be found in the examples directory of the mxgui library. For trying it out without the need to compile it, the compiled firmware is here.Although it’s just a preliminary version, and there’s still work to do, it already provides a battery status indicator and dynamic display brightness adaptation based on ambient light, as well as a 30s timeout after which the display turns off to save power.
The code is written in C++ as a multithreaded application for Miosix, using the POSIX threading API. There’s also a simulator for the GUI to help design the user interface without the need to flash the watch every time to see how a modification looks like.
In the future I’ll probably add a tutorial on how to set up the miosix/mxgui environment, how the optimized video driver for the smart watch works and how the rendering engine works. There are a lot of tricks in there…
The link to the firmware now points to a new version. The previous one had a bug in the power saving code, causing the battery to last only one day. This one should be better.
The new firmware did actually fix the battery issue. It now lasts 6 days.