Changeset 31648


Ignore:
Timestamp:
Mar 14, 2017, 8:01:39 AM (2 months ago)
Author:
brainslayer
Message:

supports asrock g10 fw image for way back flashing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/router/httpd/modules/upgrade.c

    r30528 r31648  
    287287                        }
    288288#endif
     289//0x1200000 0x70000 RN67
     290#ifdef HAVE_IPQ806X
     291
     292#define _WEB_HEADER_ "RN67"
     293#define FW_HEADER                       ((char *)"CSYS")
     294#define DWORD_SWAP(v)   ((((v&0xff)<<24)&0xff000000) | \
     295                                                ((((v>>8)&0xff)<<16)&0xff0000) | \
     296                                                ((((v>>16)&0xff)<<8)&0xff00) | \
     297                                                (((v>>24)&0xff)&0xff) )
     298
     299                        typedef struct img_header {
     300                                unsigned char signature[4];
     301                                unsigned int startAddr __attribute__((packed));
     302                                unsigned int burnAddr __attribute__((packed));
     303                                unsigned char modTag[4];
     304                                unsigned int len __attribute__((packed));
     305                        } __attribute__((packed)) img_header_t;
     306                        if (brand == ROUTER_ASROCK_G10) {
     307                                img_header_t *header = (img_header_t *)buf;
     308                                if (!memcmp(header->signature, FW_HEADER, 4) && !memcmp(header->modTag, _WEB_HEADER_, 4) && header->startAddr == DWORD_SWAP(0x1200000) && header->burnAddr == DWORD_SWAP(0x70000)) {
     309                                        fprintf(stderr, "found valid ASROCK-G10 Image\n");
     310                                        count -= sizeof(struct img_header);
     311                                        memcpy(buf, buf + sizeof(struct img_header), count);
     312                                        char *write_argv_buf[8];
     313                                        write_argv_buf[0] = "mtd";
     314                                        write_argv_buf[1] = "-e";
     315                                        write_argv_buf[2] = "linux";
     316                                        write_argv_buf[3] = "-f";
     317                                        write_argv_buf[4] = "write";
     318                                        write_argv_buf[5] = upload_fifo;
     319                                        write_argv_buf[6] = "linux";
     320                                        write_argv_buf[7] = NULL;
     321                                        if (!mktemp(upload_fifo) || mkfifo(upload_fifo, S_IRWXU) < 0 || (ret = _evalpid(write_argv_buf, NULL, 0, &pid))
     322                                            || !(fifo = fopen(upload_fifo, "w"))) {
     323                                                if (!ret)
     324                                                        ret = errno;
     325                                                goto err;
     326                                        }
     327                                        goto write_data;
     328                                }
     329                        }
     330
     331#endif
    289332#if defined(HAVE_DIR860) || defined(HAVE_DIR859)
    290333#define SEAMA_MAGIC             0x5EA3A417
     
    315358                                        goto err;
    316359                                }
    317                                 memcpy(buf, buf + skip, count - skip);
     360
    318361                                count -= skip;
     362                                memcpy(buf, buf + skip, count);
    319363                                char *write_argv_buf[8];
    320364                                write_argv_buf[0] = "mtd";
Note: See TracChangeset for help on using the changeset viewer.