Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Sat Apr 23 18:31:40 2016 +0000
Revision:
6:2fbcbebed28c
Parent:
5:1775b4b13232
Version 1.6 Faster T7 P-BUS FLASHing algorithm, longer T8 erase timeout fixed BDM register display function

Who changed what in which revision?

UserRevisionLine numberNew 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 }