2018年7月7日土曜日

FlashROMの書き込み

ROMファイルを再構成する。
cp uboot.rom new.rom
dd if=ubootenv.rom bs=1024 seek=256 of=new.rom
dd if=kernel.rom   bs=1024 seek=320 of=new.rom
dd if=rootfs.rom   bs=1024 seek=2048 of=new.rom

Long word(4byte)の逆エンディアン変換を行う

FlashROMの書き込み
消去して書込みする
sudo flashrom -V -p linux_spi:dev=/dev/spidev0.0 -c "W25Q128.V" -E
sudo flashrom -V -p linux_spi:dev=/dev/spidev0.0 -c "W25Q128.V" -w new.rom

EEPROMなどと同じく消去すると0xffで埋まる。
消去を繰り返すと素子が劣化して消去に時間が掛かるようになるらしい。
UVROMやEEPROMは劣化すると不定ビット(読むたびに異なる値)が増えたり、0xffに戻ってくれなかったりしたけど、 10万回くらい大丈夫らしいです。

jffs2イメージのmount

rootfsはjffs2圧縮なのでこれを展開ドライバ経由でマウントする。
rasberry-piにはblock2mtdドライバが無いようなので、ubuntsで実行した。

mount
#必要なカーネルモジュールをロードする。
sudo modprobe mtd
sudo modprobe mtdblock
sudo modprobe jffs2
#loopデバイスを使用
sudo losetup /dev/loop0 rootfs.rom
sudo modprobe block2mtd block2mtd=/dev/loop0,65536
sudo mount -t jffs2 /dev/mtdblock0 /mnt

umount
#後片付
sudo umount /mnt
sudo modprobe -r block2mtd
sudo losetup -d /dev/loop0
sudo modprobe -r mtdblock

ブロックサイズ(上記の例で65536)は実際のjffs2イメージのブロックサイズにあわせないとだめらしいが、
更新もできてるっぽいので以上でOKだと思う。

flashromの吸出し

Raspberry-piのSPIに3.3vSPIタイプのFlashromを直結し吸出しを行う

SPIインターフェイスは、MOSI,MISO,SCLKの3線Busに各デバイスをぶらさげ
デバイスセレクトを各個に接続する。raspiはCE0,CE1があるので2つのデバイスを接続可能。
/dev/spidev0.0 /dev/spidev0.1 に割付られる



結線は以下の通り
■ raspi側 P1コネクタ (1番ピンに印あり)
 1= 3.3V POWER                  2= 5.0V POWER
 3= GPIO0 / SDA(I2C)            4= 5.0V POWER
 5= GPIO1 / SCL(I2C)            6= GND
 7= GPIO4 / GPCLK0              8= GPIO14 / TXD(SCI)
 9= GND                        10= GPIO15 / RXD
11= GPIO17                     12= GPIO18 / PCM_CLK
13= GPIO21 / PGM_DOUT          14= GND
15= GPIO22                     16= GPIO23
17= 3.3V POWER                 18= GPIO24
19= GPIO10 / MOSI(SPI)         20= GND
21= GPIO9 / MISO(SPI)          22= GPIO25
23= GPIO11 / SCLK(SPI)         24= GPIO8 / CE0(SP1)
25= GND                        26= GPIO7 / CE1(SPI)
pin1-26は全機種共通(pin27-40は省略)

■ FlashROM側 (1番ピンに印あり)
1=CS        8=Vcc(3.3v)
2=DO        7=/HOLD
3=/WP       6=CLK
4=Gnd       5=DI

■結線
 raspi側               FlashROM側
24= GPIO8  / CE0 ------ 1=CS
19= GPIO10 / MOSI ----- 5=DI
21= GPIO9  / MISO ----- 2=DO
23= GPIO11 / SCLK ----- 6=CLK
25= GND --------------- 4=Gnd
17= 3.3V POWER ----+--- 8=Vcc(3.3v)
                   +--- 3=/WP
                   +--- 7=/HOLD
WP,HOLDはpullupする。



flashromのインストール
sudo apt-get -y install build-essential pciutils usbutils libpci-dev libusb-dev libusb-1.0-0 libusb-1.0-0-dev libftdi1 libftdi-dev zlib1g-dev subversion
svn co https://code.coreboot.org/svn/flashrom/trunk flashrom
cd flashrom
sudo make
sudo make install
Rasbian Stretch(Debian9)でSPIが安定しない(変な値が返る)ので、
1つ前のJessie(Debian8)を入れなおして使う



読み出しコマンド
flashrom -V -p linux_spi:dev=/dev/spidev0.0 -c "GD25Q128C" -r rom.bin
rom.binが作成され128Mbit(16MB)の読み出しが10分程度で完了する

FlashROMは製品によってコマンドなど異なる為、チップネームをパラメーターとして与える。
チップタイプは3byteのマニュファクチャIDで判別する。
chip        ID1 ID2
MX25L12845E C2 2018
MD25Q128SIG C8 4018 < 未対応だったがGD25Q128Cで読めた
W25Q128FVSG EF 4018



エンディアン変換

FlashROM readerにもバイトオーダー指定はあるが、short/long指定が無く常に2byte wordでの変換になるようなので、4byte word変換を行う簡単なツールを書いてこれを行った。

以下のように順番を入れ替える
ABCD|ABCD|ABCD|ABCD|ABCD|...
↓
DCBA|DCBA|DCBA|DCBA|DCBA...

ubootのconfigと思われるubootenv
生ROM
_mraqerf0x0=2110 230duabetar511= 002toob=dmc nurobfsb todtooyaleb 2=ftoo=eliamIzb egisbs2=ezoc Mlosnvedeytt=0KGShte =tca17kge 10daht3=rd79:C:E0:E:2241:1lif ddae1C=r0000f...
エンディアン変換
arm_freq=0x10112032 baudrate=115200 bootcmd=run sfboot bootdelay=2 bootfile=zImage bsbsize=2M consoledev=ttySGK0 ethact=gk7101 ethaddr=3C:97:0E:22:E1:14 fileaddr=C100000...



ブロックに分割

ROMのパーテーションブロックは起動メッセージに表示されるので、これを頼りに分割をおこなう
[    0.640000] 0x000000000000-0x000000040000 : "uboot"    256k   0x40000
[    0.640000] 0x000000040000-0x000000050000 : "ubootenv"    64k   0x10000
[    0.650000] 0x000000050000-0x000000200000 : "kernel"   1728k  0x1B0000
[    0.660000] 0x000000200000-0x000001000000 : "rootfs"  14336k  0xE00000
[    0.670000] 0x000000000000-0x000001000000 : "all"  16384k 0x1000000

DDコマンドで切り出し
dd if=rom.bin bs=1024 skip=0 count=256 of=uboot.bin
dd if=rom.bin bs=1024 skip=256 count=64 of=ubootenv.bin
dd if=rom.bin bs=1024 skip=320 count=1728 of=kernel.bin
dd if=rom.bin bs=1024 skip=2048 count=14336 of=rootfs.bin

2018年7月6日金曜日

Panが左右逆なのを修正する

KKMoon model810 s468-ukはPanが左右逆だったので、ステッピングモーターの結線を変更して修正する。

24BYJ-5Vはユニポーラ5線なので、2つのコイルの両端で4端子、これにセンタータップ結合した1本が加わり5線となっている。
コネクタは、右から 赤,黒,黄,茶,緑 の順

テスターで適当に端子間の抵抗を測ると、赤とそれ以外が22Ω、赤を除く組み合わせは全て44Ωだったので、赤がセンタータップ、あとは順に並んでいるといいな…
赤意外をプチンと切断して逆オーダーになるようつなぎ直す。
黒-緑
黄-茶
茶-黄
緑-黒

そして起動。

トルクも下がらず期待通りに動いてるようなので一安心。

2018年7月5日木曜日

SDカードがformatされる!

SDカードを挿すと勝手にformatされgcardinit2014.datが作成されますが、
/mnt/mtd/ipc/run に以下の部分があるのでこの辺いじれば回避できるかと
SD_WFFLAG="gcardinit2014.dat"
 mount /dev/mmcblk0p1 $TARGET/tmpfs/sd
 if ! ls $TARGET/tmpfs/sd/$SD_WFFLAG
 then
264をmp4とwavに分離するconvert.cが公開されてましたどこだか忘れました。
iSPYとかでPC録画を考えてたのでSD関連はサラっとしか見ていません。

NVRの基板のみ安く買えたのでこちらを試してみようと思います。

Web編集:その他の隠し項目

OSD表示と同様にhtmlのソースコードから style="display:none" を削除すると、
隠し項目が表示されるが、バージョンアップで無効になった物も存在すると思われる。
有効そうなものだけ紹介する。

Medeia→image display.html
 カメラ画質に関するいくつかの項目が表示される。

Network→wireless wifi.html
 Rote/P2Pの接続モードが追加される

Network→ONVIF onvif.html
 2nd stream、Capture設定が追加される

Alarm→Alarm alarm.html
 relay out 10-30sec、image captureの枚数設定が追加される

Alarm→schedule scheduleex.html
 schedule一括設定(Alltime/no/Specified)が追加される

Web編集:OSD表示位置の設定を追加

Media→OSD setのosd.htmlのソースコードから2箇所の style="display:none" を削除すると、以下の2項目が表示される。

Time show Top/Base :カメラ名の表示位置、画面上か下
Name show Top/Base :タイムスタンプ表示位置 〃

温度表示は固定位置のもよう。

NBD8008Rケース完成

コントロールパネル作成して、ダイソーのスタックボックスに収めました。 HDDは2.5インチ500GBが余ってたのでそれ使いました。静かで良いです。 カメラ3台H.246常時録画で40日くらい持ちそう。 マウス用にUSBコネクタをフロント出ししても良かったかも PP樹脂の...