There is always something to learn,
Repetition proves it's worth
Without those moments, we would not remember
Sonata Arctica - Everything Fades To Gray


Dev Links


File(s) Version' Mirror(s) Note(s)
CardTricks 1.44 mirror2 -- mirror3 -- mirror4 sfx .exe, ~510kB
CardTricks 1.45 DSLR mirror2 with CF-card support, sfx .exe, ~510kB
CameraVersion 1.1 mirror2 sfx .exe, ~2.6MB
CHDK-Shell 2.80 FULL mirror1 with gcc devkits, sfx .exe, ~18.8MB

CHDK package filenames
  |    |    |    |    |    |
  |    |    |    |    |    +-- optional: BETA means: port is in beta state, some minor features may not work
  |    |    |    |    +------- optional: package type, full means: complete package incl. lang files, fonts  etc.
  |    |    |    +------------ SVN trunk version, the development build number (automatically set)
  |    |    +----------------- CHDK version number (manually set)
  |    +---------------------- firmware version
  +--------------------------- camera model

NEW CHDK features

long exposures


IMPORTANT: The content of this page is outdated. If you have checked or updated this page and found the content to be suitable, please remove this notice.

  • Forum thread: [1]
  • The following cameras now has the long exposure possibility, this means: no more limit to 64 seconds, exposure times up to 2000 seconds are available!
a530, a540, a550, a560, a570, a590, a630, a710
ixus70_sd1000, ixus80_sd1100, ixus870_sd880, ixus90_sd790, ixus950_sd850, ixus970_sd890
s3, s5
sx1, sx10, sx200

PTP stuff

  • PTP forum thread: [2]
  • ewavr's test versions & tools: [3]
  • The PTP stuff is available for following cameras:
a540-100b (patch by reyalP, [4])
a590-100e, a590-101b
a610-100e, a610-100f, a650-100d (patch by lauer, [5])
sx10-101a, sx10-102b


These scripts or script fragments are samples from my private collection; they are tested for my privat purposes only !
They may or may not work on other cameras - use them on your own risk !

unleash Canon TL

  • only for Digic III cameras with internal time lapse video feature, like the SD870
  • With this script you can override the Canon time lapse value...
  • The interval value is set to 5 seconds by default, adjustable in the script menu;
    this will be active until the value is changed in the Canon menu or until the camera is powered off.
  • Just load the script, set the time you want & start it with the shutter button;
    then leave <Alt> mode and make your time lapse or whatever else you want to do...
  • tested on: SD870
  • last update: 06-Feb-2010/fe50

You can also set other propcases with this script; DO NOT change the first parameter (propid, default value is 165) until you exactly know what you are doing !

rem override Canon interval, Digic III prop165, value in ms
@title set tl propcase
@param a propid
@default a 165
@param b new value in s
@default b 5
@param d propcase factor
@default d 1000
b = b * d
get_prop a c
print "Old value : " , c
set_prop a b 
print "Now set to: " , b
sleep 2000

double intervalometer

  • simple Lua intervalometer with adjustable shot count
  • inner loop: takes x shots in the given interval
  • outer loop: runs inner loop in the given interval
  • works with "old style" shutter button emulation instead of shoot(), should work on all cameras, also on older Ixus models, OS and image processor shouldn't matter
  • tested with: SD400, SD870, SX10
  • last update: 06-Feb-2010/fe50

@title double intervalometer
@param a interval inner loop, min
@default a 0
@param b ...sec
@default b 5
@param c shots in inner loop
@default c 3

@param d  interval outer loop, min
@default d 0
@param e ...sec
@default e 15
Interval1 = a*60000 + b*1000
Interval2 = d*60000 + e*1000
InnerShots = 0
OuterShots = 0

-- (dummy) restore() is called when the script is interrupted
function restore()
	--print("restore() !")

-- take the image;  shoot() may be problematic on some ixus cams,
-- so the traditional button emulation is used...
function TakePicture()
	until get_shooting() == false

-- takes c images with interval given as first two parameters
function InnerLoop()
	StartTick = get_tick_count()
	InnerShots = InnerShots +1
	sleep(Interval1 - (get_tick_count() - StartTick))

-- MAIN -------------------------------------------------------------------------------------
-- main loop ("outer loop"),  calls the inner loop with the interval given in parameter d and e
repeat -- runs endless...
	StartTick = get_tick_count()
	for z=1, c do
	OuterShots = OuterShots +1
	print("o:",OuterShots," total:",InnerShots)
	sleep(Interval2 - (get_tick_count() - StartTick))
until false

fast shooter

  • simple duration shooter script
  • this script simply holds (virtualy, of course) the shutter button down for a while...
  • useful for fast & unlimited bracketing in continuous mode:
    • set up CHDK bracketing, e.g. [+/-] bracketing with [2/3 Ev] steps
    • set the camera to continuous mode (or AF cont. mode), set up the camera for your needs (e.g. camera mode, ISO, focus, flash ...)
    • load & run the script (adjust the Duration in the script menu to your needs)
  • tested with: SX10
  • last update: 17-Apr-2010/fe50

@title fast shooter
@param a Duration, min
@default a 0
@param b ...sec
@default b 20
Interval = a*60000 + b*1000			-- we need the time value in ms
StartTick = get_tick_count()			-- start time value
press("shoot_half")				-- prepare...
repeat sleep(50) until get_shooting() == true	-- wait until focus is ok
press("shoot_full")				-- start capturing...
sleep(Interval - (get_tick_count() - StartTick))-- wait
release("shoot_full")				-- time is over, release the shutter


ewavr's 12to10.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#define MAX_ROWPIX 10000   
#define ROWLEN_12 ((MAX_ROWPIX*12)/8)
#define ROWLEN_10 ((MAX_ROWPIX*10)/8)
#define OUT_FILE_NAME  "out.crw"
int main(int argc, char **argv)
    FILE *rawin=NULL, *rawout=NULL;
    unsigned char rawrow12[ROWLEN_12];
    unsigned char rawrow10[ROWLEN_10];
    unsigned short row[MAX_ROWPIX];
    unsigned int rowpix, rows, rowlen_12, rowlen_10;
    struct stat info;
    unsigned int nrow,i,src;
        if (argc==1) {
            printf("filename expected"); 
            return 1;
        if (!rawin || !rawout) {
            printf("error 1"); 
            return 1;
        if (stat(argv[1],&info)!=0) { printf("file not exist\n"); return 2;}

        switch (info.st_size){
         case (3720*2772*12)/8: rowpix=3720; rows=2772;  break; // another 10 MP with 12 bit RAW
         case (4480*3348*12)/8: rowpix=4480; rows=3348;  break; // 14.7 MP with 12 bit RAW

         default: printf("file is unknown\n"); return 3;
        printf("processing %s", argv[1]);

        for (nrow=0; nrow<rows; nrow++) {

            fread(rawrow12, 1, rowlen_12, rawin);
            for (src=0, i=0; i<rowpix; src+=6, i+=4) {
                row[i+0]=((0xFF0&(((unsigned short)rawrow12[src+1])<<4)) | (rawrow12[src+0] >> 4)) >>2;
                row[i+1]=((0xF00&(((unsigned short)rawrow12[src+0])<<8)) | (rawrow12[src+3]     )) >>2;
                row[i+2]=((0xFF0&(((unsigned short)rawrow12[src+2])<<4)) | (rawrow12[src+5] >> 4)) >>2;
                row[i+3]=((0xF00&(((unsigned short)rawrow12[src+5])<<8)) | (rawrow12[src+4]     )) >>2;
            for (src=0, i=0; i<rowpix; src+=10, i+=8) {
          fwrite(rawrow10, 1, rowlen_10, rawout);
    return 0;

Adding support for new fw...

  1. REDIRECT Adding support of a new firmware version

Scripting commands


IMPORTANT: The content of this page is outdated. If you have checked or updated this page and found the content to be suitable, please remove this notice.

Command Lua uBasic bla1 bla2 bla3 bla4 bla5
autostarted yes yes          
binstr yes no          
bitand yes no          
bitnot yes no          
bitor yes no          
bitshl yes no          
bitshri yes no          
bitshru yes no          
bitxor yes no          
call_event_proc yes no          
call_func_ptr yes no          
click yes yes          
cls yes yes          
console_redraw yes yes          
exit_alt yes yes          
get_autostart yes yes          
get_av96 yes yes          
get_buildinfo yes no          
get_bv96 yes yes          
get_day_seconds yes yes          
get_disk_size yes yes          
get_dof yes yes          
get_drive_mode yes yes          
get_ev yes yes          
get_exp_count yes yes          
get_far_limit yes yes          
get_flash_mode yes yes          
get_flash_params_count yes no          
get_flash_ready yes yes          
get_focus yes yes          
get_focus_mode yes yes          
get_free_disk_space yes yes          
get_histo_range yes yes          
get_hyp_dist yes yes          
get_IS_mode yes yes          
get_iso_market yes yes          
get_iso_mode yes yes          
get_iso_real yes yes          
get_jpg_count yes yes          
get_mode yes yes          
get_movie_status yes yes          
get_nd_present yes yes          
get_near_limit yes yes          
get_orientation_sensor yes yes          
get_parameter_data yes no          
get_prop yes yes          
get_prop_str yes no          
get_propset yes yes          
get_raw yes yes          
get_raw_count yes yes          
get_raw_nr yes yes          
get_shooting yes yes          
get_sv96 yes yes          
get_temperature yes yes          
get_tick_count yes yes          
get_time yes yes          
get_tv96 yes yes          
get_usb_power yes yes          
get_user_av_id yes yes          
get_user_av96 yes yes          
get_user_tv_id yes yes          
get_user_tv96 yes yes          
get_vbatt yes yes          
get_zoom yes yes          
get_zoom_steps yes yes          
is_capture_mode_valid yes yes          
is_key yes yes          
is_pressed yes yes          
md_detect_motion yes yes          
md_get_cell_diff yes yes          
peek yes no          
play_sound yes no          
poke yes no          
post_levent_for_npt yes no          
post_levent_to_ui yes no          
press yes yes          
print yes yes          
print_screen yes yes          
raw_merge_start yes no          
raw_merge_add yes no          
raw_merge_end yes no          
reboot yes yes          
release yes yes          
set_aflock yes yes          
set_autostart yes yes          
set_av96 yes yes          
set_av96_direct yes yes          
set_backlight yes yes          
set_capture_mode yes yes          
set_capture_mode_canon yes yes          
set_console_autoredraw yes yes          
set_console_layout yes yes          
set_curve_state yes no          
set_ev yes yes          
set_focus yes yes          
set_iso_mode yes yes          
set_iso_real yes yes          
set_led yes yes          
set_levent_active yes no          
set_levent_script_mode yes no          
set_movie_status yes yes          
set_nd_filter yes yes          
set_prop yes yes          
set_prop_str yes no          
set_raw yes yes          
set_raw_develop yes no          
set_raw_nr yes yes          
set_record yes yes          
set_sv96 yes yes          
set_tv96 yes yes          
set_tv96_direct yes yes          
set_user_av_by_id yes yes          
set_user_av_by_id_rel yes yes          
set_user_av96 yes yes          
set_user_tv_by_id yes yes          
set_user_tv_by_id_rel yes yes          
set_user_tv96 yes yes          
set_zoom yes yes          
set_zoom_rel yes yes          
set_zoom_speed yes yes          
shoot yes yes          
shot_histo_enable yes yes          
shut_down yes yes          
sleep yes yes          
switch_mode_usb yes no          
wait_click yes yes          
wheel_left yes yes          
wheel_right yes yes          
get_capture_mode no yes          
get_display_mode no yes          
get_platform_id no yes          
get_quality no yes          
get_resolution no yes          
get_video_button no yes          
playsound no yes          
random no yes          
set_quality no yes          
set_resolution no yes          

Test Tables

Name Link License Platform Description Locale Notes
DNG4PS-2 Wikia link Windows, Mac, Linux Open Source Converter - converts CHDK RAW files into Digital Negative (DNG) format en, various
XNView Web link Windows, Mac, Linux Free (nonc) Powerfull multi-format image viewer & converter en, de, fr