From 3de0951516e462d8d438db4a0c3099c5ef308192 Mon Sep 17 00:00:00 2001 From: Martin Szulecki Date: Wed, 9 Jan 2013 15:32:15 +0100 Subject: Improve maintainability of devices and add support for all current models This removes all CPID_* and BDID_* defines which appear useless as the same information is already stored in the irecv_devices[] struct. Furthermore this removes a big inefficient switch() to determine a device in favor of a simple loop on the irecv_devices[] struct. Overall this means much less maintainance to add new device models in the future. --- include/libirecovery.h | 167 +++++++++++++++++++------------------------------ src/libirecovery.c | 165 +++--------------------------------------------- 2 files changed, 70 insertions(+), 262 deletions(-) diff --git a/include/libirecovery.h b/include/libirecovery.h index e7cd30d..fb18ce1 100644 --- a/include/libirecovery.h +++ b/include/libirecovery.h @@ -38,86 +38,8 @@ extern "C" { #endif #define APPLE_VENDOR_ID 0x05AC - -#define CPID_UNKNOWN -1 -#define CPID_IPHONE2G 0x8900 -#define CPID_IPOD1G 0x8900 -#define CPID_IPHONE3G 0x8900 -#define CPID_IPOD2G 0x8720 -#define CPID_IPHONE3GS 0x8920 -#define CPID_IPOD3G 0x8922 -#define CPID_IPAD1G 0x8930 -#define CPID_IPHONE4 0x8930 -#define CPID_IPOD4G 0x8930 -#define CPID_APPLETV2 0x8930 -#define CPID_IPHONE42 0x8930 -#define CPID_IPAD21 0x8940 -#define CPID_IPAD22 0x8940 -#define CPID_IPAD23 0x8940 -#define CPID_IPHONE4S 0x8940 -#define CPID_APPLETV31 0x8942 -#define CPID_IPAD24 0x8942 -#define CPID_IPAD25 0x8942 -#define CPID_IPOD5G 0x8942 -#define CPID_IPAD31 0x8945 -#define CPID_IPAD32 0x8945 -#define CPID_IPAD33 0x8945 -#define CPID_IPHONE5 0x8950 -#define CPID_IPAD34 0x8955 - -#define BDID_UNKNOWN -1 -#define BDID_IPHONE2G 0x00 -#define BDID_IPOD1G 0x02 -#define BDID_IPHONE3G 0x04 -#define BDID_IPOD2G 0x00 -#define BDID_IPHONE3GS 0x00 -#define BDID_IPOD3G 0x02 -#define BDID_IPAD1G 0x02 -#define BDID_IPHONE4 0x00 -#define BDID_IPOD4G 0x08 -#define BDID_APPLETV2 0x10 -#define BDID_IPHONE42 0x06 -#define BDID_IPAD21 0x04 -#define BDID_IPAD22 0x06 -#define BDID_IPAD23 0x02 -#define BDID_IPHONE4S 0x08 -#define BDID_APPLETV31 0x08 -#define BDID_IPAD24 0x06 -#define BDID_IPAD25 0x0a -#define BDID_IPOD5G 0x00 -#define BDID_IPAD31 0x00 -#define BDID_IPAD32 0x02 -#define BDID_IPAD33 0x04 -#define BDID_IPHONE51 0x00 -#define BDID_IPHONE52 0x02 -#define BDID_IPAD34 0x00 - -#define DEVICE_UNKNOWN -1 -#define DEVICE_IPHONE2G 0 -#define DEVICE_IPOD1G 1 -#define DEVICE_IPHONE3G 2 -#define DEVICE_IPOD2G 3 -#define DEVICE_IPHONE3GS 4 -#define DEVICE_IPOD3G 5 -#define DEVICE_IPAD1G 6 -#define DEVICE_IPHONE4 7 -#define DEVICE_IPOD4G 8 -#define DEVICE_APPLETV2 9 -#define DEVICE_IPHONE42 10 -#define DEVICE_IPAD21 11 -#define DEVICE_IPAD22 12 -#define DEVICE_IPAD23 13 -#define DEVICE_IPHONE4S 14 -#define DEVICE_APPLETV31 15 -#define DEVICE_IPAD24 16 -#define DEVICE_IPAD31 17 -#define DEVICE_IPAD32 18 -#define DEVICE_IPAD33 19 -#define DEVICE_IPHONE51 20 -#define DEVICE_IPHONE52 21 -#define DEVICE_IPOD5G 22 -#define DEVICE_IPAD25 23 -#define DEVICE_IPAD34 24 +#define CPID_UNKNOWN -1 +#define BDID_UNKNOWN -1 enum { kRecoveryMode1 = 0x1280, @@ -191,6 +113,38 @@ struct irecv_client { irecv_event_cb_t disconnected_callback; }; +#define DEVICE_UNKNOWN -1 +#define DEVICE_IPHONE2G 0 +#define DEVICE_IPHONE3G 1 +#define DEVICE_IPHONE3GS 2 +#define DEVICE_IPHONE4 3 +#define DEVICE_IPHONE4REVA 4 +#define DEVICE_IPHONE4CDMA 5 +#define DEVICE_IPHONE4S 6 +#define DEVICE_IPHONE51 7 +#define DEVICE_IPHONE52 8 +#define DEVICE_IPOD1G 9 +#define DEVICE_IPOD2G 10 +#define DEVICE_IPOD3G 11 +#define DEVICE_IPOD4G 12 +#define DEVICE_IPOD5G 13 +#define DEVICE_IPAD1G 14 +#define DEVICE_IPAD21 15 +#define DEVICE_IPAD22 16 +#define DEVICE_IPAD23 17 +#define DEVICE_IPAD24 18 +#define DEVICE_IPAD25 19 +#define DEVICE_IPAD26 20 +#define DEVICE_IPAD27 21 +#define DEVICE_IPAD31 22 +#define DEVICE_IPAD32 23 +#define DEVICE_IPAD33 24 +#define DEVICE_IPAD34 25 +#define DEVICE_IPAD35 26 +#define DEVICE_IPAD36 27 +#define DEVICE_APPLETV2 28 +#define DEVICE_APPLETV31 29 + struct irecv_device { int index; const char* product; @@ -201,30 +155,35 @@ struct irecv_device { static struct irecv_device irecv_devices[] = { { 0, "iPhone1,1", "m68ap", 0x00, 0x8900 }, - { 1, "iPod1,1", "n45ap", 0x02, 0x8900 }, - { 2, "iPhone1,2", "n82ap", 0x04, 0x8900 }, - { 3, "iPod2,1", "n72ap", 0x00, 0x8720 }, - { 4, "iPhone2,1", "n88ap", 0x00, 0x8920 }, - { 5, "iPod3,1", "n18ap", 0x02, 0x8922 }, - { 6, "iPad1,1", "k48ap", 0x02, 0x8930 }, - { 7, "iPhone3,1", "n90ap", 0x00, 0x8930 }, - { 8, "iPod4,1", "n81ap", 0x08, 0x8930 }, - { 9, "AppleTV2,1", "k66ap", 0x10, 0x8930 }, - { 10, "iPhone3,3", "n92ap", 0x06, 0x8930 }, - { 11, "iPad2,1", "k93ap", 0x04, 0x8940 }, - { 12, "iPad2,2", "k94ap", 0x06, 0x8940 }, - { 13, "iPad2,3", "k95ap", 0x02, 0x8940 }, - { 14, "iPhone4,1", "n94ap", 0x08, 0x8940 }, - { 15, "AppleTV3,1", "j33ap", 0x08, 0x8942 }, - { 16, "iPad2,4", "k93aap",0x06, 0x8942 }, - { 17, "iPad3,1", "j1ap", 0x00, 0x8945 }, - { 18, "iPad3,2", "j2ap", 0x02, 0x8945 }, - { 19, "iPad3,3", "j2aap", 0x04, 0x8945 }, - { 20, "iPhone5,1", "n41ap", 0x00, 0x8950 }, - { 21, "iPhone5,2", "n42ap", 0x02, 0x8950 }, - { 22, "iPod5,1", "n78ap", 0x00, 0x8942 }, - { 23, "iPad2,5", "p105ap", 0x0a, 0x8942 }, - { 24, "iPad3,4", "p101ap", 0x00, 0x8955 }, + { 1, "iPhone1,2", "n82ap", 0x04, 0x8900 }, + { 2, "iPhone2,1", "n88ap", 0x00, 0x8920 }, + { 3, "iPhone3,1", "n90ap", 0x00, 0x8930 }, + { 4, "iPhone3,2", "n90bap", 0x04, 0x8930 }, + { 5, "iPhone3,3", "n92ap", 0x06, 0x8930 }, + { 6, "iPhone4,1", "n94ap", 0x08, 0x8940 }, + { 7, "iPhone5,1", "n41ap", 0x00, 0x8950 }, + { 8, "iPhone5,2", "n42ap", 0x02, 0x8950 }, + { 9, "iPod1,1", "n45ap", 0x02, 0x8900 }, + { 10, "iPod2,1", "n72ap", 0x00, 0x8720 }, + { 11, "iPod3,1", "n18ap", 0x02, 0x8922 }, + { 12, "iPod4,1", "n81ap", 0x08, 0x8930 }, + { 13, "iPod5,1", "n78ap", 0x00, 0x8942 }, + { 14, "iPad1,1", "k48ap", 0x02, 0x8930 }, + { 15, "iPad2,1", "k93ap", 0x04, 0x8940 }, + { 16, "iPad2,2", "k94ap", 0x06, 0x8940 }, + { 17, "iPad2,3", "k95ap", 0x02, 0x8940 }, + { 18, "iPad2,4", "k93aap", 0x06, 0x8942 }, + { 19, "iPad2,5", "p105ap", 0x0a, 0x8942 }, + { 20, "iPad2,6", "p106ap", 0x0c, 0x8942 }, + { 21, "iPad2,7", "p107ap", 0x0e, 0x8942 }, + { 22, "iPad3,1", "j1ap", 0x00, 0x8945 }, + { 23, "iPad3,2", "j2ap", 0x02, 0x8945 }, + { 24, "iPad3,3", "j2aap", 0x04, 0x8945 }, + { 25, "iPad3,4", "p101ap", 0x00, 0x8955 }, + { 26, "iPad3,5", "p102ap", 0x02, 0x8955 }, + { 27, "iPad3,6", "p103ap", 0x04, 0x8955 }, + { 28, "AppleTV2,1", "k66ap", 0x10, 0x8930 }, + { 29, "AppleTV3,1", "j33ap", 0x08, 0x8942 }, { -1, NULL, NULL, -1, -1 } }; diff --git a/src/libirecovery.c b/src/libirecovery.c index f2c8798..fa16f70 100644 --- a/src/libirecovery.c +++ b/src/libirecovery.c @@ -1501,171 +1501,20 @@ irecv_error_t irecv_get_device(irecv_client_t client, irecv_device_t* device) { int device_id = DEVICE_UNKNOWN; uint32_t bdid = 0; uint32_t cpid = 0; + int i = 0; if (irecv_get_cpid(client, &cpid) < 0) { return IRECV_E_UNKNOWN_ERROR; } - switch (cpid) { - case CPID_IPHONE2G: - // iPhone1,1 iPhone1,2 and iPod1,1 all share the same ChipID - // so we need to check the BoardID - if (irecv_get_bdid(client, &bdid) < 0) { - break; - } - - switch (bdid) { - case BDID_IPHONE2G: - device_id = DEVICE_IPHONE2G; - break; - - case BDID_IPHONE3G: - device_id = DEVICE_IPHONE3G; - break; - - case BDID_IPOD1G: - device_id = DEVICE_IPOD1G; - break; - - default: - device_id = DEVICE_UNKNOWN; - break; - } - break; - - case CPID_IPHONE3GS: - device_id = DEVICE_IPHONE3GS; - break; - - case CPID_IPOD2G: - device_id = DEVICE_IPOD2G; - break; - - case CPID_IPOD3G: - device_id = DEVICE_IPOD3G; - break; - - case CPID_IPAD1G: - // iPhone3,1 iPhone3,3 iPad4,1 and iPad1,1 all share the same ChipID - // so we need to check the BoardID - if (irecv_get_bdid(client, &bdid) < 0) { - break; - } - - switch (bdid) { - case BDID_IPAD1G: - device_id = DEVICE_IPAD1G; - break; - - case BDID_IPHONE4: - device_id = DEVICE_IPHONE4; - break; - - case BDID_IPOD4G: - device_id = DEVICE_IPOD4G; - break; - - case BDID_APPLETV2: - device_id = DEVICE_APPLETV2; - break; - - case BDID_IPHONE42: - device_id = DEVICE_IPHONE42; - break; - - default: - device_id = DEVICE_UNKNOWN; - break; - } - break; - - case CPID_IPAD21: - // iPad2,1 iPad2,2 iPad2,3 and iPhone4,1 share the same ChipID, so we need to check the BoardID - if (irecv_get_bdid(client, &bdid) < 0) { - break; - } - - switch (bdid) { - case BDID_IPAD21: - device_id = DEVICE_IPAD21; - break; - - case BDID_IPAD22: - device_id = DEVICE_IPAD22; - break; - - case BDID_IPAD23: - device_id = DEVICE_IPAD23; - break; - - case BDID_IPHONE4S: - device_id = DEVICE_IPHONE4S; - break; - - default: - device_id = DEVICE_UNKNOWN; - break; - } - break; - - case CPID_APPLETV31: - // AppleTV 3rd gen. iPad2,4, iPad 2,5 and iPod5,1 share the same ChipID, so we need to check the BoardID - if (irecv_get_bdid(client, &bdid) < 0) { - break; - } - switch (bdid) { - case BDID_APPLETV31: - device_id = DEVICE_APPLETV31; - break; - case BDID_IPAD24: - device_id = DEVICE_IPAD24; - break; - case BDID_IPAD25: - device_id = DEVICE_IPAD25; - break; - case BDID_IPOD5G: - device_id = DEVICE_IPOD5G; - break; - default: - device_id = DEVICE_UNKNOWN; - break; - } - break; - - case CPID_IPHONE5: - if (irecv_get_bdid(client, &bdid) < 0) { - break; - } - switch (bdid) { - case BDID_IPHONE51: - device_id = DEVICE_IPHONE51; - break; - case BDID_IPHONE52: - device_id = DEVICE_IPHONE52; - break; - default: - device_id = DEVICE_UNKNOWN; - break; - } - break; + if (irecv_get_bdid(client, &bdid) < 0) { + return IRECV_E_UNKNOWN_ERROR; + } - case CPID_IPAD34: - if (irecv_get_bdid(client, &bdid) < 0) { - break; - } - switch (bdid) { - case BDID_IPAD34: - device_id = DEVICE_IPAD34; - break; - default: - device_id = DEVICE_UNKNOWN; - break; + for (i = 0; irecv_devices[i].model != NULL; i++) { + if (irecv_devices[i].chip_id == cpid && irecv_devices[i].board_id == bdid) { + device_id = irecv_devices[i].index; } - break; - - default: - device_id = DEVICE_UNKNOWN; - break; } *device = &irecv_devices[device_id]; -- cgit v1.1-32-gdbae