Timex m851のハッキング
(lock.cmpxchg8b.com)- Timex m851はランナー向けのデジタル腕時計のように見えるが、8-bit Seiko S1C88 CPU と 2KB RAM だけでユーザーアプリを実行する超低消費電力プラットフォームである
- 側面のピンは USB で、予定表のようなデータを同期でき、Timex SDK で
cc helloworld.cをビルドして腕時計へ直接載せられる - WatchApp は限られた RAM のため、state 単位でコードが入れ替わる構造になっており、共通コード・変数・永続データ用 API を併用する
- カーネルはイベント配信、タイマー、ビープ音、表示装置のスクロール、データベースアクセス、リューズとバックライト制御のような低レベル処理を担う
- 販売終了機器のため入手は難しいが、Virtual Datalink シミュレーターと公開ドキュメント・サンプルコードのおかげで、実機の腕時計を毎回リセットせずに開発できる
小さな腕時計の中の開発プラットフォーム
- Timex m851は 8-bit Seiko S1C88 CPU、48KB ROM、2KB RAM、42x11 ドットマトリクスのメイン表示装置を備えたデジタル腕時計である
- CPU は 超低消費電力動作 を目標に設計されており、単一電池で 3 年間動作できる
- 側面のピンは USB で、予定表のようなデータを腕時計と同期するために使われる
- Linux 向けライブラリとして libdlusb がある
- Timex が提供した SDK を使えば、
cc helloworld.cでアプリケーションをビルドして腕時計にアップロードできる - 基本ツールは Windows XP 時代のウィザード形式だが、内部では UNIX 系ツールチェーンが動いている
WatchApp の例と既存エコシステム
- hello world の例と
Makefileは taviso/timex リポジトリで見られる - このプラットフォーム向けには、ゲーム、ユーティリティ、ツールなど複数の WatchApp が作られてきた
WatchApp の構造: state と mode
- アプリケーションは state に分かれており、state が切り替わると現在アクティブなコードは破棄され、新しいコードが読み込まれる
- アプリは最大で約 30KB のコードまたはデータを使えるが、RAM は約 2KB しかない
- ページングがなく、コード全体を RAM に載せられないため state 構造が必要になる
- すべての state が共有する共通コード領域があり、変数領域と永続データのためのデータベース API も用意されている
- 先頭側の一部 state は共通イベント処理用に予約され、残りはアプリが任意の用途に使える
- mode は前面アプリケーションに相当する
- アプリは通常 mode を提供するが、バックグラウンド処理や周期処理を追加することもできる
coreRequestModeChangeNext();で mode 切り替えを要求すると、次のアプリが制御権を得る
イベント処理とカーネルサービス
- 各 state には イベントハンドラ が必要である
- イベントには、state への進入、リューズを引き出すまたは戻す操作、リューズの回転、ボタン押下、mode ボタン入力などが含まれる
- 不要なイベントは無視できる
- カーネルはハードウェア処理とイベントディスパッチを担い、複数のサービスを提供する
- タイマー
- トーンとビープ音の生成
- 表示装置のスクロール
- データベースレコードへのアクセス
- リューズ設定
- バックライト制御
- サンプルコードは
lcdClearDisplay()とlcdDispBannerMsg()のようなカーネルサービスを使って"hello!"のバナーメッセージを表示する
リセットを減らすデバッグ環境
- メモリ保護がないため、アプリがカーネルメモリを上書きしてしまう可能性がある
- カーネルは 2 秒ごとに watchdog に生存を通知する必要があり、通知がなければ watchdog が腕時計をリセットする
- 重い計算を実行するときは
hwResetWatchdog();で watchdog を更新する必要がある
- 重い計算を実行するときは
- Virtual Datalink はオープンソースのサードパーティ製シミュレーターである
- ソース
- Windows 専用で、Delphi で書かれている
- 条件付きブレークポイント、逆アセンブラ、セーブステート、リソース解析、電力解析を提供する
販売終了機器の確保と参考資料
- Timex m851 はかなり前に 販売終了 となっており、ますます入手しにくくなっている
- eBay では、電池を交換するだけで新品同様に使える機器を入手できた
- ケーブルがなければ、標準 USB Type-A のピン配列と独特のコネクタを使っている点を利用し、古い USB ケーブルとワニ口クリップを使える
- Timex T5G751 も同じコネクタを使っており、比較的見つけやすいためケーブル確保用に活用できる
- “dress edition” と呼ばれる m851 の派生版は、同一仕様で異なる筐体を持ち、別のモデル番号で出品されることがある
- 参考資料
- Design Guide: 最も重要な文書で、よく書かれている
- CPU manual: CPU マニュアル
- ツールチェーンマニュアル
- API reference: カーネルが提供するサービス一覧を収めている
1件のコメント
Hacker Newsのコメント
魔法のように思える点の1つは、Epson SoC(PN S1C88349) がとんでもなく省電力だということ。32kHzの低電力モードで動作しているときの消費電流は、わずか9マイクロアンペアしかない。
1秒あたり32,000サイクルという予算で、どれだけ多くのことができるのか考えさせられる。
しかも48K ROM、2K RAMに、タイマー3個、UART、A/Dコンバーターまで入っている。
[1] https://global.epson.com/products_and_drivers/semicon/pdf/id...
Seiko-Epsonのチップは、EM-SwatchやOKI-Casioのチップとともに、時計、電卓、体温計、安価な低消費電力のセグメントLCD機器に使われていて、ボタン電池1個で何年も動作する必要があった。
15年以上前の電卓やデジタル体温計にもこうしたSeiko-Epsonのチップが使われているが、今でも最初に入っていた1.5Vのボタン電池で動いている。リチウム電池の経年による自然放電を考えると、かなり驚きだ。
最近の多くのモバイルアプリのバイナリサイズは、かつて非常に有用な仕事をしていたOSやアプリケーション全体よりも大きい。
この流れがどこへ向かうのか恐ろしいし、誰か、あるいは何かが歯止めをかける可能性も低そうに見える。
記憶では、電源スイッチのリークなどまで含めて公称100nA未満で、本当にすごい水準だった。
4ビット(!)32KHzマイクロコントローラーで、12ビット(‼)ROM 6,144ワード、内蔵4ビットRAM 640ワード、統合LCDドライバー用の4ビットフレームバッファ160ワードを搭載している。ダブルバッファリングまで可能だ。
本当に美しいチップだ。1年ほど前にTypeScriptエミュレーターを作ったが、まだGitHubには上げていない。興味があれば公開できるし、改変していないTamagotchiのファームウェアも実行できる。
実際にはEEPROMで、Flashメモリに少し似ているようだ。
もう少し機能が多いものが欲しいなら、Bangle.jsも見る価値がある。
Bluetooth、GPS、加速度計、振動モーター、カラー画面があるのが利点。欠点は、バッテリーが3年よりはるかに短いことだ。
[0] https://banglejs.com/
「日光下でも読める常時表示画面、4週間のバッテリー寿命、完全な柔軟性、データに対する完全なコントロール」を掲げ、Bangle.js 2を高価なスマートウォッチから抜け出す代替手段として紹介している。
15年ほど前にこの時計を持っていて、いろいろなことを記録できた。
次の授業の場所、よく使う停留所のバス時刻表、月の満ち欠けなどを入れていた。
スマートフォン以前に、腕時計でバス時刻表を確認するのはJames Bondのように見えた :)
こういう時計を今でも作ってくれたらいいのに。この程度の消費電力なら、太陽光で実質的にずっと充電しながら使えそうだ。
20年以上前、Siemensの携帯電話にバス時刻表をSMSの下書きとして保存していたものだ。
ハック可能な時計へのより現代的なアプローチとしては、これがあり得る。
https://github.com/sharandac/My-TTGO-Watch
LILYGO T5 E-Paper開発ボードでDIY iPod Nano 7Gを作ろうと調べていて見つけた。
製品: https://www.aliexpress.com/item/1005002474854718.html
コードリポジトリ: https://github.com/Xinyuan-LilyGO/LilyGo-T5-Epaper-Series
Arduino方面の時間と腕がもっとあれば、これは素晴らしいiPod Nano 7G代替品になり得たと思う ;)
標準のコードはほとんどまともに動かず、何もしなくてもバッテリーは12時間ほどしか持たなかった。ただし、他人のコードをデバッグするのが好きな人にとっては、価格に対して驚くほど面白いものなのは確かだ。
抜けていた部分を少し埋め、消費電力を下げる設定を見つけて、「普通」の使用で約6時間ほど持つようにした。
今のコードはずっと良くなっているだろうが、電力予算は80年代風の超低消費電力m851というより、AppleやSamsungのスマートウォッチにはるかに近いはずだ。
実験好きなら楽しい小さなプロジェクトで、値段分の価値はある。iWatchと競うものを期待すると、がっかりする可能性が高い。
「電池1個で3年持つ」ことが大きな利点なら、Casioは確かにまだそういうものを作っている。
「Casio MIP display」で探せばよい。
Timex Datalinkシリーズについての追加情報はここにある。
https://en.m.wikipedia.org/wiki/Timex_Datalink
現代のIPS LCDでも再現できるだろうか?
もっと多くの時計やウェアラブルが、こうした8ビット低消費電力チップで作られ、データピンが露出していてハック可能だといいのに。
時計ならバッテリー3年持ちが肝心。時計を充電しなければならないと気にする必要があるなら、自分には失格。
今使っているSwatchは、同じ電池で約1年、ずっと正確に時刻を刻んでいる。安い機械式時計の問題は、気をつけないとゼンマイを巻きすぎてしまうこと。なので数年ごとに1本壊してしまうが、どうせ安い。
その2本の時計のいいところは、毎日充電する必要がないこと。もちろん手巻き時計はゼンマイを巻く必要はある。
自分たちが実際に良いものを持てるのだ、ということを改めて思い出させてくれる。そういうもののための市場さえあれば、だが。
バッテリー消費が少なく、身に着けたり交換したりする負担も小さく、デザイン面でも納得できる、うまく統合された時計があるといい。
今われわれにできる最善がSensorwatch [1]というのは残念。
[1] https://www.sensorwatch.net
追記: Sensorwatchは素晴らしいが、まだエコシステムではない。
そのボードで何をしたくなるのか気になる。
TIのEz430-chronosよりもさらにシンプルに見えるし、良さそう。
ただ、電池1個で3年というのは大したことには見えない。もちろん、どんなアプリを使って載せるかによるだろうし、プログラム可能という点は素晴らしい。
[0] https://www.sparkfun.com/products/retired/10019
2018年にCasio F91を1つなくしたのだが、先週カヌー旅行の荷造りをしていたら見つかった。時刻と日付は、手首に着けていたCasio F91と数秒しか違わなかった。
昔1つ買ったけれど、引っ越しのときになくなってしまった。また触ってみたい。
追記: ああ、製品一覧に“RETIRED”と書かれているリンクを貼っていたのか。TI製品なら、市場の反応が出始める頃にTIが終売にしないほうがおかしいくらいだ。