freemyipod r676 - Code Review

Jump to: navigation, search
Repository:freemyipod
Revision:r675‎ | r676 | r677 >
Date:18:02, 29 March 2011
Author:theseven
Status:new
Tags:
Comment:
New tool: iTunesDFU
Modified paths:
  • /tools/itunesdfu (added) (history)
  • /tools/itunesdfu/bootstrap_ipodclassic_itunes (added) (history)
  • /tools/itunesdfu/bootstrap_ipodclassic_itunes/Makefile (added) (history)
  • /tools/itunesdfu/bootstrap_ipodclassic_itunes/SOURCES (added) (history)
  • /tools/itunesdfu/bootstrap_ipodclassic_itunes/main.c (added) (history)
  • /tools/itunesdfu/bootstrap_ipodclassic_itunes/resources.S (added) (history)
  • /tools/itunesdfu/bootstrap_ipodclassic_itunes/version.h (added) (history)

Diff [purge]

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