2024年7月27日土曜日

YAMAHA電動車椅子NiMHバッテリー 不揮発メモリ解析(4)直接占拠

暑いから家に閉じこもって回路設計してますか? してますよね?

前回が2024年5月23日でしたから間延びしてしまったYAMAHA電動車椅子バッテリーハッキングの続きです.前回はこちら

なお免責:真似して燃えても俺はしらん

↓経緯は過去投稿を読んでもらうとして、古くなって使えないBLACK batteryから取り出した基板のEEPROMを直接読んでみた.
↓24C04という4kbit=512bytesのEEPROMが載ってる.(写真は剥がしたとこ)
I2Cを取り出すサービスコネクタのランドがありんす.ここにarduinoを接続して、直接占拠を行う.本体のCPUが24C04に繋がったままだが、静止状態ではI2C busをHigh-zにしたままで本体CPUは何もしないので、外部者がサービスコネクタからアクセスできてしまうという事情だ.
↓作業風景

たぶん読めたと思う512bytesデータを示します.
寿命で死んだバッテリーのデータ(BLACK)
000 : FE FE 01 00 1C 09 FF FF FF FF FF FF FF FF FF FF 
010 : 9A 0D 00 00 08 30 14 83 FF FF FF FF FF FF FF FF 
020 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
030 : 00 00 CF 01 1E 00 C1 01 00 00 00 00 00 00 00 00 
040 : 00 00 00 00 00 00 00 00 C6 DE 19 00 00 00 00 00 
050 : 35 01 F9 24 EC A3 26 0C 9A 06 0D 01 00 00 00 00 
060 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
080 : 00 0F 10 4E CE 00 13 12 FF 00 20 F4 0C 20 0B 63 
090 : 02 07 0F 00 E5 08 1C 0C 02 03 02 02 1D 01 1A 1C 
0A0 : 61 4C 5D 61 5A 4C 5B 55 00 00 00 01 00 00 00 00 
0B0 : 0E 00 25 09 14 92 00 25 08 1D FF FF FF FF FF FF 
0C0 : FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
0D0 : 22 11 76 13 54 24 E8 03 88 13 AF 01 18 00 77 00 
0E0 : E8 03 10 27 00 00 18 00 EC 00 E8 03 FF FF FF FF 
0F0 : FF FF FF FF FF FF FF FF 00 17 FF FF FF FF 0A 01 
100 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
110 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
120 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
130 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
140 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
150 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
160 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
170 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
180 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
190 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1A0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1B0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1C0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1D0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1E0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
1F0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

binaryを眺めたってどうにもなんないけど、256番地以降はall zeroみたいよ.addressingをしくじって読めてなけりゃFFになるはずなのでall zeroは真実なのだろうと思ふ.

ーーーー
arduino sourceについて

Arduinoのsketchについて参考になったのはこちらのページでした.

↓これがsketchの全部.解説はサボる.24C04のaddressingが間違いやすいのでそこだけ下の方に書いておく.EEPROMを読むだけのsketchです.

#include "Wire.h"

void setup() {
  Wire.begin();
  Serial.begin(115200);
}

int adrs = 0; // address[8:0]

void loop() {
  // set address
  int a = adrs & 0x100; // adrs[8]
  a = a==0 ? 0 : 1; 
  Wire.beginTransmission(0x50+a); // device address & addres[8]
  Wire.write(adrs&0xFF); //lower address[7:0]
  Wire.endTransmission();

  Wire.requestFrom(0x50, 1); // read a byte

  byte val = Wire.read();

  char strbuf[50];

  if((adrs%16)==0) {
    sprintf(strbuf, "%03X : ", adrs);
    Serial.print(strbuf);
  }

  sprintf(strbuf, "%02X ", val);
  Serial.print(strbuf);
  if((adrs%16)==15) Serial.println("");

  delay(5);

  adrs++;
  if(adrs==512) while(1);

}

24C04のセカンドソースはたくさんあるらしいのでdatasheetは適当に検索よろ.
↓この手のserialものには定番の、何種類かあるread access方法のうち、上のsourceではrandom accessを使った.前半でaddress指定、後半で1byte readという建て付け.
↓これの前半を拡大する.
アドレス指定バイト=10100000=A0 で良いのだろうと思ったら違ってた.
↓正しいbit assignはこうなっている.下へ1bitずらした7bit=0x50をI2Cへ与える必要がある.
アドレス指定バイトを送信するI2C関数への引数が0x50になっているのはそのせいだ.
 Wire.beginTransmission(0x50+a);
なお、+aはP0 bitで、512アドレス空間のbit8をここに納める.

↓結果的に以上の仕組みではあったが、、、R/W bitはどうすんの?と思ってしまって納得できんのだが、そいつはI2C関数かI2C peripheralが勝手に末尾に付加してくれるものなんだろう.

次回は、活きの良いBLACK batteryのEEPROMを読んでみるです.

#3へ     #5へ

かしこ

2 件のコメント:

  1. >R/W bit
    R/W Control って、ハード(Write Control って、端子がある)でやってんじゃないんですかね?
    ※私も、この辺はよく理解して無いですが。

    返信削除
    返信
    1. RW bitを判定してる原理がよくわからんくなってるけどまぁいいかとして終わらせてしまいました

      削除