Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 380 → Rev 381

/DUBwise/trunk/shared/src/MKFirmwareFlasher.java
0,0 → 1,498
/*******************************************
*
* Handling of MK LCD
*
* Author: Marcus -LiGi- Bueschleb
* see README for further Infos
*
*
*******************************************/
 
package org.ligi.ufo;
import java.io.*;
 
//#ifdef j2me
//# import javax.microedition.io.*;
//#endif
 
public class MKFirmwareFlasher
implements Runnable
{
 
public String[] flash_msgs;
public int msg_pos=0;
public int bootloader_init_attempt;
 
 
private InputStream reader;
private OutputStream writer;
 
private StreamConnection connection;
 
private byte[] bl_magic={(byte)'M',(byte)'K',(byte)'B',(byte)'L'};
private byte bl_magic_pos=0;
private boolean got_bl_magic=false;
 
private int attempt=0;
 
 
byte intension=0;
 
 
public boolean success=false;
public boolean job_done=false;
public boolean started=false;
 
public MKFirmwareFlasher(String _url,byte _intension)
{
intension=_intension;
url=_url;
flash_msgs=new String[100];
log("loading BL Handler");
}
 
 
public void start()
{
started=true;
connect();
new Thread( this ).start(); // fire up main Thread
}
 
public void sleep(int time)
{
try { Thread.sleep(time); }
catch (Exception e) { }
}
 
private void log(String msg)
{
flash_msgs[msg_pos++]=msg;
}
 
private void log_(String msg)
{
flash_msgs[msg_pos]=msg;
}
 
 
String url;
boolean sigfail;
// int last_avr_sig;
 
public int avr_sig=0;
 
public void connect()
{
 
try {
connection = (StreamConnection) Connector.open(url);
reader=connection.openInputStream();
writer=connection.openOutputStream();
}
catch (Exception e) {}
}
 
public void close_connections()
{
 
try {
int foo,leech_cnt=0;
while (( reader.available() != 0)&&(leech_cnt<1000))
{
leech_cnt++;
foo=reader.read();
}
}
catch (Exception e) {}
 
// if ((!force)&&root.canvas.do_vibra) root.vibrate(500);
try{ reader.close(); }
catch (Exception inner_ex) { }
 
try{ writer.close(); }
catch (Exception inner_ex) { }
//#ifdef j2me
//# try{ connection.close(); }
//# catch (Exception inner_ex) { }
//#endif
 
}
 
 
 
public InputStream in;
public void run()
{
boolean init_sequence=true;
int send_buff_size=0;
int gbl=0;
log_("attempt:"+attempt);
while (!got_bl_magic)
{
attempt++;
try{
if (init_sequence)
{
// if (attempt!=0)
// sleep((attempt%2==0)?80:800); //800
msg_pos=0;
flash_msgs[msg_pos++]=("at:"+attempt+" gbl:"+gbl);
flash_msgs[msg_pos]=null;
if ((attempt%2)==0) // after work
{
writer.write('#');
writer.write(0);
writer.write('R');
// CRC
writer.write((char)( (((byte)'#' +0 + (byte)'R')%4096)/64 + '='));
writer.write((char)( (((byte)'#' +0 + (byte)'R')%4096)%64 + '='));
writer.write('\r');
writer.flush();
//sleep(20);
}
writer.write( 27);
writer.flush();
sleep(20);
writer.write( 0xAA);
writer.flush();
sleep(180);
}
// else
// sleep(20);
init_sequence=true;
// sleep(20);
while ( reader.available() > 0 )
{
if ((byte)reader.read()==bl_magic[bl_magic_pos])
{
bl_magic_pos++;
if (bl_magic_pos==bl_magic.length)
{
log("got bl magic");
got_bl_magic=true;
gbl++;
bl_magic_pos=0;
 
int foo,leech_cnt=0;
while (( reader.available() != 0)&&(leech_cnt<1000))
{
leech_cnt++;
foo=reader.read();
}
 
}
 
}
else
bl_magic_pos=0;
}
 
if (got_bl_magic)
{
// sleep(50);
flash_msgs[msg_pos++]="reading avr_sig";
writer.write( 't');
writer.flush();
 
sleep(120);
// if ( reader.available() == 0 )
//throw new Exception("cant read avrsig");
 
/*
int sig1_timeout=0;
while ( reader.available() == 0)
{
if ((sig1_timeout++)>1000 )
throw new Exception("cant read avrsig");
sleep(10);
}
 
*/
avr_sig=reader.read();
 
if (avr_sig==63)
init_sequence=false;
/* while (avr_sig==63)
avr_sig=reader.read();
*/
flash_msgs[msg_pos++]="got avr sig " + avr_sig;
// last_avr_sig=avr_sig;
// for(int sig2_timeout=0;sig2_timeout<100;sig2_timeout++)
/*
int sig2_timeout=0;
while ( reader.available() == 0)
{
if ((sig2_timeout++)>1000 )
throw new Exception("cant read avrsig-val2");
sleep(10);
}*/
 
int avrsig_suff=reader.read();
 
 
if (avrsig_suff!=0)
throw new Exception("val after avrsig is" +avrsig_suff +"should b 0");
if ((avr_sig!=0x74)&&(avr_sig!=224)&&(avr_sig!=120))
{
sigfail=true;
throw new Exception("avr sig" + avr_sig + " unknown");
}
 
}
}
catch (Exception e) {
 
 
log("" + e.getMessage());
sleep(1000);
exit_bootloader();
connect();
got_bl_magic=false;
init_sequence=false; // after work
}
}
 
log("have bl-magic & good avrsig" + avr_sig);
 
try{
writer.write('T');
// writer.flush();
writer.write(avr_sig); // set devicetyp = 0x74 oder 0x76
writer.flush();
if (reader.read()!=0x0d)
throw new Exception("cant get buffer size");
writer.write('V');
writer.flush();
int bl_version_major=reader.read();
int bl_version_minor=reader.read();
flash_msgs[msg_pos++]="BL Version " + bl_version_major+"."+bl_version_minor;
writer.write('b');
writer.flush();
if (reader.read()!='Y')
throw new Exception("cant get buffer size");
send_buff_size=reader.read()*0x100;
send_buff_size+=reader.read();
 
flash_msgs[msg_pos++]="BUFF Size:" + send_buff_size;
}
catch (Exception e2) {
exit_bootloader();
return;
}
// if (send_buff_size>128)
// send_buff_size=128;
switch (intension)
{
case MKFirmwareHelper.BOOTLOADER_INTENSION_RESET_PARAMS:
try{
 
flash_msgs[msg_pos]="reset params ..";
writer.write( MKFirmwareHelper.cmd_reset_params);
 
writer.flush();
flash_msgs[msg_pos++]+=" done";
success=true;
}
catch (Exception e2) { }
break;
case MKFirmwareHelper.BOOTLOADER_INTENSION_FLASH_FIRMWARE:
try{
 
 
 
byte[] flash_buff =new byte[send_buff_size]; ///!!
//String firmware_filename=(avr_sig==224)?"/navi.bin":((avr_sig==120)?"/mk3.bin":"/fc.bin");
//flash_msgs[msg_pos++]="Opening firmware " + firmware_filename + "..";
//InputStream in;
//try {
//in=this.getClass().getResourceAsStream(firmware_filename);
// }
// catch (Exception e) { throw new Exception(" .. cant open firmware"); }
int firmware_size=-1;
try {
firmware_size= ((int)in.read()<<24) |((int)in.read()<<16) | ((int)in.read()<<8) | ((int)in.read()&0xff) ;
}
catch (Exception e)
{
throw new Exception(" .. cant read size");
}
 
// in.mark(firmware_size+10);
int blocks2write=((firmware_size/send_buff_size))+(((firmware_size%send_buff_size)==0)?0:1);
flash_msgs[msg_pos++]=".. open("+blocks2write+" blocks," + firmware_size + "bytes)";
// if (true) throw new Exception("before erasing");
// if (true) throw new Exception("before erasing" );
flash_msgs[msg_pos++]="Erasing Flash ..";
writer.write('e');
writer.flush();
if (reader.read()!=0x0d)
throw new Exception("cant erase flash");
flash_msgs[msg_pos]+="OK";
writer.write('A');
writer.write(0);
writer.write(0);
writer.flush();
if (reader.read()!=0x0d)
throw new Exception("cant set addr");
flash_msgs[msg_pos++]="addr set";
// int blocks2write=((firmware_size/send_buff_size));
 
for ( int block=0; block<blocks2write; block ++)
{
for (int s=0;s<send_buff_size;s++)
flash_buff[s]=0;
int hex_bytes_read=in.read(flash_buff,0,send_buff_size);
 
/*
if (avr_sig==224)
{
 
for (int s=hex_bytes_read;s<send_buff_size;s++)
flash_buff[s]=0;
hex_bytes_read=send_buff_size; // fix
}
 
*/
 
 
hex_bytes_read=send_buff_size; // fix
 
flash_msgs[msg_pos]="bl:" + (block+1) + "/" + blocks2write + " si:"+hex_bytes_read ;
writer.write('B');
writer.write((hex_bytes_read>>8)& 0xFF);
writer.write((hex_bytes_read)& 0xFF);
writer.write('F');
writer.flush();
writer.write(flash_buff,0,hex_bytes_read);
writer.flush();
if (avr_sig==224)
{
int crc=0xFFFF;
for (int crc_pos=0;crc_pos<hex_bytes_read;crc_pos++)
crc=MKFirmwareHelper.CRC16(flash_buff[crc_pos],crc);
writer.write((crc>>8)&0xff);
writer.write(crc&0xff);
writer.flush();
}
// flash_msgs[msg_pos]+="ok";
// writer.flush();
if (reader.read()!=0x0d)
throw new Exception("abort write at block"+block);
// sleep(1000);
} // for block
 
sleep(1000);
success=true;
}
catch (Exception e2) {
msg_pos++;}
 
break;
}
 
sleep(50);
exit_bootloader();
job_done=true;
 
}
 
 
 
public void exit_bootloader()
{
try{
writer.write('E');
writer.flush();
}
catch (Exception e) {
flash_msgs[msg_pos++]="cant exit bootloader" ;
}
flash_msgs[msg_pos++]="Exit BL done" ;
 
 
close_connections();
}
 
 
}