int main(int argc, char *argv[]) { uint8_t *buf, tail[2]; off_t size; int in, out; uint16_t crc; if (argc != 3) { fprintf(stderr, "usage: %s infile outfile\n", argv[0]); exit(EXIT_FAILURE); } if ((in = open(argv[1], O_RDONLY)) == -1) err(EXIT_FAILURE, "%s", argv[1]); if ((size = lseek(in, 0, SEEK_END)) == -1) err(EXIT_FAILURE, "%s", argv[1]); if ((buf = mmap(NULL, size, PROT_READ, MAP_SHARED | MAP_FILE, in, 0)) == MAP_FAILED) err(EXIT_FAILURE, "%s", argv[1]); if ((out = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644)) == -1) err(EXIT_FAILURE, "%s", argv[2]); crc = 0xffff; crc = rkcrc16(crc, buf, size); tail[0] = crc >> 8; tail[1] = crc & 0xff; write(out, buf, size); write(out, tail, sizeof(tail)); close(out); close(in); return EXIT_SUCCESS; }
int main(int argc, char **argv) { struct libusb_device_descriptor desc; const struct t_pid *ppid = pidtab; ssize_t nr; int offset = 0, size = 0; uint16_t crc16; uint8_t flag = 0; char action; char *partname = NULL; info("rkflashtool v%d.%d\n", RKFLASHTOOL_VERSION_MAJOR, RKFLASHTOOL_VERSION_MINOR); NEXT; if (!argc) usage(); action = **argv; NEXT; switch(action) { case 'b': if (argc > 1) usage(); else if (argc == 1) flag = strtoul(argv[0], NULL, 0); break; case 'l': case 'L': if (argc) usage(); break; case 'e': case 'r': case 'w': if (argc < 1 || argc > 2) usage(); if (argc == 1) { partname = argv[0]; } else { offset = strtoul(argv[0], NULL, 0); size = strtoul(argv[1], NULL, 0); } break; case 'm': case 'M': case 'B': case 'i': if (argc != 2) usage(); offset = strtoul(argv[0], NULL, 0); size = strtoul(argv[1], NULL, 0); break; case 'n': case 'v': case 'p': case 'P': if (argc) usage(); offset = 0; size = 1024; break; default: usage(); } /* Initialize libusb */ if (libusb_init(&c)) fatal("cannot init libusb\n"); libusb_set_debug(c, 3); /* Detect connected RockChip device */ while ( !h && ppid->pid) { h = libusb_open_device_with_vid_pid(c, 0x2207, ppid->pid); if (h) { info("Detected %s...\n", ppid->name); break; } ppid++; } if (!h) fatal("cannot open device\n"); /* Connect to device */ if (libusb_kernel_driver_active(h, 0) == 1) { info("kernel driver active\n"); if (!libusb_detach_kernel_driver(h, 0)) info("driver detached\n"); } if (libusb_claim_interface(h, 0) < 0) fatal("cannot claim interface\n"); info("interface claimed\n"); if (libusb_get_device_descriptor(libusb_get_device(h), &desc) != 0) fatal("cannot get device descriptor\n"); if (desc.bcdUSB == 0x200) info("MASK ROM MODE\n"); switch(action) { case 'l': info("load DDR init\n"); crc16 = 0xffff; while ((nr = read(0, buf, 4096)) == 4096) { crc16 = rkcrc16(crc16, buf, nr); libusb_control_transfer(h, LIBUSB_REQUEST_TYPE_VENDOR, 12, 0, 1137, buf, nr, 0); } if (nr != -1) { crc16 = rkcrc16(crc16, buf, nr); buf[nr++] = crc16 >> 8; buf[nr++] = crc16 & 0xff; libusb_control_transfer(h, LIBUSB_REQUEST_TYPE_VENDOR, 12, 0, 1137, buf, nr, 0); } goto exit; case 'L': info("load USB loader\n"); crc16 = 0xffff; while ((nr = read(0, buf, 4096)) == 4096) { crc16 = rkcrc16(crc16, buf, nr); libusb_control_transfer(h, LIBUSB_REQUEST_TYPE_VENDOR, 12, 0, 1138, buf, nr, 0); } if (nr != -1) { crc16 = rkcrc16(crc16, buf, nr); buf[nr++] = crc16 >> 8; buf[nr++] = crc16 & 0xff; libusb_control_transfer(h, LIBUSB_REQUEST_TYPE_VENDOR, 12, 0, 1138, buf, nr, 0); }