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 :タイムスタンプ表示位置 〃

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

Web編集:隠しページをmenuに追加

menu.htmlに隠しページへのリンクを追加する。

Alam/Motion detecton → md.html
Advanced/Multiple setting → addport.html
Advanced/Video shade → videoshade.html
mobile → mobile.html

・Motion detectonは動体検知の領域としきい値を4つまで指定できる。

・Multiple settingは複数のIPカメラをリレー接続して一括監視できる設定らしい

・Video shadeは画面の一部を黒く塗り潰す機能。
 信号機や旗が画面に映っている場合、動体検知の安定化を計る為?

・mobileはtmpfs/auto.jpgの静止画像をjavascriptでクライアントプルして連続表示するもの。
 FlashやOCXを使わず動画っぽくweb表示できるもの、PTZはPan,Tiltのみ

Web編集:webuser設定

Settings→Advanced→UserでBasic認証に使われるuser/passwordを設定できる。
adminのみ1行しか表示されていないが、user.htmlのソースコードから2箇所の style="display:none" を削除すると、user,guestも表示されるようになる。
user/userでweb表示を試したが無効になっているようだった。
画像配信やPTZのみとか権限レベルがあるのかも知れない。

/mnt/mtd/ipc/conf/config_user.ini を直接編集して、
user,guestを削除した。
権限レベルは admin=15,user=3,guest=1 となっていた。

Web編集の準備

IPカメラのWebを開くと細かな設定を行えるが、スマホにあるMotion detectionの設定が隠されていたり、 image設定のパラメータが省略されていたりと不備が多いので修正の必要がある。
IPカメラ本体のストレージには余裕があまり無いので、別途NFSサーバーを用意し、
IPカメラにNFSマウントした領域をWeb公開してデバッグを行う事にあうる。

イメージとしては
http://IPカメラ/web/ : オリジナルWeb
http://IPカメラ/www/ : デバッグ版Web ←NFSマウント ←Samba ←edit

■NFSサーバーの設定
Raspberry-pi(192.168.10.111)にUSB-HDDを接続し、/mnt/hdd1/nfsをNFSサーバーとして公開する。
同時にこの領域をsamba公開しwindows-PCなどで編集可能とする。
$ sudo apt install -y nfs-kernel-server
$ sudo nano /etc/exports
exportsファイルに以下の行を追加する
/mnt/hdd1/nfs   192.168.10.0/24(rw,async,crossmnt,no_root_squash,no_subtree_check)
service再起動
$ sudo systemctl restart nfs-kernel-server.service
確認
$ showmount -e
完了。(samba設定は割愛)

■IPカメラの設定
シリアルコンソールでrootログインし、設定を行う
# mount -t nfs 192.168.10.111:/mnt/hdd1/nfs /mnt/nfs
[ 8236.640000] svc: failed to register lockdv1 RPC service (errno 111).
mount: mounting 192.168.10.111:/mnt/hdd1/nfs on /mnt/nfs failed: Connection refused

↓ (errno 111)が出たら以下の対処 参考リンク→NFS マウントエラー時の対処法 ( svc: failed to register lockdv1 RPC service (errno 111). )

# mount -o port=2049,nolock,proto=tcp -t nfs 192.168.10.111:/mnt/hdd1/nfs /mnt/nfs
# mount -v

NFSマウントできる事を確認できたら、起動時に自動マウントとなるよう
/etc/fstab に次の1行を加える
192.168.10.111:/mnt/hdd1/nfs /mnt/nfs nfs port=2049,nolock,proto=tcp

最後にマウントポイント /mnt/nfs をweb公開する為のリンクを貼る
ln -s /mnt/hdd1/nfs /mnt/mtd/ipc/web/www

2018年7月4日水曜日

怪しげな接続を禁止する

P2PをONにするとクラウドサービスらしき鯖にpush通知しようとするので、これを禁止します。
/mnt/mtd/ipc/conf/config_platform.ini にUUIDなどと一緒にIPが設定されているので空白にします。
[xquncfg]
xqunenable                     = "1              "
xqunmode                       = "1              "
xqunuuid                       = "GGGG-123456-xxxxx"
xqunpuship                     = "47.91.149.233  "

xqunuuid                       = "GGGG-123456-xxxxx"
xqunpuship                     = "               "

その他、enable=0 になっておりますがキモチワルイので。
sccsvraddr = "www.scc21.net "
danasvraddr = "svrshp.thingsnic.com"
hichippuship = "49.213.12.136 "
svraddr1 = "50.19.254.134 "
svraddr2 = "122.248.234.207"
svraddr3 = "m2.iotcplatform.com"
svraddr4 = "m5.iotcplatform.com"
このへんも全部消します。

47.91.149.233はAlibabaでセキュリティ上は問題なさそうだというblogを見つけましたがどうなんでしょう?
参考リンク→Short security overview of the Escam G02

password関連の修正

グローバルネットに接続しない隔離環境で運用する予定ですが、 このままだと気持ち悪いので修正します。
Raspberry-piでuser追加してパスワードのハッシュをroot,admin,defaultそれぞれにコピーしました。
# cat shadow 
root:$6$D.1eR0ZD$jikgsw1JSay1GSNwMcxlxiOf6VqF05AvICt25NIhpOpVcVTQeEk89nwUOqrKSIZmVAOPnO4lMTC6KLOMYaSOV.:0:0:99999:7:::
bin:*:10933:0:99999:7:::
daemon:*:10933:0:99999:7:::
adm:*:10933:0:99999:7:::
lp:*:10933:0:99999:7:::
sync:*:10933:0:99999:7:::
shutdown:*:10933:0:99999:7:::
halt:*:10933:0:99999:7:::
uucp:*:10933:0:99999:7:::
operator:*:0:0:99999:7:::
ftp:*:10933:0:99999:7:::
nobody:*:10933:0:99999:7:::
default:$6$D.1eR0ZD$jikgsw1JSay1GSNwMcxlxiOf6VqF05AvICt25NIhpOpVcVTQeEk89nwUOqrKSIZmVAOPnO4lMTC6KLOMYaSOV.:0:0:99999:7:::
admin:$6$D.1eR0ZD$jikgsw1JSay1GSNwMcxlxiOf6VqF05AvICt25NIhpOpVcVTQeEk89nwUOqrKSIZmVAOPnO4lMTC6KLOMYaSOV.:0:0:99999:7:::

次にパーミッションの設定、全部777なってるので適宜変更。
chmod 644 /etc/passwd
chmod 644 /etc/group
chmod 640 /etc/shadow
(gshadowは存在しない)

# ls -l /etc
total 23
lrwxrwxrwx    1 root     root            20 Jul 25  2017 TZ -> /mnt/mtd/ipc/conf/TZ
drwxrwxrwx    4 root     root             0 Sep 14  2016 Wireless
-rwxrwxrwx    1 root     root           378 Jan  1 09:12 fstab
-rw-r--r--    1 root     root           268 Sep 14  2016 group
-rwxrwxrwx    1 root     root             9 Sep 14  2016 hostname
-rwxrwxrwx    1 root     root            35 Sep 14  2016 hosts
drwxrwxrwx    2 root     root             0 Sep 14  2016 init.d
-rwxrwxrwx    1 root     root           975 Sep 14  2016 inittab
-rwxrwxrwx    1 root     root            19 Sep 14  2016 issue
-rwxrwxrwx    1 root     root           876 Sep 14  2016 mdev.conf
lrwxrwxrwx    1 root     root            12 Jul 25  2017 mtab -> /proc/mounts
-rw-r--r--    1 root     root           648 Jan  1  1970 passwd
-rwxrwxrwx    1 root     root          1874 Sep 14  2016 profile
-rwxrwxrwx    1 root     root          1191 Sep 14  2016 protocols
lrwxrwxrwx    1 root     root            29 Jul 25  2017 resolv.conf -> /mnt/mtd/ipc/conf/resolv.conf
-rwxrwxrwx    1 root     root           422 Sep 14  2016 securetty
drwxrwxrwx    2 root     root             0 Sep 13  2016 sensors
-rwxrwxrwx    1 root     root         10873 Sep 14  2016 services
-rw-r-----    1 root     root           650 Jan  1  1970 shadow

rebootするとflashromも更新されます。
(LS-F2はReadonlyなのでromを採光性する必要がある:後日記載)

NBD8008Rケース完成

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