From a46c0ecf2bd18049cd2fd75d0ab57fe24a62d951 Mon Sep 17 00:00:00 2001
From: hackbard <hackbard@staubsauger.localdomain>
Date: Mon, 3 Sep 2007 07:37:20 +0200
Subject: [PATCH] support for binaries usinf -b, BUT: dirty dirty slow slow
 fucked up code! i mean it!

---
 betty/fwflash.c |  3 +++
 betty/lpcload.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

diff --git a/betty/fwflash.c b/betty/fwflash.c
index 7c9551f..fd8d31b 100644
--- a/betty/fwflash.c
+++ b/betty/fwflash.c
@@ -313,6 +313,9 @@ int flash_write(u32 addr,u16 data) {
 
 	u16 check;
 
+	if(data==0xffff)
+		return 0;
+
 	*((unsigned volatile short *)addr)=0xa0;
 	*((unsigned volatile short *)addr)=data;
 	while(1) {
diff --git a/betty/lpcload.c b/betty/lpcload.c
index d1bfd54..e1e12b7 100644
--- a/betty/lpcload.c
+++ b/betty/lpcload.c
@@ -22,6 +22,7 @@
 #define BANK2			(1<<3)
 #define BL			(1<<4)
 #define FLASHFW			(1<<5)
+#define BINARY			(1<<6)
 
 #define BANK0_ADDR		0x80000000
 #define BANK2_ADDR		0x82000000
@@ -97,6 +98,7 @@ void usage(void) {
 	printf("  -Dx <filename>\n");
 	printf("      x=0: bank0, x=2: bank2, x=b: bootloader\n");
 	printf("  -w <firmware which goes to flash>\n");
+	printf("  -b (if firmware for flash is a binary)\n");
 	printf("  -v\n");
 
 }
@@ -602,6 +604,23 @@ int write_to_flash(t_lpc *lpc,u8 *buf,u32 addr,int len) {
 		len-=2;
 	}
 
+
+	/*
+	cnt=0;
+	cksml=0;
+	while(len) {
+		ret=write(lpc->sfd,buf+cnt,len);
+		if(ret<0) {
+			perror("transmit flash content (w)");
+			return ret;
+		}
+		for(i=cnt;i<cnt+ret;i++)
+			cksml+=buf[i];
+		len-=ret;
+		cnt+=ret;
+	}
+	*/
+
 	/* check ack */
 	while(1) {
 		ret=read(lpc->sfd,&cksmr,1);
@@ -638,6 +657,29 @@ int firmware_to_mem(t_lpc *lpc,u8 memtype) {
 	else
 		return -1;
 
+	/* another evil hack to support binary format */
+	if((lpc->info&BINARY)&&(memtype==FLASH)) {
+		addr=0;
+		ret=1;
+		while(ret) {
+			ret=read(fd,buf,16);
+			if(ret!=16) {
+				printf("D'OH ...\n");
+				return -1;
+			}
+			buf[16]='s'; // skip
+			for(temp=0;temp<16;temp++)
+				if((u8)buf[temp]!=0xff)
+					buf[16]='w'; // write
+			printf("addr:%08x\r",addr+lpc->roff);
+			fflush(stdout);
+			if(buf[16]=='w') 
+				write_to_flash(lpc,(u8 *)buf,addr,16);
+			addr+=16;
+		}
+		return 0;
+	}
+
 	/* read a line */
 	ret=1;
 	while(ret) {
@@ -825,6 +867,9 @@ int main(int argc,char **argv) {
 				strncpy(lpc.ffwfile,argv[++i],127);
 				lpc.info|=FLASHFW;
 				break;
+			case 'b':
+				lpc.info|=BINARY;
+				break;
 			default:
 				usage();
 				return -1;
-- 
2.39.5