📄 fastboot.c
字号:
/* * Copyright (C) 2008 The Android Open Source Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#include <string.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <limits.h>#include <ctype.h>#include <sys/time.h>#include <bootimg.h>#include <zipfile/zipfile.h>#include "fastboot.h"static usb_handle *usb = 0;static const char *serial = 0;static const char *product = 0;static const char *cmdline = 0;static int wipe_data = 0;void die(const char *fmt, ...){ va_list ap; va_start(ap, fmt); fprintf(stderr,"error: "); vfprintf(stderr, fmt, ap); fprintf(stderr,"\n"); va_end(ap); exit(1);} void get_my_path(char *path);char *find_item(const char *item, const char *product){ char *dir; char *fn; char path[PATH_MAX + 128]; if(!strcmp(item,"boot")) { fn = "boot.img"; } else if(!strcmp(item,"recovery")) { fn = "recovery.img"; } else if(!strcmp(item,"system")) { fn = "system.img"; } else if(!strcmp(item,"userdata")) { fn = "userdata.img"; } else if(!strcmp(item,"info")) { fn = "android-info.txt"; } else { fprintf(stderr,"unknown partition '%s'\n", item); return 0; } if(product) { get_my_path(path); sprintf(path + strlen(path), "../../../target/product/%s/%s", product, fn); return strdup(path); } dir = getenv("ANDROID_PRODUCT_OUT"); if((dir == 0) || (dir[0] == 0)) { die("neither -p product specified nor ANDROID_PRODUCT_OUT set"); return 0; } sprintf(path, "%s/%s", dir, fn); return strdup(path);}#ifdef _WIN32void *load_file(const char *fn, unsigned *_sz);#elsevoid *load_file(const char *fn, unsigned *_sz){ char *data; int sz; int fd; data = 0; fd = open(fn, O_RDONLY); if(fd < 0) return 0; sz = lseek(fd, 0, SEEK_END); if(sz < 0) goto oops; if(lseek(fd, 0, SEEK_SET) != 0) goto oops; data = (char*) malloc(sz); if(data == 0) goto oops; if(read(fd, data, sz) != sz) goto oops; close(fd); if(_sz) *_sz = sz; return data;oops: close(fd); if(data != 0) free(data); return 0;}#endifint match_fastboot(usb_ifc_info *info){ if((info->dev_vendor != 0x18d1) && (info->dev_vendor != 0x0bb4)) return -1; if(info->ifc_class != 0xff) return -1; if(info->ifc_subclass != 0x42) return -1; if(info->ifc_protocol != 0x03) return -1; // require matching serial number if a serial number is specified // at the command line with the -s option. if (serial && strcmp(serial, info->serial_number) != 0) return -1; return 0;}int list_devices_callback(usb_ifc_info *info){ if (match_fastboot(info) == 0) { char* serial = info->serial_number; if (!serial[0]) { serial = "????????????"; } // output compatible with "adb devices" printf("%s\tfastboot\n", serial); } return -1;}usb_handle *open_device(void){ static usb_handle *usb = 0; int announce = 1; if(usb) return usb; for(;;) { usb = usb_open(match_fastboot); if(usb) return usb; if(announce) { announce = 0; fprintf(stderr,"< waiting for device >\n"); } sleep(1); }}void list_devices(void) { // We don't actually open a USB device here, // just getting our callback called so we can // list all the connected devices. usb_open(list_devices_callback);}void usage(void){ fprintf(stderr,/* 1234567890123456789012345678901234567890123456789012345678901234567890123456 */ "usage: fastboot [ <option> ] <command>\n" "\n" "commands:\n" " update <filename> reflash device from update.zip\n" " flashall 'flash boot' + 'flash system'\n" " flash <partition> [ <filename> ] write a file to a flash partition\n" " erase <partition> erase a flash partition\n" " getvar <variable> display a bootloader variable\n" " boot <kernel> [ <ramdisk> ] download and boot kernel\n" " flash:raw boot <kernel> [ <ramdisk> ] create bootimage and flash it\n" " devices list all connected devices\n" " reboot reboot device normally\n" " reboot-bootloader reboot device into bootloader\n" "\n" "options:\n" " -w erase userdata and cache\n" " -s <serial number> specify device serial number\n" " -p <product> specify product name\n" " -c <cmdline> override kernel commandline\n" ); exit(1);}void *load_bootable_image(const char *kernel, const char *ramdisk, unsigned *sz, const char *cmdline){ void *kdata = 0, *rdata = 0; unsigned ksize = 0, rsize = 0; void *bdata; unsigned bsize; if(kernel == 0) { fprintf(stderr, "no image specified\n"); return 0; } kdata = load_file(kernel, &ksize); if(kdata == 0) { fprintf(stderr, "cannot load '%s'\n", kernel); return 0; } /* is this actually a boot image? */ if(!memcmp(kdata, BOOT_MAGIC, BOOT_MAGIC_SIZE)) { if(cmdline) bootimg_set_cmdline((boot_img_hdr*) kdata, cmdline); if(ramdisk) { fprintf(stderr, "cannot boot a boot.img *and* ramdisk\n"); return 0; } *sz = ksize; return kdata; } if(ramdisk) { rdata = load_file(ramdisk, &rsize); if(rdata == 0) { fprintf(stderr,"cannot load '%s'\n", ramdisk); return 0; } } fprintf(stderr,"creating boot image...\n"); bdata = mkbootimg(kdata, ksize, rdata, rsize, 0, 0, 2048, &bsize); if(bdata == 0) { fprintf(stderr,"failed to create boot.img\n"); return 0; } if(cmdline) bootimg_set_cmdline((boot_img_hdr*) bdata, cmdline); fprintf(stderr,"creating boot image - %d bytes\n", bsize); *sz = bsize; return bdata;}void *unzip_file(zipfile_t zip, const char *name, unsigned *sz){ void *data; zipentry_t entry; unsigned datasz; entry = lookup_zipentry(zip, name); if (entry == NULL) { fprintf(stderr, "archive does not contain '%s'\n", name); return 0; } *sz = get_zipentry_size(entry); datasz = *sz * 1.001; data = malloc(datasz); if(data == 0) { fprintf(stderr, "failed to allocate %d bytes\n", *sz); return 0; } if (decompress_zipentry(entry, data, datasz)) { fprintf(stderr, "failed to unzip '%s' from archive\n", name); free(data); return 0; } return data;}static char *strip(char *s){ int n; while(*s && isspace(*s)) s++; n = strlen(s); while(n-- > 0) { if(!isspace(s[n])) break; s[n] = 0; } return s;}#define MAX_OPTIONS 32static int setup_requirement_line(char *name){ char *val[MAX_OPTIONS]; const char **out; unsigned n, count; char *x; int invert = 0; if (!strncmp(name, "reject ", 7)) { name += 7; invert = 1; } else if (!strncmp(name, "require ", 8)) { name += 8; invert = 0; } x = strchr(name, '='); if (x == 0) return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -