summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpancake <pancake@dazo>2008-12-08 18:13:36 +0100
committerpancake <pancake@dazo>2008-12-08 18:13:36 +0100
commit5a96158322b4b7e8289dfd429af3e7b15a99d173 (patch)
treed095a25f2bf1485132895c1525786fa34f71f5e8
parent3d427bfd7740731bfc203b047d557af564975cf6 (diff)
download0xFFFF-5a96158322b4b7e8289dfd429af3e7b15a99d173.tar.bz2
* Implement and test direct file FIASCO flash - openfiasco receives options for grepping for pieces and be verbose - fixed flashing order using grep options xloader, secondary, kernel, initfs, rootfs - Tested and working - Added parser for the hw revision string
* Autodetect device hw revision and setup the subversion string on the fly.
-rw-r--r--src/console.c7
-rw-r--r--src/fiasco.c50
-rw-r--r--src/flash.c10
-rw-r--r--src/main.c46
-rw-r--r--src/main.h2
-rw-r--r--src/query.c21
-rw-r--r--src/query.h2
7 files changed, 101 insertions, 37 deletions
diff --git a/src/console.c b/src/console.c
index 3206903..7098f36 100644
--- a/src/console.c
+++ b/src/console.c
@@ -46,8 +46,13 @@ void cmd_help(char *line)
void cmd_info(char *line)
{
+ char *p, str[128];
get_sw_version();
- get_hw_revision(); // get hardware revision:
+ get_hw_revision(str, 128); // get hardware revision:
+ p = strstr(str, "hw_rev:");
+ if (p) // TODO: delimit string by comma
+ printf("SubVersionString autodetected: '%s'\n", p+7);
+ else printf("SubVersionString autodetected: (error)\n");
get_root_device(); // only for flashing
get_usb_mode();
get_rd_mode();
diff --git a/src/fiasco.c b/src/fiasco.c
index 192238f..a521270 100644
--- a/src/fiasco.c
+++ b/src/fiasco.c
@@ -29,7 +29,7 @@
int (*fiasco_callback)(struct header_t *header) = NULL;
-int openfiasco(char *name)
+int openfiasco(char *name, char *piece_grep, int v)
{
struct header_t header;
unsigned char buf[128];
@@ -38,6 +38,7 @@ int openfiasco(char *name)
unsigned int namelen;
off_t off, here;
int i,j;
+
header.fd = open(name, O_RDONLY);
if (header.fd == -1) {
@@ -60,8 +61,9 @@ int openfiasco(char *name)
memset(buf,'\0', 128);
read(header.fd, buf, namelen);
- printf("Fiasco version: %2d\n", buf[3]);
+ if (v) printf("Fiasco version: %2d\n", buf[3]);
strcpy(header.fwname, (char *)buf+6);
+ if (v)
for(i=6;i<namelen;i+=strlen((char *)(buf+i))+1)
printf("Name: %s\n", buf+i);
@@ -80,7 +82,7 @@ int openfiasco(char *name)
return close(header.fd);
}
}
- printf("Skipping %d padding bytes\n", i);
+ if (v) printf("Skipping %d padding bytes\n", i);
lseek(header.fd, -1, SEEK_CUR);
continue;
}
@@ -94,16 +96,18 @@ int openfiasco(char *name)
if (data[0] == 0xff) {
printf(" [eof]\n");
break;
- } else printf(" %s\n", data);
+ } else if (v) printf(" %s\n", data);
strcpy(header.name, (char *)data);
if (read(header.fd, buf, 9)<9)
break;
memcpy(&header.size, buf,4);
header.size = ntohl(header.size);
- printf(" offset: 0x%08x\n", (unsigned int)here);
- printf(" size: %d bytes\n", header.size);
- printf(" hash: %04x\n", header.hash);
+ if (v) {
+ printf(" offset: 0x%08x\n", (unsigned int)here);
+ printf(" size: %d bytes\n", header.size);
+ printf(" hash: %04x\n", header.hash);
+ }
//printf("BYTE: %02x %02x %02x %02x %02x\n",
// buf[4], buf[5], buf[6], buf[7], buf[8]);
/* XXX this is not ok */
@@ -115,14 +119,16 @@ int openfiasco(char *name)
if (read(header.fd, data, i)<i)
break;
if (data[0]) {
- printf(" version-length: %d\n", i);
- printf(" version: %s\n", data);
+ if (v) {
+ printf(" version-length: %d\n", i);
+ printf(" version: %s\n", data);
+ }
pdata = data;
while(pdata<data+i) {
strcat(header.name,pdata==data?"-":",");
strcat(header.name, (char*)pdata);
- printf(" sub-version: %s\n", pdata);
- pdata=pdata+strlen((char*)pdata)+1;
+ if (v) printf(" sub-version: %s\n", pdata);
+ pdata = pdata+strlen((char*)pdata)+1;
for(;*pdata=='\0'&&pdata<data+i;pdata=pdata+1);
}
}
@@ -130,21 +136,27 @@ int openfiasco(char *name)
if (read(header.fd, buf+8, 1)<1)
break;
}
- printf(" name: %s\n", header.name);
/* callback */
off = lseek(header.fd, 0, SEEK_CUR);
- printf(" body-at: 0x%08x\n", (unsigned int)off);
- if (fiasco_callback != NULL) {
- fiasco_callback(&header);
- free(header.data);
- continue;
- } else {
+ if (v) {
+ 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);
+ if (fiasco_callback != NULL) {
+ fiasco_callback(&header);
+ free(header.data);
+ continue;
+ } else {
+ // ??huh
+ }
}
// XXX dup
lseek(header.fd, off, SEEK_SET);
lseek(header.fd, header.size, SEEK_CUR);
}
- return 0;
+ return close(header.fd);
}
void fiasco_data_read(struct header_t *header)
diff --git a/src/flash.c b/src/flash.c
index 0915f4c..94c7f29 100644
--- a/src/flash.c
+++ b/src/flash.c
@@ -86,6 +86,16 @@ void flash_image(const char *filename, const char *piece, const char *version)
unsigned char nolofiller[128];
ushort hash = do_hash_file(filename);
+ if (piece == NULL) {
+ //exit(1);
+ piece = fpid_file(filename);
+ if (piece == NULL) {
+ printf("Unknown piece type\n");
+ return;
+ }
+ printf("Piece type: %s\n", piece);
+ }
+
if (version)
vlen = strlen(version)+1;
diff --git a/src/main.c b/src/main.c
index 21be4b4..a5e18fd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -159,17 +159,41 @@ void unpack_fiasco_image(char *file)
{
printf("Dumping firmware pieces to disk.\n");
fiasco_callback = &unpack_callback;
- openfiasco( file );
+ openfiasco(file, NULL ,1);
}
int fiasco_flash(char *file)
{
+ char *p,version[64];
+
+ if (connect_via_usb()) {
+ fprintf(stderr, "Cannot connect to device. It is possibly not in boot stage.\n");
+ return 0;
+ }
+
+ // if (info)
+ cmd_info("");
+
check_nolo_order();
get_sw_version();
+ get_hw_revision(version, 44);
+
+ if (subverstr == NULL) {
+ p = strstr(version, "hw_rev:");
+ if (p) {
+ subverstr = strdup(p+7);
+ // TODO: delimit string by comma
+ printf("SubVersionString autodetected: '%s'\n", subverstr);
+ }
+ }
get_nolo_version();
fiasco_callback = &flash_callback;
- openfiasco( file );
+ openfiasco(file, "xloader", 0);
+ openfiasco(file, "secondary", 0);
+ openfiasco(file, "kernel", 0);
+ openfiasco(file, "initfs", 0);
+ openfiasco(file, "rootfs", 0);
return 0;
}
@@ -277,7 +301,8 @@ int main(int argc, char **argv)
usb_mode = atoi(optarg);
break;
case 'F':
- return fiasco_flash(optarg);
+ fiasco_image = optarg;
+ break;
case 'd':
sscanf(optarg, "%04hx:%04hx",
&supported_devices[SUPPORTED_DEVICES-2].vendor_id,
@@ -350,6 +375,9 @@ int main(int argc, char **argv)
if (qmode)
return queue_mode();
+ if (!unpack && fiasco_image)
+ return fiasco_flash(fiasco_image);
+
if (identify)
return 0;
@@ -395,10 +423,18 @@ int main(int argc, char **argv)
cmd_info("");
if (pcs_n) {
- int c;
-
+ char version[64];
check_nolo_order();
get_sw_version();
+ get_hw_revision(version, 44);
+ if (subverstr == NULL) {
+ char *p = strstr(version, "hw_rev:");
+ if (p) {
+ subverstr = strdup(p+7);
+ // TODO: delimit string by comma
+ printf("SubVersionString autodetected: '%s'\n", subverstr);
+ }
+ }
get_nolo_version();
for(c=0;c<pcs_n;c++) {
diff --git a/src/main.h b/src/main.h
index 43937b5..9196019 100644
--- a/src/main.h
+++ b/src/main.h
@@ -102,7 +102,7 @@ extern char *modes[];
extern char *root_devices[];
// fiasco
-int openfiasco(char *name);
+int openfiasco(char *name, char *grep, 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);
diff --git a/src/query.c b/src/query.c
index 404a60b..e8a331c 100644
--- a/src/query.c
+++ b/src/query.c
@@ -134,27 +134,28 @@ int set_rd_mode(unsigned short mode)
/*
* query root device
*/
-int get_hw_revision()
+int get_hw_revision(char *str, int len)
{
unsigned char string[512];
- int i = 0;
+ char tmpstr[64];
+ int i = 0, j=0, mod=0;
+ if (str == NULL)
+ str = tmpstr;
memset(string,'\0',512);
if (usb_control_msg(dev, CMD_QUERY, NOLO_GET_HWVERSION, 0, 0, (char *)string, 512, 2000) == -1) {
fprintf(stderr, "Cannot query hw revision.\n");
return -1;
}
- printf("HW revision string: '");
- for(i=0;i<44;i++) { // XXX ??
- if (string[i]==0) {
- printf(" ");
- } else {
- if (string[i]>19)
- printf("%c", string[i]);
+ for(i=0;i<44&&i<len;i++) { // XXX ??
+ if (string[i]>19) {
+ if (i>0 && string[i-1]<19)
+ str[j++] = (++mod%2)?':':',';
+ str[j++] = string[i];
}
}
- printf("'\n");
+ printf("HW revision string: '%s'\n", str);
return 0;
}
diff --git a/src/query.h b/src/query.h
index 03ee963..4d18253 100644
--- a/src/query.h
+++ b/src/query.h
@@ -16,7 +16,7 @@ int set_rd_mode(unsigned short mode);
int get_rd_flags();
int set_rd_flags(unsigned short flags);
-int get_hw_revision();
+int get_hw_revision(char *str, int len);
int get_root_device();
int set_root_device(unsigned short);