diff --git a/fastboot/Android.mk b/fastboot/Android.mk index b69ce56ff..a142b3ebc 100644 --- a/fastboot/Android.mk +++ b/fastboot/Android.mk @@ -16,14 +16,35 @@ LOCAL_PATH:= $(call my-dir) include $(LOCAL_PATH)/../platform_tools_tool_version.mk +fastboot_cflags := -Wall -Wextra -Werror -Wunreachable-code +fastboot_cflags += -DFASTBOOT_VERSION="\"$(tool_version)\"" +fastboot_cflags_darwin := -Wno-unused-parameter +fastboot_ldlibs_darwin := -lpthread -framework CoreFoundation -framework IOKit -framework Carbon +fastboot_ldlibs_windows := -lws2_32 +# Don't add anything here, we don't want additional shared dependencies +# on the host fastboot tool, and shared libraries that link against libc++ +# will violate ODR. +fastboot_shared_libs := +fastboot_static_libs := \ + libziparchive \ + libsparse \ + libutils \ + liblog \ + libz \ + libdiagnose_usb \ + libbase \ + libcutils \ + libgtest_host \ + +fastboot_stl := libc++_static + +# +# Build host libfastboot. +# + include $(CLEAR_VARS) - -LOCAL_CFLAGS += -DFASTBOOT_VERSION="\"$(tool_version)\"" - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/../adb \ - -LOCAL_HEADER_LIBRARIES := bootimg_headers +LOCAL_MODULE := libfastboot +LOCAL_MODULE_HOST_OS := darwin linux windows LOCAL_SRC_FILES := \ bootimg_utils.cpp \ @@ -36,48 +57,50 @@ LOCAL_SRC_FILES := \ udp.cpp \ util.cpp \ -LOCAL_MODULE := fastboot -LOCAL_MODULE_TAGS := debug -LOCAL_MODULE_HOST_OS := darwin linux windows -LOCAL_CFLAGS += -Wall -Wextra -Werror -Wunreachable-code -LOCAL_REQUIRED_MODULES := mke2fs make_f2fs - -LOCAL_SRC_FILES_linux := usb_linux.cpp -LOCAL_STATIC_LIBRARIES_linux := libselinux -LOCAL_REQUIRED_MODULES_linux := e2fsdroid mke2fs.conf sload_f2fs - LOCAL_SRC_FILES_darwin := usb_osx.cpp -LOCAL_STATIC_LIBRARIES_darwin := libselinux -LOCAL_REQUIRED_MODULES_darwin := e2fsdroid mke2fs.conf sload_f2fs -LOCAL_LDLIBS_darwin := -lpthread -framework CoreFoundation -framework IOKit -framework Carbon -LOCAL_CFLAGS_darwin := -Wno-unused-parameter - +LOCAL_SRC_FILES_linux := usb_linux.cpp LOCAL_SRC_FILES_windows := usb_windows.cpp -LOCAL_SHARED_LIBRARIES_windows := AdbWinApi -LOCAL_REQUIRED_MODULES_windows := AdbWinUsbApi -LOCAL_LDLIBS_windows := -lws2_32 + LOCAL_C_INCLUDES_windows := development/host/windows/usb/api +LOCAL_CFLAGS := $(fastboot_cflags) +LOCAL_CFLAGS_darwin := $(fastboot_cflags_darwin) +LOCAL_CXX_STL := $(fastboot_stl) +LOCAL_HEADER_LIBRARIES := bootimg_headers +LOCAL_LDLIBS_darwin := $(fastboot_ldflags_darwin) +LOCAL_LDLIBS_windows := $(fastboot_ldlibs_windows) +LOCAL_SHARED_LIBRARIES := $(fastboot_shared_libs) +LOCAL_STATIC_LIBRARIES := $(fastboot_static_libs) +include $(BUILD_HOST_STATIC_LIBRARY) -LOCAL_STATIC_LIBRARIES := \ - libziparchive \ - libsparse \ - libutils \ - liblog \ - libz \ - libdiagnose_usb \ - libbase \ - libcutils \ - libgtest_host \ +# +# Build host fastboot / fastboot.exe +# -LOCAL_CXX_STL := libc++_static - -# Don't add anything here, we don't want additional shared dependencies -# on the host fastboot tool, and shared libraries that link against libc++ -# will violate ODR -LOCAL_SHARED_LIBRARIES := +include $(CLEAR_VARS) +LOCAL_MODULE := fastboot +LOCAL_MODULE_HOST_OS := darwin linux windows +LOCAL_CFLAGS := $(fastboot_cflags) +LOCAL_CFLAGS_darwin := $(fastboot_cflags_darwin) +LOCAL_CXX_STL := $(fastboot_stl) +LOCAL_LDLIBS_darwin := $(fastboot_ldflags_darwin) +LOCAL_LDLIBS_windows := $(fastboot_ldlibs_windows) +LOCAL_REQUIRED_MODULES := mke2fs make_f2fs +LOCAL_REQUIRED_MODULES_darwin := e2fsdroid mke2fs.conf sload_f2fs +LOCAL_REQUIRED_MODULES_linux := e2fsdroid mke2fs.conf sload_f2fs +LOCAL_REQUIRED_MODULES_windows := AdbWinUsbApi +LOCAL_SRC_FILES := main.cpp +LOCAL_SHARED_LIBRARIES := $(fastboot_shared_libs) +LOCAL_SHARED_LIBRARIES_windows := AdbWinApi +LOCAL_STATIC_LIBRARIES := libfastboot $(fastboot_static_libs) +LOCAL_STATIC_LIBRARIES_darwin := libselinux +LOCAL_STATIC_LIBRARIES_linux := libselinux include $(BUILD_HOST_EXECUTABLE) +# +# Package fastboot-related executables. +# + my_dist_files := $(HOST_OUT_EXECUTABLES)/fastboot my_dist_files += $(HOST_OUT_EXECUTABLES)/mke2fs$(HOST_EXECUTABLE_SUFFIX) my_dist_files += $(HOST_OUT_EXECUTABLES)/e2fsdroid$(HOST_EXECUTABLE_SUFFIX) @@ -90,38 +113,24 @@ $(call dist-for-goals,win_sdk,$(ALL_MODULES.host_cross_fastboot.BUILT)) endif my_dist_files := -ifeq ($(HOST_OS),linux) -include $(CLEAR_VARS) -LOCAL_SRC_FILES := usbtest.cpp usb_linux.cpp util.cpp -LOCAL_MODULE := usbtest -LOCAL_CFLAGS := -Werror -LOCAL_STATIC_LIBRARIES := libbase -include $(BUILD_HOST_EXECUTABLE) -endif +# +# Build host fastboot_test. +# -# fastboot_test -# ========================================================= include $(CLEAR_VARS) - LOCAL_MODULE := fastboot_test LOCAL_MODULE_HOST_OS := darwin linux windows LOCAL_SRC_FILES := \ - socket.cpp \ socket_mock.cpp \ socket_test.cpp \ - tcp.cpp \ tcp_test.cpp \ - udp.cpp \ udp_test.cpp \ -LOCAL_STATIC_LIBRARIES := libbase libcutils - -LOCAL_CFLAGS += -Wall -Wextra -Werror -Wunreachable-code - -LOCAL_LDLIBS_darwin := -lpthread -framework CoreFoundation -framework IOKit -framework Carbon -LOCAL_CFLAGS_darwin := -Wno-unused-parameter - -LOCAL_LDLIBS_windows := -lws2_32 - +LOCAL_CFLAGS := $(fastboot_cflags) +LOCAL_CFLAGS_darwin := $(fastboot_cflags_darwin) +LOCAL_CXX_STL := $(fastboot_stl) +LOCAL_LDLIBS_darwin := $(fastboot_ldflags_darwin) +LOCAL_LDLIBS_windows := $(fastboot_ldlibs_windows) +LOCAL_STATIC_LIBRARIES := libfastboot $(fastboot_static_libs) include $(BUILD_HOST_NATIVE_TEST) diff --git a/fastboot/engine.cpp b/fastboot/engine.cpp index 551ddbab9..f271d09f6 100644 --- a/fastboot/engine.cpp +++ b/fastboot/engine.cpp @@ -42,6 +42,8 @@ #include +#include "transport.h" + enum Op { OP_DOWNLOAD, OP_COMMAND, diff --git a/fastboot/fastboot.cpp b/fastboot/fastboot.cpp index cf130c9a4..42f4fbb4b 100644 --- a/fastboot/fastboot.cpp +++ b/fastboot/fastboot.cpp @@ -1410,8 +1410,7 @@ failed: fprintf(stderr, "FAILED (%s)\n", fb_get_error().c_str()); } -int main(int argc, char **argv) -{ +int FastBoot::Main(int argc, char* argv[]) { bool wants_wipe = false; bool wants_reboot = false; bool wants_reboot_bootloader = false; diff --git a/fastboot/fastboot.h b/fastboot/fastboot.h index 005ba5a98..3d5a26130 100644 --- a/fastboot/fastboot.h +++ b/fastboot/fastboot.h @@ -34,8 +34,7 @@ #include -#include "transport.h" - +class Transport; struct sparse_file; /* protocol.c - fastboot protocol */ @@ -97,4 +96,9 @@ void verbose(const char* fmt, ...) __attribute__((__format__(FASTBOOT_FORMAT_ARC /* Current product */ extern char cur_product[FB_RESPONSE_SZ + 1]; +class FastBoot { + public: + int Main(int argc, char* argv[]); +}; + #endif diff --git a/fastboot/main.cpp b/fastboot/main.cpp new file mode 100644 index 000000000..f1c8afb13 --- /dev/null +++ b/fastboot/main.cpp @@ -0,0 +1,34 @@ +/* + * 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 "fastboot.h" + +int main(int argc, char* argv[]) { + FastBoot fb; + return fb.Main(argc, argv); +} diff --git a/fastboot/usbtest.cpp b/fastboot/usbtest.cpp deleted file mode 100644 index 9423c6d96..000000000 --- a/fastboot/usbtest.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/* - * 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 -#include -#include -#include - -#include - -#include "usb.h" - -static unsigned arg_size = 4096; -static unsigned arg_count = 4096; - -long long NOW(void) -{ - struct timeval tv; - gettimeofday(&tv, 0); - - return (((long long) tv.tv_sec) * ((long long) 1000000)) + - (((long long) tv.tv_usec)); -} - -int printifc(usb_ifc_info *info) -{ - printf("dev: csp=%02x/%02x/%02x v=%04x p=%04x ", - info->dev_class, info->dev_subclass, info->dev_protocol, - info->dev_vendor, info->dev_product); - printf("ifc: csp=%02x/%02x/%02x%s%s\n", - info->ifc_class, info->ifc_subclass, info->ifc_protocol, - info->has_bulk_in ? " in" : "", - info->has_bulk_out ? " out" : ""); - return -1; -} - -int match_null(usb_ifc_info *info) -{ - if(info->dev_vendor != 0x18d1) return -1; - if(info->ifc_class != 0xff) return -1; - if(info->ifc_subclass != 0xfe) return -1; - if(info->ifc_protocol != 0x01) return -1; - return 0; -} - -int match_zero(usb_ifc_info *info) -{ - if(info->dev_vendor != 0x18d1) return -1; - if(info->ifc_class != 0xff) return -1; - if(info->ifc_subclass != 0xfe) return -1; - if(info->ifc_protocol != 0x02) return -1; - return 0; -} - -int match_loop(usb_ifc_info *info) -{ - if(info->dev_vendor != 0x18d1) return -1; - if(info->ifc_class != 0xff) return -1; - if(info->ifc_subclass != 0xfe) return -1; - if(info->ifc_protocol != 0x03) return -1; - return 0; -} - -int test_null(Transport* usb) -{ - unsigned i; - unsigned char buf[4096]; - memset(buf, 0xee, 4096); - long long t0, t1; - - t0 = NOW(); - for (i = 0; i < arg_count; i++) { - if (usb->Write(buf, arg_size) != static_cast(arg_size)) { - fprintf(stderr,"write failed (%s)\n", strerror(errno)); - return -1; - } - } - t1 = NOW(); - fprintf(stderr,"%d bytes in %lld uS\n", arg_count * arg_size, (t1 - t0)); - return 0; -} - -int test_zero(Transport* usb) -{ - unsigned i; - unsigned char buf[4096]; - long long t0, t1; - - t0 = NOW(); - for (i = 0; i < arg_count; i++) { - if (usb->Read(buf, arg_size) != static_cast(arg_size)) { - fprintf(stderr,"read failed (%s)\n", strerror(errno)); - return -1; - } - } - t1 = NOW(); - fprintf(stderr,"%d bytes in %lld uS\n", arg_count * arg_size, (t1 - t0)); - return 0; -} - -struct -{ - const char *cmd; - ifc_match_func match; - int (*test)(Transport* usb); - const char *help; -} tests[] = { - { "list", printifc, NULL, "list interfaces" }, - { "send", match_null, test_null, "send to null interface" }, - { "recv", match_zero, test_zero, "recv from zero interface" }, - { "loop", match_loop, NULL, "exercise loopback interface" }, - { NULL, NULL, NULL, NULL }, -}; - -int usage(void) -{ - int i; - - fprintf(stderr,"usage: usbtest \n\navailable tests:\n"); - for(i = 0; tests[i].cmd; i++) { - fprintf(stderr," %-8s %s\n", tests[i].cmd, tests[i].help); - } - return -1; -} - -int process_args(int argc, char **argv) -{ - while(argc-- > 0) { - char *arg = *argv++; - if(!strncmp(arg,"count=",6)) { - arg_count = atoi(arg + 6); - } else if(!strncmp(arg,"size=",5)) { - arg_size = atoi(arg + 5); - } else { - fprintf(stderr,"unknown argument: %s\n", arg); - return -1; - } - } - - if(arg_count == 0) { - fprintf(stderr,"count may not be zero\n"); - return -1; - } - - if(arg_size > 4096) { - fprintf(stderr,"size may not be greater than 4096\n"); - return -1; - } - - return 0; -} - -int main(int argc, char **argv) -{ - Transport* usb; - int i; - - if(argc < 2) - return usage(); - - if(argc > 2) { - if(process_args(argc - 2, argv + 2)) - return -1; - } - - for(i = 0; tests[i].cmd; i++) { - if(!strcmp(argv[1], tests[i].cmd)) { - usb = usb_open(tests[i].match); - if(tests[i].test) { - if(usb == 0) { - fprintf(stderr,"usbtest: %s: could not find interface\n", - tests[i].cmd); - return -1; - } - if(tests[i].test(usb)) { - fprintf(stderr,"usbtest: %s: FAIL\n", tests[i].cmd); - return -1; - } else { - fprintf(stderr,"usbtest: %s: OKAY\n", tests[i].cmd); - } - } - return 0; - } - } - - return usage(); -}