Bootable SD card
From CHDK Wiki
|
If you want to make your SD card bootable under Windows, just use Cardtricks as described here: Let's put CHDK in the card |
How to prepare the SD card for booting the DISKBOOT.BIN file
- Format the card to FAT16 with a desktop computer via a USB card reader and create the DCIM and MISC folders on the newly formatted card. Alternatively, you can format your card with the camera, which should create a FAT16 filesystem. This is a simpler solution for Linux and Mac users. You may find that some preformatted cards won't be recognized by the camera as being bootable unless you format the card using the camera itself.
- Important: Due to the limitations of FAT16 this will not work with cards bigger than 4G!
Under MacOS X Leopard, the following series of steps will work:
- Load your SD card in a card reader (unless your camera appears as a disk drive when you connect it)
- Open Disk Utility and highlight the volume. Click "Info" and look for "Disk Identifier". For me, it was /dev/disk2s1
- close the Info window
- With the volume highlighted (not the "drive"), click "Unmount".
- From a Terminal command line, run a command like this:
sudo newfs_msdos -F 16 -v SX100IS -O -b 4096 -c 128 /dev/disk2s1 . If this command fails you could try this command which worked on an SD870: sudo newfs_msdos -F 16 -v SD870IS -b 4096 -c 128 /dev/disk2s1
- If you get an error on the Mac command line after running this command like "newfs_msdos: warning: /dev/disk2s1 is not a character device" go ahead and re-mount the drive in the Apple Disk Utility. The drive should still show up as a FAT 16 drive, you can then continue.
Note: Newer cards typically use the FAT32 filesystem, because FAT16 tops out at 4 GB. CHDK cannot boot from a FAT32 filesystem. If your card is larger than 4 GB, you must create TWO partitions on the card: a small FAT16 partition for booting CHDK, and a large FAT32 one for storing everything else. Some details:
- The small FAT16 partition must be the first partition on the card.
- Both partitions must be "primary" partitions (i.e. no "logical" or "extended" partitions).
- The FAT16 partition doesn't have to be larger than 1 or 2 MB (the only files it needs to hold are DISKBOOT.BIN and possibly PS.FIR). The FAT32 partition should, naturally, occupy the rest of the card.
- The FAT16 partition can be made bootable following the instructions below.
- Once CHDK is loaded, it will direct the camera to use the larger FAT32 partition for all storage operations. The FAT16 partition will become inaccessible after this, because CHDK and the camera can only handle one partition at a time. What this means is that you should place all the script/data/etc. files on the large partition, not the small one!
Contents |
[edit] Windows: Case #1
- Download the HDHacker utility to execute the following steps.
- Install and run the HDHacker.
- Select the proper drive letter corresponding to your SD card in the card reader.
- Select "logical drive" and "first sector" (as far as I know, it's the default)
- "Read sector from disk"
- Save this sector to a file for safety (512 bytes) (I named it: BootSector_G9.bin)
- Use a hex editor to edit this file
- Go to offset 0x40 (decimal 64) and type BOOTDISK in ASCII mode (as explained here). Keep in mind that, if you do not see FAT12 or FAT16 around 0x36 (decimal 54) in the hex editor, you probably picked the wrong drive. Do not overwrite anything in that case.
- Save it as a different file (I named it: BootSector_G9_bootable.bin)
- Use HDHacker to "load sector from file" this new file containing BOOTDISK information onto your SD card
- "write sector on disk" Don't forget to select the correct drive letter!
[edit] Windows: Case #2
- Extract from above bootable.zip the "bootable.exe" file
- Put your SD card into reader or SD slot in computer and copy "bootable.exe" to the SD card
- SD card behaves as disk and has assigned some letter (for example "F:"). Run shell (on winXP: menu Start - Run..., type "cmd") and change to SD card (by typing "F:" and press Enter in this example case)
- Run "bootable.exe" You will be prompt to give right syntax as "bootable.exe F:"
- Confirm and your SD card is bootable (Note: Doesn´t work with SanDisk Ultras "USB-Edition"!)
[edit] Windows: Case #3
Use CardTricks GUI Utility created by whim THX. For more info read Forum post here.
[edit] Linux:
[edit] Ubuntu:
If you have a SDHC card that is bigger than 4Gb you have to create 2 partions on the card. The first has to be formatted with FAT16 and will hold the CHDK files for booting (16MB is enough). The second partition has to be formated with FAT32 and will hold the images. The simplest way to do this in Ubuntu is to install gparted. With this great GUI based partition manager you can set up the partitions. Within gparted I set the "boot" flag for the first partition though I don't know if it is required. Then to make the first partition bootable apply one of the steps below. I used:
echo -n BOOTDISK | dd bs=1 count=8 seek=64 of=/dev/sdx1
Its short, simple and from gparted you already know the correct location of your card (/dev/sdb1 or b2 or a1 or a2 ....)
(Yes, that "BOOTDISK" is a literal string.)
[edit] General:
- Start a terminal, if you haven't done so already
- Determine the location of your card, it is usually something like /dev/sdx. If the card is mounted, you can determine the location from the mount command. Make sure you pick the right one! Replace the x in /dev/sdx appropriately.
- Make sure your card is unmounted (umount /dev/sdx1)
- Now, you need to alter the partition's bootsector. There are two ways to do this. This guide assumes hexedit is used, though you can use any hex editor. Keep in mind that, if you do not see FAT12 or FAT16 around 0x36 (decimal 54) in the hex editor, you probably picked the wrong drive. Do not overwrite anything in that case. If you see FAT32, you will have to reformat the card in FAT16 - this can be easily done with mkdosfs -F 16 /dev/your_card_partition. Make sure to copy all the needed images off the card before doing this.
- Directly
- Open your SD card's FAT partition in hexedit: hexedit /dev/sdx1
- Go to offset 0x40 (decimal 64) and type BOOTDISK in ASCII mode.
- Save (Ctrl-X in hexedit) and quit.
- Directly (without hexedit)
- echo -n BOOTDISK | dd bs=1 count=8 seek=64 of=/dev/sdx1
- Indirectly
- First, extract the bootsector like this: dd if=/dev/sdx1 of=BootSector_G9.bin bs=512 count=1
- Copy the saved file, so you have a backup: cp BootSector_G9{,_bootable}.bin
- Open the copy in a hex editor: hexedit BootSector_G9_bootable.bin
- Go to offset 0x40 (decimal 64) and type BOOTDISK in ASCII mode.
- Save (Ctrl-X in hexedit) and quit.
- Upload the bootsector to the card again: dd if=BootSector_G9_bootable.bin of=/dev/sdx1 bs=512 count=1
- Indirectly (without hexedit, assuming bash)
- First, extract the start of the bootsector like this: dd if=/dev/sdx1 of=BS.bootable bs=64 count=1
- Next, append the required name: echo -n BOOTDISK >> BS.bootable
- Finally, append the rest: dd if=/dev/sdx1 bs=1 skip=72 count=$[512-72] >> BS.bootable
- Upload the bootsector to the card again like in the former example: dd if=BS.bootable of=/dev/sdx1 bs=512
- Indirectly with script (szymonolko_a_t_o2.pl)
- Save below lines as script
- Run it with one argument which is the partition to be made bootable, eg. make.bootable /dev/mmcblk1p1
- Directly
#!/bin/bash
DEV=$1
if [[ -z "${DEV}" ]]
then
echo "Usage: $0 partition"
exit 1
fi
dd if=${DEV} of=1.tmp.bin bs=64 count=1
echo "BOOTDISK" > 2.tmp
dd if=2.tmp of=2.tmp.bin bs=8 count=1
rm 2.tmp
#512-64-8=440
dd if=${DEV} of=3.tmp.bin skip=9 bs=8 count=55
cat 1.tmp.bin 2.tmp.bin 3.tmp.bin > bootable.bin
rm 1.tmp.bin
rm 2.tmp.bin
rm 3.tmp.bin
dd if=bootable.bin of=${DEV} bs=512 count=1
rm bootable.bin
or
#!/bin/bash
[ "$1" ] || { echo "Usage: $0 partition"; exit 1; }
dd if="$1" of=bootable.bin bs=512 count=1
echo -n "BOOTDISK" | dd of=bootable.bin bs=1 count=8 seek=64 conv=notrunc
dd if=bootable.bin of="$1" bs=512 count=1
rm bootable.bin
[edit] Mac
- If you have darwin ports installed, the instructions for the Linux direct method also work for the Mac, provided you have darwin ports installed
- Go to MacPorts website and install MacPorts [1]
- type sudo port install hexedit to install hexedit
- type man hexedit to familiarize yourself with the commands of hexedit
- Open Disk Utility and click on the image for the SD card - click on "Get Info" to determine the location of the partition (such as disk4s1)
- Use Disk Utility to unmount the partition
- in a terminal window, type sudo hexedit /dev/disk4s1. Press enter (that's fn+return on some keyboards). Type in '40' to go to offset 0x40. Hit enter. Hit "tab" to switch to typing on the ASCII side. Type "BOOTDISK". Hit control-X and type "Y" when prompted to save.
- If you don't want to install darwinports and hexedit, you can also use the free 0xED [2], or Hex Fiend, which will work with the indirect way as well. This may be the simplest way for a Mac user to get a bootable SD disk.
- Go to the Disk Utility. Select your SD card from the list at the left, and click Informations to get the disk identifier (example: disk4s1). Use this in the steps below
- Using Disk Utility, unmount (don't eject!) your SD card.
- Open a Terminal window and type: dd if=/dev/disk4s1 of=BootSector_G9.bin bs=512 count=1. This copies a sector of the SD card to your Mac's hard disk.
- The BootSector_G9.bin file in your Home directory contains your SD card's boot sector. Make a backup of it in case anything goes wrong.
- Open BootSector_G9.bin with 0xED. Keep in mind that, if you do not see FAT12 or FAT16 around 0x36 (decimal 54) in the hex editor, you probably picked the wrong drive. Do not overwrite anything in that case.
- If the file is correct, select the Overwrite writing method (Command+Shift+O).
- Go to offset hex 40 (decimal 64) and press Tab. Type BOOTDISK. Save and quit.
- In your Terminal window, type: dd if=BootSector_G9.bin of=/dev/disk4s1 bs=512 count=1. This copies the modified file to the boot sector of your SD card.
- Using Disk Utility, mount the card.
- Copy the file DISKBOOT.BIN to the SD card. Make sure to use the correct version for your model of Canon camera.
- Eject the SD card. Slide the tab to the LOCK position
- If you have darwin ports installed, the instructions for the Linux direct method also work for the Mac, provided you have darwin ports installed
It is necessary to LOCK the SD card to load the CHDK software. In locked mode and booted into CHDK, you are still able to save your pictures on the card!
Now you have a Bootable SD card. The camera will now attempt to load the DISKBOOT.BIN file whenever the camera is started with that SD card (when it's locked).
[edit] Further instructions for blinking the firmware:
- Power off the G9. (Disconnect it from the PC if it was connected before)
- Take out the SD card.
- SET THE SD CARD LOCK! (THIS IS VERY IMPORTANT) Now it should be read-only.
- Insert the SD card again.
- Turn on the G9. After a few seconds, the AF (or other) led turns on, at least it looks like it. It is actually blinking, but too fast for the human eye to register.
How to stop the blinking?
- You have to remove the battery to stop the blinking.
- To use your SD card as before: simply clear the SD LOCK, so it is set back to read/write enabled.
