diff options
author | pancake <pancake@dazo> | 2008-12-08 18:13:36 +0100 |
---|---|---|
committer | pancake <pancake@dazo> | 2008-12-08 18:13:36 +0100 |
commit | 5a96158322b4b7e8289dfd429af3e7b15a99d173 (patch) | |
tree | d095a25f2bf1485132895c1525786fa34f71f5e8 | |
parent | 3d427bfd7740731bfc203b047d557af564975cf6 (diff) | |
download | 0xFFFF-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.c | 7 | ||||
-rw-r--r-- | src/fiasco.c | 50 | ||||
-rw-r--r-- | src/flash.c | 10 | ||||
-rw-r--r-- | src/main.c | 46 | ||||
-rw-r--r-- | src/main.h | 2 | ||||
-rw-r--r-- | src/query.c | 21 | ||||
-rw-r--r-- | src/query.h | 2 |
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; @@ -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++) { @@ -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); |