PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6FlashWriter: Der Opensource RP6 Loader



Fabian E.
09.01.2011, 17:18
Nach langer Wartezeit darf ich euch nun endlich mein neuestes Projekt vorstellen:
Der RP6FlashWriter

Der RP6FlashWriter ist eigentlich eine Neuprogrammierung des RobotLoaders(ehemals RP6Loader) von Arexx.

Einige Punkte dieses Programms haben mich so sehr gestört, dass ich mich entschlosses habe das Ganze selbst in die Hand zu nehmen.
Die Punkte sind im folgenden nocheinmal aufgelistet: Platform: Der aktuelle RobotLoader ist in Java geschrieben und daher nicht immer in der Lage, sich optimal in ein bestehendes System einzupassen.
Ich hatte am Anfang schon Probleme ihn auf Win 7 zum Laufen zu bringen
Langsam: Der Loader ist leider was das Starten und Verbinden betrifft echt langsam.
Unflexibel: Immer den Loder zu starten, zu verbinden und dann das Programm zu übertragen kann auf Dauer etwas nerven. Der RP6FlashWriter kann auch über eine Kommadozeile bedient werden.
(Hässlich): Naja, über das Design kann man sich jetzt streiten, mir persönlich gefällt es jedenfalls nicht.
Features: Flashen einer .Hex-Datei über die Kommandozeile Unterstützung für RP6 und M32 Flash-Vorgang wird mit CRC-Checksummen überprüft um eventuelle Fehler in der Übetragung zu erkennen und zu beheben Langsames und schnelles Flashen Aufzeichnung einer Log-Datei zur eventuellen Fehleranalyse Einbindung über Makfile möglich
Wie hier (https://www.roboternetz.de/phpBB2/viewtopic.php?p=507458#507458) angefangen, ist dieses Projekt nun soweit, dass eine erste Beta veröffentlicht werden kann.

Die Beta-Version gibt es aktuell auf zwei Platformen: Windows und Linux.
Für die Windows-Version (geschrieben in C#) bin ich selbst verantwortlich, die Linux-Version (geschrieben in FreeBASIC) entstand unter der Führung von -schumi- (https://www.roboternetz.de/phpBB2/profile.php?mode=viewprofile&u=43590).

Im Moment gibt es noch keine GUI, sondern nur eine Kommandozeilen-Version.
Diese ist im alltäglich Gebrauch aber auch wesentlich produktiver zu benutzen - vorausgesetzt, man hat sie richtig konfiguriert. Doch dazu später mehr.

Diese Version erlaubt es, z.B. den FlashWriter in das Makefile einzubinden und somit die Verwendung von "make program" zu aktivieren.
Dies ist wohl die sinnvollste Anwedung der Kommandozeile. Weiterhin kann das Programm natürlich auch manuell mit den entsprechenden Parametern gestartet werden.

Eine ausführliche Anleitung zur Verwendung der Windows-, als auch der Linux-Version findet sich im Download.

Hier noch ein kurzer Anriss der wichtigsten Parameter:
-f <Pfad>: Erlaubt es den Pfad der .Hex-Datei anzugeben. Beispiel: RP6FlashWriterC -f "Mein\Pfad\Zur\HexDatei.hex -p <Port>: Dieser Parameter gibt den zu benutzenden Port an. Beispiel: RP6FlashWriterC -p COM5 -help: Zeigt die Hilfe anNatürlich können die Parameter auch beliebig kombiniert werden.

Das Ganze ist wie gesagt erst mal eine Beta-Version. Das Programm läuft auf unseren Rechner mit unseren RP6 wunderbar, doch wir wissen nicht wie sich das mit anderer Hardware verhält.
Daher bieten wir euch nun hier diese Beta an. Ihr seid alle herzlich eingladen, das Programm ausgiebig zu testen und uns Rückmeldung zu geben.
Sollte sich zeigen, dass das Ganze stabil läuft, werden wir in nächster Zeit eine Finale Version und auch eine GUI veröffentlichen.
Auch der Sourcecode wird dann hier veröffentlicht. Falls jemand in der Zwischenzeit danach sucht, kann er sich bei einem von uns melden.

Falls irgendwelche Fehler oder Fehlfunktionen auftreten, schreibt das doch bitte hier in das Thema und gebt die verwendete Version mit an (Windows oder Linux).

DOWNLOAD

Windows (http://www.diamondback-development.de/Programs/RP6FlashWriter/Files/RP6FlashWriter_1.1.9_Windows.rar)
Linux (http://www.diamondback-development.de/Programs/RP6FlashWriter/Files/RP6FlashWriter_1.1.9_Linux.tar.gz)

-schumi-
06.06.2011, 21:52
http://dl.dropbox.com/u/19005544/Flashwriter_Python/rp6flashwriter_3.png
-= UPDATE =-



Nachdem die Linux-Version ja ein ziemlicher Reinfall war, gibts jetzt eine Neue.

Jetzt in Python statt FreeBASIC (<- Probleme mit der seriellen Schnittstelle nicht lösbar und immer größer)

Neu:

Er funktioniert :cheesy:
Kann auch Highspeed
Ist ein Skript und kein kompiliertes Programm mehr


Eine umfangreiche Hilfedatei in PDF-Form liegt bei. Und auch mit dem Paramter "-help" gibt das Skript ein paar Infos zu den Parametern preis.

Ich würde mich sehr freuen wenn es diesmal etwas mehr Resonanz gäbe :cheesy:

:arrow: Bei Fragen, Anregungen etc. einfach hier reinschreiben


Download:
-> klick (http://dl.dropbox.com/u/19005544/Flashwriter_Python/RP6FlashWriter_1.6.6.tar.gz)
Für die Windowsversion gibts noch keine Updates, Downloadlink bleibt also der hier: -> klick (http://www.diamondback-development.de/Programs/RP6FlashWriter/Files/RP6FlashWriter_1.1.9_Windows.rar)

[edit]: Was vielleicht noch angemerkt werden sollte:


Wenn man die Base programmiert zeigt der FlashWriter ja die Batteriespannung an. Nicht wundern, da ist noch ein Wurm in der Berechnung^^
Da das Programm ein Python-Skript ist das interpretiert wird, muss Python installiert sein. Sollte aber auf den meisten Distros schon vorinstalliert sein (Wird auch für Systemkomponenten benötigt)

-schumi-
07.06.2011, 20:55
Ich bin fast ein wenig entäuscht, dass hier anscheinend kein Interesse an dem Programm besteht... :-(

Gibt es hier keine Linux-user, die einen RP6 haben, oder woran liegt das?

Gruß
-schumi-

RolfD
11.06.2011, 03:21
Ich glaube die Notwendigkeit für eine Linux Version ist nicht so extrem groß, denn jeder Linuxer wird irgendwo noch ne Windoof Install haben.. und sei es nur ne Virtualbox oder Wine. Ist zumindest bei mir so.
LG

-schumi-
14.06.2011, 21:07
Ich glaube die Notwendigkeit für eine Linux Version ist nicht so extrem groß, denn jeder Linuxer wird irgendwo noch ne Windoof Install haben.

Win & Wine ist aber immer sehr unschön..^^

Aber zu der Windowsversion gibts ja leider auch keine Reaktionen...

Gruß

radbruch
05.11.2011, 21:40
Hallo

Da ich zur Zeit versuche mich mit C# vertraut zum machen wollte ich mal anschauen, wie ihr das angeht. Aber leider sind die Links tot:

http://www.diamondback-development.de/Programs/RP6FlashWriter/Files/RP6FlashWriter_1.1.9_Windows.rar
http://sourceforge.net/projects/rp6flashwriter/files/
http://sourceforge.net/apps/phpbb/rp6flashwriter/index.php

Kann man die Quellcodes noch irgendwo finden?

Gruß

mic

JayWay
06.11.2011, 12:57
Im Subversion-Zweig ist er noch in voller Schönheit zu finden:

http://rp6flashwriter.svn.sourceforge.net/

Gruß JayWay

radbruch
06.11.2011, 15:24
Klasse, danke für den Tipp. Der C#-Einsteiger hat es allerdings trotzem nicht leicht:

https://www.roboternetz.de/community/attachment.php?attachmentid=20487

...beim Öffnen von RP6FlashWriter.sln

JayWay
06.11.2011, 17:02
Mit Visual Studio 2010 Express + C# klappt es. Eventuell updaten, oder die Quellen in ein neues Projekt einbinden. Vielleicht gibt es da auch Tools zum konvertieren.

Gruß Jörg

radbruch
06.11.2011, 17:20
Nochmals Danke. Ohne Internet geht wohl nichts mehr:

http://www.tomig.at/513/visual-studio-2010-redet-nicht-mit-den-2008er/

Leider noch nicht perfekt, aber offensichtlich eine Verbesserung:

Fabian E.
20.11.2011, 10:15
Oha, Interesse für das Projekt :) Naja fast jedenfalls :D

Wenn ich wieder zu Hause bin (heute abend oder morgen), werde ich dir den fehlenden Code zukommen lassen :)

nnamsie
22.01.2012, 16:19
Hallo Fabian!

Danke für den Flashwriter!
Ich nutze das Programm unter Ubuntu 10.04 und es funktioniert wunderbar.
Der RP6Loader mit Klicki-Bunti ist unter Linux wirklich eine Gurke.
Ist halt wie beim Asuro auch: Asuro-Flash sieht zwar nett aus, ist aber nicht zu gebrauchen!
Das Programm asurocon ist zwar "nur" ein Konsolenprogramm, funktioniert aber bestens.

Ich wollte Dir dies nur als Feedback geben und hoffe, daß Du die Linuxversion auch weiter pflegst.

thx thomas

p.s.: Hast Du einen Tip, wie man den Flashwriter in makefile einbindet? (Du erwähntest das in der Anleitung, glaub ich)

Fabian E.
22.01.2012, 16:56
Ja, das ist nicht so ganz einfach...
Im makefile gibt es bei den "bösen" Sachen am Ende einen Befehle "program".
Der muss umgeschrieben werden.
Unter Windows sieht es danach so aus:

# Program the device.
program: $(TARGET).hex
..\..\Library\RP6FlashWriterC\RP6FlashWriterC.exe -f $(TARGET).hex

RP6FlashWriterC ist einfach die Windows-Consolen-Version, hier musst du dann natürlich entsprechend den passenden Linux Befehl eingeben.

Danach kannst du ein Script erstellen mit dem Inhalt

make program
Das flashst dir den RP6 dann :)

Du kannst natürlich auch make program noch zum build-script hinzufügen, wenn du das möchtest.

redapple
23.03.2015, 08:45
Hi Florian und -Schumi-,
als alter Linuxer und Konsolenfetischist hab mich sehr gefreut, die Kommandozeilenversion des FlashWriters gefunden zu haben!

Ich hab das Projekt jetzt erstmal nur überflogen und habe noch nicht wirklich viel Erfahrung mit der Robotik,
aber interessant fände ich noch, das RP6-M256-WIFI Modul über das WLAN flashen zu können.

Ich sag jetzt einfach mal, dass die Erweiterung so kompliziert ja nicht sein kann, wenn man das Script
von Schumi als Basis nimmt. Ich werde mich weiter informieren.

Jedenfalls vielen Dank für das tolle Script!

Liebe Grüße,
Daniel

[EDIT]
Ich hab ein bisschen an einem WifiWriter Script gebastelt. Basiert auf dem FlashWriter-Script von Schumi.
Funktioniert alles bis einschließlich INIT_FLASH(). Nur mit der FLASH() Funktion selber hab ich noch Probleme.

Zum einen weiß ich nicht, wann genau ich das '[P]\n' senden muss, dass SlyD hier (https://www.roboternetz.de/community/threads/58162-Diskussion-zum-RP6-M256-WIFI-Modul/page17?p=555057&viewfull=1#post555057) erwähnt.

Zweitens müssen die CHECKBYTE() Aufrufe angepasst werden?!?

Hier mal das Script soweit:


#!/usr/bin/env python

import serial
import time
import sys
import os
import socket, select
import re

Hostname = "" # *** Set default Hostname here
Port = "2000" # *** Set default Port here
Hexfilename = "" # *** Set default hexfile here
Debuglevel = 1 # *** Set default Debuglevel here (0, 1, 2, 3)
BufferSize = 1024 # size for socket.recv() buffer
Timestart = time.time()

Connection = None
Hexfile = None

def CONNECTION_READ():
data = Connection.recv(BufferSize)
if Debuglevel >= 3:
if data <> '':
print("|I " + str(data))
return data

def CONNECTION_WRITE(data):
if Debuglevel >= 3:
if data <> '':
print("|O " +str(data))
Connection.send(data)
return

def CLOSE_ALL ():
if not (Connection is None):
Connection.close()
if not (Hexfile is None):
Hexfile.close()
return

def ERROR (Message):
print
print ' ## ERROR: #########################################'
print ' # '+Message
print ' ################################################## #'
print
CLOSE_ALL()
quit(1)

def GET_BOARDINFO ():
Boardinfo = -1
CONNECTION_WRITE(chr(72))
Infostring = ''
Timeout = 0
while len(Infostring) < 9:
Infostring = CONNECTION_READ()
Timeout = Timeout + 1
if Timeout > 1000:
ERROR ('Got no boardinfo!')
Boardnr = ord(Infostring[4])
if (Boardnr == 8):
Boardinfo = 'M256-Board'
return Boardinfo

def WAIT_FOR_BOOT ():
Readbuff = ''
Timeout = 0
while Readbuff <> '\n[WIFIBOOT]\n':
Readbuff = CONNECTION_READ()
Timeout = Timeout + 1
if Timeout > 1000:
ERROR ('No message "[WIFIBOOT]"!')
return

def WAIT_FOR_READY ():
Readbuff = ''
Timeout = 0
while Readbuff <> '\n[READY]\n':
Readbuff = CONNECTION_READ()
Timeout = Timeout + 1
if Timeout > 1000:
ERROR ('No message "[READY]"!')
return

def RESET ():
# Enter CMD mode
CONNECTION_WRITE('$$$\r\n')
response = CONNECTION_READ()
if(re.search(r'CMD\r\n',response) == None):
ERROR('Not expected response: ' + response)
# set reset pin
CONNECTION_WRITE('set sys output 0x0080 0x0080\r\n')
response = CONNECTION_READ()
if(re.search(r'set sys output 0x0080 0x0080\r\n', response) == None):
ERROR('Not expected response: ' + response)
response = CONNECTION_READ()
if(re.search(r'\r\nAOK\r\n<.*> ', response) == None):
ERROR('Not expected response: ' + response)
# clear reset pin
CONNECTION_WRITE('set sys output 0x0000 0x0080\r\n')
response = CONNECTION_READ()
if(re.search(r'set sys output 0x0000 0x0080\r\n', response) == None):
ERROR('Not expected response: ' + response)
response = CONNECTION_READ()
if(re.search(r'\r\nAOK\r\n<.*> ', response) == None):
ERROR('Not expected response: ' + response)
# exit CMD mode
CONNECTION_WRITE('exit\r\n')
response = CONNECTION_READ()
if(re.search(r'exit\r\n', response) == None):
ERROR('Not expected response: ' + response)

return

def HEX_ENCRYPT (Flashdata):
Bytecounter = 0
Linecounter = 1
for Line in Hexfile:
Line = Line[1:]
Checksum = 0
Charpos = 0
while Charpos < len(Line)-2:
Hexchar = Line[Charpos:Charpos+2]
Checksum = Checksum + int(Hexchar, 16)
Charpos = Charpos + 2
Checksum = Checksum & 255
Checksum = 1 + ( ~Checksum)
if Checksum<>0:
ERROR("Checksum in Hexfile ("+str(Linecounter)+") false!")
else:
if Debuglevel >= 2:
print "Checksum in Line "+str(Linecounter)+" is OK"
Line = Line[8:]
Line = Line[:-4]
Charpos=0
while Charpos < len(Line):
Hexchar = Line[Charpos:Charpos+2]
Hexwert = int(Hexchar, 16)
Flashdata = Flashdata + chr(Hexwert)
Charpos = Charpos + 2
Bytecounter = Bytecounter + 1
if Bytecounter==256:
Bytecounter = 0
Linecounter = Linecounter + 1
while Bytecounter<256:
Flashdata = Flashdata + chr(255)
Bytecounter = Bytecounter + 1
return Flashdata

def CHECKBYTE (databyte, errormessage):
Timeout = 0
while CONNECTION_READ()<>chr(databyte):
Timeout = Timeout + 1
if Timeout > 1000:
ERROR (errormessage)
return

def INIT_UPLOAD ():
CONNECTION_WRITE(chr(73))
Timeout = 0
while CONNECTION_READ()<>chr(103):
Timeout = Timeout + 1
if Timeout > 1000:
ERROR ('RP6 cancels upload-init!')
return

def INIT_FLASH ():
CONNECTION_WRITE(chr(75))
Timeout = 0
while CONNECTION_READ()<>chr(91):
Timeout = Timeout + 1
if Timeout > 1000:
ERROR ('RP6 cancels flash-init!')
return

def CRC (Checksum, Databyte):
Tmp = (Databyte & 255) ^ (Checksum & 255)
Databyte = Tmp ^ (Tmp << 4)
Tmp1 = ((Databyte & 255) << 8 | Checksum >> 8 & 255)
Tmp2 = (Databyte & 255) >> 4
Tmp3 = (Databyte & 255) << 3
return Tmp1 ^ Tmp2 ^ Tmp3

def FLASH (Flashdata):
Blockcounter = 0
Bytecounter = 0
while Bytecounter < len(Flashdata):
CONNECTION_WRITE('[P]\n')
print(CONNECTION_READ())
Blockcounter = Blockcounter + 1
Checksum = 65535
CONNECTION_WRITE(chr(170))
CONNECTION_WRITE(chr(128))
CONNECTION_WRITE(chr(0))
CONNECTION_WRITE(chr(Blockcounter-1))
Checksum = CRC(Checksum, 170)
Checksum = CRC(Checksum, 128)
Checksum = CRC(Checksum, 0)
Checksum = CRC(Checksum, Blockcounter-1)
Blockbytenr = 0
while Blockbytenr < 256:
Blockbytenr = Blockbytenr + 1
Databyte = ord(Flashdata[Bytecounter])
CONNECTION_WRITE(chr(Databyte))
Checksum = CRC(Checksum, Databyte)
Bytecounter = Bytecounter + 1
CONNECTION_WRITE(chr(Checksum & 255))
CONNECTION_WRITE(chr((Checksum >> 8) & 255))
CONNECTION_WRITE(chr(170))

if Debuglevel >= 1:
print " Block",
print Blockcounter,
print "DONE. Bytes:",
print Bytecounter,
print " Checksum:",
print Checksum
if Boardinfo == 'Base-Board':
CHECKBYTE(66, 'RP6 cancels Block '+str(Blockcounter)+'!')
CHECKBYTE(93, 'RP6 cancels Block '+str(Blockcounter)+'!')
CHECKBYTE(91, 'RP6 cancels Block '+str(Blockcounter)+'!')
if Boardinfo == 'M32-Board':
CHECKBYTE(66, 'RP6 cancels Block '+str(Blockcounter)+'!')
CHECKBYTE(32, 'RP6 cancels Block '+str(Blockcounter)+'!')
CHECKBYTE(93, 'RP6 cancels Block '+str(Blockcounter)+'!')
CHECKBYTE(91, 'RP6 cancels Block '+str(Blockcounter)+'!')
if Boardinfo == 'M256-Board':
check = CONNECTION_READ()
print('# Check: ' + check)
print('# Check length: ' + str(len(check)))

return



Flashdata = ''

print
print " ################################################## #"
print " # #"
print " # ****** RP6 FlashWriter ****** #"
print " # by Simon Schumann #"
print " # #"
print " # simon.schumann@web.de #"
print " # #"
print " ################################################## #"
print

print "DOING: Converting arguments"
if((len(sys.argv) < 3) | len(sys.argv) > 4):
print('Usage: WifiWriter.py <hexfilename> <host> [<port>]')
sys.exit()
Hexfilename = sys.argv[1]
Host = sys.argv[2]
if(len(sys.argv) == 4):
Port = sys.argv[3]

print " File: ",
print Hexfilename
print " Host: ",
print Host
print " Port: ",
print Port
print " Debuglevel: ",
print Debuglevel
print " DONE"

print "DOING: Open hexfile ",
if not os.path.isfile(Hexfilename):
ERROR("Open hexfile: No such file!")
Hexfile = open(Hexfilename, "r")
print "DONE"

print "DOING: Parsing hexfile"
Flashdata = HEX_ENCRYPT(Flashdata)
print " DONE"

print "DOING: Open connection to Robot ",
Connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Connection.settimeout(2)

try:
Connection.connect((Host,int(Port)))
except:
ERROR("NETWORK ERROR: Can't connect to " + Host + ":" + Port)

print "DONE"

print "DOING: Reset ",
RESET()
print "DONE"

print "DOING: Waiting for bootmessage ",
WAIT_FOR_BOOT()
print "DONE"

print "DOING: [WIFIBOOT_START] ",
CONNECTION_WRITE('[WIFIBOOT_START]\n')
response = CONNECTION_READ()
if(response != '[ACK]\n'):
ERROR('No expected response: ' + response)
print "DONE"

print "DOING: Get boardinfo"
Boardinfo = GET_BOARDINFO()
if Boardinfo == -1:
ERROR("Connected board not known!")
print " ->",
print Boardinfo
print " DONE"

print "DOING: Init upload ",
INIT_UPLOAD()
print "DONE"

print "DOING: Init Flash ",
INIT_FLASH()
print "DONE"

#print "DOING: Flashing "
#FLASH(Flashdata)
#print " DONE"

print "DOING: [E] ",
CONNECTION_WRITE('[E]\n')
response = CONNECTION_READ()
if(response != '\n[READY]\n'):
ERROR('No expected response: ' + response)
print "DONE"

print "DOING: Reset ",
RESET()
print "DONE"

Timeend = time.time()

print
print ' ****** FLASHED SUCCESSFUL *******'
print ' in: '+str(round(Timeend-Timestart, 2))+' seconds'

CLOSE_ALL()

quit(0)


Ist noch nicht besonders schön, aber wenn jemand wegen oben genannter Probleme mit der FLASH() Funktion Infos/Lösungen hat, wäre mir sehr geholfen.

r0b1ns
02.04.2024, 18:26
Hallo,
ich habe mich auch gefreut dieses Projekt gefunden zu haben.
Leider sind die Links jedoch bereits alle tot.
Kann jemand den RP6FlashWriter für Linux neu hochladen?