Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Wed Sep 11 11:55:51 2013 +0000
Revision:
4:682d96ff6d79
Child:
5:1775b4b13232
This update adds T8 CAN DUMP and FLASH capability (recovery still to do)

Who changed what in which revision?

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