From bf1c491c2b510648a3c1efc2c381e30635248d18 Mon Sep 17 00:00:00 2001 From: Dominik Riebeling Date: Sun, 1 Jul 2012 12:29:47 +0200 Subject: Move check for existing bootloader to ipodpatcher. Bootloader handling is different on nano2g compared to the other supported Ipod models. Since ipodpatcher handles this internally make ipodpatcher also provide a way to check this when using from Rockbox Utility to avoid duplicating the (already existing) checks in the latter. Fixes wrong "bootloader already installed" message on nano2g. Change-Id: Ibc658d775fbac7cf9a7e329d445fe97828a455d8 --- rbutil/ipodpatcher/ipodpatcher.c | 44 ++++++++++++++------------ rbutil/ipodpatcher/ipodpatcher.h | 1 + rbutil/rbutilqt/base/bootloaderinstallipod.cpp | 6 ++-- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/rbutil/ipodpatcher/ipodpatcher.c b/rbutil/ipodpatcher/ipodpatcher.c index 9f446d4ea4..542e078605 100644 --- a/rbutil/ipodpatcher/ipodpatcher.c +++ b/rbutil/ipodpatcher/ipodpatcher.c @@ -796,6 +796,26 @@ int add_new_image(struct ipod_t* ipod, char* imagename, char* filename, int type } +int ipod_has_bootloader(struct ipod_t* ipod) +{ + /* The 2nd gen Nano is installed differently */ + if (ipod->modelnum == 62) { + int i; + int has_osbk = 0; + /* Check if we have an OSBK image */ + for (i = 0; i < ipod->nimages; i++) { + if (ipod->ipod_directory[i].ftype==FTYPE_OSBK) { + has_osbk = 1; + } + } + return has_osbk; + } + else { + return (ipod->ipod_directory[0].entryOffset != 0); + } +} + + /* Bootloader installation on the Nano2G consists of renaming the OSOS image to OSBK and then writing the Rockbox bootloader as a @@ -810,17 +830,8 @@ int add_new_image(struct ipod_t* ipod, char* imagename, char* filename, int type static int add_bootloader_nano2g(struct ipod_t* ipod, char* filename, int type) { - int i; - int has_osbk = 0; - /* Check if we already have an OSBK image */ - for (i = 0; i < ipod->nimages; i++) { - if (ipod->ipod_directory[i].ftype==FTYPE_OSBK) { - has_osbk = 1; - } - } - - if (has_osbk == 0) { + if (ipod_has_bootloader(ipod) == 0) { /* First-time install - rename OSOS to OSBK and create new OSOS for bootloader */ fprintf(stderr,"[INFO] Creating OSBK backup image of original firmware\n"); @@ -841,17 +852,8 @@ static int add_bootloader_nano2g(struct ipod_t* ipod, char* filename, int type) static int delete_bootloader_nano2g(struct ipod_t* ipod) { - int i; - int has_osbk = 0; - /* Check if we have an OSBK image */ - for (i = 0; i < ipod->nimages; i++) { - if (ipod->ipod_directory[i].ftype==FTYPE_OSBK) { - has_osbk = 1; - } - } - - if (has_osbk == 0) { + if (ipod_has_bootloader(ipod) == 0) { fprintf(stderr,"[ERR] No OSBK image found - nothing to uninstall\n"); return -1; } else { @@ -1118,7 +1120,7 @@ int delete_bootloader(struct ipod_t* ipod) /* Firstly check we have a bootloader... */ - if (ipod->ipod_directory[0].entryOffset == 0) { + if (ipod_has_bootloader(ipod) == 0) { fprintf(stderr,"[ERR] No bootloader found.\n"); return -1; } diff --git a/rbutil/ipodpatcher/ipodpatcher.h b/rbutil/ipodpatcher/ipodpatcher.h index 30a1b1e9fd..dc3f100520 100644 --- a/rbutil/ipodpatcher/ipodpatcher.h +++ b/rbutil/ipodpatcher/ipodpatcher.h @@ -69,6 +69,7 @@ void ipod_get_ramsize(struct ipod_t* ipod); int read_aupd(struct ipod_t* ipod, char* filename); int write_aupd(struct ipod_t* ipod, char* filename); off_t filesize(int fd); +int ipod_has_bootloader(struct ipod_t* ipod); #ifdef __cplusplus } diff --git a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp index cb69faa35b..249da13735 100644 --- a/rbutil/rbutilqt/base/bootloaderinstallipod.cpp +++ b/rbutil/rbutilqt/base/bootloaderinstallipod.cpp @@ -166,7 +166,7 @@ bool BootloaderInstallIpod::uninstall(void) return false; } - if (ipod.ipod_directory[0].entryOffset == 0) { + if (ipod_has_bootloader(&ipod) == 0) { emit logItem(tr("No bootloader detected."), LOGERROR); emit done(true); return false; @@ -199,8 +199,8 @@ BootloaderInstallBase::BootloaderType BootloaderInstallIpod::installed(void) } else { read_directory(&ipod); - if(ipod.ipod_directory[0].entryOffset == 0 || ipod.macpod) { - qDebug() << "[BootloaderInstallIpod] installed: BootloaderOther"; + getmodel(&ipod,(ipod.ipod_directory[ipod.ososimage].vers>>8)); + if(!ipod_has_bootloader(&ipod)) { result = BootloaderOther; } else { -- cgit v1.2.3