タイマーによる起動/停止(4)


先日の続き。
  • スリープからの起動は ppc_uartd が AVR にコマンドを送り、
  • 指定時間になれば、AVR が電源を入れている
    のであろうということころまでは推測した。

    ppc_uartd が AVR に送っているコマンドを解析する。

    暗号?

    /etc/melco/timer_sleep を書き換えると、 程なく ppc_uartd が AVR (ttyS1) に
    <<<<::::88886666444433330000....,,,,++++((((''''%%%%""""!!!!????[[[[
    
    とか、
    <<<<::::88886666444433330000....,,,,++++((((&&&&%%%%""""!!!!????[[[[
    
    とかいったデータを送る。
    まるで暗号である。

    暗号を解くためには、試料をたくさんそろえなければと、 AVR へのコマンドを収集した。
    たとえば、こんな具合
    スリープ開始スリープ復帰コマンド
    00:0000:00
    <<<<::::88886666555533331111....----++++))))''''%%%%####    ????[[[[
    01:0000:00
    <<<<::::88886666555533331111....----++++))))''''%%%%""""!!!!????[[[[
    02:0000:00
    <<<<::::88886666555533331111....----++++))))''''%%%%""""!!!!????[[[[
    03:0000:00
    <<<<::::88886666555533331111....----++++))))''''%%%%""""    ????[[[[
    04:0000:00
    <<<<::::88886666555533331111....----++++))))''''%%%%""""    ????[[[[
    05:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$####!!!!????[[[[
    06:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$####!!!!????[[[[
    07:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$####!!!!????[[[[
    08:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$####    ????[[[[
    09:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$####    ????[[[[
    10:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$""""!!!!????[[[[
    11:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$""""!!!!????[[[[
    12:0000:00
    <<<<::::88886666555533331111....----++++))))''''$$$$""""    ????[[[[
    13:0000:00
    <<<<::::88886666444433330000....----++++))))&&&&$$$$""""    ????[[[[
    14:0000:00
    <<<<::::88886666444433330000....----++++))))&&&&$$$$""""    ????[[[[
    15:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%####!!!!????[[[[
    16:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%####!!!!????[[[[
    17:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%####    ????[[[[
    18:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%####    ????[[[[
    19:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%""""!!!!????[[[[
    20:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%""""    ????[[[[
    21:0000:00
    <<<<::::88886666444433330000....----++++((((''''%%%%""""    ????[[[[
    22:0000:00
    <<<<::::88886666444433330000....----++++((((''''$$$$####!!!!????[[[[
    23:0000:00
    <<<<::::88886666444433330000....----++++((((''''$$$$####!!!!????[[[[

    AVR へのコマンドは、4文字単位であるのはわかっているのだが、 どう組み合わされているのかがわからない。
    これを実行したのは、12時台であるが、 12:00-00:00 と 13:00-00:00 との間でコマンドが大きく変わっている。
    先日、スリープ開始時刻が

  • 現在より前なら明日
  • 現在より後なら今日
    であることを確認したが、これであろう。

    解読?!

    スリープ開始時/分、スリープ復帰時/分をいろいろ変えて、 同じような表を作っていて、気が付いた。

    それぞれの列には、2種類の文字しかない

    (上記の表では、すべては出ていないが、)
    先頭から3列は < : 8 固定
    4列目は、7 か 6 
    5列目は、5 か 4 
    6列目は、3 か 2 
      :
    14列目は、# か "
    15列目は、! か スペース
    16列目、17列目は、? [ 固定。

    4列目から15列目は、それぞれの列を 0x01 とマスクして、 2進数表現すればいいのではないだろうか?
    つまり、

    <<<<::::88886666444433330000....----++++((((''''$$$$####!!!!????[[[[
    であれば、
    6430 .-+( '$#!
    0010 0110 1011

    と変換し、 2進数で 0010 0110 1011 として数値が表されているのではないかと。
    そういう目で、再度上記表を見てみると、
    00:00-00:00 から 12:00-00:00 までは単調減少
    13:00-00:00 から 23:00-00:00 までは単調減少
    している。

    絶対値?相対値?

    コマンドで与えられる数値は、
    「何時何分に起動」と時刻(絶対値)をあらわしているのか、
    それとも
    「何分後に起動」と何らかの基準時刻から経過時間(相対値)を あらわしているのか?

    同じ時刻を指定しても、実行する時間によって、コマンドが異なることから、 相対値と考えられる。

    基準時間

    何らかの時間(基準時間)の「何分後に起動」と指定しているとして、 その基準時間は?
  • スリープ開始時間?
  • コマンド送信時間?

    最初の表のコマンドを数値に変換し、実行時刻も併せて整理してみる
    スリープ開始スリープ復帰 コマンド値:()内は10進実行時刻
    00:0000:000011101111110b(1918)12:14
    01:0000:000011101111101b(1917)12:15
    02:0000:000011101111101b(1917)12:15
    03:0000:000011101111100b(1916)12:16
    04:0000:000011101111100b(1916)12:16
    05:0000:000011101111011b(1915)12:17
    06:0000:000011101111011b(1915)12:18
    07:0000:000011101111011b(1915)12:18
    08:0000:000011101111010b(1914)12:19
    09:0000:000011101111010b(1914)12:19
    10:0000:000011101111001b(1913)12:20
    11:0000:000011101111001b(1913)12:20
    12:0000:000011101111000b(1912)12:21
    13:0000:000001001110000b(624)12:22
    14:0000:000001001110000b(624)12:22
    15:0000:000001001101111b(623)12:23
    16:0000:000001001101111b(623)12:23
    17:0000:000001001101110b(622)12:24
    18:0000:000001001101110b(622)12:24
    19:0000:000001001101101b(621)12:25
    20:0000:000001001101100b(620)12:26
    21:0000:000001001101100b(620)12:26
    22:0000:000001001101011b(619)12:27
    23:0000:000001001101011b(619)12:27
    実行時間が変われば、コマンド値も変わるので、 基準時間はコマンド送信時間のようである。
    つまり「今からXX後に起動しろ」というコマンドということである。
    スリープ開始時間は ppc_uartd が管理している(開始時間になれば、 ppc_uartd が/www/script/melsub_shutdown.sh を使って電源を落とす)ので、 予想通り、スリープ開始時間はコマンドとは関係ないようである。

    XXは?
    単純に考えれば、「XX分」なのだが、、、
    最初の行では、12:14 の 1918 分(=31 時間 58 分)後は 20:12 で、 スリープ復帰時間 00:00 の2時間弱(1:48)前である。
    最後の行では、12:27 の 619 分(=10 時間 19 分)後は 22:46 で、 スリープ復帰時間 00:00 の1時間以上(1:14)前である。

    コマンド値をもっと小さくしてみる
    スリープ開始スリープ復帰 コマンド値:()内は10進実行時刻
    02:4502:50000000001101b(13)02:35
    02:4502:51000000001110b(14)02:35
    02:4502:52000000001110b(14)02:36
    02:4502:53000000001111b(15)02:36
    02:4502:54000000001111b(15)02:37
    ここでは、2分前が指定されていることになる。

    単位が分(60秒)ではなく、60+数秒なのか、 それともこんなに誤差があるのか???
    もっといろいろな時間を指定して検証したり、 実際に2、30時間後を指定してスリープさせてみたりすれば わかるのだろうが、、、、
    このぐらいにしておこう


    LinkStation/玄箱 をハックしよう → HGLAN 1.12 の FLASH ROM

    Copyright (C) 2004 Yasunari Yamashita. All Rights Reserved.
    yasunari @ yamasita.jp
    山下康成京都府向日市