このページは「24環境」の情報です

第6回 MTD + JFFS2 (cramfs)で最強武装

海老原祐太郎
2002/8/30

MTD (メモリーテクノロジーデバイス)とは、素のRAMやフラッシュROMをディスクとして扱う機能です。
CAT68701には128KバイトのフラッシュROMが載っていますので、このフラッシュROMの
余り部分を使用してDISKとして使ってみます。

JFFS2は "The Journalling Flash File System, version 2" ファイルシステムで、
Axis Communications社が開発したもので、Red HatのDavid Woodhouse氏がメンテナンスしています。
ジャーナリング機能を持っているので電断などの障害に強いとされています。
http://sources.redhat.com/jffs2/

カーネル 2.4.19 で作業しますので、まだ 2.4.19 に移行していない方は第4回 Linux-2.4.19を使おう を参考にしてください。

フラッシュROMの型番が SST 39SF010A と最後に"A"付きのものしかサポートしていません。

メモリマップ

mtd_map.gif

フラッシュROMの容量はわずか128Kバイトです。
前半32KバイトはIPLプログラム、残り96Kbyteをディスクスペースとして使用します。
SRAMは512K全てをディスクスペースとして使用します。

パッチを当てる

kernelpatch_2.4.19_cat68701-mtd.diff.gz をダウンロードして linux-2.4.19 にパッチを当てます。

$ cd linux-2.4.19
$ zcat kernelpatch_2.4.19_cat68701-mtd.diff.gz | patch -p1
patching file drivers/mtd/chips/jedec_probe.c
patching file drivers/mtd/maps/Config.in
patching file drivers/mtd/maps/Makefile
patching file drivers/mtd/maps/cat68701.c

コンパイル

いつもと同じように make menuconfig します。

Memory Technology Devices (MTD) --->
  <*> Memory Technology Device (MTD) support
  [ ] Debugging
  <*> MTD partitioning support
  < > MTD concatenating support
  < > RedBoot partition table parsing
  --- User Modules And Translation Layers
  < > Direct char device access to MTD devices
  <*> Caching block device access to MTD devices
  < > FTL (Flash Translation Layer) support
  < > NFTL (NAND Flash Translation Layer) support
  RAM/ROM/Flash chip drivers --->
    < > Detect flash chips by Common Flash Interface (CFI) probe
    <*> Detect non-CFI AMD/JEDEC-compatible flash chips
    [ ] Flash chip driver advanced configuration options
    < > Support for Intel/Sharp flash chips
    <*> Support for AMD/Fujitsu flash chips
    <*> Support for RAM chips in bus mapping
    < > Support for ROM chips in bus mapping
    < > Support for absent chips in bus mapping
    [ ] Older (theoretically obsoleted now) drivers for non-CFI chips
  Mapping drivers for chip access --->
    < > CFI Flash device in physical memory map
    <*> CAT68701 mtd map (JEDEC_FLASH and SRAM)
File systems  --->
  <*> Journalling Flash File System v2 (JFFS2) support

*> の部分はモジュール <M> でもOKです。いつもと同じように

$ make dep zImage modules

モジュールにした場合はロードの順番がありますので、
SH3マシンの /etc/modules は以下のようにしたらよいと思います。

mtdpart
gen_probe
cfi_cmdset_0002
jedec_probe
map_ram
cat68701
mtdblock
jffs2

起 動 

liloを打って新しいカーネルで起動してください。
正常に起動したら次のような起動メッセージがでます。

Found: SST 39SF010A
number of JEDEC chips: 1
Creating 2 MTD partitions on "CAT68701 FLASH":
0x00000000-0x00008000 : "IPL"
0x00008000-0x00020000 : "Flash FS"

確認してみます。

supercat:~# cat /proc/mtd
dev: size erasesize name
mtd0: 00008000 00001000 "IPL"
mtd1: 00018000 00001000 "Flash FS"
mtd2: 00080000 00001000 "CAT68701 SRAM"

フォーマット

jffs2ファイルシステムを使うので、まずはツールをインストールします。

この作業は PCで行ってもSH3マシンで行ってもどちらでもOK

# apt-get install mtd-tools
# mkdir jffs2tmp           仮のルートファイルシステムを作る
# touch jffs2tmp/hoge      最低でも何か一個ファイルが必要らしい
# mkfs.jffs2 -r jffs2tmp/ -p -e 0x1000 -o jffs2.img
-r ルート   -p 残りのスペースは埋める   -e セクターサイズ(=4K)  -o 出力ファイル名

jffs2.img が出来上がります。これがJFFS2ファイルシステムのイメージです。
次にこれを書き込みます。

この作業はSH3マシンで行わないと意味無い

# mknod /dev/mtd0 b 31 0
# mknod /dev/mtd1 b 31 1
# mknod /dev/mtd2 b 31 2
# cp jffs2.img /dev/mtd1

間違って /dev/mtd0 に書き込まないよーに。こちらはipl領域なので起動できなくなります。

マウント

早速マウントしてみます。

# mkdir /flash
# mount -t jffs2 /dev/mtd1 /flash
# cd /flash
# ls
hoge
# mount
/dev/hda1 on / type ext2 (rw,errors=remount-ro)
proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/mtd1 on /flash type jffs2 (rw)
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1             323M  199M  107M  65% /
/dev/mtd1              96k   24k   72k  25% /flash

容量は本当に少ないですが、使い方を考えれば便利に使えると思います。

<2002-08-31 追記>
JFFS2はデフォルトで圧縮機能を持ってると教えてもらいました(知らなかった。汗)
早速圧縮率を見てみたら半分とは言わないまでもかなり小さくなってました。
ちなみに オールゼロのファイルをコピーしたらどんなにサイズがでかくても4Kでした。
supercat:/flash# du -hs /boss/kernel/linux-2.4.19/fs/cramfs/
72k /boss/kernel/linux-2.4.19/fs/cramfs   ←  ハードディスク上
supercat:/flash# du -hs cramfs/
42k cramfs                                ←  jffs2上でのサイズ

BIOSのアップグレード

/dev/mtd0 の方は、ipl領域ですから、ここにiplプログラムを書き込むことでBIOSのアップグレードができます。
まずBIOSを以下のページからダウンロードします。

BIOSダウンロードページ (sh-stub.bin)

# cp sh-stub.bin /dev/mtd0    (5秒くらい・・電源は絶対に切らないこと)

これだけです。これで最新のBIOSに更新できます。
あまりに簡単でかえって危険なので、普段は rm /dev/mtd0 として
デバイスファイルを消しておいたほうがよいかもしれません。

SRAMの方は?

/dev/mtd2 がSRAMですが、同じ手順で JFFS2 を使うとうまくいきません。(>_<)
ext2fs で使用すれば問題ないようです。

# mkdir /sram
# mkfs.ext2 /dev/mtd2
# mount /dev/mtd2 /sram
<2001-08-31追記>
JFFS2はMTDのフラッシュメモリ上でしか動かないような感じです。
struct mtd_info -> read8() や write8() を呼び出しているのでうすうすそんな気がしてたんですけど、、
例えば HDDの空きパーテーションで実験しましたがNGでした。
ということはCF(コンパクトフラッシュ)とかにも使えないっぽい。残念。

cramfs 

おまけ。
もっとファイルを入れたい向きには、圧縮ROMファイルシステム cramfs を試してみては?
書き込みできない完全ROMファイルシステムですが圧縮する分たくさん入ります。

$ make menuconfig

File systems --->
  <*> Compressed ROM file system support
先ほどと同じように、イメージを作るところまでは PCでもSH3でもどちらで行ってもOK

# apt-get install mkcramfs
# mkdir cramfsroot
# cp 入れたいファイル cramfsroot
# mkcramfs cramfsroot cramfs.img

書き込みはSH3で行う

# cp cramfs.img /dev/mtd1
# mount /dev/mtd1 /flash