Sophie Dexter
/
Just4Trionic
Just4Trionic - CAN and BDM FLASH programmer for Saab cars
gmlan.cpp@5:1775b4b13232, 2015-04-25 (annotated)
- Committer:
- Just4pLeisure
- Date:
- Sat Apr 25 17:07:08 2015 +0000
- Revision:
- 5:1775b4b13232
- Parent:
- 4:682d96ff6d79
Version 1.5 Is a significant milestone.; ; Supports BDM and CAN read and write of T5.x, T7 and T8 ECU's plus T8 recovery.; A Target Resident Driver for BDM gives a big speed boost.; Supports many alternative replacement FLASH chips for T5.x ECU's;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Just4pLeisure | 4:682d96ff6d79 | 1 | #include "gmlan.h" |
Just4pLeisure | 4:682d96ff6d79 | 2 | |
Just4pLeisure | 5:1775b4b13232 | 3 | Timer GMLANtimer; |
Just4pLeisure | 5:1775b4b13232 | 4 | |
Just4pLeisure | 5:1775b4b13232 | 5 | |
Just4pLeisure | 4:682d96ff6d79 | 6 | void GMLANTesterPresentAll() |
Just4pLeisure | 4:682d96ff6d79 | 7 | { |
Just4pLeisure | 4:682d96ff6d79 | 8 | char GMLANMsg[] = GMLANTesterPresentFunctional; |
Just4pLeisure | 4:682d96ff6d79 | 9 | can_send_timeout(GMLANALLNODES, GMLANMsg, 3, GMLANPTCT); |
Just4pLeisure | 4:682d96ff6d79 | 10 | ACTIVITYLEDON; |
Just4pLeisure | 4:682d96ff6d79 | 11 | } |
Just4pLeisure | 4:682d96ff6d79 | 12 | |
Just4pLeisure | 5:1775b4b13232 | 13 | void GMLANTesterPresent(uint32_t ReqID, uint32_t RespID) |
Just4pLeisure | 4:682d96ff6d79 | 14 | { |
Just4pLeisure | 4:682d96ff6d79 | 15 | char GMLANMsg[] = GMLANTesterPresentPhysical; |
Just4pLeisure | 5:1775b4b13232 | 16 | can_send_timeout(ReqID, GMLANMsg, 2, GMLANPTCT); |
Just4pLeisure | 5:1775b4b13232 | 17 | can_wait_timeout(RespID, GMLANMsg, 2, GMLANPTCT); |
Just4pLeisure | 4:682d96ff6d79 | 18 | ACTIVITYLEDON; |
Just4pLeisure | 4:682d96ff6d79 | 19 | } |
Just4pLeisure | 4:682d96ff6d79 | 20 | |
Just4pLeisure | 4:682d96ff6d79 | 21 | // All steps needed in preparation for using a bootloader ('Utility File' in GMLAN parlance) |
Just4pLeisure | 5:1775b4b13232 | 22 | bool GMLANprogrammingSetupProcess(uint32_t ReqID, uint32_t RespID) |
Just4pLeisure | 4:682d96ff6d79 | 23 | { |
Just4pLeisure | 5:1775b4b13232 | 24 | GMLANTesterPresent(ReqID, RespID); |
Just4pLeisure | 4:682d96ff6d79 | 25 | printf("Starting Diagnostic session\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 26 | if (!GMLANinitiateDiagnostic(ReqID, RespID, GMLANdisableAllDTCs)) { |
Just4pLeisure | 4:682d96ff6d79 | 27 | printf("Unable to start Diagnostic session\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 28 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 29 | } |
Just4pLeisure | 4:682d96ff6d79 | 30 | printf("Disabling Normal Communincation Messages\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 31 | if (!GMLANdisableNormalCommunication(ReqID, RespID)) { |
Just4pLeisure | 4:682d96ff6d79 | 32 | printf("Unable to tell T8 to disable normal communication messages\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 33 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 34 | } |
Just4pLeisure | 4:682d96ff6d79 | 35 | printf("Report Programmed State\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 36 | if (!GMLANReportProgrammedState(ReqID, RespID)) { |
Just4pLeisure | 4:682d96ff6d79 | 37 | printf("Unable to determine ECU programmed state\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 38 | } |
Just4pLeisure | 4:682d96ff6d79 | 39 | printf("Requesting program mode\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 40 | if (!GMLANProgrammingMode(ReqID, RespID, GMLANRequestProgrammingNormal)) { |
Just4pLeisure | 4:682d96ff6d79 | 41 | printf("Unable to request programming mode\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 42 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 43 | } |
Just4pLeisure | 4:682d96ff6d79 | 44 | printf("Starting program session\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 45 | if (!GMLANProgrammingMode(ReqID, RespID, GMLANEnableProgrammingMode)) { |
Just4pLeisure | 4:682d96ff6d79 | 46 | printf("Unable to start program session\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 47 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 48 | } |
Just4pLeisure | 5:1775b4b13232 | 49 | wait_ms(500); // was 5 |
Just4pLeisure | 4:682d96ff6d79 | 50 | return TRUE; |
Just4pLeisure | 4:682d96ff6d79 | 51 | } |
Just4pLeisure | 4:682d96ff6d79 | 52 | |
Just4pLeisure | 4:682d96ff6d79 | 53 | |
Just4pLeisure | 4:682d96ff6d79 | 54 | // All steps needed to transfer and start a bootloader ('Utility File' in GMLAN parlance) |
Just4pLeisure | 5:1775b4b13232 | 55 | bool GMLANprogrammingUtilityFileProcess(uint32_t ReqID, uint32_t RespID, const uint8_t UtilityFile[]) |
Just4pLeisure | 4:682d96ff6d79 | 56 | { |
Just4pLeisure | 4:682d96ff6d79 | 57 | uint16_t i = 0, j = 0, k = 0; |
Just4pLeisure | 4:682d96ff6d79 | 58 | uint32_t StartAddress = 0x102400; |
Just4pLeisure | 4:682d96ff6d79 | 59 | uint16_t txpnt = 0; |
Just4pLeisure | 4:682d96ff6d79 | 60 | char iFrameNumber = 0x21; |
Just4pLeisure | 4:682d96ff6d79 | 61 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 62 | // |
Just4pLeisure | 5:1775b4b13232 | 63 | GMLANTesterPresent(ReqID, RespID); |
Just4pLeisure | 5:1775b4b13232 | 64 | GMLANtimer.start(); |
Just4pLeisure | 4:682d96ff6d79 | 65 | printf("Waiting for Permission to send bootloader\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 66 | wait_ms(500); |
Just4pLeisure | 5:1775b4b13232 | 67 | if (!GMLANRequestDownload(ReqID, RespID, GMLANRequestDownloadModeNormal)) { |
Just4pLeisure | 4:682d96ff6d79 | 68 | printf("Unable to request Bootloader Upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 69 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 70 | } |
Just4pLeisure | 4:682d96ff6d79 | 71 | printf("Sending Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 72 | printf(" 0.00 %% complete.\r"); |
Just4pLeisure | 4:682d96ff6d79 | 73 | // |
Just4pLeisure | 4:682d96ff6d79 | 74 | for (i=0; i<0x46; i++) { |
Just4pLeisure | 5:1775b4b13232 | 75 | if (!GMLANDataTransferFirstFrame(ReqID, RespID, 0xF0, GMLANDOWNLOAD, StartAddress)) { |
Just4pLeisure | 4:682d96ff6d79 | 76 | printf("Unable to start Bootloader Upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 77 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 78 | } |
Just4pLeisure | 4:682d96ff6d79 | 79 | iFrameNumber = 0x21; |
Just4pLeisure | 4:682d96ff6d79 | 80 | for (j=0; j < 0x22; j++) { |
Just4pLeisure | 4:682d96ff6d79 | 81 | GMLANMsg[0] = iFrameNumber; |
Just4pLeisure | 4:682d96ff6d79 | 82 | for (k=1; k<8; k++) |
Just4pLeisure | 4:682d96ff6d79 | 83 | GMLANMsg[k] = UtilityFile[txpnt++]; |
Just4pLeisure | 5:1775b4b13232 | 84 | if (!can_send_timeout(ReqID, GMLANMsg, 8, GMLANPTCT)) { |
Just4pLeisure | 4:682d96ff6d79 | 85 | printf("Unable to send Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 86 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 87 | } |
Just4pLeisure | 4:682d96ff6d79 | 88 | ++iFrameNumber &= 0x2F; |
Just4pLeisure | 5:1775b4b13232 | 89 | wait_ms(2); // was 2 |
Just4pLeisure | 4:682d96ff6d79 | 90 | } |
Just4pLeisure | 5:1775b4b13232 | 91 | if (!GMLANDataTransferBlockAcknowledge(RespID)) |
Just4pLeisure | 4:682d96ff6d79 | 92 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 93 | if (GMLANtimer.read_ms() > 2000) { |
Just4pLeisure | 5:1775b4b13232 | 94 | GMLANTesterPresent(ReqID, RespID); |
Just4pLeisure | 5:1775b4b13232 | 95 | GMLANtimer.reset(); |
Just4pLeisure | 4:682d96ff6d79 | 96 | } |
Just4pLeisure | 4:682d96ff6d79 | 97 | StartAddress += 0xea; |
Just4pLeisure | 4:682d96ff6d79 | 98 | printf("%6.2f\r", 100*(float)txpnt/(float)(16384+(70*4)) ); |
Just4pLeisure | 4:682d96ff6d79 | 99 | } |
Just4pLeisure | 4:682d96ff6d79 | 100 | wait_ms(1); |
Just4pLeisure | 5:1775b4b13232 | 101 | if (!GMLANDataTransferFirstFrame(ReqID, RespID, 0x0A, GMLANDOWNLOAD, StartAddress)) { |
Just4pLeisure | 4:682d96ff6d79 | 102 | printf("Unable to finish Bootloader Upload\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 103 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 104 | } |
Just4pLeisure | 4:682d96ff6d79 | 105 | iFrameNumber = 0x21; |
Just4pLeisure | 4:682d96ff6d79 | 106 | GMLANMsg[0] = iFrameNumber; |
Just4pLeisure | 4:682d96ff6d79 | 107 | for (k=0; k<7; k++) { |
Just4pLeisure | 4:682d96ff6d79 | 108 | GMLANMsg[k+1] = UtilityFile[txpnt++]; |
Just4pLeisure | 4:682d96ff6d79 | 109 | } |
Just4pLeisure | 5:1775b4b13232 | 110 | if (!can_send_timeout(ReqID, GMLANMsg, 8, GMLANPTCT)) { |
Just4pLeisure | 4:682d96ff6d79 | 111 | printf("Unable to finish sending Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 112 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 113 | } |
Just4pLeisure | 5:1775b4b13232 | 114 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 115 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 116 | printf("%6.2f\r\n", (float)100 ); |
Just4pLeisure | 4:682d96ff6d79 | 117 | printf("Starting the bootloader\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 118 | if (!GMLANDataTransfer(ReqID, RespID, 0x06, GMLANEXECUTE, 0x00102460)) { |
Just4pLeisure | 4:682d96ff6d79 | 119 | printf("Unable to start the Bootloader\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 120 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 121 | } |
Just4pLeisure | 5:1775b4b13232 | 122 | wait_ms(500); // was 100 |
Just4pLeisure | 4:682d96ff6d79 | 123 | return TRUE; |
Just4pLeisure | 4:682d96ff6d79 | 124 | } |
Just4pLeisure | 4:682d96ff6d79 | 125 | |
Just4pLeisure | 5:1775b4b13232 | 126 | bool GMLANinitiateDiagnostic(uint32_t ReqID, uint32_t RespID, char level) |
Just4pLeisure | 4:682d96ff6d79 | 127 | { |
Just4pLeisure | 4:682d96ff6d79 | 128 | char GMLANMsg[] = GMLANinitiateDiagnosticOperation; |
Just4pLeisure | 4:682d96ff6d79 | 129 | GMLANMsg[2] = level; |
Just4pLeisure | 5:1775b4b13232 | 130 | if (!can_send_timeout(ReqID, GMLANMsg, 3, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 131 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 132 | if (ReqID == T8USDTREQID) return TRUE; |
Just4pLeisure | 5:1775b4b13232 | 133 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 134 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 135 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x10 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 136 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 137 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 138 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x10 ) |
Just4pLeisure | 4:682d96ff6d79 | 139 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 140 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x50) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 141 | } |
Just4pLeisure | 4:682d96ff6d79 | 142 | |
Just4pLeisure | 4:682d96ff6d79 | 143 | |
Just4pLeisure | 5:1775b4b13232 | 144 | bool GMLANdisableNormalCommunication(uint32_t ReqID, uint32_t RespID) |
Just4pLeisure | 4:682d96ff6d79 | 145 | { |
Just4pLeisure | 4:682d96ff6d79 | 146 | char GMLANMsg[] = GMLANdisableCommunication; |
Just4pLeisure | 5:1775b4b13232 | 147 | if (!can_send_timeout(ReqID, GMLANMsg, 2, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 148 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 149 | if (ReqID == T8USDTREQID) return TRUE; |
Just4pLeisure | 5:1775b4b13232 | 150 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 5:1775b4b13232 | 151 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 152 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x28 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 153 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 154 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 155 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x28 ) |
Just4pLeisure | 4:682d96ff6d79 | 156 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 157 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x68) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 158 | } |
Just4pLeisure | 4:682d96ff6d79 | 159 | |
Just4pLeisure | 4:682d96ff6d79 | 160 | |
Just4pLeisure | 5:1775b4b13232 | 161 | bool GMLANReportProgrammedState(uint32_t ReqID, uint32_t RespID) |
Just4pLeisure | 4:682d96ff6d79 | 162 | { |
Just4pLeisure | 4:682d96ff6d79 | 163 | char GMLANMsg[] = GMLANReportProgrammed; |
Just4pLeisure | 5:1775b4b13232 | 164 | if (!can_send_timeout(ReqID, GMLANMsg, 2, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 165 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 166 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 167 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 168 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0xA2 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 169 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 170 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 171 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0xA2 ) |
Just4pLeisure | 4:682d96ff6d79 | 172 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 173 | return (GMLANMsg[0] == 0x02 && GMLANMsg[1] == 0xE2) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 174 | } |
Just4pLeisure | 4:682d96ff6d79 | 175 | |
Just4pLeisure | 4:682d96ff6d79 | 176 | |
Just4pLeisure | 5:1775b4b13232 | 177 | bool GMLANProgrammingMode(uint32_t ReqID, uint32_t RespID, char mode) |
Just4pLeisure | 4:682d96ff6d79 | 178 | { |
Just4pLeisure | 4:682d96ff6d79 | 179 | char GMLANMsg[] = GMLANProgramming; |
Just4pLeisure | 4:682d96ff6d79 | 180 | GMLANMsg[2] = mode; |
Just4pLeisure | 5:1775b4b13232 | 181 | if (!can_send_timeout(ReqID, GMLANMsg, 3, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 182 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 183 | if (mode == GMLANEnableProgrammingMode) |
Just4pLeisure | 4:682d96ff6d79 | 184 | return TRUE; // No response expected when enabling program mode |
Just4pLeisure | 5:1775b4b13232 | 185 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 186 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 187 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0xA5 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 188 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 189 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 190 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0xA5 ) |
Just4pLeisure | 4:682d96ff6d79 | 191 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 192 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0xE5) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 193 | } |
Just4pLeisure | 4:682d96ff6d79 | 194 | |
Just4pLeisure | 5:1775b4b13232 | 195 | bool GMLANSecurityAccessRequest(uint32_t ReqID, uint32_t RespID, char level, uint16_t& seed) |
Just4pLeisure | 4:682d96ff6d79 | 196 | { |
Just4pLeisure | 4:682d96ff6d79 | 197 | char GMLANMsg[] = GMLANSecurityAccessSeed; |
Just4pLeisure | 4:682d96ff6d79 | 198 | GMLANMsg[2] = level; |
Just4pLeisure | 5:1775b4b13232 | 199 | if (!can_send_timeout(ReqID, GMLANMsg, 3, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 200 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 201 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 202 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 203 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x27 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 204 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 205 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 206 | seed = GMLANMsg[3] << 8 | GMLANMsg[4]; |
Just4pLeisure | 4:682d96ff6d79 | 207 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x27 ) |
Just4pLeisure | 4:682d96ff6d79 | 208 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 209 | return (GMLANMsg[0] == 0x04 && GMLANMsg[1] == 0x67 && GMLANMsg[2] == level) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 210 | } |
Just4pLeisure | 4:682d96ff6d79 | 211 | |
Just4pLeisure | 5:1775b4b13232 | 212 | bool GMLANSecurityAccessSendKey(uint32_t ReqID, uint32_t RespID, char level, uint16_t key) |
Just4pLeisure | 4:682d96ff6d79 | 213 | { |
Just4pLeisure | 4:682d96ff6d79 | 214 | char GMLANMsg[] = GMLANSecurityAccessKey; |
Just4pLeisure | 4:682d96ff6d79 | 215 | GMLANMsg[2] = level+1; |
Just4pLeisure | 4:682d96ff6d79 | 216 | GMLANMsg[3] = (key >> 8) & 0xFF; |
Just4pLeisure | 4:682d96ff6d79 | 217 | GMLANMsg[4] = key & 0xFF; |
Just4pLeisure | 5:1775b4b13232 | 218 | if (!can_send_timeout(ReqID, GMLANMsg, 5, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 219 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 220 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 221 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 222 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x27 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 223 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 224 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 225 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x27 ) |
Just4pLeisure | 4:682d96ff6d79 | 226 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 227 | return (GMLANMsg[0] == 0x02 && GMLANMsg[1] == 0x67 && GMLANMsg[2] == level+1) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 228 | } |
Just4pLeisure | 4:682d96ff6d79 | 229 | |
Just4pLeisure | 5:1775b4b13232 | 230 | bool GMLANRequestDownload(uint32_t ReqID, uint32_t RespID, char dataFormatIdentifier) |
Just4pLeisure | 4:682d96ff6d79 | 231 | { |
Just4pLeisure | 4:682d96ff6d79 | 232 | char GMLANMsg[] = GMLANRequestDownloadMessage; |
Just4pLeisure | 4:682d96ff6d79 | 233 | GMLANMsg[2] = dataFormatIdentifier; |
Just4pLeisure | 5:1775b4b13232 | 234 | if (!can_send_timeout(ReqID, GMLANMsg, 7, GMLANPTCT)) |
Just4pLeisure | 5:1775b4b13232 | 235 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 236 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 237 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 238 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x34 && GMLANMsg[3] == 0x78) { |
Just4pLeisure | 5:1775b4b13232 | 239 | printf("Waiting\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 240 | GMLANTesterPresent(T8REQID, T8RESPID); |
Just4pLeisure | 5:1775b4b13232 | 241 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 242 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 243 | } |
Just4pLeisure | 4:682d96ff6d79 | 244 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x34 ) |
Just4pLeisure | 4:682d96ff6d79 | 245 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 246 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x74) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 247 | } |
Just4pLeisure | 4:682d96ff6d79 | 248 | |
Just4pLeisure | 4:682d96ff6d79 | 249 | |
Just4pLeisure | 5:1775b4b13232 | 250 | bool GMLANDataTransfer(uint32_t ReqID, uint32_t RespID, char length, char function, uint32_t address) |
Just4pLeisure | 4:682d96ff6d79 | 251 | { |
Just4pLeisure | 4:682d96ff6d79 | 252 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 253 | GMLANMsg[0] = length; |
Just4pLeisure | 4:682d96ff6d79 | 254 | GMLANMsg[1] = 0x36; |
Just4pLeisure | 4:682d96ff6d79 | 255 | GMLANMsg[2] = function; |
Just4pLeisure | 4:682d96ff6d79 | 256 | GMLANMsg[3] = (char) (address >> 24); |
Just4pLeisure | 4:682d96ff6d79 | 257 | GMLANMsg[4] = (char) (address >> 16); |
Just4pLeisure | 4:682d96ff6d79 | 258 | GMLANMsg[5] = (char) (address >> 8); |
Just4pLeisure | 4:682d96ff6d79 | 259 | GMLANMsg[6] = (char) (address); |
Just4pLeisure | 4:682d96ff6d79 | 260 | GMLANMsg[7] = 0xaa; |
Just4pLeisure | 5:1775b4b13232 | 261 | if (!can_send_timeout(ReqID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 262 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 263 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 264 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 265 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 266 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 267 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 268 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 ) |
Just4pLeisure | 4:682d96ff6d79 | 269 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 270 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x76) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 271 | } |
Just4pLeisure | 4:682d96ff6d79 | 272 | |
Just4pLeisure | 4:682d96ff6d79 | 273 | |
Just4pLeisure | 5:1775b4b13232 | 274 | bool GMLANDataTransferFirstFrame(uint32_t ReqID, uint32_t RespID, char length, char function, uint32_t address) |
Just4pLeisure | 4:682d96ff6d79 | 275 | { |
Just4pLeisure | 4:682d96ff6d79 | 276 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 277 | GMLANMsg[0] = 0x10; |
Just4pLeisure | 4:682d96ff6d79 | 278 | GMLANMsg[1] = length; |
Just4pLeisure | 4:682d96ff6d79 | 279 | GMLANMsg[2] = 0x36; |
Just4pLeisure | 4:682d96ff6d79 | 280 | GMLANMsg[3] = function; |
Just4pLeisure | 4:682d96ff6d79 | 281 | GMLANMsg[4] = (char) (address >> 24); |
Just4pLeisure | 4:682d96ff6d79 | 282 | GMLANMsg[5] = (char) (address >> 16); |
Just4pLeisure | 4:682d96ff6d79 | 283 | GMLANMsg[6] = (char) (address >> 8); |
Just4pLeisure | 4:682d96ff6d79 | 284 | GMLANMsg[7] = (char) (address); |
Just4pLeisure | 5:1775b4b13232 | 285 | if (!can_send_timeout(ReqID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 286 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 287 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 4:682d96ff6d79 | 288 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 289 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 290 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 4:682d96ff6d79 | 291 | return FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 292 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 ) |
Just4pLeisure | 4:682d96ff6d79 | 293 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 294 | return (GMLANMsg[0] == 0x30 && GMLANMsg[1] == 0x00 && GMLANMsg[2] == 0x00) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 295 | } |
Just4pLeisure | 4:682d96ff6d79 | 296 | |
Just4pLeisure | 4:682d96ff6d79 | 297 | |
Just4pLeisure | 5:1775b4b13232 | 298 | bool GMLANDataTransferConsecutiveFrame(uint32_t ReqID, char framenumber, char data[8]) |
Just4pLeisure | 4:682d96ff6d79 | 299 | { |
Just4pLeisure | 4:682d96ff6d79 | 300 | char GMLANMsg[8]; |
Just4pLeisure | 4:682d96ff6d79 | 301 | GMLANMsg[0] = framenumber; |
Just4pLeisure | 4:682d96ff6d79 | 302 | for (char k = 0; k < 7; k++ ) |
Just4pLeisure | 4:682d96ff6d79 | 303 | GMLANMsg[k+1] = data[k]; |
Just4pLeisure | 5:1775b4b13232 | 304 | return (can_send_timeout(ReqID, GMLANMsg, 8, GMLANPTCT)) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 305 | } |
Just4pLeisure | 4:682d96ff6d79 | 306 | |
Just4pLeisure | 5:1775b4b13232 | 307 | bool GMLANDataTransferBlockAcknowledge(uint32_t RespID) |
Just4pLeisure | 4:682d96ff6d79 | 308 | { |
Just4pLeisure | 5:1775b4b13232 | 309 | char GMLANMsg[8]; |
Just4pLeisure | 5:1775b4b13232 | 310 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) { |
Just4pLeisure | 5:1775b4b13232 | 311 | printf("\r\nI did not receive a block acknowledge message\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 312 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 313 | } |
Just4pLeisure | 5:1775b4b13232 | 314 | if (GMLANMsg[0] != 0x01 && GMLANMsg[1] != 0x76) { |
Just4pLeisure | 5:1775b4b13232 | 315 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 && GMLANMsg[3] == 0x78) { |
Just4pLeisure | 5:1775b4b13232 | 316 | printf("\r\nI'm waiting for a block acknowledge message\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 317 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) { |
Just4pLeisure | 5:1775b4b13232 | 318 | printf("I did not receive a block acknowledge message after enhanced timeout\r\n"); |
Just4pLeisure | 5:1775b4b13232 | 319 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 320 | } |
Just4pLeisure | 5:1775b4b13232 | 321 | } |
Just4pLeisure | 5:1775b4b13232 | 322 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x36 ) { |
Just4pLeisure | 5:1775b4b13232 | 323 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 5:1775b4b13232 | 324 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 325 | } |
Just4pLeisure | 5:1775b4b13232 | 326 | if (GMLANMsg[0] != 0x01 && GMLANMsg[1] != 0x76) { |
Just4pLeisure | 5:1775b4b13232 | 327 | printf("\r\nEXITING due to an unexpected CAN message\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 328 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 329 | } |
Just4pLeisure | 5:1775b4b13232 | 330 | } |
Just4pLeisure | 5:1775b4b13232 | 331 | return TRUE; |
Just4pLeisure | 5:1775b4b13232 | 332 | } |
Just4pLeisure | 5:1775b4b13232 | 333 | |
Just4pLeisure | 5:1775b4b13232 | 334 | bool GMLANReturnToNormalMode(uint32_t ReqID, uint32_t RespID) |
Just4pLeisure | 5:1775b4b13232 | 335 | { |
Just4pLeisure | 5:1775b4b13232 | 336 | char GMLANMsg[] = GMLANReturnToNormalModeMessage; |
Just4pLeisure | 5:1775b4b13232 | 337 | if (!can_send_timeout(ReqID, GMLANMsg, 2, GMLANPTCT)) |
Just4pLeisure | 5:1775b4b13232 | 338 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 339 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCT)) |
Just4pLeisure | 5:1775b4b13232 | 340 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 341 | while (GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x20 && GMLANMsg[3] == 0x78) |
Just4pLeisure | 5:1775b4b13232 | 342 | if (!can_wait_timeout(RespID, GMLANMsg, 8, GMLANPTCTENHANCED)) |
Just4pLeisure | 5:1775b4b13232 | 343 | return FALSE; |
Just4pLeisure | 5:1775b4b13232 | 344 | if ( GMLANMsg[0] == 0x03 && GMLANMsg[1] == 0x7F && GMLANMsg[2] == 0x20 ) |
Just4pLeisure | 4:682d96ff6d79 | 345 | GMLANShowReturnCode(GMLANMsg[3]); |
Just4pLeisure | 4:682d96ff6d79 | 346 | return (GMLANMsg[0] == 0x01 && GMLANMsg[1] == 0x60) ? TRUE : FALSE; |
Just4pLeisure | 4:682d96ff6d79 | 347 | } |
Just4pLeisure | 4:682d96ff6d79 | 348 | |
Just4pLeisure | 4:682d96ff6d79 | 349 | |
Just4pLeisure | 4:682d96ff6d79 | 350 | void GMLANShowReturnCode(char returnCode) |
Just4pLeisure | 4:682d96ff6d79 | 351 | { |
Just4pLeisure | 4:682d96ff6d79 | 352 | switch (returnCode) { |
Just4pLeisure | 4:682d96ff6d79 | 353 | case 0x11 : |
Just4pLeisure | 4:682d96ff6d79 | 354 | printf("0x11 - ServiceNotSupported\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 355 | break; |
Just4pLeisure | 4:682d96ff6d79 | 356 | case 0x12 : |
Just4pLeisure | 4:682d96ff6d79 | 357 | printf("0x12 - SubFunctionNotSupported-InvalidFormat\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 358 | break; |
Just4pLeisure | 4:682d96ff6d79 | 359 | case 0x22 : |
Just4pLeisure | 4:682d96ff6d79 | 360 | printf("0x22 - ConditionsNotCorrectOrRequestSequenceError\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 361 | break; |
Just4pLeisure | 4:682d96ff6d79 | 362 | case 0x31 : |
Just4pLeisure | 4:682d96ff6d79 | 363 | printf("0x31 - RequestOutOfRange\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 364 | break; |
Just4pLeisure | 4:682d96ff6d79 | 365 | case 0x35 : |
Just4pLeisure | 4:682d96ff6d79 | 366 | printf("0x35 - InvalidKey\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 367 | break; |
Just4pLeisure | 4:682d96ff6d79 | 368 | case 0x36 : |
Just4pLeisure | 4:682d96ff6d79 | 369 | printf("0x36 - ExceededNumberOfAttempts, ECU is now locked!\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 370 | break; |
Just4pLeisure | 4:682d96ff6d79 | 371 | case 0x37 : |
Just4pLeisure | 4:682d96ff6d79 | 372 | printf("0x37 - RequiredTimeDelayNotExpired\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 373 | break; |
Just4pLeisure | 4:682d96ff6d79 | 374 | case 0x78 : |
Just4pLeisure | 4:682d96ff6d79 | 375 | printf("0x78 - RequestCorrectlyReceived-ResponsePending\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 376 | break; |
Just4pLeisure | 4:682d96ff6d79 | 377 | case 0x81 : |
Just4pLeisure | 4:682d96ff6d79 | 378 | printf("0x81 - SchedulerFull\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 379 | break; |
Just4pLeisure | 4:682d96ff6d79 | 380 | case 0x83 : |
Just4pLeisure | 4:682d96ff6d79 | 381 | printf("0x83 - VoltageOutOfRangeFault\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 382 | break; |
Just4pLeisure | 4:682d96ff6d79 | 383 | case 0x85 : |
Just4pLeisure | 4:682d96ff6d79 | 384 | printf("0x85 - GeneralProgrammingFailure\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 385 | break; |
Just4pLeisure | 4:682d96ff6d79 | 386 | case 0x99 : |
Just4pLeisure | 4:682d96ff6d79 | 387 | printf("0x99 - ReadyForDownload-DTCStored\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 388 | break; |
Just4pLeisure | 4:682d96ff6d79 | 389 | case 0xE3 : |
Just4pLeisure | 4:682d96ff6d79 | 390 | printf("0xE3 - DeviceControlLimitsExceeded\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 391 | break; |
Just4pLeisure | 4:682d96ff6d79 | 392 | default : |
Just4pLeisure | 4:682d96ff6d79 | 393 | printf("Unknown failure Return Code ?!?\r\n"); |
Just4pLeisure | 4:682d96ff6d79 | 394 | } |
Just4pLeisure | 4:682d96ff6d79 | 395 | } |