暑いから家に閉じこもって回路設計してますか? してますよね?
前回が2024年5月23日でしたから間延びしてしまったYAMAHA電動車椅子バッテリーハッキングの続きです.前回はこちら
なお免責:真似して燃えても俺はしらん
↓経緯は過去投稿を読んでもらうとして、古くなって使えないBLACK batteryから取り出した基板のEEPROMを直接読んでみた.
↓24C04という4kbit=512bytesのEEPROMが載ってる.(写真は剥がしたとこ)
I2Cを取り出すサービスコネクタのランドがありんす.ここにarduinoを接続して、直接占拠を行う.本体のCPUが24C04に繋がったままだが、静止状態ではI2C busをHigh-zにしたままで本体CPUは何もしないので、外部者がサービスコネクタからアクセスできてしまうという事情だ.
↓作業風景寿命で死んだバッテリーのデータ(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という建て付け.
↓正しいbit assignはこうなっている.下へ1bitずらした7bit=0x50をI2Cへ与える必要がある.
アドレス指定バイトを送信するI2C関数への引数が0x50になっているのはそのせいだ.
Wire.beginTransmission(0x50+a);なお、+aはP0 bitで、512アドレス空間のbit8をここに納める.
↓結果的に以上の仕組みではあったが、、、R/W bitはどうすんの?と思ってしまって納得できんのだが、そいつはI2C関数かI2C peripheralが勝手に末尾に付加してくれるものなんだろう.
かしこ
>R/W bit
返信削除R/W Control って、ハード(Write Control って、端子がある)でやってんじゃないんですかね?
※私も、この辺はよく理解して無いですが。
RW bitを判定してる原理がよくわからんくなってるけどまぁいいかとして終わらせてしまいました
削除