summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile5
-rw-r--r--src/devices.c74
-rw-r--r--src/dump.c80
-rw-r--r--src/fiasco.c597
-rw-r--r--src/flash.c4
-rw-r--r--src/fpid.c11
-rw-r--r--src/gui/Makefile12
-rw-r--r--src/gui/gui.c1163
-rw-r--r--src/gui/gui.gtkaml.orig (renamed from src/gui/gui.gtkaml)4
-rw-r--r--src/gui/gui.gtkon321
-rw-r--r--src/hash.c28
-rw-r--r--src/hash.h2
-rw-r--r--src/main.c262
-rw-r--r--src/main.h35
-rw-r--r--src/pieces.c8
-rw-r--r--src/qmode.c2
-rw-r--r--src/query.c22
-rw-r--r--src/squeue/squeue.c2
-rw-r--r--src/squeue/squeue.vapi2
19 files changed, 2295 insertions, 339 deletions
diff --git a/src/Makefile b/src/Makefile
index 2e8990d..a04638f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -6,10 +6,13 @@ BIN=0xFFFF
#LIBS=`${HAVE_USB} && echo -- '-lusb'`
LIBS=`if [ "${HAVE_USB}" = 1 ]; then echo '-lusb'; fi`
CFLAGS+=-DVERSION=\"${VERSION}\" -Wall -I .
-CFLAGS+=-pedantic -std=c99 -DHAVE_USB=${HAVE_USB}
+CFLAGS+=-pedantic -std=c99 -DHAVE_USB=${HAVE_USB} -Wno-unused-result
USBOBJ=../libusb/error.o ../libusb/usb.o ../libusb/descriptors.o
USBOBJ+=../libusb/linux.o ## XXX not portable
+CFLAGS+=-I../libusb
+LDFLAGS+=-L../libusb
+
all: ${BIN}
${BIN}: ${OBJ}
diff --git a/src/devices.c b/src/devices.c
index 2691770..cb1e05d 100644
--- a/src/devices.c
+++ b/src/devices.c
@@ -1,6 +1,7 @@
/*
* 0xFFFF - Open Free Fiasco Firmware Flasher
- * Copyright (C) 2007 pancake <pancake@youterm.com>
+ * Copyright (C) 2007-2009 pancake <pancake@nopcode.org>
+ * Copyright (C) 2012 Pali Rohár <pali.rohar@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,18 +30,31 @@
*
* The following table shows this info:
*
- * boot os
- * n770 0421:0105 0421:0431
- * n800 0421:0431
+ * omap-rom nolo flash-mode mass-stor pc-suite
+ * 770 0421:0105 0421:0431
+ * n800 0421:04c3 0421:0431
+ * n810 0421:0105
+ * n900 0421:0106 0421:0105 0421:01c8 0421:01c7 0421:01c8
+ *
+ * mode images protocol
+ * omap-rom 2nd, secondary OMAP messages + Nokia X-Loader protocol
+ * nolo all except mmc NOLO
+ * flash-mode mmc MK II
+ * mass-storage sd, first emmc Standard USB Mass Storage
+ * pc-suite mmc MK II
*
*/
struct devices supported_devices[SUPPORTED_DEVICES] = {
- { "FFFF", 0x000, 0x0000, 0x0000 }, // dummy
- { "unkn", 0x421, 0x3f00, 0x0000 }, // probably a development board
- { "n770/n810", 0x421, 0x0105, 0x0001 }, // my n770
- { "n800", 0x421, 0x04c3, 0x0001 }, // a n800
- { 0 },
- { 0 }
+ { "FFFF", 0x0000, 0x0000, FLASH_NORMAL }, // dummy
+ { "unkn", 0x0421, 0x3f00, FLASH_NORMAL }, // probably a development board
+ { "n800", 0x0421, 0x04c3, FLASH_NORMAL }, // n800
+ { "770/n810/n900", 0x0421, 0x0105, FLASH_NORMAL }, // 770, n810, n900
+ { "n900", 0x0421, 0x0106, FLASH_COLD }, // n900 cold flashing
+ { "n900", 0x0421, 0x01c8, FLASH_MKII }, // n900 mmc flashing
+ { "770/n800", 0x0421, 0x0431, FLASH_DISK }, // 770, n800 usb mass storage
+ { "n900", 0x0421, 0x01c7, FLASH_DISK }, // n900 usb mass storage
+ { NULL },
+ { NULL }
};
/** Returns 0 when no device was found and a positive
@@ -73,7 +87,7 @@ void list_valid_devices()
int i;
struct devices ptr = supported_devices[1];
- for(i=1; ptr.vendor_id; ptr = supported_devices[++i])
+ for(i=1; ptr.name; ptr = supported_devices[++i])
printf("%04x:%04x %s\n", ptr.vendor_id, ptr.product_id, ptr.name);
}
@@ -82,39 +96,31 @@ void list_valid_devices()
* structures for the specified device.
* Otherwise returns false (0)
*/
-
int usb_device_found(struct usb_device_descriptor *udd, struct devices *it_device)
{
+ int dev_index = 0;
struct usb_bus *bus;
- int dev_index = 0;
-
- if (usb_find_busses() < 0) {
- fprintf(stderr, "\nerror: no usb busses found.\n");
+ if ((usb_find_busses()<0) || (usb_find_devices()==-1)) {
+ fprintf(stderr, "\nerror: no usb bus or device found.\n");
exit(1);
} else {
- switch(usb_find_devices()) {
- case -1:
- fprintf(stderr, "\nerror: no devices found.\n");
- exit(1);
- default:
- for (bus = usb_busses; bus; bus = bus->next) {
- struct usb_device *dev = bus->devices;
- D printf("bus: \n");
- for (; dev; dev = dev->next) {
- *udd = dev->descriptor;
- D printf(" dev (%s) - ", dev->filename);
- D printf("vendor: %04x product: %04x\n", udd->idVendor, udd->idProduct);
+ for (bus = usb_busses; bus; bus = bus->next) {
+ struct usb_device *dev = bus->devices;
+ D printf("bus: \n");
+ for (; dev; dev = dev->next) {
+ *udd = dev->descriptor;
+ D printf(" dev (%s) - ", dev->filename);
+ D printf("vendor: %04x product: %04x\n", udd->idVendor, udd->idProduct);
- if ((dev_index = is_valid_device(udd))) {
- device = dev;
- *it_device = supported_devices[dev_index];
- return 1;
- }
+ if ((dev_index = is_valid_device(udd))) {
+ device = dev;
+ printf("%s found!\n", dev->filename);
+ *it_device = supported_devices[dev_index];
+ return 1;
}
}
}
}
-
return 0;
}
#endif
diff --git a/src/dump.c b/src/dump.c
index 3f15fce..02025e5 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -1,6 +1,6 @@
/*
* 0xFFFF - Open Free Fiasco Firmware Flasher
- * Copyright (C) 2007 pancake <pancake@youterm.com>
+ * Copyright (C) 2007-2009 pancake <pancake@nopcode.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -37,7 +37,7 @@ int rf_extract(char *dev, off_t from, off_t to, char *file)
FILE *fd = fopen(file, "wb+");
if (from>to) {
- printf("Bad range %lld - %lld for %s\n", from, to, file);
+ printf("Bad range %lld - %lld for %s\n", (long long int)from, (long long int)to, file);
goto __rf_extract_exit;
}
if (fs == NULL) { perror(dev); goto __rf_extract_exit; }
@@ -56,7 +56,7 @@ int rf_extract(char *dev, off_t from, off_t to, char *file)
}
printf("\r%s: %lld bytes dumped from %s\n",
- file, to-from, dev);
+ file, (long long int)(to-from), dev);
__rf_extract_exit:
if (fs) fclose(fs);
@@ -138,8 +138,8 @@ int mtd_close(int fd, struct nand_oobinfo *old_oobinfo, int oobinfochanged)
// configuration for nanddump //
//int noecc = 0; // don't error correct
-int omitoob = 1; // omit oob data
-int omitbad = 1;
+static int omitoob = 1; // omit oob data
+static int omitbad = 1;
// configuration for nanddump //
#define CONFIGURE_FLAGS(x) \
@@ -158,6 +158,7 @@ int check_badblocks(char *mtddev)
unsigned char oobbuf[64];
struct nand_oobinfo old_oobinfo;
struct mtd_oob_buf oob = {0, 16, oobbuf};
+ /* XXX stat1 is never initialized !!! */
struct mtd_ecc_stats stat1, stat2;
mtd_info_t meminfo;
@@ -176,7 +177,6 @@ int check_badblocks(char *mtddev)
fprintf(stderr, "Size %u, flags %u, type 0x%x\n",
meminfo.size, meminfo.flags, (int)meminfo.type);
-
oob.length = meminfo.oobsize;
for(i = 0; i < meminfo.size; i+= meminfo.writesize) {
@@ -204,8 +204,9 @@ int check_badblocks(char *mtddev)
}
/* ECC stats available ? */
+ memset (&stat1, 0, sizeof (stat1));
if (eccstats) {
- if (ioctl(fd, ECCGETSTATS, &stat2)) {
+ if (ioctl (fd, ECCGETSTATS, &stat2)) {
perror("ioctl(ECCGETSTATS)");
goto closeall;
}
@@ -245,6 +246,7 @@ closeall:
}
// XXX warning ioob is not used
+// isbl is used to skip bad blocks ?
int nanddump(char *mtddev, unsigned long start_addr, unsigned long length, char *dumpfile, int isbl, int ioob)
{
unsigned char readbuf[2048];
@@ -453,22 +455,35 @@ __done:
return 1;
}
-int is_n800()
+static int is_n900()
+{
+ int n900 = 0;
+ unsigned char buf[4];
+ FILE *fd = fopen("/dev/mtd2", "rb");
+ if (!fd) {
+ fprintf(stderr, "Cannot open /dev/mtd2.\n");
+ exit(1);
+ }
+ fread(buf, 4, 1, fd);
+ if (!memcmp("\xff\xff\xff\xff", buf, 4))
+ n900 = 1;
+ fclose(fd);
+ return n900;
+}
+
+static int is_n800()
{
int n800 = 0;
unsigned char buf[4];
FILE *fd = fopen("/dev/mtd0", "rb");
-
if (!fd) {
fprintf(stderr, "Cannot open /dev/mtd0.\n");
exit(1);
}
- fread(buf, 4, 1,fd);
+ fread(buf, 4, 1, fd);
if (!memcmp("\xff\xff\xff\xff", buf, 4))
n800 = 1;
-
fclose(fd);
-
return n800;
}
@@ -539,9 +554,50 @@ int dump_config()
return 0;
}
+int reverse_extract_pieces_n900(char *dir)
+{
+ char reply;
+ chdir(dir);
+ printf("Device detected: n900\n");
+ // Some of the values here are probably not correct
+ // I need a firmware to identify if the sizes of the pieces are ok
+
+ nanddump("/dev/mtd0", 0, 0, "xloader.bin", 1, 0); // fix size?
+ nanddump("/dev/mtd1", 0, 0, "config.bin", 1, 0);
+ nanddump("/dev/mtd3", 0, 0, "nolo.bin", 0, 0);
+
+ printf("\n\nExtract rootfs? (y/N): "); fflush(stdout);
+ read(0, &reply, 1);
+ if (reply=='y'||reply=='Y') {
+ //rf_extract("/dev/mtd4", 0x000000, 0x6000000, "rootfs.jffs2");
+ nanddump("/dev/mtd5", 0x000000, 0, "rootfs.jffs2", 0,0);
+ } else printf("*** Ignoring rootfs\n");
+
+ printf("\n\nStrip dumped files? (y/N): "); fflush(stdout);
+ read(0, &reply, 1);
+ if (reply=='y'||reply=='Y') {
+ rf_strip("xloader.bin");
+ rf_strip("config.bin");
+ rf_strip("nolo.bin");
+ } else printf("*** Ignoring strip\n");
+
+ printf("\nIdentifying extracted files...\n");
+ printf("%s: xloader\n", fpid_file("xloader.bin"));
+ printf("%s: config.bin\n", fpid_file("config.bin"));
+ printf("%s: nolo.bin\n", fpid_file("nolo.bin"));
+ printf("%s: rootfs.jffs2\n", fpid_file("rootfs.jffs2"));
+
+ return 1;
+}
+
int reverse_extract_pieces(char *dir)
{
char reply;
+
+ if (is_n900())
+ return reverse_extract_pieces_n900(dir);
+
+ printf("Device detected: 770/n800/n900\n");
chdir(dir);
// TODO: get values from /proc/mtd ???
diff --git a/src/fiasco.c b/src/fiasco.c
index cb27b10..b0b68cf 100644
--- a/src/fiasco.c
+++ b/src/fiasco.c
@@ -1,6 +1,7 @@
/*
* 0xFFFF - Open Free Fiasco Firmware Flasher
- * Copyright (C) 2007 pancake <pancake@youterm.com>
+ * Copyright (C) 2007-2011 pancake <pancake@youterm.com>
+ * Copyright (C) 2011-2012 Pali Rohár <pali.rohar@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,18 +28,24 @@
#include "main.h"
#include "hash.h"
+char *strdup(const char *s);
+
int (*fiasco_callback)(struct header_t *header) = NULL;
-int openfiasco(char *name, char *piece_grep, int v)
+int openfiasco(const char *name, const char *type, const char *device, const char *hwrev, const char *version, int v)
{
struct header_t header;
- unsigned char buf[128];
- unsigned char data[128];
- unsigned char *pdata;
- unsigned int namelen;
+ unsigned char buf[256];
+ unsigned char data[256];
+ unsigned char *pdata, *pdataend;
+ unsigned int headerlen;
+ unsigned int blockcount;
off_t off, here;
- int i,j;
+ int subsections;
+ int match;
+ int i;
+ memset(&header, 0, sizeof(header));
header.fd = open(name, O_RDONLY);
if (header.fd == -1) {
@@ -47,45 +54,73 @@ int openfiasco(char *name, char *piece_grep, int v)
}
/* read header */
- read(header.fd, buf, 5);
+ if (read(header.fd, buf, 5) != 5) {
+ printf("Invalid read of 5 bytes\n");
+ return close(header.fd);
+ }
if (buf[0] != 0xb4) {
printf("Invalid header\n");
return close(header.fd);
}
- memcpy(&namelen,buf+1,4);
- namelen = ntohl(namelen);
- if (namelen>128) {
+
+ memcpy(&headerlen,buf+1,4);
+ headerlen = ntohl(headerlen);
+ if (headerlen>128) {
printf("Stupid length at header. Is this a joke?\n");
return close(header.fd);
}
+
memset(buf,'\0', 128);
- read(header.fd, buf, namelen);
+ if (read(header.fd, buf, headerlen) != headerlen) {
+ printf("Invalid read of %d bytes\n", headerlen);
+ return close(header.fd);
+ }
- if (v) printf("Fiasco version: %2d\n", buf[3]);
- strncpy(header.fwname, (char *)buf+6, sizeof(header.fwname) - 1);
- if (v)
- for(i=6;i<namelen;i+=strlen((char *)(buf+i))+1)
- printf("Name: %s\n", buf+i);
+ memcpy(&blockcount,buf,4);
+ blockcount = ntohl(blockcount);
+ if (blockcount==0) {
+ printf("Error: No block in header\n");
+ return close(header.fd);
+ }
+ if (v) printf("Number of blocks: %d\n", blockcount);
+
+ pdata = buf+4;
+ while (pdata < buf+headerlen-4) {
+ if (pdata[0] == 0xe8) {
+ if (v) printf("Header: %s\n", pdata+2);
+ } else if (pdata[0] == 0x31) {
+ i = pdata[1];
+ if (i >= sizeof(header.swver)) i = sizeof(header.swver)-1;
+ memset(header.swver, 0, sizeof(header.swver));
+ strncpy(header.swver, (char *)pdata+2, i);
+ if (v) printf("SW version: %s\n", header.swver);
+ } else {
+ if (v) printf("Unknown header 0x%x, length %d, data %s\n", pdata[0], pdata[1], pdata+2);
+ }
+ pdata += (int)pdata[1]+2;
+ }
/* 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'
- /* 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);
- }
+
+ i = 0;
+ while(1) {
+ if (read(header.fd, buf, 7)<7) {
+ printf("Next valid header not found\n");
+ return close(header.fd);
}
- if (v) printf("Skipping %d padding bytes\n", i);
- lseek(header.fd, -1, SEEK_CUR);
- continue;
+ if (buf[0] == 0x54 && buf[2] == 0x2E && buf[3] == 0x19 && buf[4] == 0x01 && buf[5] == 0x01 && buf[6] == 0x00)
+ break;
+ lseek(header.fd, -6, SEEK_CUR);
+ ++i;
}
+ if (i && v) printf("Skipping %d padding bytes\n", i);
+
+ subsections = buf[1]-1;
+
+ if (read(header.fd, buf+7, 2)<2)
+ break;
header.hash = buf[7]<<8|buf[8];
/* piece name */
@@ -97,64 +132,192 @@ int openfiasco(char *name, char *piece_grep, int v)
printf(" [eof]\n");
break;
} else if (v) printf(" %s\n", data);
- strcpy(header.name, (char *)data);
+ memset(header.type, 0, sizeof(header.type));
+ strncpy(header.type, (char *)data, sizeof(header.type)-1);
+
+ if (v) {
+ printf(" header: ");
+ for (i=0; i<7;++i) printf(" 0x%.2X", (unsigned int)buf[i]);
+ printf("\n");
+ }
if (read(header.fd, buf, 9)<9)
- break;
+ return close(header.fd);
memcpy(&header.size, buf,4);
header.size = ntohl(header.size);
if (v) {
printf(" offset: 0x%08x\n", (unsigned int)here);
printf(" size: %d bytes\n", header.size);
printf(" hash: %04x\n", header.hash);
+ printf(" subsections: %d\n", subsections);
}
- //printf("BYTE: %02x %02x %02x %02x %02x\n",
- // buf[4], buf[5], buf[6], buf[7], buf[8]);
- /* XXX this is not ok */
- //printf("BUF8: %02x\n", buf[8]);
- while (buf[8] && buf[8]>'0' && buf[8] < '9') {
+
+ memset(header.device, 0, sizeof(header.device));
+ memset(header.hwrevs, 0, sizeof(header.hwrevs));
+ memset(header.version, 0, sizeof(header.version));
+ if (header.layout) {
+ free(header.layout);
+ header.layout = NULL;
+ }
+
+ while (subsections > 0) {
if (read(header.fd, data, 1)<1)
- break;
+ return close(header.fd);
i = data[0];
if (read(header.fd, data, i)<i)
- break;
- if (data[0]) {
+ return close(header.fd);
+ {
if (v) {
- printf(" version-length: %d\n", i);
- printf(" version: %s\n", data);
+ printf(" subinfo\n");
+ printf(" type: ");
+ if (buf[8] == '1') printf("version string");
+ else if (buf[8] == '2') printf("hw revision");
+ else if (buf[8] == '3') printf("layout");
+ else printf("unknown (%c:0x%x)", buf[8], buf[8]);
+ printf("\n");
+ printf(" length: %d\n", i);
}
pdata = data;
- while(pdata<data+i) {
- strcat(header.name,pdata==data?"-":",");
- strcat(header.name, (char*)pdata);
- if (v) printf(" sub-version: %s\n", pdata);
- pdata = pdata+strlen((char*)pdata)+1;
- for(;*pdata=='\0'&&pdata<data+i;pdata=pdata+1);
+ pdataend = data+i;
+ while(pdata<pdataend) {
+ char buf2[9];
+ if (buf[8] == '2' && pdata != data) {
+ memset(buf2, 0, 9);
+ strncpy(buf2, (char *)pdata, 8);
+ }
+ if (v) {
+ printf(" ");
+ if (buf[8] == '1') printf("version");
+ else if (buf[8] == '2' && pdata == data) printf("device");
+ else if (buf[8] == '2' && pdata != data) printf("hw revision");
+ else if (buf[8] == '3') printf("layout");
+ else printf("data");
+ if (buf[8] == '2' && pdata != data)
+ printf(": %s\n", buf2);
+ else if (buf[8] == '3')
+ printf(": (not printing)\n");
+ else if (buf[8] == '1' || buf[8] == '2')
+ printf(": %s\n", pdata);
+ else {
+ char *buf3 = malloc(i+1);
+ memcpy(buf3, pdata, i);
+ buf3[i] = 0;
+ printf(": (raw) %s\n", buf3);
+ free(buf3);
+ }
+ }
+ if (buf[8] == '1') {
+ strncpy(header.version, (char *)pdata, sizeof(header.version)-1);
+ } else if (buf[8] == '2' && pdata == data) {
+ strncpy(header.device, (char *)pdata, sizeof(header.device)-1);
+ } else if (buf[8] == '2' && pdata != data) {
+ if (header.hwrevs[0] == 0)
+ strncpy(header.hwrevs, buf2, sizeof(header.hwrevs)-1);
+ else {
+ strcat(header.hwrevs, ",");
+ strcat(header.hwrevs, buf2);
+ }
+ } else if (buf[8] == '3') {
+ if (header.layout) free(header.layout);
+ header.layout = malloc(strlen((char*)pdata)+1);
+ if (header.layout) strcpy(header.layout, (char *)pdata);
+ }
+ if (buf[8] == '2' && pdata != data && strlen((char *)pdata) > 8)
+ pdata += 8;
+ else
+ pdata += strlen((char*)pdata)+1;
+ for(;*pdata=='\0' && pdata<pdataend; pdata++);
}
}
- strcpy(header.version, (char *)data);
if (read(header.fd, buf+8, 1)<1)
- break;
+ return close(header.fd);
+ --subsections;
}
- /* callback */
+
+ header.name = malloc(strlen(header.type)+strlen(header.device)+strlen(header.hwrevs)+strlen(header.version)+4);
+ if (!header.name) {
+ printf("malloc error\n");
+ exit(1);
+ }
+ strcpy(header.name, header.type);
+ if (header.device[0]) {
+ strcat(header.name, "-");
+ strcat(header.name, header.device);
+ }
+ if (header.hwrevs[0]) {
+ strcat(header.name, "-");
+ strcat(header.name, header.hwrevs);
+ }
+ if (header.version[0]) {
+ strcat(header.name, "-");
+ strcat(header.name, header.version);
+ }
+
off = lseek(header.fd, 0, SEEK_CUR);
if (v) {
+ printf(" version: %s\n", header.version);
+ printf(" device: %s\n", header.device);
+ printf(" hwrevs: %s\n", header.hwrevs);
printf(" name: %s\n", header.name);
printf(" body-at: 0x%08x\n", (unsigned int)off);
}
- if (piece_grep==NULL || (strstr(header.name, piece_grep))) {
- printf("==> (%s) %s\n", piece_grep, header.name);
+
+ match = 1;
+
+ if (match && type && strcmp(header.type, type) != 0)
+ match = 0;
+
+ if (match && device && strcmp(header.device, device) != 0)
+ match = 0;
+
+ if (match && version && strcmp(header.version, version) != 0)
+ match = 0;
+
+ if (match && hwrev) {
+ char *tmp1 = malloc(strlen(header.hwrevs)+3);
+ char *tmp2 = malloc(strlen(hwrev)+3);
+
+ if (!tmp1 || !tmp2) {
+ printf("malloc error\n");
+ return close(header.fd);
+ }
+
+ sprintf(tmp1, ",%s,", header.hwrevs);
+ sprintf(tmp2, ",%s,", hwrev);
+
+ if (!strstr(tmp1, tmp2))
+ match = 0;
+
+ free(tmp1);
+ free(tmp2);
+ }
+
+ /* callback */
+ if (match) {
+ printf("==> %s\n", header.name);
if (fiasco_callback != NULL) {
fiasco_callback(&header);
+ if (header.layout) {
+ free(header.layout);
+ header.layout = NULL;
+ }
+ free(header.name);
free(header.data);
continue;
} else {
// ??huh
}
+ } else {
+ printf("ignored %s\n", header.name);
}
// XXX dup
lseek(header.fd, off, SEEK_SET);
lseek(header.fd, header.size, SEEK_CUR);
+ if (header.layout) {
+ free(header.layout);
+ header.layout = NULL;
+ }
+ free(header.name);
}
return close(header.fd);
}
@@ -166,51 +329,72 @@ void fiasco_data_read(struct header_t *header)
printf("Cannot alloc %d bytes\n", header->size);
return;
}
- read(header->fd, header->data, header->size);
+ if (read (header->fd, header->data, header->size) != header->size) {
+ printf("Cannot read %d bytes\n", header->size);
+ return;
+ }
}
/* fiasco writer */
-int fiasco_new(const char *filename, const char *name)
+int fiasco_new(const char *filename, const char *swver)
{
int fd;
- //int len = htonl(strlen(name)+1+6+14);
+ unsigned int len;
+ unsigned char len8;
+ const char *str = "OSSO UART+USB";
- fd = open(filename, O_RDWR|O_CREAT, 0644);
- if (fd == -1)
+ if (swver && strlen(swver)+1 > UINT8_MAX) {
+ printf("SW version is too long\n");
return -1;
-#if 1
- write(fd, "\xb4\x00\x00\x00\x14\x00\x00\x00\x01\xe8\x0e", 11);
- write(fd, "OSSO UART+USB", 14);
-#else
- /* 2nd format doesnt works. atm stay with old one */
- write(fd, "\xb4", 1);
- write(fd, &len, 4);
- /* version header */
- write(fd, "\x00\x00\x00\x02\xe8\x0e", 6);
- /* firmware type */
- write(fd, "OSSO UART+USB", 14);
- /* firmware name */
- write(fd, name, strlen(name));
- write(fd, "", 1);
-#endif
- return fd;
-}
+ }
-int fiasco_add_eof(int fd)
-{
-#if 0
- unsigned char buf[120];
+ fd = open(filename, O_RDWR|O_CREAT|O_TRUNC, 0644);
if (fd == -1)
return -1;
- memset(buf,'\xff', 120);
- write(fd, buf, 120);
-#endif
- return 0;
+
+ printf("Writing header\n");
+
+ write(fd, "\xb4", 1); //signature
+
+ len = 4;
+ len += strlen(str) + 3;
+ if (swver)
+ len += strlen(swver) + 3;
+ len = htonl(len);
+ write(fd, &len, 4);
+
+ if (swver)
+ len = htonl(2);
+ else
+ len = htonl(1);
+ write(fd, &len, 4);
+
+ // header
+ len = strlen(str)+1;
+ len8 = len;
+ write(fd, "\xe8", 1);
+ write(fd, &len8, 1);
+ write(fd, str, len);
+
+ // sw version
+ if (swver) {
+ printf("Writing SW version: %s\n", swver);
+ len = strlen(swver)+1;
+ len8 = len;
+ write(fd, "\x31", 1);
+ write(fd, &len8, 1);
+ write(fd, swver, len);
+ };
+
+ return fd;
}
-int fiasco_add(int fd, const char *name, const char *file, const char *version)
+int fiasco_add(int fd, const char *name, const char *file, const char *layout, const char *device, const char *hwrevs, const char *version)
{
+ int i;
int gd,ret;
+ int size;
+ int align;
unsigned int sz;
unsigned char len;
unsigned short hash;
@@ -226,17 +410,40 @@ int fiasco_add(int fd, const char *name, const char *file, const char *version)
if (gd == -1)
return -1;
- sz = htonl((unsigned int) lseek(gd, 0, SEEK_END));
+ sz = lseek(gd, 0, SEEK_END);
+ if (name) {
+ if (strcmp(name, "mmc") == 0) // align mmc
+ sz = ((sz >> 8) + 1) << 8;
+ else if (strcmp(name, "kernel") == 0) // align kernel
+ sz = ((sz >> 7) + 1) << 7;
+ }
+
+ printf(" size: %d\n", sz);
+ sz = htonl((unsigned int) sz);
+
lseek(gd, 0, SEEK_SET);
- // 4 bytes big endian
- //write(fd, "T\x02\x2e\x19\x01\x01\x00", 7); // header?
- write(fd, "T\x01\x2e\x19\x01\x01\x00", 7); // header (old piece format)
+
+ write(fd, "T", 1);
+
+ /* number of subsections */
+ len = 1;
+ if (version)
+ ++len;
+ if (device)
+ ++len;
+ if (layout)
+ ++len;
+ write(fd, &len, 1);
+
+ write(fd, "\x2e\x19\x01\x01\x00", 5);
+
/* checksum */
- hash = do_hash_file(file);
+ hash = do_hash_file(file, name);
ptr[0]^=ptr[1]; ptr[1]=ptr[0]^ptr[1]; ptr[0]^=ptr[1];
write(fd, &hash, 2);
- printf("hash: %04x\n", hash);
+ printf(" hash: %04x\n", hash);
+ /* image type name */
memset(bname, '\0', 13);
if (name == NULL)
name = fpid_file(file);
@@ -246,24 +453,104 @@ int fiasco_add(int fd, const char *name, const char *file, const char *version)
strncpy(bname, name, 12);
write(fd, bname, 12);
-
write(fd, &sz, 4);
+ write(fd, "\x00\x00\x00\x00", 4);
+
+ /* append version subsection */
if (version) {
- /* append metadata */
- write(fd, "\x00\x00\x00\x00\x31", 5);
- len = strlen(version);
+ write(fd, "1", 1); /* 1 - version */
+ len = strlen(version)+1;
write(fd, &len, 1);
write(fd, version, len);
- write(fd, "\x00\x9b", 2);
- } else {
- write(fd, "\x00\x00\x00\x00\x9b", 5);
}
+
+ /* append device & hwrevs subsection */
+ if (device) {
+ const char *ptr = hwrevs;
+ const char *oldptr = hwrevs;
+ write(fd, "2", 1); /* 2 - device & hwrevs */
+ len = 16;
+ if (hwrevs) {
+ i = 1;
+ while ((ptr = strchr(ptr, ','))) { i++; ptr++; }
+ if ((int)len + i*8 > 255) {
+ printf("Device string and HW revisions are too long\n");
+ return -1;
+ }
+ len += i*8;
+ }
+ write(fd, &len, 1);
+ len = strlen(device);
+ if (len > 15) len = 15;
+ write(fd, device, len);
+ for (i=0; i<16-len; ++i)
+ write(fd, "\x00", 1);
+ if (hwrevs) {
+ ptr = hwrevs;
+ oldptr = hwrevs;
+ while ((ptr = strchr(ptr, ','))) {
+ len = ptr-oldptr;
+ if (len > 8) len = 8;
+ write(fd, oldptr, len);
+ for (i=0; i<8-len; ++i)
+ write(fd, "\x00", 1);
+ ++ptr;
+ oldptr = ptr;
+ }
+ len = strlen(oldptr);
+ if (len > 8) len = 8;
+ write(fd, oldptr, len);
+ for (i=0; i<8-len; ++i)
+ write(fd, "\x00", 1);
+ }
+ }
+
+ /* append layout subsection */
+ if (layout) {
+ int lfd = open(layout, O_RDONLY);
+ if (lfd >= 0) {
+ len = read(lfd, buf, sizeof(buf));
+ if (len > 0) {
+ write(fd, "3", 1); /* 3 - layout */
+ write(fd, &len, 1);
+ write(fd, buf, len);
+ }
+ close(lfd);
+ } else {
+ printf("Cannot open layout file %s\n", layout);
+ return -1;
+ }
+ }
+
+ /* dummy byte - end of all subsections */
+ write(fd, "\x00", 1);
+
+ size = 0;
while(1) {
ret = read(gd, buf, 4096);
+ size += ret;
if (ret<1)
break;
- write(fd, buf, ret);
+ if (write(fd, buf, ret) != ret) {
+ fprintf (stderr, "Cannot write %d bytes\n", ret);
+ return -1;
+ }
+ }
+
+ /* align mmc and kernel (fill with 0xff) */
+ align = 0;
+ if (name) {
+ if (strcmp(name, "mmc") == 0)
+ align = ((size >> 8) + 1) << 8;
+ else if (strcmp(name, "kernel") == 0)
+ align = ((size >> 7) + 1) << 7;
+ }
+ if (align) {
+ while (size < align) {
+ write(fd, "\xff", 1);
+ ++size;
+ }
}
return 0;
@@ -271,57 +558,91 @@ int fiasco_add(int fd, const char *name, const char *file, const char *version)
int fiasco_pack(int optind, char *argv[])
{
- const char *file = argv[optind];
+ char *file = argv[optind];
+ int fd, ret, i;
+
+ char *ptr;
+ char *arg;
char *type;
- int fd, ret;
+ char *device;
+ char *hwrevs;
+ char *version;
+ char *layout;
- fd = fiasco_new(file, file); // TODO use a format here
+ char *swver = NULL;
+
+ i = optind;
+ while((arg=argv[++i])) {
+ if (strncmp(arg, "version:", strlen("version:"))==0) {
+ swver = arg+strlen("version:");
+ break;
+ }
+ }
+
+ printf("Package: %s\n", file);
+ fd = fiasco_new(file, swver);
if (fd == -1)
return 1;
- printf("Package: %s\n", file);
- while((file=argv[++optind])) {
- type = (char *)fpid_file(file);
- printf("Adding %s: %s..\n", type, file);
- ret = fiasco_add(fd, type, file, NULL);
+ while((arg=argv[++optind])) {
+
+ if (strncmp(arg, "version:", strlen("version:"))==0)
+ continue;
+
+// format: [[[[dev:[hw:]]ver:]type:]file[%layout]
+ ptr = strdup(arg);
+ layout = strchr(ptr, '%');
+ if (layout) {
+ *(layout++) = 0;
+ }
+
+ type = NULL;
+ device = NULL;
+ hwrevs = NULL;
+ version = NULL;
+
+ file = strrchr(ptr, ':');
+ if (file) {
+ *(file++) = 0;
+ type = strrchr(ptr, ':');
+ if (type) {
+ *(type++) = 0;
+ version = strrchr(ptr, ':');
+ if (version) {
+ *(version++) = 0;
+ hwrevs = strchr(ptr, ':');
+ if (hwrevs)
+ *(hwrevs++) = 0;
+ device = ptr;
+ } else {
+ version = ptr;
+ }
+ } else {
+ type = ptr;
+ }
+ } else {
+ file = ptr;
+ }
+
+ if (!type)
+ type = (char *)fpid_file(file);
+
+ printf("Adding file: %s\n", file);
+ printf(" type: %s\n", type);
+ if (device) printf(" device: %s\n", device);
+ if (hwrevs) printf(" hw revisions: %s\n", hwrevs);
+ if (version) printf(" version: %s\n", version);
+ if (layout) printf(" layout file: %s\n", layout);
+
+ ret = fiasco_add(fd, type, file, layout, device, hwrevs, version);
+ free(ptr);
if (ret<0) {
printf("Error\n");
close(fd);
return 1;
}
}
- fiasco_add_eof(fd);
printf("Done!\n");
close(fd);
return 0;
}
-
-/* local code */
-#if 0
-void my_callback(int fd, struct header_t *header)
-{
- fiasco_data_read(header);
- //read(fd, buf, header->size);
- printf("Dumping %s\n", header->name);
- printf("DATA: %02x\n", header->data[0]);
- fiasco_data_free(header);
-}
-
-int main(int argc, char **argv)
-{
- if (argc!=2) {
- printf("Usage: unfiasco [file]\n");
- return 1;
- }
-
-/*
- fd = fiasco_new("myfiasco", "pancake-edition");
- fiasco_add(fd, "kernel", "zImage", "2.6.22");
- close(fd);
-*/
-
-// fiasco_callback = &my_callback;
-
- return openfiasco(argv[1]);
-}
-#endif
diff --git a/src/flash.c b/src/flash.c
index 43c79bb..3ad957f 100644
--- a/src/flash.c
+++ b/src/flash.c
@@ -74,7 +74,7 @@ void check_nolo_order()
check_nolo_order_failed();
}
-void flash_image(const char *filename, const char *piece, const char *version)
+void flash_image(const char *filename, const char *piece, const char *device, const char *hwrevs, const char *version)
{
FILE *fd;
int vlen = 0;
@@ -84,7 +84,7 @@ void flash_image(const char *filename, const char *piece, const char *version)
unsigned long long size, off;
unsigned char bsize[4], tmp;
unsigned char nolofiller[128];
- ushort hash = do_hash_file(filename);
+ ushort hash = do_hash_file(filename, piece);
if (piece == NULL) {
//exit(1);
diff --git a/src/fpid.c b/src/fpid.c
index 7387855..7126719 100644
--- a/src/fpid.c
+++ b/src/fpid.c
@@ -1,6 +1,7 @@
/*
* 0xFFFF - Open Free Fiasco Firmware Flasher
* Copyright (C) 2007 pancake <pancake@youterm.com>
+ * Copyright (C) 2012 Pali Rohár <pali.rohar@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,12 +24,16 @@
/* global structs */
char *pieces[] = {
"xloader", // xloader.bin
- "2nd", // 2nd
+ "2nd", // 2nd.bin
"secondary", // secondary.bin
"kernel", // zImage
- "initfs", // jffs'd initfs
- "rootfs", // 80mB of blob
+ "initfs", // initfs
+ "rootfs", // rootfs
"omap-nand", // 8kB of food for the nand
+ "mmc", // raw eMMC image
+ "cmt-2nd", // cmt-2nd
+ "cmt-algo", // cmt-algo
+ "cmt-mcusw", // cmt-mcusw
"fiasco", // FIASCO IMAGE
NULL
};
diff --git a/src/gui/Makefile b/src/gui/Makefile
index 61a5efa..3fb5c85 100644
--- a/src/gui/Makefile
+++ b/src/gui/Makefile
@@ -1,8 +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
+all: goxf
+
+goxf:
+ ${CC} -I../squeue ../squeue/squeue.c ../fpid.c gui.c `pkg-config --cflags --libs gtk+-2.0` -o goxf
+
+c:
+ gtkamlc --save-temps --Xcc=-I../squeue ../squeue/squeue.c ../fpid.c ../squeue/squeue.vapi gui.gtkon extras.vapi --pkg gtk+-2.0 -o goxf
test:
valac --save-temps --Xcc=-I.. squeue.vapi test.vala ../squeue.c -o v
@@ -11,3 +16,6 @@ else
all:
@true
endif
+
+clean:
+ rm -f goxf *.o *.c
diff --git a/src/gui/gui.c b/src/gui/gui.c
new file mode 100644
index 0000000..f8a1ffc
--- /dev/null
+++ b/src/gui/gui.c
@@ -0,0 +1,1163 @@
+/* gui.c generated by valac 0.11.2.14-5f971, the Vala compiler
+ * generated from gui.vala, do not modify */
+
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+#include <squeue.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib/gstdio.h>
+#include <stdio.h>
+#include <float.h>
+#include <math.h>
+#include <gdk/gdk.h>
+
+
+#define TYPE_MAIN_WINDOW (main_window_get_type ())
+#define MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MAIN_WINDOW, MainWindow))
+#define MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MAIN_WINDOW, MainWindowClass))
+#define IS_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MAIN_WINDOW))
+#define IS_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MAIN_WINDOW))
+#define MAIN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MAIN_WINDOW, MainWindowClass))
+
+typedef struct _MainWindow MainWindow;
+typedef struct _MainWindowClass MainWindowClass;
+typedef struct _MainWindowPrivate MainWindowPrivate;
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define _g_free0(var) (var = (g_free (var), NULL))
+#define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
+
+struct _MainWindow {
+ GtkWindow parent_instance;
+ MainWindowPrivate * priv;
+};
+
+struct _MainWindowClass {
+ GtkWindowClass parent_class;
+};
+
+struct _MainWindowPrivate {
+ GtkTreeView* tv;
+ GtkProgressBar* pb;
+ GtkAboutDialog* aboutdialog1;
+};
+
+
+static gpointer main_window_parent_class = NULL;
+static struct squeue_t* main_window_q;
+static struct squeue_t* main_window_q = NULL;
+static struct squeue_t* main_window_p;
+static struct squeue_t* main_window_p = NULL;
+static MainWindow* main_window_viewer;
+static MainWindow* main_window_viewer = NULL;
+
+GType main_window_get_type (void) G_GNUC_CONST;
+#define MAIN_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_MAIN_WINDOW, MainWindowPrivate))
+enum {
+ MAIN_WINDOW_DUMMY_PROPERTY
+};
+static void main_window_doCloseApplication (MainWindow* self);
+static void main_window_OnReset (MainWindow* self);
+static void main_window_OnFileFlashEvent (MainWindow* self);
+gboolean main_window_showYesNo (MainWindow* self, const gchar* s);
+void main_window_showMessage (MainWindow* self, const gchar* s, GtkMessageType mt);
+static void main_window_OnFileOpenEvent (MainWindow* self);
+void main_window_add_file (MainWindow* self, const gchar* type, const gchar* size, const gchar* file);
+gboolean main_window_loadFile (MainWindow* self, const gchar* filename);
+void main_window_showError (MainWindow* self, const gchar* s);
+static void main_window_OnMenuHelpAboutActivatedEvent (MainWindow* self);
+static void _lambda0_ (gint x, MainWindow* self);
+static void __lambda0__gtk_dialog_response (GtkDialog* _sender, gint response_id, gpointer self);
+static void main_window_OnFileNewEvent (MainWindow* self);
+void main_window_list_clear (MainWindow* self);
+static void main_window_OnQuitEvent (MainWindow* self);
+void main_window_list_del (MainWindow* self);
+void main_window_setup_treeview (GtkTreeView* view);
+gboolean main_window_readFunc (void);
+static void main_window_OnGetInformation (MainWindow* self);
+void main_window_msg (MainWindow* self, const gchar* str);
+static void main_window_OnConnect (MainWindow* self);
+static void main_window_OnStop (MainWindow* self);
+static gboolean main_window_chk_queues (MainWindow* self);
+static gint main_window_main (gchar** args, int args_length1);
+MainWindow* main_window_new (void);
+MainWindow* main_window_construct (GType object_type);
+static gboolean _lambda1_ (GtkWidget* x, GdkEvent* y);
+static gboolean __lambda1__gtk_widget_delete_event (GtkWidget* _sender, GdkEvent* event, gpointer self);
+static GObject * main_window_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
+static void _main_window_OnFileNewEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnFileOpenEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnQuitEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnConnect_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnStop_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnGetInformation_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnReset_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnMenuHelpAboutActivatedEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self);
+static void _main_window_OnConnect_gtk_button_clicked (GtkButton* _sender, gpointer self);
+static void _main_window_OnStop_gtk_button_clicked (GtkButton* _sender, gpointer self);
+static void _main_window_OnGetInformation_gtk_button_clicked (GtkButton* _sender, gpointer self);
+static void _main_window_OnFileOpenEvent_gtk_button_clicked (GtkButton* _sender, gpointer self);
+static void _main_window_list_del_gtk_button_clicked (GtkButton* _sender, gpointer self);
+static void _main_window_OnFileFlashEvent_gtk_button_clicked (GtkButton* _sender, gpointer self);
+static gboolean _gtk_widget_hide_on_delete_gtk_widget_delete_event (GtkWidget* _sender, GdkEvent* event, gpointer self);
+static void main_window_finalize (GObject* obj);
+static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func);
+static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func);
+static gint _vala_array_length (gpointer array);
+
+
+static void main_window_doCloseApplication (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ gtk_main_quit ();
+}
+
+
+static void main_window_OnReset (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ squeue_push (main_window_q, "reset:device", 1);
+}
+
+
+static gpointer _g_object_ref0 (gpointer self) {
+ return self ? g_object_ref (self) : NULL;
+}
+
+
+static void main_window_OnFileFlashEvent (MainWindow* self) {
+ GtkTreeModel* _tmp0_ = NULL;
+ GtkListStore* _tmp1_;
+ GtkListStore* ls;
+ const gchar* str;
+ GtkTreeIter iter = {0};
+ gint _tmp2_;
+ gint n;
+ g_return_if_fail (self != NULL);
+ _tmp0_ = gtk_tree_view_get_model (self->priv->tv);
+ _tmp1_ = _g_object_ref0 (GTK_LIST_STORE (_tmp0_));
+ ls = _tmp1_;
+ str = NULL;
+ _tmp2_ = gtk_tree_model_iter_n_children ((GtkTreeModel*) ls, NULL);
+ n = _tmp2_;
+ if (n > 0) {
+ gboolean _tmp3_;
+ _tmp3_ = main_window_showYesNo (self, "Do you want to flash these files?");
+ if (_tmp3_) {
+ GtkTreeIter _tmp4_ = {0};
+ gtk_tree_model_get_iter_first ((GtkTreeModel*) ls, &_tmp4_);
+ iter = _tmp4_;
+ {
+ gboolean _tmp5_;
+ _tmp5_ = TRUE;
+ while (TRUE) {
+ if (!_tmp5_) {
+ gboolean _tmp6_;
+ _tmp6_ = gtk_tree_model_iter_next ((GtkTreeModel*) ls, &iter);
+ if (!_tmp6_) {
+ break;
+ }
+ }
+ _tmp5_ = FALSE;
+ gtk_tree_model_get ((GtkTreeModel*) ls, &iter, 2, &str, -1, -1);
+ squeue_push2 (main_window_q, "flash", str, 1);
+ }
+ }
+ }
+ } else {
+ main_window_showMessage (self, "No files selected", GTK_MESSAGE_ERROR);
+ }
+ _g_object_unref0 (ls);
+}
+
+
+static void main_window_OnFileOpenEvent (MainWindow* self) {
+ GtkFileChooserDialog* _tmp0_ = NULL;
+ GtkFileChooserDialog* fc;
+ gint _tmp1_;
+ gint resp;
+ g_return_if_fail (self != NULL);
+ _tmp0_ = (GtkFileChooserDialog*) gtk_file_chooser_dialog_new ("Select file to open", (GtkWindow*) self, GTK_FILE_CHOOSER_ACTION_OPEN, "gtk-cancel", GTK_RESPONSE_CANCEL, "gtk-open", GTK_RESPONSE_ACCEPT, NULL);
+ fc = g_object_ref_sink (_tmp0_);
+ _tmp1_ = gtk_dialog_run ((GtkDialog*) fc);
+ resp = _tmp1_;
+ gtk_widget_hide ((GtkWidget*) fc);
+ if (resp == GTK_RESPONSE_ACCEPT) {
+ gchar* _tmp2_ = NULL;
+ gchar* file;
+ gchar* _tmp3_ = NULL;
+ const gchar* type;
+ glong _tmp4_;
+ gchar* _tmp5_ = NULL;
+ gchar* size;
+ _tmp2_ = gtk_file_chooser_get_filename ((GtkFileChooser*) fc);
+ file = _tmp2_;
+ _tmp3_ = fpid_file (file);
+ type = _tmp3_;
+ _tmp4_ = fpid_size (file);
+ _tmp5_ = g_strdup_printf ("%ld", _tmp4_);
+ size = _tmp5_;
+ if (type == NULL) {
+ main_window_showMessage (self, "Invalid file type", GTK_MESSAGE_ERROR);
+ } else {
+ main_window_add_file (self, type, size, file);
+ }
+ _g_free0 (size);
+ _g_free0 (file);
+ }
+ gtk_object_destroy ((GtkObject*) fc);
+ _g_object_unref0 (fc);
+}
+
+
+gboolean main_window_loadFile (MainWindow* self, const gchar* filename) {
+ gboolean result = FALSE;
+ gint err;
+ gchar* contents;
+ gsize length = 0UL;
+ gchar* _tmp0_ = NULL;
+ gsize _tmp1_;
+ GError * _inner_error_ = NULL;
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (filename != NULL, FALSE);
+ err = 0;
+ contents = NULL;
+ g_file_get_contents (filename, &_tmp0_, &_tmp1_, &_inner_error_);
+ _g_free0 (contents);
+ contents = _tmp0_;
+ length = _tmp1_;
+ if (_inner_error_ != NULL) {
+ _g_free0 (contents);
+ goto __catch0_g_error;
+ }
+ _g_free0 (contents);
+ goto __finally0;
+ __catch0_g_error:
+ {
+ GError * e;
+ gchar* _tmp2_;
+ e = _inner_error_;
+ _inner_error_ = NULL;
+ _tmp2_ = g_strconcat ("Unexpected error while loading the file, please contact the author wit" \
+"h the following information:\n" \
+"\n", e->message, NULL);
+ main_window_showError (self, _tmp2_);
+ _g_free0 (_tmp2_);
+ err++;
+ _g_error_free0 (e);
+ }
+ __finally0:
+ if (_inner_error_ != NULL) {
+ g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
+ g_clear_error (&_inner_error_);
+ return FALSE;
+ }
+ result = err == 0;
+ return result;
+}
+
+
+gboolean main_window_showYesNo (MainWindow* self, const gchar* s) {
+ gboolean result = FALSE;
+ GtkMessageDialog* _tmp0_ = NULL;
+ GtkMessageDialog* md;
+ gint _tmp1_;
+ gint ret;
+ g_return_val_if_fail (self != NULL, FALSE);
+ g_return_val_if_fail (s != NULL, FALSE);
+ _tmp0_ = (GtkMessageDialog*) gtk_message_dialog_new ((GtkWindow*) self, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, s);
+ md = g_object_ref_sink (_tmp0_);
+ _tmp1_ = gtk_dialog_run ((GtkDialog*) md);
+ ret = _tmp1_;
+ gtk_object_destroy ((GtkObject*) md);
+ result = ret == GTK_RESPONSE_YES;
+ _g_object_unref0 (md);
+ return result;
+}
+
+
+void main_window_showMessage (MainWindow* self, const gchar* s, GtkMessageType mt) {
+ GtkMessageDialog* _tmp0_ = NULL;
+ GtkMessageDialog* md;
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (s != NULL);
+ _tmp0_ = (GtkMessageDialog*) gtk_message_dialog_new ((GtkWindow*) self, GTK_DIALOG_DESTROY_WITH_PARENT, mt, GTK_BUTTONS_CLOSE, s);
+ md = g_object_ref_sink (_tmp0_);
+ gtk_dialog_run ((GtkDialog*) md);
+ gtk_object_destroy ((GtkObject*) md);
+ _g_object_unref0 (md);
+}
+
+
+static void _lambda0_ (gint x, MainWindow* self) {
+ gtk_widget_hide ((GtkWidget*) self->priv->aboutdialog1);
+}
+
+
+static void __lambda0__gtk_dialog_response (GtkDialog* _sender, gint response_id, gpointer self) {
+ _lambda0_ (response_id, self);
+}
+
+
+static void main_window_OnMenuHelpAboutActivatedEvent (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ gtk_window_set_transient_for ((GtkWindow*) self->priv->aboutdialog1, (GtkWindow*) self);
+ g_signal_connect_object ((GtkDialog*) self->priv->aboutdialog1, "response", (GCallback) __lambda0__gtk_dialog_response, self, 0);
+ gtk_dialog_run ((GtkDialog*) self->priv->aboutdialog1);
+}
+
+
+void main_window_showError (MainWindow* self, const gchar* s) {
+ GtkMessageDialog* _tmp0_ = NULL;
+ GtkMessageDialog* md;
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (s != NULL);
+ _tmp0_ = (GtkMessageDialog*) gtk_message_dialog_new ((GtkWindow*) self, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, s);
+ md = g_object_ref_sink (_tmp0_);
+ gtk_dialog_run ((GtkDialog*) md);
+ gtk_object_destroy ((GtkObject*) md);
+ _g_object_unref0 (md);
+}
+
+
+static void main_window_OnFileNewEvent (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ main_window_list_clear (self);
+}
+
+
+static void main_window_OnQuitEvent (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ main_window_doCloseApplication (self);
+}
+
+
+void main_window_list_clear (MainWindow* self) {
+ GtkTreeModel* _tmp0_ = NULL;
+ g_return_if_fail (self != NULL);
+ _tmp0_ = gtk_tree_view_get_model (self->priv->tv);
+ gtk_list_store_clear (GTK_LIST_STORE (_tmp0_));
+}
+
+
+void main_window_list_del (MainWindow* self) {
+ GtkTreeIter iter = {0};
+ GtkTreeModel* model;
+ GtkTreeSelection* _tmp0_ = NULL;
+ GtkTreeSelection* _tmp1_;
+ GtkTreeSelection* sel;
+ gint _tmp2_;
+ g_return_if_fail (self != NULL);
+ model = NULL;
+ _tmp0_ = gtk_tree_view_get_selection (self->priv->tv);
+ _tmp1_ = _g_object_ref0 (_tmp0_);
+ sel = _tmp1_;
+ _tmp2_ = gtk_tree_selection_count_selected_rows (sel);
+ if (_tmp2_ == 1) {
+ GtkTreeModel* _tmp3_ = NULL;
+ GtkTreeIter _tmp4_ = {0};
+ GtkTreeModel* _tmp5_;
+ GtkTreeModel* _tmp6_ = NULL;
+ gtk_tree_selection_get_selected (sel, &_tmp3_, &_tmp4_);
+ _g_object_unref0 (model);
+ _tmp5_ = _g_object_ref0 (_tmp3_);
+ model = _tmp5_;
+ iter = _tmp4_;
+ _tmp6_ = gtk_tree_view_get_model (self->priv->tv);
+ gtk_list_store_remove (GTK_LIST_STORE (_tmp6_), &iter);
+ }
+ _g_object_unref0 (sel);
+ _g_object_unref0 (model);
+}
+
+
+void main_window_add_file (MainWindow* self, const gchar* type, const gchar* size, const gchar* file) {
+ GtkTreeModel* _tmp0_ = NULL;
+ GtkListStore* _tmp1_;
+ GtkListStore* listmodel;
+ GtkTreeIter iter = {0};
+ GtkTreeIter _tmp2_ = {0};
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (type != NULL);
+ g_return_if_fail (size != NULL);
+ g_return_if_fail (file != NULL);
+ _tmp0_ = gtk_tree_view_get_model (self->priv->tv);
+ _tmp1_ = _g_object_ref0 (GTK_LIST_STORE (_tmp0_));
+ listmodel = _tmp1_;
+ gtk_list_store_append (listmodel, &_tmp2_);
+ iter = _tmp2_;
+ gtk_list_store_set (listmodel, &iter, 0, type, 1, size, 2, file, -1, -1);
+ _g_object_unref0 (listmodel);
+}
+
+
+void main_window_setup_treeview (GtkTreeView* view) {
+ GtkListStore* _tmp0_ = NULL;
+ GtkListStore* listmodel;
+ GtkCellRendererText* _tmp1_ = NULL;
+ GtkCellRendererText* _tmp2_;
+ GtkCellRendererText* _tmp3_ = NULL;
+ GtkCellRendererText* _tmp4_;
+ GtkCellRendererText* _tmp5_ = NULL;
+ GtkCellRendererText* cell;
+ g_return_if_fail (view != NULL);
+ _tmp0_ = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ listmodel = _tmp0_;
+ gtk_tree_view_set_model (view, (GtkTreeModel*) listmodel);
+ _tmp1_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
+ _tmp2_ = g_object_ref_sink (_tmp1_);
+ gtk_tree_view_insert_column_with_attributes (view, -1, "Type", (GtkCellRenderer*) _tmp2_, "text", 0, NULL, NULL);
+ _g_object_unref0 (_tmp2_);
+ _tmp3_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
+ _tmp4_ = g_object_ref_sink (_tmp3_);
+ gtk_tree_view_insert_column_with_attributes (view, -1, "Size", (GtkCellRenderer*) _tmp4_, "text", 1, NULL, NULL);
+ _g_object_unref0 (_tmp4_);
+ _tmp5_ = (GtkCellRendererText*) gtk_cell_renderer_text_new ();
+ cell = g_object_ref_sink (_tmp5_);
+ g_object_set ((GObject*) cell, "foreground_set", TRUE, NULL, NULL);
+ gtk_tree_view_insert_column_with_attributes (view, -1, "Name", (GtkCellRenderer*) cell, "text", 2, "foreground", 3, NULL, NULL);
+ _g_object_unref0 (cell);
+ _g_object_unref0 (listmodel);
+}
+
+
+static gchar string_get (const gchar* self, glong index) {
+ gchar result = '\0';
+ g_return_val_if_fail (self != NULL, '\0');
+ result = ((gchar*) self)[index];
+ return result;
+}
+
+
+gboolean main_window_readFunc (void) {
+ gboolean result = FALSE;
+ const gchar* _tmp0_ = NULL;
+ const gchar* msg;
+ gboolean _tmp1_ = FALSE;
+ _tmp0_ = squeue_get (main_window_p, 0);
+ msg = _tmp0_;
+ if (msg != NULL) {
+ gchar _tmp2_;
+ _tmp2_ = string_get (msg, (glong) 0);
+ _tmp1_ = _tmp2_ != '\0';
+ } else {
+ _tmp1_ = FALSE;
+ }
+ if (_tmp1_) {
+ gchar** _tmp3_;
+ gchar** _tmp4_ = NULL;
+ gint foo_length1;
+ gint _foo_size_;
+ gchar** _tmp5_;
+ gchar** foo;
+ fprintf (stdout, "[<] msg received: %s\n", msg);
+ _tmp4_ = _tmp3_ = g_strsplit (msg, ":", 2);
+ _tmp5_ = _tmp4_;
+ foo_length1 = _vala_array_length (_tmp3_);
+ _foo_size_ = foo_length1;
+ foo = _tmp5_;
+ if (foo[1] != NULL) {
+ const gchar* _tmp6_;
+ GQuark _tmp7_;
+ static GQuark _tmp7__label0 = 0;
+ static GQuark _tmp7__label1 = 0;
+ static GQuark _tmp7__label2 = 0;
+ _tmp6_ = foo[0];
+ _tmp7_ = (NULL == _tmp6_) ? 0 : g_quark_from_string (_tmp6_);
+ if (_tmp7_ == ((0 != _tmp7__label0) ? _tmp7__label0 : (_tmp7__label0 = g_quark_from_static_string ("bar")))) {
+ switch (0) {
+ default:
+ {
+ gint _tmp8_;
+ gchar* _tmp9_;
+ _tmp8_ = atoi (foo[1]);
+ gtk_progress_bar_set_fraction (main_window_viewer->priv->pb, (gdouble) (_tmp8_ / 100));
+ _tmp9_ = g_strconcat (foo[1], "%", NULL);
+ gtk_progress_bar_set_text (main_window_viewer->priv->pb, _tmp9_);
+ _g_free0 (_tmp9_);
+ break;
+ }
+ }
+ } else if (_tmp7_ == ((0 != _tmp7__label1) ? _tmp7__label1 : (_tmp7__label1 = g_quark_from_static_string ("error")))) {
+ switch (0) {
+ default:
+ {
+ main_window_showMessage (main_window_viewer, foo[1], GTK_MESSAGE_ERROR);
+ break;
+ }
+ }
+ } else if (_tmp7_ == ((0 != _tmp7__label2) ? _tmp7__label2 : (_tmp7__label2 = g_quark_from_static_string ("info")))) {
+ switch (0) {
+ default:
+ {
+ main_window_showMessage (main_window_viewer, foo[1], GTK_MESSAGE_INFO);
+ break;
+ }
+ }
+ } else {
+ switch (0) {
+ default:
+ {
+ fprintf (stderr, "[E] Unknown message type\n");
+ break;
+ }
+ }
+ }
+ }
+ squeue_pop (main_window_p);
+ foo = (_vala_array_free (foo, foo_length1, (GDestroyNotify) g_free), NULL);
+ }
+ result = TRUE;
+ return result;
+}
+
+
+static void main_window_OnGetInformation (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ main_window_msg (self, "info:device");
+}
+
+
+static void main_window_OnConnect (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ main_window_OnStop (self);
+ system ("sudo 0xFFFF -Q &");
+ squeue_close (main_window_p);
+ squeue_close (main_window_q);
+ main_window_q = NULL;
+ main_window_p = main_window_q;
+}
+
+
+static void main_window_OnStop (MainWindow* self) {
+ g_return_if_fail (self != NULL);
+ system ("sudo pkill 0xFFFF");
+}
+
+
+static gboolean main_window_chk_queues (MainWindow* self) {
+ gboolean result = FALSE;
+ gboolean _tmp2_ = FALSE;
+ g_return_val_if_fail (self != NULL, FALSE);
+ if (main_window_p == NULL) {
+ struct squeue_t* _tmp0_ = NULL;
+ _tmp0_ = squeue_open ("/tmp/0xFFFF.1", (gint) Q_OPEN);
+ main_window_p = _tmp0_;
+ }
+ if (main_window_q == NULL) {
+ struct squeue_t* _tmp1_ = NULL;
+ _tmp1_ = squeue_open ("/tmp/0xFFFF.2", (gint) Q_OPEN);
+ main_window_q = _tmp1_;
+ }
+ if (main_window_p == NULL) {
+ _tmp2_ = TRUE;
+ } else {
+ _tmp2_ = main_window_q == NULL;
+ }
+ if (_tmp2_) {
+ main_window_showMessage (self, "Cannot connect to queues", GTK_MESSAGE_ERROR);
+ result = FALSE;
+ return result;
+ }
+ result = TRUE;
+ return result;
+}
+
+
+void main_window_msg (MainWindow* self, const gchar* str) {
+ gboolean _tmp0_;
+ gint _tmp1_;
+ g_return_if_fail (self != NULL);
+ g_return_if_fail (str != NULL);
+ _tmp0_ = main_window_chk_queues (self);
+ if (!_tmp0_) {
+ return;
+ }
+ _tmp1_ = squeue_push (main_window_q, str, 0);
+ if (_tmp1_ < 1) {
+ fprintf (stderr, "Oops on push\n");
+ squeue_free (main_window_q);
+ main_window_q = NULL;
+ squeue_free (main_window_p);
+ main_window_p = NULL;
+ }
+}
+
+
+static gboolean _lambda1_ (GtkWidget* x, GdkEvent* y) {
+ gboolean result = FALSE;
+ g_return_val_if_fail (x != NULL, FALSE);
+ g_return_val_if_fail (y != NULL, FALSE);
+ gtk_main_quit ();
+ result = FALSE;
+ return result;
+}
+
+
+static gboolean __lambda1__gtk_widget_delete_event (GtkWidget* _sender, GdkEvent* event, gpointer self) {
+ gboolean result;
+ result = _lambda1_ (_sender, event);
+ return result;
+}
+
+
+static gint main_window_main (gchar** args, int args_length1) {
+ gint result = 0;
+ MainWindow* _tmp0_ = NULL;
+ MainWindow* _tmp1_;
+ GSourceFunc _tmp2_;
+ gtk_init (&args_length1, &args);
+ _tmp0_ = main_window_new ();
+ _tmp1_ = g_object_ref_sink (_tmp0_);
+ _g_object_unref0 (main_window_viewer);
+ main_window_viewer = _tmp1_;
+ if (args_length1 > 1) {
+ main_window_loadFile (main_window_viewer, args[1]);
+ }
+ gtk_window_resize ((GtkWindow*) main_window_viewer, 600, 400);
+ gtk_window_set_position ((GtkWindow*) main_window_viewer, GTK_WIN_POS_CENTER);
+ g_signal_connect ((GtkWidget*) main_window_viewer, "delete-event", (GCallback) __lambda1__gtk_widget_delete_event, NULL);
+ main_window_setup_treeview (main_window_viewer->priv->tv);
+ gtk_widget_show_all ((GtkWidget*) main_window_viewer);
+ _tmp2_ = (GSourceFunc) main_window_readFunc;
+ g_timeout_add_full (G_PRIORITY_DEFAULT, (guint) 200, _tmp2_, NULL, NULL);
+ gtk_main ();
+ result = 0;
+ return result;
+}
+
+
+int main (int argc, char ** argv) {
+ g_type_init ();
+ return main_window_main (argv, argc);
+}
+
+
+MainWindow* main_window_construct (GType object_type) {
+ MainWindow * self = NULL;
+ self = (MainWindow*) g_object_new (object_type, NULL);
+ return self;
+}
+
+
+MainWindow* main_window_new (void) {
+ return main_window_construct (TYPE_MAIN_WINDOW);
+}
+
+
+static void _main_window_OnFileNewEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnFileNewEvent (self);
+}
+
+
+static void _main_window_OnFileOpenEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnFileOpenEvent (self);
+}
+
+
+static void _main_window_OnQuitEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnQuitEvent (self);
+}
+
+
+static void _main_window_OnConnect_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnConnect (self);
+}
+
+
+static void _main_window_OnStop_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnStop (self);
+}
+
+
+static void _main_window_OnGetInformation_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnGetInformation (self);
+}
+
+
+static void _main_window_OnReset_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnReset (self);
+}
+
+
+static void _main_window_OnMenuHelpAboutActivatedEvent_gtk_menu_item_activate (GtkMenuItem* _sender, gpointer self) {
+ main_window_OnMenuHelpAboutActivatedEvent (self);
+}
+
+
+static void _main_window_OnConnect_gtk_button_clicked (GtkButton* _sender, gpointer self) {
+ main_window_OnConnect (self);
+}
+
+
+static void _main_window_OnStop_gtk_button_clicked (GtkButton* _sender, gpointer self) {
+ main_window_OnStop (self);
+}
+
+
+static void _main_window_OnGetInformation_gtk_button_clicked (GtkButton* _sender, gpointer self) {
+ main_window_OnGetInformation (self);
+}
+
+
+static void _main_window_OnFileOpenEvent_gtk_button_clicked (GtkButton* _sender, gpointer self) {
+ main_window_OnFileOpenEvent (self);
+}
+
+
+static void _main_window_list_del_gtk_button_clicked (GtkButton* _sender, gpointer self) {
+ main_window_list_del (self);
+}
+
+
+static void _main_window_OnFileFlashEvent_gtk_button_clicked (GtkButton* _sender, gpointer self) {
+ main_window_OnFileFlashEvent (self);
+}
+
+
+static gboolean _gtk_widget_hide_on_delete_gtk_widget_delete_event (GtkWidget* _sender, GdkEvent* event, gpointer self) {
+ gboolean result;
+ result = gtk_widget_hide_on_delete (self);
+ return result;
+}
+
+
+static GObject * main_window_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties) {
+ GObject * obj;
+ GObjectClass * parent_class;
+ MainWindow * self;
+ GtkVBox* _vbox0;
+ GtkMenuBar* _menubar0;
+ GtkMenuItem* _menuitem0;
+ GtkMenu* _menu0;
+ GtkImageMenuItem* _imagemenuitem0;
+ GtkImageMenuItem* _imagemenuitem1;
+ GtkSeparatorMenuItem* _separatormenuitem0;
+ GtkImageMenuItem* _imagemenuitem2;
+ GtkMenuItem* _menuitem1;
+ GtkMenu* _menu1;
+ GtkImageMenuItem* _imagemenuitem3;
+ GtkImageMenuItem* _imagemenuitem4;
+ GtkImageMenuItem* _imagemenuitem5;
+ GtkImageMenuItem* _imagemenuitem6;
+ GtkMenuItem* _menuitem2;
+ GtkMenu* _menu2;
+ GtkImageMenuItem* _imagemenuitem7;
+ GtkHBox* _hbox0;
+ GtkVBox* _vbox1;
+ GtkScrolledWindow* _scrolledwindow0;
+ GtkVBox* _vbox2;
+ GtkButton* _button0;
+ GtkButton* _button1;
+ GtkButton* _button2;
+ GtkLabel* _label0;
+ GtkButton* _button3;
+ GtkButton* _button4;
+ GtkLabel* _label1;
+ GtkButton* _button5;
+ GtkVBox* _tmp0_ = NULL;
+ GtkVBox* _tmp1_;
+ GtkMenuBar* _tmp2_ = NULL;
+ GtkMenuBar* _tmp3_;
+ GtkMenu* _tmp4_ = NULL;
+ GtkMenu* _tmp5_;
+ GtkImageMenuItem* _tmp6_ = NULL;
+ GtkImageMenuItem* _tmp7_;
+ GtkImageMenuItem* _tmp8_ = NULL;
+ GtkImageMenuItem* _tmp9_;
+ GtkSeparatorMenuItem* _tmp10_ = NULL;
+ GtkSeparatorMenuItem* _tmp11_;
+ GtkImageMenuItem* _tmp12_ = NULL;
+ GtkImageMenuItem* _tmp13_;
+ GtkMenuItem* _tmp14_ = NULL;
+ GtkMenuItem* _tmp15_;
+ GtkMenu* _tmp16_ = NULL;
+ GtkMenu* _tmp17_;
+ GtkImageMenuItem* _tmp18_ = NULL;
+ GtkImageMenuItem* _tmp19_;
+ GtkImageMenuItem* _tmp20_ = NULL;
+ GtkImageMenuItem* _tmp21_;
+ GtkImageMenuItem* _tmp22_ = NULL;
+ GtkImageMenuItem* _tmp23_;
+ GtkImageMenuItem* _tmp24_ = NULL;
+ GtkImageMenuItem* _tmp25_;
+ GtkMenuItem* _tmp26_ = NULL;
+ GtkMenuItem* _tmp27_;
+ GtkMenu* _tmp28_ = NULL;
+ GtkMenu* _tmp29_;
+ GtkImageMenuItem* _tmp30_ = NULL;
+ GtkImageMenuItem* _tmp31_;
+ GtkMenuItem* _tmp32_ = NULL;
+ GtkMenuItem* _tmp33_;
+ GtkHBox* _tmp34_ = NULL;
+ GtkHBox* _tmp35_;
+ GtkVBox* _tmp36_ = NULL;
+ GtkVBox* _tmp37_;
+ GtkScrolledWindow* _tmp38_ = NULL;
+ GtkScrolledWindow* _tmp39_;
+ GtkTreeView* _tmp40_ = NULL;
+ GtkTreeView* _tmp41_;
+ GtkVBox* _tmp42_ = NULL;
+ GtkVBox* _tmp43_;
+ GtkButton* _tmp44_ = NULL;
+ GtkButton* _tmp45_;
+ GtkButton* _tmp46_ = NULL;
+ GtkButton* _tmp47_;
+ GtkButton* _tmp48_ = NULL;
+ GtkButton* _tmp49_;
+ GtkLabel* _tmp50_ = NULL;
+ GtkLabel* _tmp51_;
+ GtkButton* _tmp52_ = NULL;
+ GtkButton* _tmp53_;
+ GtkButton* _tmp54_ = NULL;
+ GtkButton* _tmp55_;
+ GtkLabel* _tmp56_ = NULL;
+ GtkLabel* _tmp57_;
+ GtkButton* _tmp58_ = NULL;
+ GtkButton* _tmp59_;
+ GtkProgressBar* _tmp60_ = NULL;
+ GtkProgressBar* _tmp61_;
+ GtkAboutDialog* _tmp62_ = NULL;
+ GtkAboutDialog* _tmp63_;
+ gchar* _tmp64_;
+ gchar** _tmp65_ = NULL;
+ gchar** _tmp66_;
+ gint _tmp66__length1;
+ parent_class = G_OBJECT_CLASS (main_window_parent_class);
+ obj = parent_class->constructor (type, n_construct_properties, construct_properties);
+ self = MAIN_WINDOW (obj);
+ _vbox0 = NULL;
+ _menubar0 = NULL;
+ _menuitem0 = NULL;
+ _menu0 = NULL;
+ _imagemenuitem0 = NULL;
+ _imagemenuitem1 = NULL;
+ _separatormenuitem0 = NULL;
+ _imagemenuitem2 = NULL;
+ _menuitem1 = NULL;
+ _menu1 = NULL;
+ _imagemenuitem3 = NULL;
+ _imagemenuitem4 = NULL;
+ _imagemenuitem5 = NULL;
+ _imagemenuitem6 = NULL;
+ _menuitem2 = NULL;
+ _menu2 = NULL;
+ _imagemenuitem7 = NULL;
+ _hbox0 = NULL;
+ _vbox1 = NULL;
+ _scrolledwindow0 = NULL;
+ _vbox2 = NULL;
+ _button0 = NULL;
+ _button1 = NULL;
+ _button2 = NULL;
+ _label0 = NULL;
+ _button3 = NULL;
+ _button4 = NULL;
+ _label1 = NULL;
+ _button5 = NULL;
+ _tmp0_ = (GtkVBox*) gtk_vbox_new (FALSE, 0);
+ _tmp1_ = g_object_ref_sink (_tmp0_);
+ _g_object_unref0 (_vbox0);
+ _vbox0 = _tmp1_;
+ _tmp2_ = (GtkMenuBar*) gtk_menu_bar_new ();
+ _tmp3_ = g_object_ref_sink (_tmp2_);
+ _g_object_unref0 (_menubar0);
+ _menubar0 = _tmp3_;
+ _tmp4_ = (GtkMenu*) gtk_menu_new ();
+ _tmp5_ = g_object_ref_sink (_tmp4_);
+ _g_object_unref0 (_menu0);
+ _menu0 = _tmp5_;
+ _tmp6_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-new", NULL);
+ _tmp7_ = g_object_ref_sink (_tmp6_);
+ _g_object_unref0 (_imagemenuitem0);
+ _imagemenuitem0 = _tmp7_;
+ _tmp8_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-open", NULL);
+ _tmp9_ = g_object_ref_sink (_tmp8_);
+ _g_object_unref0 (_imagemenuitem1);
+ _imagemenuitem1 = _tmp9_;
+ _tmp10_ = (GtkSeparatorMenuItem*) gtk_separator_menu_item_new ();
+ _tmp11_ = g_object_ref_sink (_tmp10_);
+ _g_object_unref0 (_separatormenuitem0);
+ _separatormenuitem0 = _tmp11_;
+ _tmp12_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-quit", NULL);
+ _tmp13_ = g_object_ref_sink (_tmp12_);
+ _g_object_unref0 (_imagemenuitem2);
+ _imagemenuitem2 = _tmp13_;
+ _tmp14_ = (GtkMenuItem*) gtk_menu_item_new_with_mnemonic ("_File");
+ _tmp15_ = g_object_ref_sink (_tmp14_);
+ _g_object_unref0 (_menuitem0);
+ _menuitem0 = _tmp15_;
+ _tmp16_ = (GtkMenu*) gtk_menu_new ();
+ _tmp17_ = g_object_ref_sink (_tmp16_);
+ _g_object_unref0 (_menu1);
+ _menu1 = _tmp17_;
+ _tmp18_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-connect", NULL);
+ _tmp19_ = g_object_ref_sink (_tmp18_);
+ _g_object_unref0 (_imagemenuitem3);
+ _imagemenuitem3 = _tmp19_;
+ _tmp20_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-stop", NULL);
+ _tmp21_ = g_object_ref_sink (_tmp20_);
+ _g_object_unref0 (_imagemenuitem4);
+ _imagemenuitem4 = _tmp21_;
+ _tmp22_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-info", NULL);
+ _tmp23_ = g_object_ref_sink (_tmp22_);
+ _g_object_unref0 (_imagemenuitem5);
+ _imagemenuitem5 = _tmp23_;
+ _tmp24_ = (GtkImageMenuItem*) gtk_image_menu_item_new_with_label ("Reset");
+ _tmp25_ = g_object_ref_sink (_tmp24_);
+ _g_object_unref0 (_imagemenuitem6);
+ _imagemenuitem6 = _tmp25_;
+ _tmp26_ = (GtkMenuItem*) gtk_menu_item_new_with_mnemonic ("_Target");
+ _tmp27_ = g_object_ref_sink (_tmp26_);
+ _g_object_unref0 (_menuitem1);
+ _menuitem1 = _tmp27_;
+ _tmp28_ = (GtkMenu*) gtk_menu_new ();
+ _tmp29_ = g_object_ref_sink (_tmp28_);
+ _g_object_unref0 (_menu2);
+ _menu2 = _tmp29_;
+ _tmp30_ = (GtkImageMenuItem*) gtk_image_menu_item_new_from_stock ("gtk-about", NULL);
+ _tmp31_ = g_object_ref_sink (_tmp30_);
+ _g_object_unref0 (_imagemenuitem7);
+ _imagemenuitem7 = _tmp31_;
+ _tmp32_ = (GtkMenuItem*) gtk_menu_item_new_with_mnemonic ("_Help");
+ _tmp33_ = g_object_ref_sink (_tmp32_);
+ _g_object_unref0 (_menuitem2);
+ _menuitem2 = _tmp33_;
+ _tmp34_ = (GtkHBox*) gtk_hbox_new (FALSE, 0);
+ _tmp35_ = g_object_ref_sink (_tmp34_);
+ _g_object_unref0 (_hbox0);
+ _hbox0 = _tmp35_;
+ _tmp36_ = (GtkVBox*) gtk_vbox_new (FALSE, 3);
+ _tmp37_ = g_object_ref_sink (_tmp36_);
+ _g_object_unref0 (_vbox1);
+ _vbox1 = _tmp37_;
+ _tmp38_ = (GtkScrolledWindow*) gtk_scrolled_window_new (NULL, NULL);
+ _tmp39_ = g_object_ref_sink (_tmp38_);
+ _g_object_unref0 (_scrolledwindow0);
+ _scrolledwindow0 = _tmp39_;
+ _tmp40_ = (GtkTreeView*) gtk_tree_view_new ();
+ _tmp41_ = g_object_ref_sink (_tmp40_);
+ _g_object_unref0 (self->priv->tv);
+ self->priv->tv = _tmp41_;
+ _tmp42_ = (GtkVBox*) gtk_vbox_new (FALSE, 3);
+ _tmp43_ = g_object_ref_sink (_tmp42_);
+ _g_object_unref0 (_vbox2);
+ _vbox2 = _tmp43_;
+ _tmp44_ = (GtkButton*) gtk_button_new_with_label ("gtk-connect");
+ _tmp45_ = g_object_ref_sink (_tmp44_);
+ _g_object_unref0 (_button0);
+ _button0 = _tmp45_;
+ _tmp46_ = (GtkButton*) gtk_button_new_with_label ("gtk-stop");
+ _tmp47_ = g_object_ref_sink (_tmp46_);
+ _g_object_unref0 (_button1);
+ _button1 = _tmp47_;
+ _tmp48_ = (GtkButton*) gtk_button_new_with_label ("gtk-info");
+ _tmp49_ = g_object_ref_sink (_tmp48_);
+ _g_object_unref0 (_button2);
+ _button2 = _tmp49_;
+ _tmp50_ = (GtkLabel*) gtk_label_new ("");
+ _tmp51_ = g_object_ref_sink (_tmp50_);
+ _g_object_unref0 (_label0);
+ _label0 = _tmp51_;
+ _tmp52_ = (GtkButton*) gtk_button_new_with_label ("gtk-add");
+ _tmp53_ = g_object_ref_sink (_tmp52_);
+ _g_object_unref0 (_button3);
+ _button3 = _tmp53_;
+ _tmp54_ = (GtkButton*) gtk_button_new_with_label ("gtk-remove");
+ _tmp55_ = g_object_ref_sink (_tmp54_);
+ _g_object_unref0 (_button4);
+ _button4 = _tmp55_;
+ _tmp56_ = (GtkLabel*) gtk_label_new ("");
+ _tmp57_ = g_object_ref_sink (_tmp56_);
+ _g_object_unref0 (_label1);
+ _label1 = _tmp57_;
+ _tmp58_ = (GtkButton*) gtk_button_new_with_label ("gtk-media-record");
+ _tmp59_ = g_object_ref_sink (_tmp58_);
+ _g_object_unref0 (_button5);
+ _button5 = _tmp59_;
+ _tmp60_ = (GtkProgressBar*) gtk_progress_bar_new ();
+ _tmp61_ = g_object_ref_sink (_tmp60_);
+ _g_object_unref0 (self->priv->pb);
+ self->priv->pb = _tmp61_;
+ _tmp62_ = (GtkAboutDialog*) gtk_about_dialog_new ();
+ _tmp63_ = g_object_ref_sink (_tmp62_);
+ _g_object_unref0 (self->priv->aboutdialog1);
+ self->priv->aboutdialog1 = _tmp63_;
+ g_object_set ((GtkWindow*) self, "type", GTK_WINDOW_TOPLEVEL, NULL);
+ gtk_window_set_title ((GtkWindow*) self, "0xFFFF GUI");
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem0, "activate", (GCallback) _main_window_OnFileNewEvent_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu0, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem0));
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem1, "activate", (GCallback) _main_window_OnFileOpenEvent_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu0, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem1));
+ gtk_menu_shell_append ((GtkMenuShell*) _menu0, (GtkWidget*) ((GtkMenuItem*) _separatormenuitem0));
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem2, "activate", (GCallback) _main_window_OnQuitEvent_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu0, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem2));
+ gtk_menu_item_set_submenu (_menuitem0, _menu0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menubar0, (GtkWidget*) _menuitem0);
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem3, "activate", (GCallback) _main_window_OnConnect_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu1, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem3));
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem4, "activate", (GCallback) _main_window_OnStop_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu1, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem4));
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem5, "activate", (GCallback) _main_window_OnGetInformation_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu1, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem5));
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem6, "activate", (GCallback) _main_window_OnReset_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu1, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem6));
+ gtk_menu_item_set_submenu (_menuitem1, _menu1);
+ gtk_menu_shell_append ((GtkMenuShell*) _menubar0, (GtkWidget*) _menuitem1);
+ g_signal_connect_object ((GtkMenuItem*) _imagemenuitem7, "activate", (GCallback) _main_window_OnMenuHelpAboutActivatedEvent_gtk_menu_item_activate, self, 0);
+ gtk_menu_shell_append ((GtkMenuShell*) _menu2, (GtkWidget*) ((GtkMenuItem*) _imagemenuitem7));
+ gtk_menu_item_set_submenu (_menuitem2, _menu2);
+ gtk_menu_shell_append ((GtkMenuShell*) _menubar0, (GtkWidget*) _menuitem2);
+ gtk_box_pack_start ((GtkBox*) _vbox0, (GtkWidget*) _menubar0, FALSE, TRUE, (guint) 0);
+ gtk_container_set_border_width ((GtkContainer*) _hbox0, (guint) 5);
+ gtk_container_set_border_width ((GtkContainer*) _vbox1, (guint) 3);
+ g_object_set ((GtkWidget*) _scrolledwindow0, "can-focus", TRUE, NULL);
+ g_object_set (_scrolledwindow0, "hscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL);
+ g_object_set (_scrolledwindow0, "vscrollbar-policy", GTK_POLICY_AUTOMATIC, NULL);
+ gtk_container_add ((GtkContainer*) _scrolledwindow0, (GtkWidget*) self->priv->tv);
+ gtk_container_add ((GtkContainer*) _vbox1, (GtkWidget*) _scrolledwindow0);
+ gtk_container_add ((GtkContainer*) _hbox0, (GtkWidget*) _vbox1);
+ gtk_container_set_border_width ((GtkContainer*) _vbox2, (guint) 3);
+ gtk_button_set_use_stock (_button0, TRUE);
+ g_signal_connect_object (_button0, "clicked", (GCallback) _main_window_OnConnect_gtk_button_clicked, self, 0);
+ gtk_box_pack_start ((GtkBox*) _vbox2, (GtkWidget*) _button0, FALSE, TRUE, (guint) 0);
+ gtk_button_set_use_stock (_button1, TRUE);
+ g_signal_connect_object (_button1, "clicked", (GCallback) _main_window_OnStop_gtk_button_clicked, self, 0);
+ gtk_box_pack_start ((GtkBox*) _vbox2, (GtkWidget*) _button1, FALSE, TRUE, (guint) 0);
+ gtk_button_set_use_stock (_button2, TRUE);
+ g_signal_connect_object (_button2, "clicked", (GCallback) _main_window_OnGetInformation_gtk_button_clicked, self, 0);
+ gtk_box_pack_start ((GtkBox*) _vbox2, (GtkWidget*) _button2, FALSE, TRUE, (guint) 0);
+ gtk_container_add ((GtkContainer*) _vbox2, (GtkWidget*) _label0);
+ gtk_button_set_use_stock (_button3, TRUE);
+ g_signal_connect_object (_button3, "clicked", (GCallback) _main_window_OnFileOpenEvent_gtk_button_clicked, self, 0);
+ gtk_box_pack_start ((GtkBox*) _vbox2, (GtkWidget*) _button3, FALSE, TRUE, (guint) 0);
+ gtk_button_set_use_stock (_button4, TRUE);
+ g_signal_connect_object (_button4, "clicked", (GCallback) _main_window_list_del_gtk_button_clicked, self, 0);
+ gtk_box_pack_start ((GtkBox*) _vbox2, (GtkWidget*) _button4, FALSE, TRUE, (guint) 0);
+ gtk_container_add ((GtkContainer*) _vbox2, (GtkWidget*) _label1);
+ gtk_button_set_use_stock (_button5, TRUE);
+ g_signal_connect_object (_button5, "clicked", (GCallback) _main_window_OnFileFlashEvent_gtk_button_clicked, self, 0);
+ gtk_box_pack_start ((GtkBox*) _vbox2, (GtkWidget*) _button5, FALSE, TRUE, (guint) 0);
+ gtk_box_pack_start ((GtkBox*) _hbox0, (GtkWidget*) _vbox2, FALSE, TRUE, (guint) 0);
+ gtk_container_add ((GtkContainer*) _vbox0, (GtkWidget*) _hbox0);
+ gtk_box_pack_start ((GtkBox*) _vbox0, (GtkWidget*) self->priv->pb, FALSE, TRUE, (guint) 0);
+ gtk_container_add ((GtkContainer*) self, (GtkWidget*) _vbox0);
+ g_signal_connect_object ((GtkWidget*) self->priv->aboutdialog1, "delete-event", (GCallback) _gtk_widget_hide_on_delete_gtk_widget_delete_event, (GtkWidget*) self->priv->aboutdialog1, 0);
+ gtk_container_set_border_width ((GtkContainer*) self->priv->aboutdialog1, (guint) 5);
+ gtk_window_set_title ((GtkWindow*) self->priv->aboutdialog1, "About 0xFFFF gui");
+ gtk_window_set_resizable ((GtkWindow*) self->priv->aboutdialog1, FALSE);
+ gtk_window_set_modal ((GtkWindow*) self->priv->aboutdialog1, TRUE);
+ g_object_set ((GtkWindow*) self->priv->aboutdialog1, "window-position", GTK_WIN_POS_CENTER_ON_PARENT, NULL);
+ gtk_dialog_set_has_separator ((GtkDialog*) self->priv->aboutdialog1, FALSE);
+ gtk_about_dialog_set_program_name (self->priv->aboutdialog1, "0xFFFF");
+ gtk_about_dialog_set_version (self->priv->aboutdialog1, "0.5");
+ gtk_about_dialog_set_copyright (self->priv->aboutdialog1, "Copyright (c) 2007-2009 pancake");
+ gtk_about_dialog_set_comments (self->priv->aboutdialog1, "The Free Nokia Internet Tablet flasher");
+ gtk_about_dialog_set_website (self->priv->aboutdialog1, "http://www.nopcode.org/0xFFFF/");
+ _tmp64_ = g_strdup ("pancake (pancake@youterm.com)");
+ _tmp65_ = g_new0 (gchar*, 2 + 1);
+ _tmp65_[0] = _tmp64_;
+ _tmp65_[1] = NULL;
+ _tmp66_ = _tmp65_;
+ _tmp66__length1 = 2;
+ gtk_about_dialog_set_authors (self->priv->aboutdialog1, _tmp66_);
+ _tmp66_ = (_vala_array_free (_tmp66_, _tmp66__length1, (GDestroyNotify) g_free), NULL);
+ _g_object_unref0 (_button5);
+ _g_object_unref0 (_label1);
+ _g_object_unref0 (_button4);
+ _g_object_unref0 (_button3);
+ _g_object_unref0 (_label0);
+ _g_object_unref0 (_button2);
+ _g_object_unref0 (_button1);
+ _g_object_unref0 (_button0);
+ _g_object_unref0 (_vbox2);
+ _g_object_unref0 (_scrolledwindow0);
+ _g_object_unref0 (_vbox1);
+ _g_object_unref0 (_hbox0);
+ _g_object_unref0 (_imagemenuitem7);
+ _g_object_unref0 (_menu2);
+ _g_object_unref0 (_menuitem2);
+ _g_object_unref0 (_imagemenuitem6);
+ _g_object_unref0 (_imagemenuitem5);
+ _g_object_unref0 (_imagemenuitem4);
+ _g_object_unref0 (_imagemenuitem3);
+ _g_object_unref0 (_menu1);
+ _g_object_unref0 (_menuitem1);
+ _g_object_unref0 (_imagemenuitem2);
+ _g_object_unref0 (_separatormenuitem0);
+ _g_object_unref0 (_imagemenuitem1);
+ _g_object_unref0 (_imagemenuitem0);
+ _g_object_unref0 (_menu0);
+ _g_object_unref0 (_menuitem0);
+ _g_object_unref0 (_menubar0);
+ _g_object_unref0 (_vbox0);
+ return obj;
+}
+
+
+static void main_window_class_init (MainWindowClass * klass) {
+ main_window_parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (MainWindowPrivate));
+ G_OBJECT_CLASS (klass)->constructor = main_window_constructor;
+ G_OBJECT_CLASS (klass)->finalize = main_window_finalize;
+}
+
+
+static void main_window_instance_init (MainWindow * self) {
+ self->priv = MAIN_WINDOW_GET_PRIVATE (self);
+}
+
+
+static void main_window_finalize (GObject* obj) {
+ MainWindow * self;
+ self = MAIN_WINDOW (obj);
+ _g_object_unref0 (self->priv->tv);
+ _g_object_unref0 (self->priv->pb);
+ _g_object_unref0 (self->priv->aboutdialog1);
+ G_OBJECT_CLASS (main_window_parent_class)->finalize (obj);
+}
+
+
+GType main_window_get_type (void) {
+ static volatile gsize main_window_type_id__volatile = 0;
+ if (g_once_init_enter (&main_window_type_id__volatile)) {
+ static const GTypeInfo g_define_type_info = { sizeof (MainWindowClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) main_window_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (MainWindow), 0, (GInstanceInitFunc) main_window_instance_init, NULL };
+ GType main_window_type_id;
+ main_window_type_id = g_type_register_static (GTK_TYPE_WINDOW, "MainWindow", &g_define_type_info, 0);
+ g_once_init_leave (&main_window_type_id__volatile, main_window_type_id);
+ }
+ return main_window_type_id__volatile;
+}
+
+
+static void _vala_array_destroy (gpointer array, gint array_length, GDestroyNotify destroy_func) {
+ if ((array != NULL) && (destroy_func != NULL)) {
+ int i;
+ for (i = 0; i < array_length; i = i + 1) {
+ if (((gpointer*) array)[i] != NULL) {
+ destroy_func (((gpointer*) array)[i]);
+ }
+ }
+ }
+}
+
+
+static void _vala_array_free (gpointer array, gint array_length, GDestroyNotify destroy_func) {
+ _vala_array_destroy (array, array_length, destroy_func);
+ g_free (array);
+}
+
+
+static gint _vala_array_length (gpointer array) {
+ int length;
+ length = 0;
+ if (array) {
+ while (((gpointer*) array)[length]) {
+ length++;
+ }
+ }
+ return length;
+}
+
+
+
diff --git a/src/gui/gui.gtkaml b/src/gui/gui.gtkaml.orig
index e5c9e97..7e73a1a 100644
--- a/src/gui/gui.gtkaml
+++ b/src/gui/gui.gtkaml.orig
@@ -78,7 +78,7 @@
<AboutDialog class:standalone="true" class:private="aboutdialog1" delete-event="{aboutdialog1.hide_on_delete}"
border-width="5" title="About 0xFFFF gui" resizable="false" modal="true"
window-position="{WindowPosition.CENTER_ON_PARENT}" has-separator="false"
- program-name="0xFFFF" version="0.3.9" copyright="Copyright (c) 2008 pancake"
+ program-name="0xFFFF" version="0.5" copyright="Copyright (c) 2007-2009 pancake"
comments="The Free Nokia Internet Tablet flasher"
website="http://www.nopcode.org/0xFFFF/"
authors='{new string[] {"pancake (pancake@youterm.com)", null}}'>
@@ -143,7 +143,7 @@ public bool loadFile( string filename )
{
int err = 0;
try {
- string contents; int length;
+ string contents; size_t length;
FileUtils.get_contents (filename, out contents, out length);
//textview1.buffer.set_text (contents, length);
} catch(Error e) {
diff --git a/src/gui/gui.gtkon b/src/gui/gui.gtkon
new file mode 100644
index 0000000..b684e13
--- /dev/null
+++ b/src/gui/gui.gtkon
@@ -0,0 +1,321 @@
+/*
+ | Frontend for the 0xFFFF flasher in gtkaml
+ | author: pancake <youterm.com>
+ */
+
+Window using="Gtk" gtkon:version=0.4
+ using:Extras="Extras"
+ using:SQueues="SQueues"
+ name="MainWindow"
+ title="0xFFFF GUI"
+{
+ /* delete-event="{OnWindow1DeleteEvent}" */
+ VBox {
+ MenuBar !expand {
+ MenuItem label="_File" with-mnemonic {
+ submenu {
+ Menu {
+ ImageMenuItem stock-id="gtk-new" activate=OnFileNewEvent;
+ ImageMenuItem stock-id="gtk-open" activate=OnFileOpenEvent;
+ SeparatorMenuItem;
+ ImageMenuItem stock-id="gtk-quit" activate=OnQuitEvent;
+ }
+ }
+ }
+ MenuItem label="_Target" with-mnemonic {
+ submenu {
+ Menu {
+ ImageMenuItem stock-id="gtk-connect" activate=OnConnect;
+ ImageMenuItem stock-id="gtk-stop" activate=OnStop;
+ ImageMenuItem stock-id="gtk-info" activate=OnGetInformation;
+ ImageMenuItem label="Reset" activate=OnReset;
+ }
+ }
+ }
+ MenuItem label="_Help" with-mnemonic {
+ submenu {
+ Menu {
+ ImageMenuItem stock-id="gtk-about" activate=OnMenuHelpAboutActivatedEvent;
+ }
+ }
+ }
+ }
+
+ HBox border-width="5" {
+ VBox border-width="3" spacing="3" {
+ ScrolledWindow can-focus="true" hscrollbar-policy="{PolicyType.AUTOMATIC}" vscrollbar-policy="{PolicyType.AUTOMATIC}" {
+ TreeView $.tv;
+ }
+
+ }
+ VBox !expand border-width="3" spacing="3" {
+ Button label="gtk-connect" use-stock !expand clicked=OnConnect;
+ Button label="gtk-stop" use-stock !expand clicked=OnStop;
+ Button label="gtk-info" use-stock !expand clicked=OnGetInformation;
+ Label label="";
+ /*
+ <!-- <Button label="Options" use-stock="false" expand="false"/>
+ <Button label="Fiasco!" use-stock="false" expand="false"/>
+ <Button label="Unpack!" use-stock="false" expand/> -->
+ */
+ Button label="gtk-add" use-stock="true" !expand clicked=OnFileOpenEvent;
+ Button label="gtk-remove" use-stock="true" expand="false" clicked=list_del;
+ Label label="";
+ Button label="gtk-media-record" use-stock="true" expand="false" clicked=OnFileFlashEvent;
+ }
+ }
+ ProgressBar $.pb !expand;
+
+ //<!-- <Statusbar expand="false"/> -->
+ }
+ AboutDialog gtkaml:standalone $.aboutdialog1 delete-event=aboutdialog1.hide_on_delete
+ border-width="5" title="About 0xFFFF gui" resizable="false" modal="true"
+ window-position="{WindowPosition.CENTER_ON_PARENT}" has-separator="false"
+ program-name="0xFFFF" version="0.5" copyright="Copyright (c) 2007-2009 pancake"
+ comments="The Free Nokia Internet Tablet flasher"
+ website="http://www.nopcode.org/0xFFFF/"
+ authors='{new string[] {"pancake (pancake@youterm.com)", null}}';
+
+ -{
+
+
+ private void doCloseApplication () {
+ Gtk.main_quit ();
+ }
+
+ private void OnReset() {
+ q->push("reset:device", 1);
+ }
+
+ private void OnFileFlashEvent() {
+ ListStore ls = (ListStore)tv.get_model();
+ weak string str;
+ TreeIter iter;
+
+ int n = ls.iter_n_children(null);
+ if (n >0) {
+ if (showYesNo("Do you want to flash these files?")) {
+ ls.get_iter_first(out iter);
+ do {
+ ls.get(iter, 2, out str, -1);
+ //stdout.printf("polla:%s\n", str);
+ q->push2("flash", str, 1);
+ } while(ls.iter_next(ref iter));
+ }
+ } else showMessage("No files selected", MessageType.ERROR);
+ }
+
+ private void OnFileOpenEvent () {
+ FileChooserDialog fc = new FileChooserDialog("Select file to open",
+ this, FileChooserAction.OPEN,
+ "gtk-cancel", ResponseType.CANCEL,
+ "gtk-open", ResponseType.ACCEPT);
+ int resp = fc.run ();
+ fc.hide ();
+ if (resp == ResponseType.ACCEPT) {
+ string file = fc.get_filename();
+ string *type = External.fpid_file(file);
+ string size = "%ld".printf(External.fpid_size(file));
+ if (type == null)
+ showMessage("Invalid file type", MessageType.ERROR);
+ else add_file(type, size, file);
+ }
+ fc.destroy ();
+ }
+
+ public bool loadFile( string filename ) {
+ int err = 0;
+ try {
+ string contents; size_t length;
+ FileUtils.get_contents (filename, out contents, out length);
+ //textview1.buffer.set_text (contents, length);
+ } catch(Error e) {
+ showError ("Unexpected error while loading the file, please contact the author with the following information:\n\n" + e.message);
+ err++;
+ }
+ return err == 0;
+ }
+
+ public bool showYesNo(string s) {
+ MessageDialog md = new MessageDialog (this,
+ DialogFlags.DESTROY_WITH_PARENT,
+ MessageType.QUESTION, ButtonsType.YES_NO, s);
+ int ret = md.run ();
+ md.destroy ();
+ return ret==ResponseType.YES;
+ }
+
+ public void showMessage(string s, MessageType mt) {
+ MessageDialog md = new MessageDialog (this,
+ DialogFlags.DESTROY_WITH_PARENT,
+ mt, ButtonsType.CLOSE, s);
+ md.run ();
+ md.destroy ();
+ }
+
+ private void OnMenuHelpAboutActivatedEvent () {
+ aboutdialog1.transient_for = this;
+ aboutdialog1.response.connect ((x)=> { aboutdialog1.hide (); });
+ aboutdialog1.run ();
+ }
+
+ public void showError (string s) {
+ MessageDialog md = new MessageDialog (this,
+ DialogFlags.DESTROY_WITH_PARENT,
+ MessageType.ERROR,
+ ButtonsType.CLOSE,
+ s);
+ md.run ();
+ md.destroy ();
+ }
+
+ private void OnFileNewEvent () {
+ list_clear();
+ // TODO: clear file list
+ }
+
+ private void OnQuitEvent () {
+ doCloseApplication();
+ // TODO: send message to gracefully kill 0xFFFF
+ // TODO: handle ^C when flashing
+ }
+
+ public void list_clear() {
+ ((ListStore)tv.model).clear();
+ }
+
+ public void list_del() {
+ TreeIter iter;
+ TreeModel model;
+
+ TreeSelection sel = tv.get_selection();
+
+ if (sel.count_selected_rows() == 1) {
+ sel.get_selected(out model, out iter);
+ ((ListStore)tv.model).remove(iter);
+ }
+ }
+
+ public void add_file(string type, string size, string file) {
+ ListStore listmodel = (ListStore)tv.get_model();
+ Gtk.TreeIter iter;
+ listmodel.append (out iter);
+ listmodel.set (iter, 0, type, 1, size, 2, file, -1);
+ }
+
+ public static void setup_treeview (Gtk.TreeView view) {
+ /* use liststore to hold accountname, accounttype, balance and color attribute */
+ /* for more info how gtkTreeview works take a look in the GTK API */
+
+ var listmodel = new Gtk.ListStore(4, typeof(string), typeof(string), typeof(string), typeof(string));
+ view.set_model(listmodel);
+
+ view.insert_column_with_attributes (-1, "Type", new Gtk.CellRendererText(), "text", 0, null);
+ view.insert_column_with_attributes (-1, "Size", new Gtk.CellRendererText(), "text", 1, null);
+
+ var cell = new Gtk.CellRendererText ();
+ cell.set ("foreground_set", true, null);
+ view.insert_column_with_attributes (-1, "Name", cell, "text", 2, "foreground", 3, null);
+
+ // Gtk.TreeIter iter;
+ // listmodel.append (out iter);
+ // listmodel.set (iter, 0, "initfs", 1, "3M", 2, "initfs.jffs", -1);
+ //listmodel.set (iter, 0, "initfs", 1, "3M", 2, "initfs.jffs", 3, "green", -1);
+
+ // listmodel.append (out iter);
+ // listmodel.set (iter, 0, "rootfs", 1, "52M", 2, "rootfs.jffs", -1);
+ }
+
+ public static bool readFunc() {
+ weak string msg = p->get(0);
+
+ if (msg != null && msg[0]!='\0') {
+ stdout.printf("[<] msg received: %s\n", msg);
+ string[] foo = msg.split(":",2);
+ if (foo[1] != null) {
+ switch(foo[0]) {
+ case "bar":
+ viewer.pb.fraction = foo[1].to_int() / 100;
+ viewer.pb.text = foo[1]+"%";
+ break;
+ case "error":
+ viewer.showMessage(foo[1], MessageType.ERROR);
+ break;
+ case "info":
+ viewer.showMessage(foo[1], MessageType.INFO);
+ break;
+ default:
+ stderr.printf("[E] Unknown message type\n");
+ break;
+ }
+ //viewer.showMessage(msg, MessageType.INFO);
+ }
+ p->pop();
+ }
+ return true;
+ }
+
+ static SQueue *q = null;
+ static SQueue *p = null;
+
+ private void OnGetInformation() {
+ msg("info:device");
+ }
+
+ private void OnConnect() {
+ //msg("connect:device");
+ OnStop();
+ External.system("sudo 0xFFFF -Q &");
+ p->close();
+ q->close();
+ p = q = null;
+ }
+
+ private void OnStop() {
+ External.system("sudo pkill 0xFFFF");
+ }
+
+ private bool chk_queues() {
+ if (p == null)
+ p = SQueue.open("/tmp/0xFFFF.1", SQueueMode.OPEN);
+ if (q == null)
+ q = SQueue.open("/tmp/0xFFFF.2", SQueueMode.OPEN);
+ if (p == null || q == null) {
+ showMessage("Cannot connect to queues", MessageType.ERROR);
+ return false;
+ }
+ return true;
+ }
+
+ public void msg(string str) {
+ if (!chk_queues())
+ return;
+ if (q->push(str, 0)<1) {
+ stderr.printf("Oops on push\n");
+ q->free();
+ q = null;
+ p->free();
+ p = null;
+ }
+ }
+
+ static MainWindow viewer;
+
+ static int main (string[] args) {
+ Gtk.init (ref args);
+ viewer = new MainWindow();
+ if (args.length > 1)
+ viewer.loadFile (args[1]);
+ viewer.resize(600,400);
+ viewer.set_position(WindowPosition.CENTER);
+ viewer.delete_event.connect ((x,y) => { Gtk.main_quit(); return false; });
+ setup_treeview(viewer.tv);
+ viewer.show_all ();
+ // viewer.showMessage("This software is beta and does not guaranties correct functionality", MessageType.WARNING);
+ Timeout.add(200, (SourceFunc)(readFunc));
+ Gtk.main ();
+ return 0;
+ }
+
+ }-
+}
diff --git a/src/hash.c b/src/hash.c
index d4ad607..cc17492 100644
--- a/src/hash.c
+++ b/src/hash.c
@@ -1,6 +1,6 @@
/*
* 0xFFFF - Open Free Fiasco Firmware Flasher
- * Copyright (C) 2007 pancake <pancake@youterm.com>
+ * Copyright (C) 2007-2009 pancake <pancake@youterm.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -17,6 +17,7 @@
*/
#include <stdio.h>
+#include <string.h>
#include "hash.h"
usho do_hash(usho *b, int len)
@@ -27,11 +28,13 @@ usho do_hash(usho *b, int len)
return result;
}
-usho do_hash_file(const char *filename)
+usho do_hash_file(const char *filename, const char *type)
{
unsigned char buf[BSIZE];
FILE *fd = fopen(filename, "r");
usho hash = 0;
+ int align = 0;
+ int size;
int ret;
if (fd == NULL) {
@@ -39,7 +42,8 @@ usho do_hash_file(const char *filename)
return -1;
}
- do { ret = fread(&buf, 1, BSIZE, fd);
+ do {
+ ret = fread(&buf, 1, BSIZE, fd);
if (ret == -1) {
fclose(fd);
return 0;
@@ -47,8 +51,26 @@ usho do_hash_file(const char *filename)
hash ^= do_hash((usho *)&buf, ret);
} while(ret);
+ size = ftell(fd);
fclose(fd);
+ /* mmc and kernel image must be aligned */
+ if (type) {
+ if (strcmp(type, "mmc") == 0)
+ align = ((size >> 8) + 1) << 8;
+ else if (strcmp(type, "kernel") == 0)
+ align = ((size >> 7) + 1) << 7;
+ }
+
+ if (align) {
+ printf("align from %d to %d\n", size, align);
+ buf[0] = 0xff;
+ while (size < align) {
+ hash ^= do_hash((usho *)&buf, 1);
+ ++size;
+ }
+ }
+
return hash;
}
diff --git a/src/hash.h b/src/hash.h
index 363d5d4..03825ae 100644
--- a/src/hash.h
+++ b/src/hash.h
@@ -5,6 +5,6 @@
#define BSIZE 0x20000
usho do_hash(usho *b, int len);
-usho do_hash_file(const char *filename);
+usho do_hash_file(const char *filename, const char *type);
#endif
diff --git a/src/main.c b/src/main.c
index 1c86a1c..759c732 100644
--- a/src/main.c
+++ b/src/main.c
@@ -58,7 +58,6 @@ char *root_devices[] = {
NULL
};
-
void show_title()
{
printf("0xFFFF v%s // The Free Fiasco Firmware Flasher\n", VERSION);
@@ -68,39 +67,48 @@ void show_usage()
{
int i;
show_title();
+
#if HAVE_USB
- printf("Over USB:\n");
- printf(" -b [arg] boots the kernel with arguments\n");
- printf(" -c console prompt mode\n");
- printf(" -d [vid:pid] injects a usb device into the supported list\n");
- printf(" -D [0|1|2] sets the root device to flash (0), mmc (1) or usb (2)\n");
- printf(" -f <flags> set the given RD flags (see '-f help')\n");
- printf(" -i show device information (let standby mode)\n");
- printf(" -l list supported usb device ids\n");
- printf(" -p [[p%%]file] piece-of-firmware %% file-where-this-piece-is\n");
- printf(" -r [0|1] disable/enable R&D mode\n");
- printf(" -R reboot the omap board\n");
- printf(" -U [0|1] disable/enable the usb host mode\n");
+ printf ("Over USB:\n"
+ " -b [arg] boots the kernel with arguments\n"
+ " -c console prompt mode\n"
+ " -d [vid:pid] injects a usb device into the supported list\n"
+ " -D [0|1|2] sets the root device to flash (0), mmc (1) or usb (2)\n"
+ " -f <flags> set the given RD flags (see '-f help')\n"
+ " -i show device information (let standby mode)\n"
+ " -l list supported usb device ids\n"
+ " -p format piece-of-firmware\n"
+ " piece format: [[[[dev:[hw:]]ver:]type:]file[%%layout]\n"
+ " hw is device HW revision\n"
+ " dev is device name string\n"
+ " ver is image version string\n"
+ " type is image type\n"
+ " file is image file name\n"
+ " layout is file name for layout file\n"
+ " -r [0|1] disable/enable R&D mode\n"
+ " -R reboot the omap board\n"
+ " -U [0|1] disable/enable the usb host mode\n");
#endif
#if HAVE_SQUEUE
printf(" -Q enter shared queues server mode (for gui or remote)\n");
#endif
- 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");
- printf(" -H [file] calculate hash for file\n");
- printf(" -I [piece] identify a firmware piece\n");
- printf(" -P [new-fiasco] creates a new fiasco package, pieces as arguments\n");
- printf(" -u [fiasco] unpack target fiasco image\n");
- printf(" -v be verbose and noisy\n");
- printf(" -V show 0xFFFF version information\n");
- printf(" -x extract configuration entries from /dev/mtd1\n");
- printf("Pieces are: ");
+ printf ("Local stuff:\n"
+ " -s [serial] serial port console (minicom like terminal)\n"
+ " -h show this help message\n"
+ " -S [subversion] unpacks/flash pieces matching this sub-version information\n"
+ " -n do not flash or write to disk (simulation)\n"
+ " -C [/dev/mtd] check bad blocks on mtd\n"
+ " -e [path] dump/extract pieces to path\n"
+ " -F [fiasco] flash a fiasco firmware image\n"
+ " -H [file] calculate hash for file\n"
+ " -I [piece] identify a firmware piece\n"
+ " -P [new-fiasco] creates a new fiasco package, pieces as arguments\n"
+ " optional argument 'version:<version>'\n"
+ " -u [fiasco] unpack target fiasco image\n"
+ " -v be verbose and noisy\n"
+ " -V show 0xFFFF version information\n"
+ " -x extract configuration entries from /dev/mtd1\n"
+ "Pieces are: ");
for(i=0;pieces[i];i++) printf("%s ", pieces[i]); printf("\n");
// serial port support is not yet done (cold flash is for flashing the 8kB nand)
// TODO: commandline shell prompt for nolo comm
@@ -117,7 +125,7 @@ int unpack_callback(struct header_t *header)
if (strchr(header->name, ',') != NULL) {
if (!strstr(header->name, subverstr)) {
printf("Skipping '%s' does not matches -S subversion\n",
- header->name);
+ header->name);
return 1;
}
}
@@ -125,12 +133,22 @@ int unpack_callback(struct header_t *header)
if (nomode)
return 1;
+ printf("Unpacking file: %s\n", header->name);
+ printf(" type: %s\n", header->type);
+ if (header->device[0]) printf(" device: %s\n", header->device);
+ if (header->hwrevs[0]) printf(" hw revisions: %s\n", header->hwrevs);
+ if (header->version[0]) printf(" version: %s\n", header->version);
+ if (header->layout) printf(" layout file: %s\n", header->layout);
+ printf(" size: %d\n", header->size);
+ printf(" hash: %04x\n", header->hash);
+
fd = fopen(header->name, "wb");
if (fd == NULL) {
printf("Cannot open file.\n");
return 1;
}
- fwrite(header->data, header->size, 1, fd);
+ if (fwrite(header->data, header->size, 1, fd) != 1)
+ printf("Writing failed\n");
fclose(fd);
return 0;
@@ -147,9 +165,11 @@ int flash_callback(struct header_t *header)
return 1;
}
- type = (char *)fpid_file(header->name);
+ type = header->type;
+ if (!type[0])
+ type = (char *)fpid_file(header->name);
printf("\nFlashing %s (%s)\n", header->name, type);
- flash_image(header->name, type, NULL);
+ flash_image(header->name, type, header->device, header->hwrevs, header->version);
return 0;
}
@@ -158,7 +178,7 @@ void unpack_fiasco_image(char *file)
{
printf("Dumping firmware pieces to disk.\n");
fiasco_callback = &unpack_callback;
- openfiasco(file, NULL ,1);
+ openfiasco(file, NULL, NULL, NULL, NULL, 0);
}
int fiasco_flash(const char *file)
@@ -166,10 +186,10 @@ int fiasco_flash(const char *file)
char *p;
char version[64];
- if (connect_via_usb()) {
- fprintf(stderr, "Cannot connect to device. It is possibly not in boot stage.\n");
- return 0;
- }
+ if (connect_via_usb()) {
+ fprintf(stderr, "Cannot connect to device. It is possibly not in boot stage.\n");
+ return 0;
+ }
// if (info)
cmd_info("");
@@ -190,11 +210,11 @@ int fiasco_flash(const char *file)
printf("\n");
fiasco_callback = &flash_callback;
- openfiasco(file, "xloader", 0);
- openfiasco(file, "secondary", 0);
- openfiasco(file, "kernel", 0);
- openfiasco(file, "initfs", 0);
- openfiasco(file, "rootfs", 0);
+ openfiasco(file, "xloader", NULL, NULL, NULL, 0);
+ openfiasco(file, "secondary", NULL, NULL, NULL, 0);
+ openfiasco(file, "kernel", NULL, NULL, NULL, 0);
+ openfiasco(file, "initfs", NULL, NULL, NULL, 0);
+ openfiasco(file, "rootfs", NULL, NULL, NULL, 0);
return 0;
}
@@ -203,67 +223,75 @@ int fiasco_flash(const char *file)
int connect_via_usb()
{
static char pbc[]={'/','-','\\', '|'};
- struct usb_device_descriptor udd;
- struct devices it_device;
+ struct usb_device_descriptor udd;
+ struct devices it_device;
int c = 0;
// usb_set_debug(5);
usb_init();
- /* Tries to get access to the Internet Tablet and retries
- * if any of the neccessary steps fail.
- *
- * Note: While a proper device may be found on the bus it may
- * not be in the right state to be accessed (e.g. the Nokia is
- * not in the boot stage any more).
- */
+ /* Tries to get access to the Internet Tablet and retries
+ * if any of the neccessary steps fail.
+ *
+ * Note: While a proper device may be found on the bus it may
+ * not be in the right state to be accessed (e.g. the Nokia is
+ * not in the boot stage any more).
+ */
while(!dev) {
usleep(0xc350); // 0.5s
-
- if(!usb_device_found(&udd, &it_device)) {
+
+ if(!usb_device_found(&udd, &it_device)) {
printf("\rWaiting for device... %c", pbc[++c%4]);
fflush(stdout);
continue;
}
- /* open device */
- if(!(dev = usb_open(device))) {
- perror("usb_open");
- return 1;
- }
-
- if ( usb_claim_interface(dev, 2) < 0) {
- //device->config->interface->altsetting->bInterfaceNumber) < 0) { // 2 or 0
- D perror("usb_claim_interface");
-
- // Something is broken if closing fails.
- if(usb_close(dev)) {
- perror("usb_close");
- return 1;
- }
+ /* open device */
+ if(!(dev = usb_open(device))) {
+ perror("usb_open");
+ return 1;
+ }
- dev = NULL;
+#if 1
+{
+char name[32];
+name[0] = '\0';
+usb_get_driver_np(dev, 2, name, sizeof(name));
+printf ("Driver: %s\n", name);
+usb_detach_kernel_driver_np(dev, 2);
+}
+#endif
+ if (usb_claim_interface(dev, 2) < 0) {
+ //device->config->interface->altsetting->bInterfaceNumber) < 0) { // 2 or 0
+ perror("usb_claim_interface");
- // Try again later.
- continue;
- }
+ // Something is broken if closing fails.
+ if(usb_close(dev)) {
+ perror("usb_close");
+ return 1;
+ }
+ dev = NULL;
+ // Try again later.?
+ exit(1);
+ }
- if (usb_set_altinterface(dev, 1) <0) { //device->config->interface->altsetting->bAlternateSetting) < 0) {
- D perror("usb_set_altinterface");
+ if (usb_set_altinterface(dev, 1) <0) { //device->config->interface->altsetting->bAlternateSetting) < 0) {
+ perror("usb_set_altinterface");
- // Something is broken if closing fails.
- if(usb_close(dev)) {
- perror("usb_close");
- return 1;
- }
+ // Something is broken if closing fails.
+ if(usb_close(dev)) {
+ perror("usb_close");
+ return 1;
+ }
- dev = NULL;
- // Try again later.
- continue;
- }
- }
+ dev = NULL;
+ // Try again later.
+ continue;
+ }
+ break;
+ }
- printf("found %s (%04x:%04x)\n", it_device.name,
+ printf("found %s (%04x:%04x)\n", it_device.name,
it_device.vendor_id, it_device.product_id);
/* go go go! */
@@ -278,11 +306,12 @@ int connect_via_usb()
int main(int argc, char **argv)
{
int c;
+ const char *type;
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));
+ printf("xorpair: %04x\n", do_hash_file(optarg, NULL));
return 0;
case 'x':
return dump_config();
@@ -306,8 +335,8 @@ int main(int argc, char **argv)
break;
case 'd':
sscanf(optarg, "%04hx:%04hx",
- &supported_devices[SUPPORTED_DEVICES-2].vendor_id,
- &supported_devices[SUPPORTED_DEVICES-2].product_id);
+ &supported_devices[SUPPORTED_DEVICES-2].vendor_id,
+ &supported_devices[SUPPORTED_DEVICES-2].product_id);
supported_devices[SUPPORTED_DEVICES-2].name = strdup("user");
break;
case 'D':
@@ -315,14 +344,14 @@ int main(int argc, char **argv)
break;
case 'f':
if (!strcmp(optarg,"help")) {
- printf("* Flags are composed of:\n");
- printf(" 0x02 - disable OMAP watchdog (possibly)\n");
- printf(" 0x04 - disable RETU watchdog (possibly)\n");
- printf(" 0x08 - disable lifeguard reset\n");
- printf(" 0x10 - enable serial console\n");
- printf(" 0x20 - disable USB timeout\n");
- exit(1);
- }
+ printf("* Flags are composed of:\n");
+ printf(" 0x02 - disable OMAP watchdog (possibly)\n");
+ printf(" 0x04 - disable RETU watchdog (possibly)\n");
+ printf(" 0x08 - disable lifeguard reset\n");
+ printf(" 0x10 - enable serial console\n");
+ printf(" 0x20 - disable USB timeout\n");
+ exit(1);
+ }
rd_flags = (unsigned short) strtoul(optarg, NULL, 16);
break;
case 'r':
@@ -356,7 +385,10 @@ int main(int argc, char **argv)
case 'P':
return fiasco_pack(optind, argv);
case 'I':
- printf("%s: %s\n", fpid_file(optarg), optarg);
+ type = fpid_file(optarg);
+ printf("%s: %s\n", type, optarg);
+ if (type && strcmp(type, "fiasco") == 0)
+ openfiasco(optarg, NULL, NULL, NULL, NULL, 1);
identify = 1;
break;
case 'C':
@@ -383,7 +415,7 @@ int main(int argc, char **argv)
return 0;
// flags ok?
- if ( (fiasco_image == NULL)
+ if ( (fiasco_image == NULL)
&& (boot_cmdline == NULL)
&& (reverseto == NULL)
&& (pcs_n == 0)
@@ -396,15 +428,19 @@ int main(int argc, char **argv)
{
printf("# The Free Fiasco Firmware Flasher v"VERSION"\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");
+ "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;
}
if (unpack) {
- if (reverseto)
- chdir(reverseto);
+ if (reverseto) {
+ if (chdir(reverseto) < 0) {
+ printf("Error: Cannot change directory to %s\n", reverseto);
+ return 1;
+ }
+ }
unpack_fiasco_image(fiasco_image);
return 0;
}
@@ -415,14 +451,14 @@ int main(int argc, char **argv)
}
#if HAVE_USB
- if (connect_via_usb()) {
- fprintf(stderr, "Cannot connect to device. It is possibly not in boot stage.\n");
- return 0;
- }
+ if (connect_via_usb()) {
+ fprintf(stderr, "Cannot connect to device. It is possibly not in boot stage.\n");
+ return 0;
+ }
// if (info)
cmd_info("");
-
+
if (pcs_n) {
char version[64];
check_nolo_order();
@@ -440,15 +476,15 @@ int main(int argc, char **argv)
for(c=0;c<pcs_n;c++) {
printf("Flashing %s (%s)\n", pcs[c].type, pcs[c].name);
- flash_image(pcs[c].name, pcs[c].type, pcs[c].vers);
+ flash_image(pcs[c].name, pcs[c].type, pcs[c].device, pcs[c].hwrevs, pcs[c].version);
}
}
if (rd_mode != -1)
- set_rd_mode(rd_mode);
-
+ set_rd_mode(rd_mode);
+
if (rd_flags != -1)
- set_rd_flags(rd_flags);
+ set_rd_flags(rd_flags);
if (root_device != -1)
set_root_device(root_device);
diff --git a/src/main.h b/src/main.h
index b71a9a0..9526491 100644
--- a/src/main.h
+++ b/src/main.h
@@ -15,7 +15,7 @@ struct devices;
int queue_mode();
int reverse_extract_pieces(char *dir);
-void flash_image(const char *filename, const char *piece, const char *version);
+void flash_image(const char *filename, const char *piece, const char *device, const char *hwrevs, const char *version);
int fiasco_read_image(char *file);
void check_nolo_order();
extern struct usb_dev_handle *dev;
@@ -56,21 +56,29 @@ extern int verbose;
#define CMD_WRITE 64
#define CMD_QUERY 192
-
struct piece_t {
char *name;
char *type;
- char *vers;
+ char *device;
+ char *hwrevs;
+ char *version;
+};
+
+enum flash_mode {
+ FLASH_COLD,
+ FLASH_NORMAL,
+ FLASH_MKII,
+ FLASH_DISK,
};
struct devices {
char *name;
unsigned short vendor_id;
unsigned short product_id;
- unsigned short flags;
+ enum flash_mode mode;
};
-#define SUPPORTED_DEVICES 6
+#define SUPPORTED_DEVICES 10
extern struct devices supported_devices[SUPPORTED_DEVICES];
extern int pcs_n;
@@ -84,18 +92,26 @@ enum {
PIECE_INITFS,
PIECE_ROOTFS,
PIECE_OMAPNAND,
+ PIECE_MMC,
+ PIECE_CMT_2ND,
+ PIECE_CMT_ALGO,
+ PIECE_CMT_MCUSW,
PIECE_FIASCO,
PIECE_LAST
};
struct header_t {
int fd;
- char fwname[128];
- char name[128];
+ char swver[128];
+ char type[128];
+ char device[16];
+ char hwrevs[128];
char version[128];
unsigned short hash;
unsigned int size;
unsigned char *data;
+ char *name;
+ char *layout;
};
extern char *pieces[];
@@ -103,12 +119,11 @@ extern char *modes[];
extern char *root_devices[];
// fiasco
-int openfiasco(char *name, char *grep, int v);
+int openfiasco(const char *name, const char *type, const char *device, const char *hwrev, const char *version, int v);
int fiasco_new(const char *filename, const char *name);
void fiasco_data_read(struct header_t *header);
-int fiasco_add_eof(int fd);
extern int (*fiasco_callback)(struct header_t *header);
-int fiasco_add(int fd, const char *name, const char *file, const char *version);
+int fiasco_add(int fd, const char *name, const char *file, const char *layout, const char *device, const char *hwrevs, 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);
diff --git a/src/pieces.c b/src/pieces.c
index 16cacce..5f850d2 100644
--- a/src/pieces.c
+++ b/src/pieces.c
@@ -52,7 +52,9 @@ int add_piece(char *piece)
pcs[pcs_n].name = strdup(file);
pcs[pcs_n].type = strdup(piece);
- pcs[pcs_n].vers = NULL; // TODO version string not yet supported
+ pcs[pcs_n].device = NULL;
+ pcs[pcs_n].hwrevs = NULL;
+ pcs[pcs_n].version = NULL; // TODO version string not yet supported
} else {
/*/ autodetect piece type */
pcs[pcs_n].type = (char *)fpid_file(piece);
@@ -66,7 +68,9 @@ int add_piece(char *piece)
} else {
pcs[pcs_n].name = strdup(piece);
pcs[pcs_n].type = strdup(pcs[pcs_n].type);
- pcs[pcs_n].vers = NULL;
+ pcs[pcs_n].device = NULL;
+ pcs[pcs_n].hwrevs = NULL;
+ pcs[pcs_n].version = NULL;
}
}
diff --git a/src/qmode.c b/src/qmode.c
index cf52866..e23e457 100644
--- a/src/qmode.c
+++ b/src/qmode.c
@@ -54,7 +54,7 @@ void process_message(char *msg)
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, NULL, NULL);
} else
if (!strcmp(str, "reset")) {
if (reboot_board() == 0) {
diff --git a/src/query.c b/src/query.c
index e8a331c..77a8b33 100644
--- a/src/query.c
+++ b/src/query.c
@@ -1,6 +1,6 @@
/*
* 0xFFFF - Open Free Fiasco Firmware Flasher
- * Copyright (C) 2007,2008 pancake <@youterm.com>
+ * Copyright (C) 2007-2009 pancake <@youterm.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -46,8 +46,7 @@ int get_status()
*/
int set_usb_mode(unsigned int mode)
{
- if (mode > 1)
- {
+ if (mode > 1) {
printf("Invalid USB mode specified '%d'.\n", mode);
return -1;
}
@@ -79,7 +78,7 @@ int get_usb_mode()
}
sprintf(strbuf, "Device's USB mode is '%s'\n", (mode) ? "host" : "client");
- printf(strbuf);
+ printf("%s", strbuf);
return 0;
}
@@ -178,7 +177,6 @@ int get_root_device()
{
unsigned char opcode;
- strbuf[0] = '\0';
if (usb_control_msg(dev, CMD_QUERY, NOLO_GET_RDFLAGS, 0, 1, (char *)&opcode, 1, 2000) < 0) {
fprintf(stderr, "Cannot query root device\n");
return -1;
@@ -189,8 +187,7 @@ int get_root_device()
return -1;
}
- sprintf(strbuf, "Root device is: %s\n", root_devices[opcode]);
- printf(strbuf);
+ printf("Root device is: %s\n", root_devices[opcode]);
return 0;
}
@@ -292,13 +289,13 @@ int get_rd_flags()
{
unsigned short flags = 0;
- if (usb_control_msg(dev, CMD_QUERY, NOLO_GET_RDFLAGS, 0, 3, (void *) &flags, sizeof(flags), 2000) == -1) {
+ if (usb_control_msg (dev, CMD_QUERY, NOLO_GET_RDFLAGS, 0, 3, (void *) &flags,sizeof(flags), 2000) == -1) {
fprintf(stderr, "Cannot get rd flags\n");
sprintf(strbuf, "error: Cannot read rd flags\n");
return -1;
}
- sprintf(strbuf,
+ sprintf (strbuf,
"Current rd flag setting:\n"
"disable OMAP watchdog : %s\n"
"disable RETU watchdog : %s\n"
@@ -310,7 +307,7 @@ int get_rd_flags()
, (flags & 0x08) ? "set" : "not set"
, (flags & 0x10) ? "set" : "not set"
, (flags & 0x20) ? "set" : "not set");
- printf(strbuf);
+ puts (strbuf);
return 0;
}
@@ -338,7 +335,6 @@ int get_nolo_version()
return 0;
}
-
int get_sw_version()
{
int ret;
@@ -359,8 +355,8 @@ int get_sw_version()
if (bytes[0]) {
sprintf(strbuf, "Software Version: %s\n", bytes);
printf("Software Version: %s\n", bytes); //???+strlen(bytes)+1));
- } else
- printf("No software version detected\n");
+ } else printf("No software version detected\n");
+
return 1;
}
diff --git a/src/squeue/squeue.c b/src/squeue/squeue.c
index 89fc7f5..0ed8815 100644
--- a/src/squeue/squeue.c
+++ b/src/squeue/squeue.c
@@ -94,7 +94,7 @@ _retry:
}
pool = shmat(shmid, NULL, 0);
- if (((int)pool) == -1) {
+ if (pool == (void *)-1) {
perror("shmat");
return NULL;
}
diff --git a/src/squeue/squeue.vapi b/src/squeue/squeue.vapi
index 0f66713..09b10e5 100644
--- a/src/squeue/squeue.vapi
+++ b/src/squeue/squeue.vapi
@@ -22,7 +22,7 @@ namespace SQueues {
[CCode (cname = "squeue_push2")]
public int push2(string cmd, string msg, int l);
[CCode (cname = "squeue_get")]
- public weak string get(int l);
+ public unowned string get(int l);
[CCode (cname = "squeue_pop")]
public int pop();
[CCode (cname = "squeue_stats")]