2018年6月28日木曜日

STM32H743 の USB が使えずの対策

CubeMX (4.25.0) で生成した STM32H743 の USB Audio, CDC の test code を自分流にアレンジして composite device として動作する様にしている. しかし, いつからか power on reset 後 USB が接続できず, PC が enum できない状態になってしまった. ただ, 一度 BOOT0 端子を high にして reset 解除を行なうと rom boot が動作する事になるが, 一旦, この rom boot を動作させた後, reset (power on reset でない) すると接続できていたので, この方法でずっと開発を行なっていた.
ただそろそろ,  power on reset 後に USB が認識できる様にしようと調べてみたが, 結論としては CubeMX で生成された code から power management の code を削除してしまったのが原因だったと思われる.

必要な code は以下の通り

HAL_PWREx_EnableUSBVoltageDetector();
内容は
PWR->CR3 |= PWR_CR3_USB33DEN;
を呼んでいるだけであるが, USB 用の 3.3V regulator を動作させるかどうかの電圧 detector の電源を on/off するもので,  USB を使用する前に on する必要がある. Reference manual には 5V を入力できてそれを 3.3V にする事ができるし, 3.3V を入力する事もできると書いているが,  Nucleo H743ZI の回路は 3.3V を接続されていて regulator を動作させる必要はない. しかし, この regulator を動作させるかさせないかの detect が動作させていない為, regulator の動作が不定になり, USB の動作ができなかったという事だと推察される.

現状 USB を initialize する時の Init(), Register(), Start() の後に code を入れたが, 使用前という事は Start()の前の気がしないではないが, cpu clock で数十数百程度の事なので, たぶんそれは細かすぎる事でなんでしょう.

以下 STM32H743ZI  reference manual DoclD029587 Rev3 から抜粋


追記 (201808050)
上記で rom boot からの reset でUSB が使えて件は, PWR->CR3 が power on reset 以外初期化をしない為に rom boot で USB33DEN を有効にしていてそれを reset 端子による reset 後も引き継いていた為でした (CR2 も同様).

以下 STM32H743ZI  reference manual DoclD029587 Rev3 (section 6 PWR)から抜粋



2018年6月8日金曜日

12TB RAID5 mount 出来ず, でも復活

 先日いきなり, Ubuntu 14.04 に接続している 12TBの RAID5 の disk が access できなくなった.
df してもそれほど問題がある様に思えない. ただ ls しても file がない. dmesg を見ると error っぽい log がある. HDDが動かなくなってはイヤなので fstab で mount 項目を comment out, RAID disk の電源はそのままに, PCだけ reboot した.
 
まず手動で mount すると syslog に以下のwarning が

Jun  7 07:03:46 waters kernel: [90179.663177] sd 9:0:0:0: [sdb] Attached SCSI disk
Jun  7 07:03:47 waters kernel: [90180.352750] EXT4-fs (sdb): ext4_check_descriptors: Checksum for group 3644 failed (10343!=7979)
Jun  7 07:03:47 waters kernel: [90180.352758] EXT4-fs (sdb): group descriptors corrupted!

 
ググってみると, superblock がおかしくなっているという事, mkfs 時に super block の backup が作られているので, 使用する superblock を backup の方を使うことで mount できる.

復活までの操作は
1.  mke2fs -n /dev/sdx   で該当 file system の情報を得る
2.  e2fsck.ext4 -b superblock -B blocksize /dev/sdx   で fsck する
3.  e2fsck.ext4 /dev/sdx  で念の為、通常の superblock で fsck


# mke2fs -n /dev/sdb
mke2fs 1.42.9 (4-Feb-2014)
/dev/sdb is entire device, not just one partition!
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)                                               ### fsck で指定する block size
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
366276608 inodes, 2930212864 blocks
146510643 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
89423 block groups
32768 blocks per group, 32768 fragments per group
4096 inodes per group
Superblock backups stored on blocks:
                          ### 以下がsuperblock の list 今回は 32768 を使用
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,

    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
   102400000, 214990848, 512000000, 550731776, 644972544, 1934917632,
   2560000000





# fsck.ext4 -b 32768 -B 4096 /dev/sdb
e2fsck 1.42.9 (4-Feb-2014)
Superblock needs_recovery flag is clear, but ジャーナル has data.
Recovery flag not set in backup superblock, so running ジャーナル anyway.
/dev/sdb: recovering journal
Pass 1: Checking iノードs, blocks, and sizes
Iノード 721821000 is in use, but has dtime set.  修正<y>? yes             ### ひたすら "Enter" を押す
Iノード 721821000 has imagic flag set.  クリア<y>? yes
Iノード 721821000 has a extra size (30009) which is invalid 修正<y>? yes
Iノード 721821001 is in use, but has dtime set.  修正<y>? yes
Iノード 721821001 has a extra size (61060) which is invalid 修正<y>? yes
Iノード 721821001 has 圧縮ion flag set on ファイルシステム without 圧縮ion support.  クリア<y>? yes
Iノード 721821001 has a bad extended attribute block 2459851454.  クリア<y>? yes
Iノード 721821001, i_size is 4609247913415050120, should be 0.  修正<y>? yes
Iノード 721821001, i_blocks is 34852892082033, should be 0.  修正<y>? yes
Iノード 721821002 is in use, but has dtime set.  修正<y>? yes
Iノード 721821002 has imagic flag set.  クリア<y>? yes
Iノード 721821002 has a extra size (41406) which is invalid 修正<y>? yes
legal block #3 (3411828393) in iノード 721821004.  CLEARED.
Block #4 (2834099418) causes symlink to be too big.  CLEARED.
Block #5 (223285474) causes symlink to be too big.  CLEARED.
Block #6 (151183681) causes symlink to be too big.  CLEARED.
Illegal block #7 (3028417134) in iノード 721821004.  CLEARED.
Block #8 (286251651) causes symlink to be too big.  CLEARED.
Block #9 (2027505565) causes symlink to be too big.  CLEARED.
Block #10 (1513751525) causes symlink to be too big.  CLEARED.
Illegal block #11 (3043589953) in iノード 721821004.  CLEARED.
Too many illegal blocks in iノード 721821004.Clear inode<y>? yes
Iノード 721821000 has a bad extended attribute block 1787912555.  クリア<y>? yes
Iノード 721821000 has INDEX_FL flag set but is not a ディレクトリ.Clear HTree index<y>? yes
Iノード 721821000, i_size is 5904482037710001798, should be 0.  修正<y>? yes
Iノード 721821000, i_blocks is 1997111956269, should be 0.  修正<y>? yes
Iノード 721821003 has INDEX_FL flag set but is not a ディレクトリ.Clear HTree index<y>? yes
Iノード 721821003, i_size is 7593185805256298082, should be 0.  修正<y>? yes
Iノード 721821003, i_blocks is 113575096955107, should be 0.  修正<y>? yes

Restarting e2fsck from the beginning...
Pass 1: Checking iノードs, blocks, and sizes

Running additional passes to resolve blocks claimed by more than one iノード...
Pass 1B: Rescanning for multiply-claimed blocks




Free blocks count wrong for グループ #9749 (32768, counted=1272).
Free blocks count wrong for グループ #9750 (32768, counted=1272).  
### ひたすら "Enter" 押すがかなり時間がかかるので 停止
 
# fsck.ext4 -y -b 32768 -B 4096 /dev/sdb         ### all yes を指定

# fsck.ext4 -y  /dev/sdb                                  ### 念の為, 通常の superblock を使用して fsck

# mount /dev/sdb /mnt                                  ### mount できた


RAID5 は壊れ出すと修復不可能だが, 今回は super blockがおかしくなっただけなので,なんとかなった.
しかし, いつ HDD が壊れてもしょうがない. 他の server に使用している同型の RAID5 は 2回 HDD を交換している. やはり backup がひつ必要だ. 幸い HDD が 6TBなどは 2,3万円で購入できる. RAID0 もでいいから 12TB の backup を用意しておいた方がよいだろう.