GM1.00KでのCHDK追試

Canon Powershot S95が修理から帰ってきてから、CHDKの自動起動に失敗していた。


この時は、ネタ元のサイトの言う通り作業して失敗した。ネタ元、


では、

  1. カメラ本体でSDを物理フォーマットする
  2. 一度、ファームウェアアップデートトリックでCHDKを起動し、CHDKのメニューから、SDをBootableにする、という作業を行う


とあったが、結果、どちらも必要ないことが分かった。要するに、(ワシはUbuntuで)SDカードのフォーマットをPCで行い、CHDKの諸々のファイルをSDカードに展開して、カードリーダから取り出す。SDカードのライトプロテクトをOnにしてカメラに挿入。撮影モードで電源OnでCHDKが自動起動する。ということだ。

ただし、以前のファームGM1.00Hで可能だった、CHDKの自動起動用SDカードを、通常の撮影に使用する、という動作が不可能になった。また、ネタ元で動作するとされている、4GBのSDカードを単一のFAT16パーティションで自動ブートさせる動作、は動作しなかった。




以下は、作業時のメモ。

1. CHDKが使えているSDカード、PCでフォーマットしたもので、CHDKファイルのみ新バージョンで置き換えたもの。

$ sudo fdisk -l /dev/sdg

Disk /dev/sdg: 16.1 GB, 16055795712 bytes
64 heads, 32 sectors/track, 15312 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9357b7f9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1   *           1           3        3056    5  Extended
/dev/sdg2               4       15312    15676416    b  W95 FAT32
/dev/sdg3               1           3        3056    6  FAT16

Partition table entries are not in disk order


2. ファームアップデートトリックでCHDKの起動が出来るSD、現状のファーム (GM1.0.0K)でフォーマットしたもの。

$ sudo fdisk -l /dev/sdg

Disk /dev/sdg: 4025 MB, 4025483264 bytes
126 heads, 61 sectors/track, 1022 cylinders
Units = cylinders of 7686 * 512 = 3935232 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1               2        1023     3927040    b  W95 FAT32
Partition 1 has different physical/logical beginnings (non-Linux?):
     phys=(1, 2, 3) logical=(1, 8, 19)
Partition 1 has different physical/logical endings:
     phys=(974, 125, 61) logical=(1022, 117, 43)


3. 違いは、フォーマットの構成。CHDK用の小さなパーティションの有無と、一番目のパーティションの開始・終了位置。


4. パーティションの開始・終了位置を揃えてみる。つまり、カメラで物理フォーマットをせずPCで物理フォーマットを行う。2.ではFAT32でダメだったのでFAT16でやってみる。

4-1. SDの準備

$ sudo fdisk -l /dev/sdg

Disk /dev/sdg: 4025 MB, 4025483264 bytes
126 heads, 61 sectors/track, 1022 cylinders
Units = cylinders of 7686 * 512 = 3935232 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1   *           1        1022     3927515+   6  FAT16

$ sudo mkdosfs /dev/sdg1
mkdosfs 3.0.7 (24 Dec 2009)

$ echo -n BOOTDISK | sudo dd bs=1 count=8 seek=64 of=/dev/sdg1
8+0 records in
8+0 records out
8 bytes (8 B) copied, 0.0126452 s, 0.6 kB/s

$ sudo mount /dev/sdg1 /mnt

$ sudo unzip s95-100k-1.0.0-1803-full_BETA.zip -d /mnt
Archive:  s95-100k-1.0.0-1803-full_BETA.zip
-e CHDK-CHDK for s95 fw:100k build:1.0.0-1803_BETA date:Thu, 12 Apr 2012 08:29:52 +0200
  inflating: /mnt/DISKBOOT.BIN       
  inflating: /mnt/CHDK/SYMBOLS/icon_10.rbf  
  inflating: /mnt/CHDK/SYMBOLS/icon_16.rbf  
  inflating: /mnt/CHDK/BOOKS/readme.txt  
 extracting: /mnt/CHDK/CURVES/readme.txt  
  inflating: /mnt/CHDK/DATA/GPS_Kreis.txt  
  ... snip ...
  inflating: /mnt/changelog.txt      
  inflating: /mnt/vers.req           
  inflating: /mnt/readme.txt         
  inflating: /mnt/PS.FI2             

$ sudo umount /mnt
$ sudo eject /dev/sdg


4-2. ファームアップデートトリックで実験
SDのライトプロテクトをOffにして、カメラ本体に挿入、再生モードで電源をOnした。「カードが異常です」の表示。メニューにはファームアップデートの項目は無い。SDのライトプロテクトをOnにしてカメラ本体に挿入しても同じ結果。


4-3. ブートトリックで実験
SDのライトプロテクトをOnにして、カメラ本体に挿入、撮影モードで電源をOnした。「カードが異常です」の表示。


5. パーティションの構成を揃えてみる。つまり、CHDK用の小さなパーティションを用意する。

5-1. SDカードの準備

$ sudo fdisk -l /dev/sdg

Disk /dev/sdg: 4025 MB, 4025483264 bytes
126 heads, 61 sectors/track, 1022 cylinders
Units = cylinders of 7686 * 512 = 3935232 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdg1   *           1           3       11498+   6  FAT16
/dev/sdg2               4        1022     3916017    b  W95 FAT32

$ sudo mkdosfs /dev/sdg1
mkdosfs 3.0.7 (24 Dec 2009)

$ sudo mkdosfs -F32 /dev/sdg2
mkdosfs 3.0.7 (24 Dec 2009)

$ echo -n BOOTDISK | sudo dd bs=1 count=8 seek=64 of=/dev/sdg1
8+0 records in
8+0 records out
8 bytes (8 B) copied, 0.00830938 s, 1.0 kB/s

$ sudo unzip s95-100k-1.0.0-1803-full_BETA.zip -d /mnt 
Archive:  s95-100k-1.0.0-1803-full_BETA.zip
-e CHDK-CHDK for s95 fw:100k build:1.0.0-1803_BETA date:Thu, 12 Apr 2012 08:29:52 +0200

$ sudo umount /mnt
$ sudo eject /dev/sdg


5-2. 取りあえず、上の状態で実験

Windowsからパーティションが見えないだけで、CHDKの起動には支障ないはずだ。SDのライトプロテクトをOnにして、カメラ本体に挿入、撮影モードで電源をOnした。CHDKの自動起動に成功。

SDのライトプロテクトをOffにして、カメラ本体に挿入、撮影モードで電源をOnすると、一番目の小さなパーティションを利用しようとしている。CHDKを使用しない場合に不便。

PC側での挙動は以下のとおり。SDカードをリーダに挿入すると、一番目の小さなパーティション、二番目の大きなパーティションの両方が自動でマウントされる。

5-3. Windows向けのパーティション対策を行う

$ sudo sfdisk -uS -N3 -f /dev/sdg
Checking that no-one is using this disk right now ...
OK

Disk /dev/sdg: 1022 cylinders, 126 heads, 61 sectors/track
Old situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdg1   *        61     23057      22997   6  FAT16
/dev/sdg2         23058   7855091    7832034   b  W95 FAT32
/dev/sdg3             0         -          0   0  Empty
/dev/sdg4             0         -          0   0  Empty
Input in the following format; absent fields get a default value.
<start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s>
Usually you only need to specify <start> and <size> (and perhaps <type>).
/dev/sdg3 :61 22997 6
Warning: given size (22997) exceeds max allowable size (0)
/dev/sdg3            61     23057      22997   6  FAT16
New situation:
Units = sectors of 512 bytes, counting from 0

   Device Boot    Start       End   #sectors  Id  System
/dev/sdg1   *        61     23057      22997   6  FAT16
/dev/sdg2         23058   7855091    7832034   b  W95 FAT32
/dev/sdg3            61     23057      22997   6  FAT16
/dev/sdg4             0         -          0   0  Empty
Warning: partitions 1 and 3 overlap
Do you want to write this to disk? [ynq] y
Successfully wrote the new partition table

Re-reading the partition table ...

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)

$ sudo sfdisk --id /dev/sdg 1 5
Done

$ sudo eject /dev/sdg


5-4. パーティション対策したSDで実験

SDのライトプロテクトをOnにして、カメラ本体に挿入、撮影モードで電源をOnした。CHDKの自動起動に成功。

SDのライトプロテクトをOffにして、カメラ本体に挿入、撮影モードで電源をOnすると、一番目の小さなパーティションを利用しようとしている。以前の挙動と違う。以前は二便目の大きなパーティションを使用する、CHDKを使用しない、普通の撮影が出来た。これに対し、PC側での挙動は同じ。SDカードをリーダに挿入すると、二番目の大きなパーティションのみが自動でマウントされる。


6. 前回失敗した原因

カメラ本体でSDを物理フォーマットしたためだと思われる。GM1.00HとGM1.00Kでの物理フォーマットが異なること、前回と今回の実験の比較から。