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 |