| Index: tools/itunesdfu/bootstrap_ipodclassic_itunes/SOURCES | 
| — | — | @@ -0,0 +1,2 @@ | 
|   | 2 | +main.c
 | 
|   | 3 | +resources.S
 | 
| Index: tools/itunesdfu/bootstrap_ipodclassic_itunes/main.c | 
| — | — | @@ -0,0 +1,155 @@ | 
|   | 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 | +#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_1223#87020000000001#{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_ipodclassic_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_ipodclassic_itunes/version.h | 
| — | — | @@ -0,0 +1,36 @@ | 
|   | 2 | +//
 | 
|   | 3 | +//
 | 
|   | 4 | +//    Copyright 2011 TheSeven
 | 
|   | 5 | +//
 | 
|   | 6 | +//
 | 
|   | 7 | +//    This file is part of emBIOS.
 | 
|   | 8 | +//
 | 
|   | 9 | +//    emBIOS 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 | +//    emBIOS 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 emBIOS.  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_ipodclassic_itunes/Makefile | 
| — | — | @@ -0,0 +1,85 @@ | 
|   | 2 | +NAME := bootstrap_ipodclassic_itunes
 | 
|   | 3 | +DFUIMAGE ?= ../../../apps/installer-ipodclassic/build/bootstrap-ipodclassic.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_ipodclassic_itunes | 
| Property changes on: tools/itunesdfu/bootstrap_ipodclassic_itunes | 
| ___________________________________________________________________ | 
| Added: svn:ignore | 
| ## -0,0 +1 ## | 
|   | 87 | +build |