[Info] Canon Basic - Informationen, Anwendungen, Firmware-Dump

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

Canon Basic - Informationen, Anwendungen, Firmware-Dump

Beitragvon msl » 15.08.2010, 19:48

Hallo CHDK-Freunde,

wie in den News schon berichtet, gibt es eine in der Firmware vorhandene Skriptsprache, mit der sich interessante Dinge anstellen lassen.

Gleich zu Beginn dieser Diskussion soll darauf hingewiesen werden, dass man sich genau überlegen muss, was man mit dieser Möglichkeit anstellen möchte. Bei unsachgemäßer Anwendung besteht die Gefahr, dass die Firmware der Kamera unbrauchbar wird.

Was sind die Voraussetzungen, um ein Canon-Basic-Skript zum Laufen zu bringen?

1. Eine Speicherkarte, formatiert als FAT12/FAT16 oder FAT32. Bootfähigkeit wird nicht benötigt. Die Kartengröße sollte mindestens 512 MB betragen.

2. Die Speicherkarte muss aber trotzdem im Bootsektor besonders vorbereitet werden. Dazu benötigen wir einen Disk-Editor Zu empfehlen ist hier das Programm HxD in der portablen Version (Achtung richtige Version beim Download auswählen). Mit diesem Editor wird Speicherkarte angesprochen und am Offset 0x1F0 die Zeichenkette SCRIPT eingetragen. Dazu das Programm starten und unter "Extras" "Datenträger öffnen.." aufrufen. Das richtige Laufwerk für die SD-Karte auswählen. Die Option "schreibgeschützt öffnen" abwählen. Mit "Ok" das Öffnen bestätigen. Nun kann am genannten Offset die der Eintrag "SCRIPT" im rechten Fenster durchgeführt werden.

Alternativ kann auch das Programm EOSCard benutzt werden, um den Eintrag "SCRIPT" zu erzeugen. Dazu das Programm öffnen. Das Programm erkennt normalerweise die eingelegte SD-Karte automatisch. Mit "Refresh" kann die Erkennung wiederholt werden. Einfach die Option "SCRIPT" aktivieren. Die anderen Optionen sind unwichtig. Mit "Save" speichern.

3. Nun muss eine Datei mit dem Namen script.req erstellt werden. In ihr wird mit einem Text-Editor folgende Zeichenkette eingetragen: for DC_scriptdisk ohne Enter für eine neue Zeile.

4. Das eigentliche Canon-Basic-Skript kommt in die Datei extend.m. Der Name dieser Datei darf nicht anders angegeben werden, egal um welches Skript es sich handelt.

5. Das Skript wird gestartet, in dem man die Kamera im Wiedergabe-Modus startet und die Taste [SET.FUNC] drückt. Bei Kameras mit Touchscreen beim Einschalten Zoom-Hebel nach links halten und nach Einschalten loslassen und zum Skriptstart wieder nach links drücken.

Grundlegende Informationen zur Skriptsprache und deren Syntax werden in diesem Wiki-Artikel erarbeitet.

Das nachstehende Skript ist die übliche Hello-World-Demo. CHDKLover (Danke für die schnelle Integration) hat schon den Canon-Basic-Dialekt in den Syntax-Highlighter aufgenommen. Er ist im Syntax-BBCode unter "Canon Basic" erreichbar.

Syntax: [ Download ] [ Verstecken ]
Benutze Canon Basic Syntax Highlighting
private sub sayHello()
    a=LCDMsg_Create()
    LCDMsg_SetStr(a,"Hello World!")
end sub
private sub Initialize()
    UI.CreatePublic()
    sayHello()
end sub
Erstellt in 0.012 Sekunden, mit GeSHi 1.0.8.9


Es kann einfach in die leere Datei extend.m kopiert werden.

Das folgendes Skript (Autor reyalp) erstellt einen Firmware-Dump. Die im Anhang befindliche Zip-Datei enthält die beiden notwendigen Dateien. Diese werden auf die wie oben in Punkt 1 und 2 beschrieben vorbereitete SD-Karte kopiert. Kamera im Wiedergabemodus einschalten! (Wenn vorhanden [>]-Taste für den Wiedergabemodus zum Einschalten benutzen.)

Skript mit FUNC.SET starten. Eine Weile warten (ca. 1 Minute). Möglicherweise wird auf dem Display nichts angezeigt, da die Farbwerte für die Schrift von Kamera zu Kamera unterschiedlich sind. Das Skript erzeugt auf der SD-Karte zwei Dateien: PRIMARY.BIN und CBDUMPER.LOG.

PRIMARY.BIN ist der Firmware-Dump. In CBDUMPER.LOG werden Log-Informationen geschrieben. Wenn nur diese Datei verfügbar ist, war die Erstellung des Firmware-Dumps nicht erfolgreich. Bei Verfügbarkeit der Log-Datei hat man aber Gewissheit, dass das Skript funktioniert.

Ein erfolgreich erstellter Firmware-Dump hat eine Größe von 8 oder 16 MB. Bei neueren Kameras kann die Größe abweichen.

Kann trotz funktionierendem Skript kein Firmware-Dump erzeugt werden, passen möglicherweise die vorgegebenen Adressen und/oder Signaturen für die Kamera nicht und müssen angepasst werden.

Syntax: [ Download ] [ Verstecken ]
Benutze Canon Basic Syntax Highlighting
DIM startaddr=0
DIM os="unk"
DIM lcdmsg=0
DIM msgstr=0

private sub GetStart()
    if memcmp(0xFFC00004,"gaonisoy",8) = 0 then
        startaddr = 0xFFC00000
        os = "dry"
        exit sub
    end if
    if memcmp(0xFFC00008,"Copyrigh",8) = 0 then
        startaddr = 0xFFC00000
        os = "vx"
        exit sub
    end if
    if memcmp(0xFF810004,"gaonisoy",8) = 0 then
        startaddr = 0xFF810000
        os = "dry"
        exit sub
    end if
    if memcmp(0xFF810008,"Copyrigh",8) = 0 then
        startaddr = 0xFF810000
        os = "vx"
        exit sub
    end if
    if memcmp(0xFF000004,"gaonisoy",8) = 0 then
        startaddr = 0xFF000000
        os = "dry"
        exit sub
    end if
end sub
 
private sub RegisterProcs()
    if System.Create() = -1 then
        SystemEventInit()
    end if
    if ExecuteEventProcedure("UI_RegistDebugEventProc") = -1 then
        ExecuteEventProcedure("UI.CreatePublic")
    end if
end sub
 
private sub InitMsg()
    lcdmsg = ExecuteEventProcedure("LCDMsg_Create")
    msgstr = AllocateMemory(80)
    msgfile = Fopen_Fut("A/CBDUMPER.LOG","w")
    if msgfile <> 0 then
        Fclose_Fut(msgfile)
    end if
end sub
 
private sub PutMsg(msg)
    if lcdmsg >= 0 then
        LCDMsg_SetStr(lcdmsg,msg)
    end if
    msgfile = Fopen_Fut("A/CBDUMPER.LOG","a")
    if msgfile <> 0 then
        Fwrite_Fut(msg,strlen(msg),1,msgfile)
        Fwrite_Fut("\n",1,1,msgfile)
        Fclose_Fut(msgfile)
    end if
end sub
 
private sub Initialize()
    RegisterProcs()
    InitMsg()
    PutMsg("Started")
 
    GetStart()
 
    if startaddr <> 0 then
        sprintf(msgstr,"%0X %s",startaddr,os)
        PutMsg(msgstr)
        romsize = 0xFFFFFFFC - startaddr
        dumpfile = Fopen_Fut("A/PRIMARY.BIN","w")
        if dumpfile <> 0 then
            Fwrite_Fut(startaddr,romsize,1,dumpfile)
            Fclose_Fut(dumpfile)
            Wait(500)
            PutMsg("done")
        else
            PutMsg("file error")
        end if
    else
        PutMsg("not found!")
    end if
    FreeMemory(msgstr)
end sub
Erstellt in 0.013 Sekunden, mit GeSHi 1.0.8.9


Gruß msl
Dateianhänge
Dateien_für_Firmware-Dump.zip
Datei script.req und extend.m mit Firmware-Dump-Skript
(1.08 KiB) 852-mal heruntergeladen
Zuletzt geändert von msl am 18.08.2010, 08:12, insgesamt 2-mal geändert.
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

VxWorks

Beitragvon CHDKLover » 16.08.2010, 09:52

Hallo,
ich habe mich heute mit der neuen Skriptschnittstelle beschäftigt. Leider sind Skripte, die für DryOS entwickelt wurden nicht immer kompatibel mit VxWorks. Befehle, die der Parser nicht kennt werden wahrscheinlich ignoriert. Das ist nur ein Vermutung, da keinerlei Rückmeldung vom System kommt. Aber meine Skripte liefen immer ohne Abstürze durch. Ein guter Indikator für ein noch aktives Skript ist, dass die Kamera auf keine Nutzereingaben reagiert. Drückt man nach dem Start des Skriptes über "FUNC. SET" auf "MENU" dann erscheint das Menü erst nach der Beendigung des Skriptes.
Um während der Skriptabarbeitung Rückmeldungen seitens der Kamera zu bekommen, habe ich für VxWorks die beep und led Funktionalität getestet. Außerdem habe ich auf Grundlage des DryOS-Dumpers einen universal FW-Dumper geschrieben (nur mit meiner A610 getestet).

Weitere Informationen zu den Canon Skripts:
- Das Skript lässt sich nur direkt nach dem einschalten starten, es dürfen vorher keine anderen Tasten betätigt werden!
- Das Skript lässt sich nur einmal pro Kamerastart starten!
- Die Skripte ersetzten nicht die LUA und uBasic Skripte des CHDK

Nachfolgend ein paar Beispiele die auf meiner a610 (VxWorks) laufen:
Syntax: [ Download ] [ Verstecken ]
Benutze Canon Basic Syntax Highlighting
dim a,b,f,romsize,startadr=0

private sub dump()
    startadr = 0
    if memcmp(0xFFC00004,"gaonisoy",8) = 0 then &#39;DryOS
        startadr = 0xFFC00000
    else
        if Peek32(0xFFC00000) = 0xE3A00002 then &#39;VxWorks BigEndian
            startadr = 0xFFC00000
        else
            if memcmp(0xFF810004,"gaonisoy",8) = 0 then &#39;DryOS
                startadr = 0xFF810000    
            else
                if Peek32(0xFF810000) = 0xE3A00002 then &#39;VxWorks BigEndian
                    startadr = 0xFF810000
                end if
            end if
        end if
    end if

    if startadr <> 0 then
        romsize = 0xFFFFFFFC - startadr
        f=Fopen_Fut("A/PRIMARY.BIN","w")
        Fwrite_Fut(startadr,romsize,1,f)
        Fclose_Fut(f)
    end if
end sub

private sub led()
&#39;0=grün (oben)
&#39;1=rot (oben)
&#39;2=orange (unten)
&#39;3=grün (on/off)
&#39;4
&#39;5
&#39;6
&#39;7
&#39;8=blau (print)
&#39;9
&#39;10
    Driver_EnableEventProc()
    &#39;LEDDrive(3,1) &#39;schaltet power led ab ( 0=an, 1=aus)
    for a=0 to 10
        LEDDrive(a,0)
        Wait(1000)
        LEDDrive(a,0)
        for b=0 to (a + 1)
            LEDDrive(a,0)
            Wait(250)
            LEDDrive(a,1)
            Wait(250)
        next
    next
end sub

private sub beep()
    Driver_EnableEventProc()
    BeepTest()
end sub

private sub log(s)
    f=Fopen_Fut("A/info.txt","a+")
    Fwrite_Fut(s,strlen(s),1,f)
    Fwrite_Fut("\r\n",2,1,f)
    Fclose_Fut(f)
end sub

private sub info()
    Driver_EnableEventProc()
    f=Fopen_Fut("A/info.txt","w")
    Fclose_Fut(f)
    log(GetFirmwareVersion())
    log(GetBuildDate())
    log(GetBuildTime())
    GetLogToFile("A/romlog.txt",1)
end sub

private sub Initialize()
    SystemEventInit()

    led()
    beep()
    dump()
    info()
end sub
Erstellt in 0.009 Sekunden, mit GeSHi 1.0.8.9


CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon msl » 18.08.2010, 11:16

Hallo,

für die meisten stellt sich diese elementare Skript-Sprache sicherlich als weniger nützlich dar. Sie hat aber das CHDK-Projekt schon jetzt im Frühstadium der Erforschung erheblich weitergebracht.

Endlich konnte die Firmware von einigen 2010er Kameras extrahiert werden. Das betrifft bisher die A3100, die Ixus130 und die SX210. Das wäre ohne Canon-Basic nahezu unmöglich gewesen!

Diese Skript-Sprache scheint auch gute Möglichkeiten zu sein, bestimmte Kamera-Einstellungen zu überprüfen. Z.B. lassen sich die Farbeinstellungen als Farbbalken ausgeben. Evt. ergeben sich daraus auch neue Möglichkeiten zur zeitweisen Änderung von bestimmten Display-Einstellungen wie z.B. die Backlight-Helligkeit.

Ein anderes großes Thema wäre die Audio-Steuerung. Erstmalig ist es möglich, das Audio-System der Kamera anzusprechen.

Es bleibt spannend. 8)

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Beitragvon alex3000 » 18.08.2010, 12:34

Hab es mal auf der PS A490 probiert - geht leider nicht. :cry:
SX 200 IS
alex3000
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 8
Registriert: 30.08.2009, 11:17

Beitragvon msl » 18.08.2010, 12:50

Was hast du probiert und was geht nicht?

Beschreib doch mal näher, was du gemacht hast, sonst ist deine Aussage wenig hilfreich. ;)

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

A490

Beitragvon alex3000 » 23.08.2010, 12:50

Oh sorry, die Hitze...

Mit dem udumper zeigt nur NewDryOs eine Reaktion (beim Einschalten bleibt die Kamera schwarz), auch wenn danach im Dumpfile nichts drinnen steht.
Bei den anderen Optionen schaltet sie sich nur in den Playmodus.

Mit der Scriptsprache mag sie gar nicht - nicht mal ein HelloWorld ist möglich.
Und ja: ich denke, ich hab alles richtig gemacht.

P.S.: auch eine ver.req bringt nichts.
SX 200 IS
alex3000
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 8
Registriert: 30.08.2009, 11:17

Beitragvon CHDKLover » 23.08.2010, 13:24

Hallo alex3000,
ich denke das es auf der sx200is gehen sollte. Probiere es sonst einfach nochmal:
  • Speicherkarte formatieren nimm erstmal eine < 2GB Karte
  • mit einem Hexeditor die Speicherkarte als Laufwerk laden und an Offset 0x1F0 "SCRIPT" eintragen
  • Datei "script.req" anlegen, nicht das dich Windows täuscht und die Endung txt anhängt
  • diese Datei in einem Editor deiner Wahl öffnen und die Zeichenkette "for DC_scriptdisk" hineinschreiben (brauchst kein Zeilenumbruch)
  • die eigentliche Skriptdatei "extend.m" anlegen (darf wieder nicht die Endung txt haben)
  • diese Datei öffnen und HelloWorld Beispielskript reinkopieren (das Skript funktioniert nur bei Kameras mit DryOS Betriebssystem)
  • Kamera im Play Modus starten und Func.Set Taste drücken

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon alex3000 » 25.08.2010, 06:25

CHDKLover hat geschrieben:Hallo alex3000, [...]


Ja, genau so hab ich das gemacht. Aber bei der A490 tut sich nix.

Bei meiner SX200IS interessierts mich ja nicht, da läuft ja CHDK... :D
SX 200 IS
alex3000
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 8
Registriert: 30.08.2009, 11:17

Beitragvon CHDKLover » 25.08.2010, 08:54

Hallo alex3000,
ich hatte in deiner Signatur nur die sx200is gesehen, daher meine Vermutung. Aber das währe ein schöner Gegenvergleich, wenn du die Karte mal in deine sx200is steckst und versuchst das Skript da auszuführen. Sollte das auch nicht gehen, dann kann man die Skriptschnittstelle so nicht ansprechen.
Aber ich hab mal geschaut, vielleicht geht die neue uDumper Methode von reyalp - http://chdk.setepontos.com/index.php/to ... l#msg38534

SD-Karte bootfähig machen und die diskboot.bin darauf kopieren. Kamera starten und warten.

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon alex3000 » 25.08.2010, 09:27

CHDKLover hat geschrieben: vielleicht geht die neue uDumper Methode von reyalp - http://chdk.setepontos.com/index.php/to ... l#msg38534


Leider nein, das geht auch nicht. :cry:
SX 200 IS
alex3000
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 8
Registriert: 30.08.2009, 11:17

Beitragvon bastisk8 » 25.08.2010, 14:38

Ist diese neue Skriptsprache denn auch für die Canon-DSLRs zu gebrauchen?

Können wir dann evtl. in der Zukunft doch mit etwas ähnlichem wie CHDK für Spiegelreflexkameras (abgesehen von Magic Lantern) rechnen?
Canon Powershot A 590is (natürlich mit CHDK)
Canon Eos 1000d mit Canon 18-55is und Tamron 55-200
bastisk8
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 22
Registriert: 21.10.2008, 13:53
Wohnort: Sachsen

Beitragvon msl » 18.09.2010, 09:02

Skript zum Testen der LED-Ansteuerung (nur DryOS)

Das Skript spricht die die Canon-Funktion LEDDrive() an und testet Werte von 0 - 15. So kann man sehen, bei welchem Wert welche LED anspricht. Mit diesem Ergebnis kann dann die CHDK-Skript-Funktion set_LED genauer auf die Kamera abgestimmt. werden.

Syntax: [ Download ] [ Verstecken ]
Benutze Canon Basic Syntax Highlighting
dim a,b,c

dim cl=1



private sub Initialize()



    System.Create()

    Driver.Create()

    UI.CreatePublic()



    a=LCDMsg_Create()

    LCDMsg_ChangeColor(a,cl)

    LCDMsg_SetStr(a,"LED Test")

    Wait(2000)

 

    b=LCDMsg_Create()

    LCDMsg_ChangeColor(b,cl)

    LCDMsg_Move(b,300,50)



    for c=0 to 15  

        LCDMsg_SetNum(b,c)

        BeepDrive(3)

        Wait(500)

        LEDDrive(c,0)

        Wait(2000)

        LEDDrive(c,1)

    next



    Wait(2000)

    LCDMsg_SetStr(a,"Test End")



end sub



private sub Terminate()



end sub
Erstellt in 0.005 Sekunden, mit GeSHi 1.0.8.9


Möglicherweise muss die Textanzeige-Farbe geändert werden. Dazu den Wert für cl variieren oder einen anderen Hintergrund wählen. Textfarben scheinen von Kamera zu Kamera unterschiedlich zu sein. Bei der A720 ist 1 weiß.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re:

Beitragvon CrazyHazle » 17.11.2010, 10:25

bastisk8 hat geschrieben:Ist diese neue Skriptsprache denn auch für die Canon-DSLRs zu gebrauchen?

Können wir dann evtl. in der Zukunft doch mit etwas ähnlichem wie CHDK für Spiegelreflexkameras (abgesehen von Magic Lantern) rechnen?


Hallo Zusammen,

ich will die Frage von bastisk8 nochmal aufgreifen. Hat schon jemand versucht das Canon Basic auf einer aktuellen DSLR in Betrieb zu nehmen? Also eine mit SD-Karte?

LG Crazy
Ixus 50 101b
Ixus 30 still waiting for Ixus 30 port.
CrazyHazle
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 17
Registriert: 17.11.2010, 08:02
Kamera(s): Ixus 30, Ixus 40, Ixus 50, PowerShort 720 IS, EOS 60D

Re: Canon Basic - Informationen, Test, praktische Anwendunge

Beitragvon f_m_b » 23.05.2011, 21:54

Hallo zusammen.

Ich versuche gerade für die SX20 das manuelle Starten aktiv zu bekommen.
Dabei ist mir aufgefallen, dass der Dump der SX20 (1.02B) unvollständig war.
Mit Hilfe von diesem Beitrag, CANON-BASIC und folgendem Skript: Link habe ich innerhalb 15 Minuten das vollständige DUMP-File in "Händen".

WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNSINN...
f_m_b
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 148
Registriert: 30.05.2010, 21:59
Kamera(s): -

Re: Canon Basic - Informationen, Test, praktische Anwendunge

Beitragvon Nando » 30.06.2011, 14:44

Hallo zusammen,
ich habe CANON-BASIC an meiner Canon PowerShot SX200IS getestet.

Ich bekomme nicht genau mit, wann das Script wirklich gestartet wurde.
Wenn ich einmal die Taste [SET.FUNC] drücke, bekomme ich keine Rückmeldung. Es sieht so aus, als ob nichts passiert.
Wenn ich länger die Taste [SET.FUNC] drücke, stand beim ersten Versuch 'done' über der Animation der Uhr, auf dem LCD.

Das Script Firmware-Dump, vom ersten Beitrag, lief im ersten Versuch durch und meldet "done". Auf der SD-Karte war die Datei PRIMARY.BIN (Größe 8 323 068) hinzugekommen.
Eine heruntergeladenes Firmware-Dump ist kleiner (Größe 4 194 304).

Ich habe es weitere Male probiert, mit der selben Dateigröße.
Wie ich im Internet gelesen habe, ist die Größe korrekt. Die erste Zeile im Hexeditor geöffnet passt.

Soll ich das Firmware-Dump irgendwo hochladen?

bis dann,
Nando
Canon PowerShot SX200 IS 100D (seit Mitte Nov 2009), Canon PowerShot A1000 IS 100b
Nando
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 257
Registriert: 11.11.2009, 15:55

Nächste

Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste