時々話題に上がるOSのメモ(AliOS,Harmony,webOS,Tizen,KaiOS) 2019/09/06


AliOS系統

AliOS

元々はalibabaがAndroid(AOSP)をベースにカスタマイズしたOS。「Yun OS」「Aliyun OS」といった呼び方をされていた時期もある。

公式ページ: AliOS

基本的にはGapps(Google Play Storeなど)が入っておらず、代わりにalibaba系でやってるサービスやストアが導入されている中国向けのAndroidといった感じのものになっている。

AliOS Things

AliOSのIoT向けとして作成されているOS。AliOSといってもAndroidベースではない。

公式ページ: AliOS Things
github: https://github.com/alibaba/AliOS-Things

IoT向けということで、ESP32とか、RISC-Vを使ったC-Sky SoCとかもサポートしている。

Huawei系統

LiteOS

Narrow Band IoT(NB-IoT)など向けにHuaweiが開発していたOS。これが、HarmonyOSに発展した。

github: https://github.com/LiteOS/LiteOS

動作対象ボード一覧: LiteOS支持的开发板种类

HarmonyOS

「鴻蒙 OS( HongMeng OS)」とも呼ばれることがある。LiteOSはIoT向けのみだったが、その適用範囲を大幅に広げ、スマートフォンも対象に含むようだ。

github: https://github.com/huawei-iot/HarmonyOS

ARKというAndroidでいうART(Android Run Time)みたいなものを作成しているようで、「方舟编译器(Open Ark compiler)」というページで関連資料が公開されている。

OpenARK Compilerについては「https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler/home」「https://code.opensource.huaweicloud.com/HarmonyOS/OpenArkCompiler/readme」でソースも公開されている。(ページの遷移具合で微妙に他のページへのリンクが消えたりするのが謎)

昔からのやつら

Tizen

Samsungが開発している自社向けOS。2019/5/30にTizen 5.5がリリースされていたりしている。

Android代替のTizen Mobileということで始まっているので、スマホやタブレットでTizen OS搭載のものがリリースされたりしているが、あまり売れていないようだ。
TV向けのTizen TVやWearデバイス向けTizen Wearなどは出ているようだ。

公式ページ: Tizen
ソースコード: Tizen Source

Tizen RT」というCortex-M/R SoC向けのバリエーションもあるようだが、こちらは2017/5のTizen RT 1.0以降更新がないようだ。

webOS

現在はLGが主体となって開発しているpalm webOS。
LG社のTV向けOSとして現在も開発は続けられている。(最新のwebOS TV SDK v4.0.4のリリースが2019/3)

公式ページ: webOS TV Developer
オープンソースサイト: webOS Open Source Edition

ラズパイ3が公式デバイスとして掲載されている。

kaiOS

Firefox OSのB2G部分をベースに開発が続けられているモバイル向けOS。
インドのJio社やNOKIAのフィーチャーフォンで使われており、昨日も新しいデバイスが発表されたりしている。

公式ページ: KaiOS tech
開発者向け: KaiOS Developer
github: https://github.com/kaiostech

Firefox version 59をベースに開発を進めているようだが、更新どうしてるんだろう?

SH-04Hで急速充電ができない原因


ジャンクのSH-04Hを約6千円で購入

安さの理由は左上の割れと、液晶の右端中央付近の色変化だけだと思っていました。

で・・・充電をしてみると、どうやっても低速充電表示となり、急速充電になりません。

よくわからないなぁ・・・と思いつつ、パソコンからデータ転送するか、と繋いでみると、パソコン側でデバイス認識してくれません。

microUSB端子を掃除して、ケーブルとケーブルの差し方をいろいろ試してみるとパソコンで認識できる状態に持って行くことに成功。

そして、その状態のまま先ほどは低速充電となった電源に繋いでみると、急速充電となることを確認出来ました。

SH-04Hの急速充電はQuick Chargeという仕組みを使って行われていますが、これはmicroUSB端子の「Vbus」「GND」と「D+」「D-」の4つの端子を使い5Vで0.5Aを超える充電や9Vでの充電を行うようになっています。

それに対して低速充電と表示される通常USB充電は「Vbus」と「GND」を使い5V 0.5A以内で充電を行います。

つまり、SH-04Hで急速充電できず、低速充電となるという状況は、microUSBの「D+」端子と「D-」端子の接触が悪く、きちんと認識されていない状況にある、ということになります。

miroUSB端子は小さく、金属端子部分も奥まった場所にあるため確認が難しいため、対処が難しいために、通常は本体交換という対処になってしまうんでしょうね。

何も考えずにASUS PRIME B450M-Aで安いDDR4 DIMMを4枚指ししようとしたら認識しなかった件


そろそろ値上がるという評判なので、2月に導入したRyzen 3環境のメモリを増やそうとした。

クロックアップしないし、8GBだから大丈夫だろう、となんも考えずに安く売ってたKLEVV IM48GU88N26-GIIHA0(2枚で5333円)を購入。

いままで使っていたpanram W4U2666PS-8GC19と並べて見る。

基板は一緒。RAMチップが違うだけ、という感じ。

これはいけるな、と4枚指ししてみると、起動しない。

メモリ速度を2400MHz固定にしたり、いろんな組み合わせを試してみたりした結果、3枚までは起動した。4枚がどうしても起動できない。

(元々はA1とB1がPanramの2枚指しで、上記以外にもA1とB1:Panram/A2とB2:KLEVVとか全組み合わせをやってます)

ASUS PRIME B450M-A メモリ対応リスト」を確認してみて原因判明・・・

PANRAMの方は4DIMM対応になっているが、KLEVVの方は型番の下の方がちょっと違うので同じとは言いがたいが2DIMM対応までになっている。

というわけで、駄目そうなので、他に転用しました・・・

Arduino/ESP32/TTGO T-WatchのシステムクロックとRTC周りのメモ 2019/07/02


TTGO T-watchの腕時計の時刻表示がおかしいので調べていったことのメモ

・T-Watchでは画面オフ時にシステムクロックが止まる

T-watchでは左側の端っこボタンを押すと画面がオフになる。

この処理は、power_handle関数内の「LVGL_POWER_IRQ」イベントの「axp.isPEKShortPressIRQ()」( 左側の端っこボタン =PEKキー)で行われている。

オフ時に「rtc_clk_cpu_freq_set(RTC_CPU_FREQ_2M)」を実行して、CPU周波数を落としている(240M→2M)

これによりOS内のシステムクロックの進みも劇的に遅くなって、ほぼ止まっているように見える。

このことがあるので、T-Watchのソフトウェアでは、システムクロックからではなく、RTC上の時計から時刻を取得しているようだった。

・システムクロックの設定方法はsettimeofday(UNIX)

Arduino/ESP32環境でシステムクロックを簡単に設定する手法はNTPからの時刻を取得して、システムクロックを適用する、というもの。

    struct tm timeinfo;
    bool ret = false;
    int retry = 0;
    configTzTime("JST-9", "pool.ntp.org");
    do {
        ret = getLocalTime(&timeinfo);
        if (!ret) {
            Serial.printf("get ntp fail,retry : %d \n", retry++);
        }
    } while (!ret &amp;&amp; retry < 3);

また、システムクロックをRTCに反映するのも簡単。(以下は、RTCモジュールがPCF8563の場合に使うPCF8563_Libraryの場合)

        rtc.setDateTime(timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

しかし、逆にRTCからシステムクロックに対して時刻を反映させる手法がよく分からない。

RTCモジュールがDS1307RTCの場合の事例があるので Michael MargolisさんによるTimeモジュールを使ってみたが、時刻設定はできなかった。

void syncSystemTimeByRtc()
{
    Serial.print("Read RTC :");
    Serial.println(rtc.formatDateTime(PCF_TIMEFORMAT_YYYY_MM_DD_H_M_S));
    struct tm dt;
    getLocalTime(&amp;dt);
    Serial.printf("getLocalTime is %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
    RTC_Date d = rtc.getDateTime();
    Serial.printf("  %d,%d,%d,%d,%d,%d\n",d.hour,d.minute,d.second,d.day,d.month,d.year);
    setTime(d.hour,d.minute,d.second,d.day,d.month,d.year);
    Serial.println(timeStatus());
    getLocalTime(&amp;dt);
    Serial.printf("getLocalTime override RTC clock, %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
   
}

上記のデバグコードをいれて、画面オフ→オンイベントを起こしてみると、

10:16:18.034 -> LVGL_POWER_IRQ event
10:16:18.034 -> 
10:16:18.034 -> PEKShortPressIRQ to off
10:31:15.803 -> PEKShortPressIRQ to on
10:31:15.803 -> bma423_disable:0
10:31:15.803 -> Read RTC :2019-7-2/10:31:15
10:31:15.835 -> getLocalTime is 10:16:9
10:31:15.835 ->   10,31,15,2,7,2019
10:31:15.835 -> 2
10:31:15.835 -> getLocalTime override RTC clock, 10:16:9
10:31:24.715 -> RTC time is 2019-7-2/10:31:24
10:31:24.715 -> getLocalTime is 10:16:17

時刻が設定されていない・・・

UNIXだとどうやってシステムクロック設定できたかな?と調べて見たらsettimeofdayでunixtimeを指定する、ということが判明

#include <time.h>    // requried for settimeofday 
#include <sys/time.h>// requried for timeval

上記を冒頭に追加した上で、以下を書いた。

void syncSystemTimeByRtc()
{
    Serial.print("Read RTC :");
    Serial.println(rtc.formatDateTime(PCF_TIMEFORMAT_YYYY_MM_DD_H_M_S));
    struct tm dt;
    getLocalTime(&amp;dt);
    Serial.printf("getLocalTime is %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
    RTC_Date d = rtc.getDateTime();
    Serial.printf("  %d,%d,%d,%d,%d,%d\n",d.hour,d.minute,d.second,d.day,d.month,d.year);
    dt.tm_hour = d.hour;
    dt.tm_min  = d.minute;
    dt.tm_sec  = d.second;
    dt.tm_mday  = d.day;
    dt.tm_mon = d.month-1;
    dt.tm_year = d.year-1900; 
    time_t timertc = mktime(&amp;dt);
    Serial.print("RTC unixtime is ");
    Serial.print(timertc);
    Serial.print(" ,system unixtime is ");
    time_t timesys = time(NULL);
    Serial.println(timesys);
    struct timeval tv ={
      .tv_sec = timertc
    };
    settimeofday(&amp;tv,NULL);
    
    getLocalTime(&amp;dt);
    Serial.printf("getLocalTime override RTC clock, %d:%d:%d\n",dt.tm_hour,dt.tm_min,dt.tm_sec);
   
}

これで期待通りにRTCの時刻をシステムクロックに反映することができるようになった。

13:23:48.103 -> PEKShortPressIRQ to on
13:23:48.103 -> bma423_disable:0
13:23:48.103 -> Read RTC :2019-7-2/13:23:47
13:23:48.103 -> getLocalTime is 13:17:30
13:23:48.103 ->   13,23,47,2,7,2019
13:23:48.103 -> RTC unixtime is 1562041427 ,system unixtime is 1562041050
13:23:48.103 -> getLocalTime override RTC clock, 13:23:47
13:23:57.121 -> RTC time is 2019-7-2/13:23:56
13:23:57.121 -> getLocalTime is 13:23:56

・rtc_cpu_freq_setは非推奨

コンパイル中に以下の警告が・・・

C:\Users\osakanataro\Documents\Arduino\TTGO-T-Watch-mod\TTGO-T-Watch-mod.ino:328:17: warning: 'void rtc_clk_cpu_freq_set(rtc_cpu_freq_t)' is deprecated [-Wdeprecated-declarations]

                 rtc_clk_cpu_freq_set(RTC_CPU_FREQ_240M);

https://github.com/espressif/arduino-esp32/blob/master/tools/sdk/include/soc/soc/rtc.h 」を確認したところ、「 rtc_clk_cpu_freq_config_set 」に置き換わった、とある。

・・・あるんだけど、 rtc_clk_cpu_freq_config_set に関する資料がでてこないってどういうこと???

grepしても定義無いし、試しに置き換えてみても定義されてない、というエラーになった。

ESP32腕時計TTGO T-Watchが届いた


ESP32を搭載した腕時計風のTTGO T-Watchを約49ドルで購入しました。

約2週間で届いたので早速遊んでみました。

資料系

メーカページ(LILYGO)
公式英語マニュアル
公式中国語マニュアル
サンプルソフトウェア

開梱

かわいらしい感じの梱包ですね。

内容物はこちら

T-Watch本体と、予備のボード?、T-Watchの横にあるコネクタから拡張するためのケーブル、Type-Cケーブル、腕時計用バンド、裏蓋取り外し用ネジ回しと予備のネジ

説明書には中を開けた時にどういう感じになっているのか書かれています。

とりあえずこちらも開けてみました。

元に戻して電源ON

最初はタッチパネルの検査プログラムが起動しタッチした座標を報告します、Type-Cコネクタの隣のボタンを押すと、今度は衝撃検知プログラムが起動しstepCountとして振り回した回数を表示します。

とりあえず、パソコンにつなげるとドライバがあれば「Silicon Labs CP210x USB to UART Bridge (COM?)」として認識します。

ドライバがインストールされていない場合は下記の様に「CP2104 USB to UART Bridge Controller」として認識されます。ドライバのインストールについては後述します。

デモ用のプログラムがgithubで公開されていますのでArduio IDEをセットアップします。

ただし、普通にインストールしただけでは認識せず、追加手順が必要となります。

必要なもの

Arduino IDE
git for Windows

T-watch ソフトウェア書き込み手順

TTGO公式の設定手順を参照しながらやりました。

その1:git for Windowsをインストール

以前に別の件でインストールしていたのでそのまま使っています。

その2:Arduino IDEをインストール

今回はArduino IDE ver 1.8.9をインストールしました。

その3: Arduino IDEのインストール先のhardwareディレクトリ内にespressifディレクトリを作る

標準インストールだとC:\Program Files (x86)\Arduino\hardware ディレクトリ内にespressifディレクトリを作る。

その4:作成したespressifディレクトリ内でコマンドプロンプトを開く

作成したC:\Program Files (x86)\Arduino\hardware\espressifディレクトリででコマンドプロンプトを開きます。

その5:gitでespressifのarduino-esp32レポジトリを取得する

espressifディレクトリで「git clone –recursive https://github.com/espressif/arduino-esp32.git esp32」(wordpress編集画面だと「-」が2個なのに1個だけになる・・・)を実行します。

そうすると、 C:\Program Files (x86)\Arduino\hardware\espressif\esp32 ディレクトリが作成されファイルが置かれていきます。

その6:esp32\toolsディレクトリにあるgetコマンドを実行し追加ファイルを取得

C:\Program Files (x86)\Arduino\hardware\espressif\esp32\tools\ ディレクトリ内にある「get.exe」を実行し、追加ファイルを取得します。

その7:Silicon Labs CP210xをインストール/アップデート

手順には明記されていないのですが、古いドライバ Ver6.7.4.261で書き込もうとするとエラーになりました。「T-WatchマニュアルのGetting started」に掲載されているCP2104-Win10(Ver10.1.8.2466)だと正常に動きますので、アップデートします。
(CP2104の製造メーカ公式ドライバダウンロードページ)

なお、書き込み時のエラーは下記の「A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header」です。

その8:T-Watchをパソコンに接続

その9:Arduino IDEを起動し、TTGO T-Watchを選択

Arduino IDEを起動し、「ツール」-「ボード」の一覧から「TTGO T-Watch」を選択します。

その10:T-Watchサンプルソフトを取得

git for Windowsを使って、 https://github.com/Xinyuan-LilyGO/TTGO-T-Watch で公開されているサンプルソフトウェアを取得します。

「git clone –recursive https://github.com/Xinyuan-LilyGO/TTGO-T-Watch」

取得完了後、「library」にあるディレクトリを、マイドキュメントの中にある「Arduino\library」内にコピーします。

その11:書き込み

Arduino IDEからサンプルソフトウェアを書き込みます。


サンプルソフトウェアを書き込んだのですが、うまいこと自宅のWiFiに接続できず、時計合わせに失敗しています。

また、タッチパネルの動作が若干微妙な感じもあります・・・