summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpancake <pancake@dazo>2008-12-08 00:21:05 +0100
committerpancake <pancake@dazo>2008-12-08 00:21:05 +0100
commit3d427bfd7740731bfc203b047d557af564975cf6 (patch)
treeffef9e82ba45e75d03679aed04b4086d57d6bba7
parentedac98d26ee29bbdc3e16be8ecec5cbfff80482f (diff)
download0xFFFF-3d427bfd7740731bfc203b047d557af564975cf6.tar.bz2
* Added -n flag to do not write to disk or flash (simulation)
* Added -S flag to specify subversion id manually while flashing or dumping * Fixed support for the last fiasco image - Skip paddings - More verbose output while parsing FIASCO headers * Initial implementation of the full direct FIASCO flasher - No need to dump manually before flashing * Some warnings and code cleanup * Fix building issue * Add HAVE_GUI directive in config.mk * Up to version 0.4
-rw-r--r--config.mk4
-rw-r--r--logotool/Makefile5
-rw-r--r--src/Makefile4
-rw-r--r--src/fiasco.c43
-rw-r--r--src/flash.c2
-rw-r--r--src/gui/Makefile7
-rw-r--r--src/main.c70
-rw-r--r--src/main.h12
-rw-r--r--src/qmode.c20
-rw-r--r--src/squeue/squeue.c4
-rw-r--r--src/utils.c4
11 files changed, 134 insertions, 41 deletions
diff --git a/config.mk b/config.mk
index 71cf2ec..86af3cc 100644
--- a/config.mk
+++ b/config.mk
@@ -1,8 +1,10 @@
-VERSION=0.3.9
+VERSION=0.4.0
PREFIX=/usr
+
# NetBSD stuff
CFLAGS+=-I/usr/pkg/include
LDFLAGS+=-L/usr/pkg/lib -Wl,-R/usr/pkg/lib
HAVE_USB=1
+HAVE_GUI=0
diff --git a/logotool/Makefile b/logotool/Makefile
index 22e6a44..1c5d08d 100644
--- a/logotool/Makefile
+++ b/logotool/Makefile
@@ -1,7 +1,10 @@
OBJ=logotool.o compress.o uncompress.o rgb2yuv.o
CFLAGS=-Wall -g
+BIN=logotool
-all: ${OBJ}
+all: ${BIN}
+
+${BIN}: ${OBJ}
${CC} ${OBJ} -o logotool
clean:
diff --git a/src/Makefile b/src/Makefile
index 9610497..e8dbffa 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -10,7 +10,9 @@ CFLAGS+=-pedantic -std=c99 -DHAVE_USB=${HAVE_USB}
USBOBJ=../libusb/error.o ../libusb/usb.o ../libusb/descriptors.o
USBOBJ+=../libusb/linux.o ## XXX not portable
-all: ${OBJ}
+all: ${BIN}
+
+${BIN}: ${OBJ}
${CC} ${LDFLAGS} -o ${BIN} ${OBJ} ${LIBS}
allusb: ${OBJ}
diff --git a/src/fiasco.c b/src/fiasco.c
index 91b7481..192238f 100644
--- a/src/fiasco.c
+++ b/src/fiasco.c
@@ -27,16 +27,17 @@
#include "main.h"
#include "hash.h"
-void (*fiasco_callback)(struct header_t *header) = NULL;
+int (*fiasco_callback)(struct header_t *header) = NULL;
int openfiasco(char *name)
{
struct header_t header;
unsigned char buf[128];
unsigned char data[128];
+ unsigned char *pdata;
unsigned int namelen;
- off_t off;
- int i;
+ off_t off, here;
+ int i,j;
header.fd = open(name, O_RDONLY);
if (header.fd == -1) {
@@ -66,14 +67,22 @@ int openfiasco(char *name)
/* walk the tree */
while(1) {
+ here = lseek(header.fd, 0, SEEK_CUR);
if (read(header.fd, buf, 9)<9)
break;
-
if (buf[0] != 0x54) { // 'T'
- printf("unexpected header at 0x%x, found %02x %02x %02x\n",
- ((int)lseek(header.fd, 0, SEEK_CUR))-9,
- buf[0], buf[1], buf[2]);
- break;
+ /* skipping some bytes */
+ lseek(header.fd, -9, SEEK_CUR);
+ for(i=0;buf[0]!=0x54;i++) {
+ j = read(header.fd, buf, 1);
+ if (j == -1) {
+ printf("Cannot find next FIASCO header\n");
+ return close(header.fd);
+ }
+ }
+ printf("Skipping %d padding bytes\n", i);
+ lseek(header.fd, -1, SEEK_CUR);
+ continue;
}
header.hash = buf[7]<<8|buf[8];
@@ -92,6 +101,7 @@ int openfiasco(char *name)
break;
memcpy(&header.size, buf,4);
header.size = ntohl(header.size);
+ printf(" offset: 0x%08x\n", (unsigned int)here);
printf(" size: %d bytes\n", header.size);
printf(" hash: %04x\n", header.hash);
//printf("BYTE: %02x %02x %02x %02x %02x\n",
@@ -104,18 +114,31 @@ int openfiasco(char *name)
i = data[0];
if (read(header.fd, data, i)<i)
break;
- if (data[0])
- printf(" version: %s\n", data);
+ if (data[0]) {
+ printf(" version-length: %d\n", i);
+ printf(" version: %s\n", data);
+ pdata = data;
+ while(pdata<data+i) {
+ strcat(header.name,pdata==data?"-":",");
+ strcat(header.name, (char*)pdata);
+ printf(" sub-version: %s\n", pdata);
+ pdata=pdata+strlen((char*)pdata)+1;
+ for(;*pdata=='\0'&&pdata<data+i;pdata=pdata+1);
+ }
+ }
strcpy(header.version, (char *)data);
if (read(header.fd, buf+8, 1)<1)
break;
}
+ printf(" name: %s\n", header.name);
/* callback */
off = lseek(header.fd, 0, SEEK_CUR);
+ printf(" body-at: 0x%08x\n", (unsigned int)off);
if (fiasco_callback != NULL) {
fiasco_callback(&header);
free(header.data);
continue;
+ } else {
}
// XXX dup
lseek(header.fd, off, SEEK_SET);
diff --git a/src/flash.c b/src/flash.c
index e135e53..0915f4c 100644
--- a/src/flash.c
+++ b/src/flash.c
@@ -74,7 +74,7 @@ void check_nolo_order()
check_nolo_order_failed();
}
-void flash_image(char *filename, char *piece, char *version)
+void flash_image(const char *filename, const char *piece, const char *version)
{
FILE *fd;
int vlen = 0;
diff --git a/src/gui/Makefile b/src/gui/Makefile
index 58d9bc2..61a5efa 100644
--- a/src/gui/Makefile
+++ b/src/gui/Makefile
@@ -1,6 +1,13 @@
+include ../../config.mk
+
+ifeq (${HAVE_GUI},1)
all:
gtkamlc --save-temps --Xcc=-I../squeue ../squeue/squeue.c ../fpid.c ../squeue/squeue.vapi gui.gtkaml extras.vapi --pkg gtk+-2.0 -o goxf
test:
valac --save-temps --Xcc=-I.. squeue.vapi test.vala ../squeue.c -o v
valac --save-temps --Xcc=-I.. squeue.vapi client.vala ../squeue.c -o c
+else
+all:
+ @true
+endif
diff --git a/src/main.c b/src/main.c
index 5ce17ae..21be4b4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -32,6 +32,7 @@ struct usb_dev_handle *dev = NULL;
char *fiasco_image = NULL;
char *boot_cmdline = NULL;
char *reverseto = NULL;
+char *subverstr = NULL;
int rd_mode = -1;
int rd_flags = -1;
int usb_mode = -1;
@@ -42,6 +43,7 @@ int moboreboot = 0;
int unpack = 0;
int qmode = 0;
int info = 0;
+int nomode = 0;
char *modes[]={
"host",
@@ -86,6 +88,8 @@ void show_usage()
printf("Local stuff:\n");
printf(" -s [serial] serial port console (minicom like terminal)\n");
printf(" -h show this help message\n");
+ printf(" -S [subversion] unpacks/flash pieces matching this sub-version information\n");
+ printf(" -n do not flash or write to disk (simulation)\n");
printf(" -C [/dev/mtd] check bad blocks on mtd\n");
printf(" -e [path] dump/extract pieces to path\n");
printf(" -F [fiasco] flash a fiasco firmware image\n");
@@ -105,16 +109,50 @@ void show_usage()
}
-void unpack_callback(struct header_t *header)
+int unpack_callback(struct header_t *header)
{
- FILE *fd = fopen(header->name, "wb");
+ FILE *fd;
+
+ fiasco_data_read(header);
+ if (subverstr) {
+ if (strchr(header->name, ',') != NULL) {
+ if (!strstr(header->name, subverstr)) {
+ printf("Skipping '%s' does not matches -S subversion\n",
+ header->name);
+ return 1;
+ }
+ }
+ }
+ if (nomode)
+ return 1;
+
+ fd = fopen(header->name, "wb");
if (fd == NULL) {
printf("Cannot open file.\n");
- return;
+ return 1;
}
- fiasco_data_read(header);
fwrite(header->data, header->size, 1, fd);
fclose(fd);
+
+ return 0;
+}
+
+int flash_callback(struct header_t *header)
+{
+ int ret;
+ char *type;
+
+ ret = unpack_callback(header);
+ if (ret) {
+ printf("ignored\n");
+ return 1;
+ }
+
+ type = (char *)fpid_file(header->name);
+ printf("Flashing %s (%s)\n", header->name, type);
+ flash_image(header->name, type, NULL);
+
+ return 0;
}
void unpack_fiasco_image(char *file)
@@ -126,21 +164,23 @@ void unpack_fiasco_image(char *file)
int fiasco_flash(char *file)
{
- /* TODO */
- fiasco_callback = NULL;
+ check_nolo_order();
+ get_sw_version();
+ get_nolo_version();
+
+ fiasco_callback = &flash_callback;
openfiasco( file );
- printf("\nTODO: Implement the fiasco flashing here.\n");
- return -1;
+ return 0;
}
#if HAVE_USB
int connect_via_usb()
{
+ static char pbc[]={'/','-','\\', '|'};
struct usb_device_descriptor udd;
struct devices it_device;
int c = 0;
- static char pbc[]={'/','-','\\', '|'};
// usb_set_debug(5);
usb_init();
@@ -214,7 +254,7 @@ int main(int argc, char **argv)
{
int c;
- while((c = getopt(argc, argv, "QC:cp:PvVhRu:ib:U:r:e:ld:I:D:f:F:s:xH:")) != -1) {
+ while((c = getopt(argc, argv, "QC:cp:PvVhRu:ib:U:r:e:ld:I:D:f:F:s:xH:S:n")) != -1) {
switch(c) {
case 'H':
printf("xorpair: %04x\n", do_hash_file(optarg));
@@ -227,6 +267,12 @@ int main(int argc, char **argv)
case 'b':
boot_cmdline = optarg;
break;
+ case 'S':
+ subverstr = optarg;
+ break;
+ case 'n':
+ nomode = 1;
+ break;
case 'U':
usb_mode = atoi(optarg);
break;
@@ -321,8 +367,8 @@ int main(int argc, char **argv)
{
printf("# The Free Fiasco Firmware Flasher v"VERSION"\n"
- "0xFFFF [-chilQRvVx] [-C mtd-dev] [-d vid:pid] [-D 0|1|2] [-e path] [-f flags]\n"
- " [-F fiasco] [-H hash-file] [-I piece] [-p [piece%%]file]] [-r 0|1]\n"
+ "0xFFFF [-chinlQRvVx] [-C mtd-dev] [-d vid:pid] [-D 0|1|2] [-e path] [-f flags]\n"
+ " [-F fiasco] [-H hash-file] [-I piece] [-p [piece%%]file]] [-r 0|1] [-S subver]\n"
" [-s serial-dev] [-u fiasco-image] [-U 0|1] | [-P new-fiasco] [piece1] [2] ..\n");
return 1;
}
diff --git a/src/main.h b/src/main.h
index ed53d50..43937b5 100644
--- a/src/main.h
+++ b/src/main.h
@@ -5,7 +5,6 @@
#include "hash.h"
#include "nolo.h"
#include "os.h"
-
extern char strbuf[1024];
#define _FILE_OFFSET_BITS 64
@@ -16,11 +15,11 @@ struct devices;
int queue_mode();
int reverse_extract_pieces(char *dir);
-void flash_image(char *filename, char *piece, char *version);
+void flash_image(const char *filename, const char *piece, const char *version);
int fiasco_read_image(char *file);
void check_nolo_order();
extern struct usb_dev_handle *dev;
-unsigned long get_file_size(char *file);
+unsigned long get_file_size(const char *file);
void progressbar(unsigned long long part, unsigned long long total);
const char *fpid_file(const char *filename);
int add_piece(char *piece);
@@ -107,10 +106,15 @@ int openfiasco(char *name);
int fiasco_new(const char *filename, const char *name);
void fiasco_data_read(struct header_t *header);
int fiasco_add_eof(int fd);
-extern void (*fiasco_callback)(struct header_t *header);
+extern int (*fiasco_callback)(struct header_t *header);
int fiasco_add(int fd, const char *name, const char *file, const char *version);
int fiasco_pack(int optind, char *argv[]);
int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char *dumpfile, int isbl, int ioob);
+//
+int reboot_board();
+int get_rd_flags();
+int get_usb_mode();
+int get_nolo_version();
#endif
diff --git a/src/qmode.c b/src/qmode.c
index 3aa73fa..5bfa765 100644
--- a/src/qmode.c
+++ b/src/qmode.c
@@ -19,7 +19,13 @@
#include "main.h"
#include "os.h"
#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
#include <signal.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+
#if HAVE_SQUEUE
struct squeue_t *q;
@@ -43,23 +49,19 @@ void process_message(char *msg)
printf("[x] (%s)\n", msg);
str = strdup(msg);
arg = strchr(str, ':');
- if (c!=NULL) {
+ if (c!=0) {
arg[0]='\0';
arg = arg +1;
if (!strcmp(str, "flash")) {
- char buf[1024];
- char *type = fpid_file(arg);
+ const char *type = fpid_file(arg);
if (type == NULL) {
squeue_push2(p, "error", "Unknown piece format", 1);
- } else {
- flash_image(arg, type, NULL);
- }
+ } else flash_image(arg, type, NULL);
} else
if (!strcmp(str, "reset")) {
if (reboot_board() == 0) {
squeue_push2(p,"info", "Device reboots", 1);
- } else
- squeue_push2(p,"error", "Cannot reboot device", 1);
+ } else squeue_push2(p,"error", "Cannot reboot device", 1);
} else
if (!strcmp(str, "info")) {
get_rd_flags();
@@ -95,7 +97,7 @@ int queue_mode()
pid = dofork();
if (pid) {
- wait(pid);
+ wait(&pid);
return 0;
} else {
p = squeue_open("/tmp/0xFFFF.1", Q_CREAT);
diff --git a/src/squeue/squeue.c b/src/squeue/squeue.c
index 0d134f0..96f2b59 100644
--- a/src/squeue/squeue.c
+++ b/src/squeue/squeue.c
@@ -1,13 +1,17 @@
#include "squeue.h"
+#define _XOPEN_SOURCE 500 /* Or: #define _BSD_SOURCE */
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/shm.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
+#include <unistd.h>
#include <string.h>
#define POOL_SIZE ITEM_MAX*ITEM_SIZE
diff --git a/src/utils.c b/src/utils.c
index 2f4efbb..24872ed 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -22,7 +22,7 @@
#include <stdarg.h>
#include <stdlib.h>
-unsigned long get_file_size(char *file)
+unsigned long get_file_size(const char *file)
{
FILE *fd = fopen(file, "r");
unsigned long len = 0;
@@ -53,7 +53,7 @@ void progressbar(unsigned long long part, unsigned long long total)
squeue_push2(p, "bar", msg, 0);
} else {
#endif
- printf("\e[K %3d%% [", pc);
+ printf("\x1b[K %3d%% [", pc);
if (columns)
cols = atoi(columns);
cols-=15;