| Index: tools/itunesdfu/bootstrap_ipodnano4g_itunes/Makefile |
| — | — | @@ -0,0 +1,85 @@ |
| | 2 | +NAME := bootstrap_ipodnano4g_itunes |
| | 3 | +DFUIMAGE ?= ../../../apps/installer-ipodnano4g/build/bootstrap-ipodnano4g.dfu |
| | 4 | + |
| | 5 | +ifeq ($(shell uname),WindowsNT) |
| | 6 | +CCACHE := |
| | 7 | +else |
| | 8 | +CCACHE := $(shell which ccache) |
| | 9 | +endif |
| | 10 | + |
| | 11 | +CC := $(CCACHE) gcc |
| | 12 | +LD := $(CCACHE) gcc |
| | 13 | + |
| | 14 | +CFLAGS += -Os -fomit-frame-pointer "-DDFUIMAGE=\"$(DFUIMAGE)\"" |
| | 15 | +LDFLAGS += -Wl,-s |
| | 16 | + |
| | 17 | +preprocess = $(shell $(CC) $(PPCFLAGS) $(2) -E -P -x c $(1) | grep -v "^\#") |
| | 18 | +preprocesspaths = $(shell $(CC) $(PPCFLAGS) $(2) -E -P -x c $(1) | grep -v "^\#" | sed -e "s:^..*:$(dir $(1))&:" | sed -e "s:^\\./::") |
| | 19 | + |
| | 20 | +REVISION := $(shell svnversion .) |
| | 21 | +REVISIONINT := $(shell echo $(REVISION) | sed -e "s/[^0-9].*$$//") |
| | 22 | + |
| | 23 | +SRC := $(call preprocesspaths,SOURCES,-I. -I..) |
| | 24 | +OBJ := $(SRC:%.c=build/%.o) |
| | 25 | +OBJ := $(OBJ:%.S=build/%.o) |
| | 26 | + |
| | 27 | +all: $(NAME) |
| | 28 | + |
| | 29 | +-include $(OBJ:%=%.dep) |
| | 30 | + |
| | 31 | +$(NAME): build/$(NAME).exe |
| | 32 | + |
| | 33 | +build/resources.o: $(DFUIMAGE) |
| | 34 | + |
| | 35 | +build/$(NAME).exe: $(OBJ) |
| | 36 | + @echo [LD] $@ |
| | 37 | + @$(LD) -o $@ $(OBJ) $(LDFLAGS) |
| | 38 | + |
| | 39 | +build/%.o: %.c build/version.h |
| | 40 | + @echo [CC] $< |
| | 41 | +ifeq ($(shell uname),WindowsNT) |
| | 42 | + @-if not exist $(subst /,\,$(dir $@)) md $(subst /,\,$(dir $@)) |
| | 43 | +else |
| | 44 | + @-mkdir -p $(dir $@) |
| | 45 | +endif |
| | 46 | + @$(CC) -c $(CFLAGS) -o $@ $< |
| | 47 | + @$(CC) -MM $(CFLAGS) $< > $@.dep.tmp |
| | 48 | + @sed -e "s|.*:|$@:|" < $@.dep.tmp > $@.dep |
| | 49 | +ifeq ($(shell uname),WindowsNT) |
| | 50 | + @sed -e "s/.*://" -e "s/\\$$//" < $@.dep.tmp | fmt -1 | sed -e "s/^ *//" -e "s/$$/:/" >> $@.dep |
| | 51 | +else |
| | 52 | + @sed -e 's/.*://' -e 's/\\$$//' < $@.dep.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.dep |
| | 53 | +endif |
| | 54 | + @rm -f $@.dep.tmp |
| | 55 | + |
| | 56 | +build/%.o: %.S build/version.h |
| | 57 | + @echo [CC] $< |
| | 58 | +ifeq ($(shell uname),WindowsNT) |
| | 59 | + @-if not exist $(subst /,\,$(dir $@)) md $(subst /,\,$(dir $@)) |
| | 60 | +else |
| | 61 | + @-mkdir -p $(dir $@) |
| | 62 | +endif |
| | 63 | + @$(CC) -c $(CFLAGS) -o $@ $< |
| | 64 | + @$(CC) -MM $(CFLAGS) $< > $@.dep.tmp |
| | 65 | + @sed -e "s|.*:|$@:|" < $@.dep.tmp > $@.dep |
| | 66 | +ifeq ($(shell uname),WindowsNT) |
| | 67 | + @sed -e "s/.*://" -e "s/\\$$//" < $@.dep.tmp | fmt -1 | sed -e "s/^ *//" -e "s/$$/:/" >> $@.dep |
| | 68 | +else |
| | 69 | + @sed -e 's/.*://' -e 's/\\$$//' < $@.dep.tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $@.dep |
| | 70 | +endif |
| | 71 | + @rm -f $@.dep.tmp |
| | 72 | + |
| | 73 | +build/version.h: version.h ../../../.svn/entries |
| | 74 | + @echo [PP] $< |
| | 75 | +ifeq ($(shell uname),WindowsNT) |
| | 76 | + @-if not exist build md build |
| | 77 | + @sed -e "s/\$$REVISION\$$/$(REVISION)/" -e "s/\$$REVISIONINT\$$/$(REVISIONINT)/" < $< > $@ |
| | 78 | +else |
| | 79 | + @-mkdir -p build |
| | 80 | + @sed -e 's/\$$REVISION\$$/$(REVISION)/' -e 's/\$$REVISIONINT\$$/$(REVISIONINT)/' < $< > $@ |
| | 81 | +endif |
| | 82 | + |
| | 83 | +clean: |
| | 84 | + @rm -rf build |
| | 85 | + |
| | 86 | +.PHONY: all clean $(NAME) |
| Index: tools/itunesdfu/bootstrap_ipodnano4g_itunes/main.c |
| — | — | @@ -0,0 +1,155 @@ |
| | 2 | +// |
| | 3 | +// |
| | 4 | +// Copyright 2011 TheSeven, user890104 |
| | 5 | +// |
| | 6 | +// |
| | 7 | +// This file is part of emCORE. |
| | 8 | +// |
| | 9 | +// emCORE is free software: you can redistribute it and/or |
| | 10 | +// modify it under the terms of the GNU General Public License as |
| | 11 | +// published by the Free Software Foundation, either version 2 of the |
| | 12 | +// License, or (at your option) any later version. |
| | 13 | +// |
| | 14 | +// emCORE is distributed in the hope that it will be useful, |
| | 15 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of |
| | 16 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| | 17 | +// See the GNU General Public License for more details. |
| | 18 | +// |
| | 19 | +// You should have received a copy of the GNU General Public License along |
| | 20 | +// with emCORE. If not, see <http://www.gnu.org/licenses/>. |
| | 21 | +// |
| | 22 | +// |
| | 23 | + |
| | 24 | + |
| | 25 | +#define WIN32_LEAN_AND_MEAN |
| | 26 | +#include <windows.h> |
| | 27 | +#include <stdbool.h> |
| | 28 | +#include <inttypes.h> |
| | 29 | + |
| | 30 | + |
| | 31 | +struct controlreq { |
| | 32 | + uint8_t bmRequestType; |
| | 33 | + uint8_t bRequest; |
| | 34 | + uint16_t wValue; |
| | 35 | + uint16_t wIndex; |
| | 36 | + uint16_t wLength; |
| | 37 | + unsigned char data[]; |
| | 38 | +}; |
| | 39 | + |
| | 40 | + |
| | 41 | +extern char dfuimage[];
|
| | 42 | +extern uint32_t dfuimage_size;
|
| | 43 | + |
| | 44 | + |
| | 45 | +void print_last_error(char* text, bool force) |
| | 46 | +{ |
| | 47 | + DWORD dw = GetLastError();
|
| | 48 | + if (!dw && !force) return;
|
| | 49 | + LPVOID lpMsgBuf;
|
| | 50 | + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
| | 51 | + NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); |
| | 52 | + printf("%s: Error %d: %s\n", text, dw, lpMsgBuf); |
| | 53 | +} |
| | 54 | + |
| | 55 | +int control(HANDLE dfu, struct controlreq* req, int size, bool silent) |
| | 56 | +{ |
| | 57 | + DWORD count; |
| | 58 | + OVERLAPPED overlapped; |
| | 59 | + memset(&overlapped, 0, sizeof(overlapped)); |
| | 60 | + SetLastError(0); |
| | 61 | + overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); |
| | 62 | + DeviceIoControl(dfu, 0x2200A0, req, size, req, size, NULL, &overlapped); |
| | 63 | + WaitForSingleObject(overlapped.hEvent, 1000); |
| | 64 | + DWORD rc = GetOverlappedResult(dfu, &overlapped, &count, FALSE); |
| | 65 | + CloseHandle(overlapped.hEvent); |
| | 66 | + if (rc <= 0) |
| | 67 | + { |
| | 68 | + print_last_error("DeviceIoControl", true); |
| | 69 | + count = -1; |
| | 70 | + CancelIo(dfu); |
| | 71 | + if (!silent) MessageBox(0, "DFU transfer failed!", "Error", MB_OK); |
| | 72 | + } |
| | 73 | + return count; |
| | 74 | +} |
| | 75 | + |
| | 76 | +int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) |
| | 77 | +{ |
| | 78 | + SetLastError(0); |
| | 79 | + HANDLE dfu = CreateFile("\\\\?\\usb#vid_05ac&pid_1225#87200000000001#{b8085869-feb9-404b-8cb1-1e5c14fa8c54}\\0001", |
| | 80 | + GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); |
| | 81 | + if (!dfu || dfu == (HANDLE)-1) |
| | 82 | + { |
| | 83 | + print_last_error("CreateFile", true); |
| | 84 | + MessageBox(0, "Could not open DFU device!", "Error", MB_OK); |
| | 85 | + return 1; |
| | 86 | + } |
| | 87 | + unsigned int buf[514];
|
| | 88 | + struct controlreq* req = (struct controlreq*)buf; |
| | 89 | + int i, j;
|
| | 90 | + for (i = 0; i < 256; i++)
|
| | 91 | + {
|
| | 92 | + buf[i] = i;
|
| | 93 | + for (j = 0; j < 8; j++)
|
| | 94 | + {
|
| | 95 | + if (buf[i] & 1) buf[i] = (buf[i] >> 1) ^ 0xedb88320;
|
| | 96 | + else buf[i] >>= 1;
|
| | 97 | + }
|
| | 98 | + }
|
| | 99 | + unsigned char* ptr = dfuimage; |
| | 100 | + int left = dfuimage_size + 4; |
| | 101 | + int packet = 0; |
| | 102 | + dfuimage_size = 0xffffffff;
|
| | 103 | + for (i = 0; i < left - 4; i++)
|
| | 104 | + dfuimage_size = (dfuimage_size >> 8) ^ buf[(dfuimage_size ^ ptr[i]) & 0xff];
|
| | 105 | + while (left) |
| | 106 | + { |
| | 107 | + int size = left > 2048 ? 2048 : left; |
| | 108 | + req->bmRequestType = 0x21; |
| | 109 | + req->bRequest = 1; |
| | 110 | + req->wValue = packet; |
| | 111 | + req->wIndex = 0; |
| | 112 | + req->wLength = size; |
| | 113 | + memcpy(req->data, ptr, size); |
| | 114 | + if (control(dfu, req, size + 8, false) != size + 8) return 2; |
| | 115 | + req->data[4] = 0; |
| | 116 | + while (req->data[4] != 5) |
| | 117 | + { |
| | 118 | + req->bmRequestType = 0xa1; |
| | 119 | + req->bRequest = 3; |
| | 120 | + req->wValue = 0; |
| | 121 | + req->wIndex = 0; |
| | 122 | + req->wLength = 6; |
| | 123 | + req->data[4] = 0; |
| | 124 | + if (control(dfu, req, 14, false) != 14) return 3; |
| | 125 | + } |
| | 126 | + ptr += size; |
| | 127 | + left -= size; |
| | 128 | + packet++; |
| | 129 | + } |
| | 130 | + req->bmRequestType = 0x21; |
| | 131 | + req->bRequest = 1; |
| | 132 | + req->wValue = packet; |
| | 133 | + req->wIndex = 0; |
| | 134 | + req->wLength = 0; |
| | 135 | + if (control(dfu, req, 8, false) != 8) return 4; |
| | 136 | + int timeout = 20; |
| | 137 | + req->data[4] = 0; |
| | 138 | + while (req->data[4] != 2 && timeout-- > 0)
|
| | 139 | + {
|
| | 140 | + Sleep(100);
|
| | 141 | + req->bmRequestType = 0xa1; |
| | 142 | + req->bRequest = 3; |
| | 143 | + req->wValue = 0; |
| | 144 | + req->wIndex = 0; |
| | 145 | + req->wLength = 6; |
| | 146 | + req->data[4] = 0; |
| | 147 | + if (control(dfu, req, 14, true) != 14) break; |
| | 148 | + }
|
| | 149 | + if (req->data[4] == 2)
|
| | 150 | + {
|
| | 151 | + printf("DFU payload was rejected with code: %02X %02X\n", req->data[4], req->data[0]);
|
| | 152 | + MessageBox(0, "DFU payload was rejected!", "Error", MB_OK); |
| | 153 | + }
|
| | 154 | + else MessageBox(0, "UMSboot has been launched!", "Success", MB_OK); |
| | 155 | + return 0; |
| | 156 | +} |
| Index: tools/itunesdfu/bootstrap_ipodnano4g_itunes/version.h |
| — | — | @@ -0,0 +1,36 @@ |
| | 2 | +//
|
| | 3 | +//
|
| | 4 | +// Copyright 2011 TheSeven
|
| | 5 | +//
|
| | 6 | +//
|
| | 7 | +// This file is part of emCORE.
|
| | 8 | +//
|
| | 9 | +// emCORE is free software: you can redistribute it and/or
|
| | 10 | +// modify it under the terms of the GNU General Public License as
|
| | 11 | +// published by the Free Software Foundation, either version 2 of the
|
| | 12 | +// License, or (at your option) any later version.
|
| | 13 | +//
|
| | 14 | +// emCORE is distributed in the hope that it will be useful,
|
| | 15 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| | 16 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
| | 17 | +// See the GNU General Public License for more details.
|
| | 18 | +//
|
| | 19 | +// You should have received a copy of the GNU General Public License along
|
| | 20 | +// with emCORE. If not, see <http://www.gnu.org/licenses/>.
|
| | 21 | +//
|
| | 22 | +//
|
| | 23 | +
|
| | 24 | +
|
| | 25 | +#ifndef __VERSION_H__
|
| | 26 | +#define __VERSION_H__
|
| | 27 | +
|
| | 28 | +
|
| | 29 | +#define VERSION "0.1.0"
|
| | 30 | +#define VERSION_MAJOR 0
|
| | 31 | +#define VERSION_MINOR 1
|
| | 32 | +#define VERSION_PATCH 0
|
| | 33 | +#define VERSION_SVN "$REVISION$"
|
| | 34 | +#define VERSION_SVN_INT $REVISIONINT$
|
| | 35 | +
|
| | 36 | +
|
| | 37 | +#endif |
| \ No newline at end of file |
| Index: tools/itunesdfu/bootstrap_ipodnano4g_itunes/SOURCES |
| — | — | @@ -0,0 +1,2 @@ |
| | 2 | +main.c
|
| | 3 | +resources.S
|
| Index: tools/itunesdfu/bootstrap_ipodnano4g_itunes/resources.S |
| — | — | @@ -0,0 +1,30 @@ |
| | 2 | +//
|
| | 3 | +//
|
| | 4 | +// Copyright 2011 TheSeven
|
| | 5 | +//
|
| | 6 | +//
|
| | 7 | +// This file is part of emCORE.
|
| | 8 | +//
|
| | 9 | +// emCORE is free software: you can redistribute it and/or
|
| | 10 | +// modify it under the terms of the GNU General Public License as
|
| | 11 | +// published by the Free Software Foundation, either version 2 of the
|
| | 12 | +// License, or (at your option) any later version.
|
| | 13 | +//
|
| | 14 | +// emCORE is distributed in the hope that it will be useful,
|
| | 15 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| | 16 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
| | 17 | +// See the GNU General Public License for more details.
|
| | 18 | +//
|
| | 19 | +// You should have received a copy of the GNU General Public License along
|
| | 20 | +// with emCORE. If not, see <http://www.gnu.org/licenses/>.
|
| | 21 | +//
|
| | 22 | +//
|
| | 23 | +
|
| | 24 | +
|
| | 25 | +.section .data
|
| | 26 | +.global _dfuimage
|
| | 27 | +_dfuimage:
|
| | 28 | +.incbin DFUIMAGE
|
| | 29 | +.global _dfuimage_size
|
| | 30 | +_dfuimage_size:
|
| | 31 | +.long . - _dfuimage
|
| Index: tools/itunesdfu/bootstrap_ipodnano4g_itunes |
| Property changes on: tools/itunesdfu/bootstrap_ipodnano4g_itunes |
| ___________________________________________________________________ |
| Added: svn:ignore |
| ## -0,0 +1 ## |
| | 32 | +build |