diff options
Diffstat (limited to '')
-rw-r--r-- | heimdall/source/BridgeManager.cpp | 155 | ||||
-rw-r--r-- | heimdall/source/BridgeManager.h | 11 | ||||
-rw-r--r-- | heimdall/source/EndFileTransferPacket.h | 16 | ||||
-rw-r--r-- | heimdall/source/FlashAction.cpp | 2 | ||||
-rw-r--r-- | heimdall/source/Interface.cpp | 3 | ||||
-rw-r--r-- | libpit/Source/libpit.h | 3 |
6 files changed, 106 insertions, 84 deletions
diff --git a/heimdall/source/BridgeManager.cpp b/heimdall/source/BridgeManager.cpp index ed12b87..49dde7f 100644 --- a/heimdall/source/BridgeManager.cpp +++ b/heimdall/source/BridgeManager.cpp @@ -307,51 +307,99 @@ void BridgeManager::ReleaseDeviceInterface(void) Interface::Print("\n"); } -bool BridgeManager::InitialiseProtocol(void) +enum { - Interface::Print("Initialising protocol...\n"); + kControlRequestSetLineCoding = 0x20, + kControlRequestSetControlLineState = 0x22 +}; - unsigned char dataBuffer[7]; - int result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, 0x22, 0x3, 0, nullptr, 0, 1000); +enum +{ + kLineCodingCharFormatZeroToOneStopBit = 0, + kLineCodingCharFormatOneToOneAndAHalfStopBits = 1, + kLineCodingCharFormatTwoToTwoAndAHalfStopBits = 2 +}; - if (result < 0 && verbose) - Interface::PrintWarning("Control transfer #1 failed. Result: %d\n", result); +enum +{ + kParityTypeNone = 0, + kParityTypeOdd = 1, + kParityTypeEven = 2, + kParityTypeMark = 3, + kParityTypeSpace = 4 +}; - memset(dataBuffer, 0, 7); - dataBuffer[1] = 0xC2; - dataBuffer[2] = 0x01; - dataBuffer[6] = 0x07; +bool BridgeManager::SetControlLineState(unsigned short controlSignalFlags) +{ + int result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, kControlRequestSetControlLineState, controlSignalFlags, 0, nullptr, 0, 1000); - result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, 0x20, 0x0, 0, dataBuffer, 7, 1000); + if (result != LIBUSB_SUCCESS) + { + if (verbose) + Interface::PrintWarning("Control line state (signal flags: 0x%x) transfer failed. Result: %d\n", controlSignalFlags, result); - if (result < 0 && verbose) - Interface::PrintWarning("Control transfer #2 failed. Result: %d\n", result); + return (false); + } + else + { + return (true); + } +} + +bool BridgeManager::SetControlLineCoding(LineCoding lineCoding) +{ + unsigned char dataBuffer[7]; + + dataBuffer[0] = lineCoding.dteRate & 0xFF; + dataBuffer[1] = (lineCoding.dteRate >> 8) & 0xFF; + dataBuffer[2] = (lineCoding.dteRate >> 16) & 0xFF; + dataBuffer[3] = (lineCoding.dteRate >> 24) & 0xFF; + dataBuffer[4] = lineCoding.charFormat; + dataBuffer[5] = lineCoding.parityType; + dataBuffer[6] = lineCoding.dataBits; - result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, 0x22, 0x3, 0, nullptr, 0, 1000); + int result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, kControlRequestSetLineCoding, 0x0, 0, dataBuffer, 7, 1000); - if (result < 0 && verbose) - Interface::PrintWarning("Control transfer #3 failed. Result: %d\n", result); + if (result != LIBUSB_SUCCESS) + { + if (verbose) + Interface::PrintWarning("Setting control line coding failed. Result: %d\n", result); - result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, 0x22, 0x2, 0, nullptr, 0, 1000); + return (false); + } + else + { + return (true); + } +} - if (result < 0 && verbose) - Interface::PrintWarning("Control transfer #4 failed. Result: %d\n", result); +enum +{ + kLineStateControlSignalDtePresent = 1, + kLineStateControlSignalCarrierControl = 1 << 1 +}; - memset(dataBuffer, 0, 7); - dataBuffer[1] = 0xC2; - dataBuffer[2] = 0x01; - dataBuffer[6] = 0x08; +bool BridgeManager::InitialiseProtocol(void) +{ + Interface::Print("Initialising protocol...\n"); - result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, 0x20, 0x0, 0, dataBuffer, 7, 1000); + LineCoding lineCoding; - if (result < 0 && verbose) - Interface::PrintWarning("Control transfer #5 failed. Result: %d\n", result); + lineCoding.dteRate = 115200; + lineCoding.charFormat = kLineCodingCharFormatZeroToOneStopBit; + lineCoding.parityType = kParityTypeNone; + lineCoding.dataBits = 7; - result = libusb_control_transfer(deviceHandle, LIBUSB_REQUEST_TYPE_CLASS, 0x22, 0x2, 0, nullptr, 0, 1000); + SetControlLineState(kLineStateControlSignalDtePresent | kLineStateControlSignalCarrierControl); + SetControlLineCoding(lineCoding); + SetControlLineState(kLineStateControlSignalDtePresent | kLineStateControlSignalCarrierControl); + SetControlLineState(kLineStateControlSignalCarrierControl); + + lineCoding.dataBits = 8; + SetControlLineCoding(lineCoding); - if (result < 0 && verbose) - Interface::PrintWarning("Control transfer #6 failed. Result: %d\n", result); + SetControlLineState(kLineStateControlSignalCarrierControl); unsigned int attempt = 0; @@ -371,12 +419,13 @@ bool BridgeManager::InitialiseProtocol(void) int dataTransferred = 0; + unsigned char dataBuffer[7]; + // Send "ODIN" memcpy(dataBuffer, "ODIN", 4); memset(dataBuffer + 4, 0, 1); - result = libusb_bulk_transfer(deviceHandle, outEndpoint, dataBuffer, 4, &dataTransferred, 1000); - if (result < 0) + if (libusb_bulk_transfer(deviceHandle, outEndpoint, dataBuffer, 4, &dataTransferred, 1000) != LIBUSB_SUCCESS) { if (verbose) Interface::PrintError("Failed to send data: \"%s\"\n", dataBuffer); @@ -402,9 +451,7 @@ bool BridgeManager::InitialiseProtocol(void) int retry = 0; dataTransferred = 0; - result = libusb_bulk_transfer(deviceHandle, inEndpoint, dataBuffer, 7, &dataTransferred, 1000); - - if (result < 0) + if (libusb_bulk_transfer(deviceHandle, inEndpoint, dataBuffer, 7, &dataTransferred, 1000) != LIBUSB_SUCCESS) { if (verbose) Interface::PrintError("Failed to receive handshake response."); @@ -652,46 +699,6 @@ bool BridgeManager::BeginSession(void) } } - // -------------------- KIES DOESN'T DO THIS -------------------- - - /*DeviceTypePacket deviceTypePacket; - - if (!SendPacket(&deviceTypePacket)) - { - Interface::PrintError("Failed to request device type!\n"); - return (false); - } - - SessionSetupResponse deviceTypeResponse; - - if (!ReceivePacket(&deviceTypeResponse)) - return (false); - - unsigned int deviceType = deviceTypeResponse.GetResult(); - - switch (deviceType) - { - // NOTE: If you add a new device type don't forget to update the error message below! - - case 0: // Galaxy S etc. - case 3: // Galaxy Tab - case 30: // Galaxy S 2 Skyrocket - case 180: // Galaxy S etc. - case 190: // M110S Galaxy S - - if (verbose) - Interface::Print("Session begun with device of type: %d.\n\n", deviceType); - else - Interface::Print("Session begun.\n\n"); - - return (true); - - default: - - Interface::PrintError("Unexpected device info response!\nExpected: 0, 3, 30, 180 or 190\nReceived:%d\n", deviceType); - return (false); - }*/ - Interface::Print("Session begun.\n\n"); return (true); } diff --git a/heimdall/source/BridgeManager.h b/heimdall/source/BridgeManager.h index e67c679..1f88cdc 100644 --- a/heimdall/source/BridgeManager.h +++ b/heimdall/source/BridgeManager.h @@ -94,6 +94,14 @@ namespace Heimdall Default = Error
};
+ typedef struct
+ {
+ unsigned int dteRate;
+ unsigned char charFormat;
+ unsigned char parityType;
+ unsigned char dataBits;
+ } LineCoding;
+
private:
static const DeviceIdentifier supportedDevices[kSupportedDeviceCount];
@@ -131,6 +139,9 @@ namespace Heimdall bool InitialiseProtocol(void);
+ bool SetControlLineState(unsigned short controlSignalFlags);
+ bool SetControlLineCoding(LineCoding lineCoding);
+
public:
BridgeManager(bool verbose, int communicationDelay = BridgeManager::kCommunicationDelayDefault);
diff --git a/heimdall/source/EndFileTransferPacket.h b/heimdall/source/EndFileTransferPacket.h index 7e78899..9ae4a44 100644 --- a/heimdall/source/EndFileTransferPacket.h +++ b/heimdall/source/EndFileTransferPacket.h @@ -34,7 +34,7 @@ namespace Heimdall {
kDestinationPhone = 0x00,
kDestinationModem = 0x01
- };
+ };
protected:
@@ -47,18 +47,18 @@ namespace Heimdall unsigned int destination; // PDA / Modem
unsigned int sequenceByteCount;
- unsigned int unknown1;
- unsigned int chipIdentifier;
+ unsigned int unknown1; // EFS?
+ unsigned int deviceType;
protected:
- EndFileTransferPacket(unsigned int destination, unsigned int sequenceByteCount, unsigned int unknown1, unsigned int chipIdentifier)
+ EndFileTransferPacket(unsigned int destination, unsigned int sequenceByteCount, unsigned int unknown1, unsigned int deviceType)
: FileTransferPacket(FileTransferPacket::kRequestEnd)
{
this->destination = destination;
this->sequenceByteCount = sequenceByteCount;
this->unknown1 = unknown1;
- this->chipIdentifier = chipIdentifier;
+ this->deviceType = deviceType;
}
public:
@@ -78,9 +78,9 @@ namespace Heimdall return (unknown1);
}
- unsigned int GetChipIdentifier(void) const
+ unsigned int GetDeviceType(void) const
{
- return (chipIdentifier);
+ return (deviceType);
}
virtual void Pack(void)
@@ -90,7 +90,7 @@ namespace Heimdall PackInteger(FileTransferPacket::kDataSize, destination);
PackInteger(FileTransferPacket::kDataSize + 4, sequenceByteCount);
PackInteger(FileTransferPacket::kDataSize + 8, unknown1);
- PackInteger(FileTransferPacket::kDataSize + 12, chipIdentifier);
+ PackInteger(FileTransferPacket::kDataSize + 12, deviceType);
}
};
}
diff --git a/heimdall/source/FlashAction.cpp b/heimdall/source/FlashAction.cpp index 6f2d49b..e951d4e 100644 --- a/heimdall/source/FlashAction.cpp +++ b/heimdall/source/FlashAction.cpp @@ -251,7 +251,7 @@ static bool flashFile(BridgeManager *bridgeManager, const PartitionFlashInfo& pa Interface::Print("Uploading %s\n", partitionFlashInfo.pitEntry->GetPartitionName()); if (bridgeManager->SendFile(partitionFlashInfo.file, EndModemFileTransferPacket::kDestinationModem, - partitionFlashInfo.pitEntry->GetDeviceType())) // <-- Odin method + partitionFlashInfo.pitEntry->GetDeviceType())) { Interface::Print("%s upload successful\n\n", partitionFlashInfo.pitEntry->GetPartitionName()); return (true); diff --git a/heimdall/source/Interface.cpp b/heimdall/source/Interface.cpp index dbf8431..910f346 100644 --- a/heimdall/source/Interface.cpp +++ b/heimdall/source/Interface.cpp @@ -264,6 +264,9 @@ void Interface::PrintPit(const PitData *pitData) if (entry->GetAttributes() & PitEntry::kAttributeSTL) Interface::Print("STL "); + /*if (entry->GetAttributes() & PitEntry::kAttributeBML) + Interface::Print("BML ");*/ + if (entry->GetAttributes() & PitEntry::kAttributeWrite) Interface::Print("Read/Write"); else diff --git a/libpit/Source/libpit.h b/libpit/Source/libpit.h index c7bfe8b..2001407 100644 --- a/libpit/Source/libpit.h +++ b/libpit/Source/libpit.h @@ -69,7 +69,8 @@ namespace libpit enum { kAttributeWrite = 1, - kAttributeSTL = 1 << 1 + kAttributeSTL = 1 << 1/*, + kAttributeBML = 1 << 2*/ // ??? }; enum |