General Motors Local Area Network Enhanced Diagnostic Test Mode Specification
General Motors Local Area Network Enhanced Diagnostic Test Mode Specification
ENGINEERING GMW3110
Electrical Function
STANDARDS
February 2010 Originating Department: North American Engineering Standards Page 1 of 336
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.9.4 Supported Negative Response Codes 8.13 TransferData ($36) Service. ................... 161
(RC_)........................................................... 138
8.13.1 Service Description.. ........................ 161
8.9.5 Message Flow Example 8.13.2 Request Message Definition. .......... 162
DisableNormalCommunication. .................. 138
8.13.3 Positive Response Message Definition.
8.9.6 Node Interface Function. ................... 138
.................................................................... 163
8.9.7 Node Verification Procedure. 139
8.13.4 Supported Negative Response Codes
8.9.8 Tester Implications. ............................ 139 (RC_). ......................................................... 163
8.10 DynamicallyDefineMessage ($2C) Service. 8.13.5 Message Flow Example Transfer Data.
........................................................................ 141 .................................................................... 165
8.10.1 Service Description. ......................... 141 8.13.6 Node Interface Function. ................. 167
8.10.2 Request Message Definition ............ 141 8.13.7 Node Verification Procedure. .......... 168
8.10.3 Positive Response Message Definition . 8.13.8 Tester Implications. ......................... 169
.................................................................... 142
8.14 WriteDataByIdentifier ($3B) Service. ..... 170
8.10.4 Supported Negative Response Codes
8.14.1 Service Description. ......................... 170
(RC_)........................................................... 142
8.14.2 Request Message Definition. .......... 170
8.10.5 Message Flow Example(s)
DynamicallyDefineMessage. ...................... 143 8.14.3 Positive Response Message Definition
.................................................................... 171
8.10.6 Node Interface Function. ................. 144
8.14.4 Supported Negative Response Codes
8.10.7 Node Verification Procedure. ........... 147
(RC_).. ........................................................ 171
8.10.8 Tester Implications. .......................... 148 8.14.5 Message Flow Example
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
8.16.5 Message Flow Example 8.20 DeviceControl ($AE) Service. ................ 237
ReportProgrammedState. ........................... 181
8.20.1 Service Description. ......................... 237
8.16.6 Node Interface Function. ................. 182 8.20.2 Request Message Definition. ......... 239
8.16.7 Node Verification Procedure. ........... 184
8.20.3 Positive Response Message Definition
8.16.8 Tester Implications. .......................... 185 .................................................................... 239
8.17 ProgrammingMode ($A5) Service. ......... 186 8.20.4 Supported Negative Response Codes
(RC_). ......................................................... 240
8.17.1 Service Description. ......................... 186
8.20.5 Message Flow Example DeviceControl.
8.17.2 Request Message Definition ............ 187
.................................................................... 241
8.17.3 Positive Response Message Definition.
.................................................................... 187 8.20.6 Node Interface Function. ................. 243
8.20.7 Node Verification Procedure. .......... 246
8.17.4 Supported Negative Response Codes
(RC_)........................................................... 188 8.20.8 Tester Implications. ......................... 247
8.17.5 Message Flow Example - 9 ECU Programming Requirements and Process
ProgrammingMode. .................................... 188 ........................................................................... 247
8.17.6 Node Interface Function. ................. 190 9.1 Programming Requirements .................... 247
8.17.7 Node Verification Procedure. ........... 191 9.1.1 Enabling Diagnostic Responses on
8.17.8 Tester implications. .......................... 194 SPS_TYPE_C ECUs. ................................. 248
9.1.2 Information Contained Within The Utility
8.18 ReadDiagnosticInformation ($A9) Service.
File. ............................................................. 248
........................................................................ 195
8.18.1 Service Description. ......................... 195 9.2 Requirements for All ECUs to Support
Programming. ................................................. 249
8.18.2 Request Message Definition. ........... 197
9.3 Requirements for SPS Programmable ECUs
8.18.3 Positive Response Message Definition. to Support Programming. ............................... 250
.................................................................... 198
9.3.1 Hardware Requirements.................... 250
8.18.4 Supported Negative Response Codes
(RC_)........................................................... 200 9.3.2 Software Requirements. .................... 250
9.3.3 Product Memory (Operational Software
8.18.5 Message Flow Examples -
and Calibration) File Requirements.. .......... 262
ReadDiagnosticInformation......................... 201
8.18.6 Node Interface Function. ................. 204 9.3.4 Utility File Requirements.................... 270
9.3.5 ECU Supplier Requirements. ............ 270
8.18.7 Node Verification Procedure. ........... 209
9.3.6 Assembly Plant Requirements. ......... 270
8.18.8 Tester Implications. .......................... 210
9.4 ECU Programming Process. .................... 271
8.19 ReadDataByPacketIdentifier ($AA) Service.
........................................................................ 211 9.4.1 Read Identification Information Process.
.................................................................... 271
8.19.1 Service Description.. ........................ 211
8.19.2 Request Message Definition. ........... 213 9.4.2 Retrieve SPS Data Process. ............. 273
9.4.3 Programming Session. ...................... 273
8.19.3 Positive Response Message Definition.
.................................................................... 215 9.4.4 Summary. .......................................... 280
8.19.4 Supported Negative Response Codes 9.5 ECU Programming Message Flow Example.
(RC_)........................................................... 217 ........................................................................ 280
8.19.5 Message Flow Example 9.5.1 Request Identification Information
ReadDataByPacketIdentifier. ...................... 217 Process.. ..................................................... 281
8.19.6 Node Interface Function. ................. 221 9.5.2 Programming Session. ...................... 282
8.19.7 Node Verification Procedure. ........... 234 10 Validation ...................................................... 289
8.19.8 Tester Implications. .......................... 235 10.1 General................................................... 289
10.2 Validation Cross Reference Index. ......... 289 E1.3.2 DTC Failure Sub Type (Symptom)
Definition of Additional General Electrical
10.3 Supporting Paragraphs........................... 289
Failures. ...................................................... 329
11 Provisions for Shipping ................................. 289
E1.3.3 DTC Failure Sub Type (Symptom)
12 Notes ............................................................. 289 Definition Of FM/PWM Failures. ................. 330
12.1 Glossary.................................................. 289 E1.3.4 DTC Failure Sub Type (Symptom)
12.1.1 ISO Terms........................................ 289 Definition of ECU Internal Failures. ............ 331
12.1.2 SAE Terms....................................... 289 E1.3.5 DTC Failure Sub Type (Symptom)
Definition of ECU Programming Failures. .. 332
12.1.3 GM Terms ........................................ 289
E1.3.6 DTC Failure Sub Type (Symptom)
12.2 Acronyms, Abbreviations, and Symbols. 290 Definition of Algorithm Based Failures. ...... 333
13 Additional Paragraphs ................................... 290 E1.3.7 DTC Failure Sub Type (Symptom)
13.1 All parts or systems. ............................... 290 Definition of Mechanical Failures................ 334
14 Coding System .............................................. 290 E1.3.8 DTC Failure Sub Type (Symptom)
Definition of Bus Signal Failures................. 335
15 Release and Revisions ................................. 290
E1.4 Requesting New DTC Numbers and/or
15.1 Release................................................... 290 Failure Types.................................................. 336
15.2 Revisions. ............................................... 291
Appendix A: Device Control Limits
Exceeded Return Code Definition ........... 292
A1 The GM Service and Parts Operations (SPO)
Web Page........................................................... 292
Appendix B: Corporate Common CPID
Definitions ................................................ 293
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GMLAN
System
requirement
GMW 3098
GM High GMLAN
SWC Physical
Speed CAN Architecture
Layer
Hardware Specification Physical Layer & Bus Wiring
documents GMW 3089 Specification Specification
GMW 3122 GMW 3173
Enhanced
Diagnostic
Diagnostic Test Mode
documents Specification
GMW 3110
GMLAN
GMLAN GMLAN
Strategy
strategy handler
Validation
Software specification specification
Specification
documents GMW 3104 GMW 3107
GMW 3128
GMLAN
Training
Document
ECU specific information (e.g., Diagnostic subsection of Section 8 - Diagnostic Services (Test
Services required for implementation). Modes) Definiton. The diagnostic service
definitions are structured as follows:
2.3.2 Other Publications.
1. A brief summary of the diagnostic service
OSEK/COM/VDX Communication Specification
intent.
Version 2.2.2
2. A Service Description section which provides
Bosch CAN Specification 2.0a/2.0b
text describing the general functionality of the
diagnostic service and how it should be used
(and implemented).
3. A Request Message Definition section which tells the diagnostic application which functionality is
includes: being requested. A sub-function parameter is used
Tables to define the structure of the request in a tester to ECU request message and when
message. used, shall always occupy the first byte after the
Service Identifier.
A sub-function parameter definition section
with text and table descriptions of any The $Level designation is included in the heading
sub-level functions within the diagnostic to indicate that the pseudo code shall reference the
service. sub-function parameter using $Level as a variable.
3.2 Request Message Data Parameter
A request message data parameter definition
Definition. A request message data parameter is
section with text and table descriptions of any
used to indicate to the ECU diagnostic application
additional data bytes used in the request
which specific information is being requested (e.g.,
message.
specific ECU input or output status variables,
4. A Response Message Definition section which calculated variables, etc.) A request message data
includes: parameter can affect the data contained in a
Tables to define the structure of the positive response message but it does not affect the
response message. functionality of the diagnostic service used to
A response message data parameter definition retrieve it.
section with text and table descriptions of any Example: If a diagnostic service is used to provide
additional data bytes used in the response ECU input statuses, output statuses, etc., then a
message. data parameter would be passed in with the
A section which defines specific negative diagnostic request message to identify which
response codes supported by the test mode inputs, outputs, etc., that the tester is requesting. A
service. sub-function parameter would be contained in the
request message for this service to tell the
5. A Message Flow Example section using diagnostic application if the data is to be sent as a
tables to represent the flow of messages one time response, sent periodically, or to stop
between the tester and target node. sending previously requested data.
6. A Node Interface Function section which 3.3 Positive Response Message Data Parameter
provides: Definition. A data parameter in a positive
An interface data dictionary specific to the message is used to provide the information to the
particular diagnostic service. tester that was requested via a diagnostic request
Interface pseudo code specific to the test message.
mode. 3.4 (Test Mode) Service Identifier (SID)
Suggested verification procedures to validate Overview. Each service (test mode) shall be
proper implementation of the diagnostic identified by its service Identifier (SID).
service. The SID must be included in each diagnostic
A section describing any special case request message.
implications specific to test tools and their Table 1 indicates the different ranges of service
implementation of the diagnostic services. Identifier values, which are defined in
The following provides more detailed descriptions ISO 15031-5/SAE J1979, Keyword Protocol
and examples of specific diagnostic service 2000/GM J2190, by the vehicle manufacturer, or
documentation sections and or table examples. by system supplier.
3.1 Request Message Sub-Function Parameter Table 1 provides an overview about Service
($Level) Definition. A sub-function parameter is Identifier (SID) used by different protocols in
used when a diagnostic service supports multiple relation to GMLAN SID assignments.
levels of functionality. The sub-function parameter
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
3.5 Request and Positive Response Message Table Structure. The description of each service includes a
table which shows the appropriate structure for the request and positive response messages. These tables
define which data byte(s) are applicable for the particular diagnostic service. Tables 2 and 3 are general
examples of the format of these tables.
3.6 Node Interface Function Symbol, Pseudo Code, and Data Dictionary Definition.
3.6.1 Symbol Definition. Table 4 contains a list of all of the symbols used in the pseudo code found in the
ECU Interface Section of each diagnostic service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Symbol Definition
<< Logical bit-wise shift left
$ Prefix for Hexadecimal Number
b Suffix for Binary Number
/* Prefix for a Comment String
*/ Suffix for comment string of more than one line
3.6.2 Pseudo Code Definition. The ECU Interface functions are presented in pseudo code format. This is to
reduce the possibility of multiple interpretations of a diagnostic service (test mode). The indentation practices
in the example functions below shall be followed to enhance readability.
3.6.2.1 Pseudo Code Syntax.
3.6.2.1.1 Decision Statement. Decision statements use the keywords IF, THEN, ELSE, ELSE IF and ENDIF
to control the flow of execution. Included in the parenthesis is a relational expression which can be evaluated
as either TRUE or FALSE. The flow of execution through decision statements is based on the results of the
evaluation of the relational expression(s) contained within them. An example is provided below:
IF (relational expression #1) THEN
body when expression #1 is TRUE
ELSE IF (relational expression #2) THEN
body when expression #2 is TRUE
ELSE
body when expressions #1 and #2 are FALSE
ENDIF
Note: Every IF statement shall have a corresponding ELSE, ELSE IF, or ENDIF statement. Below is an
example of pseudo code which uses two variables x and y.
IF (x > y) THEN x = x+2 /* body when x > y */
ELSE IF (x = y) THEN
IF (x!= 0) /* body when x = y */
x = y/x /* body when x = y and also body when x!= 0 */
ENDIF /* body when x = y */
ELSE
x = x*y /* body when x < y */
ENDIF
3.6.2.1.2 Select Statement. Select statements are useful when a different body of code is to execute based
on a series of relational expressions. The select statement uses the keywords SELECT FIRST and
ENDSELECT to mark the beginning and ending of the select statement. When this statement is encountered,
the relational expression in parenthesis next to the first WHEN keyword is evaluated. If this relational
expression evaluates TRUE, then the body after the first WHEN keyword is executed. The body portion is
indented one level and ends at the last line before the next WHEN keyword. If the first relational expression
evaluates FALSE, the relational expression after the next WHEN keyword is evaluated. If this relational
expression evaluates TRUE, then the body associated with that WHEN keyword is executed. If none of the
relational expressions following WHEN keywords evaluate to TRUE, then the body following the OTHERWISE
keyword is executed. After executing the body section of code following any WHEN or OTHERWISE keyword,
the select statement is exited and the code begins executing after the ENDSELECT keyword. An example of
this type of statement is included below:
SELECT FIRST
WHEN (first relational expression)
body when first expression is TRUE
WHEN (second relational expression)
© Copyright 2010 General Motors All Rights Reserved
OTHERWISE
body when all expressions are FALSE
ENDSELECT
3.6.2.1.3 Loop Statement. Loop statements are useful when it is desirable to execute a body of code in a
repetitive fashion until an exit criteria is established. This type of statement is typically used when performing
operations on arrays of data or data structures as it provides an easy mechanism to index through the array.
Loop statements use the keywords FOR and ENDFOR to mark the beginning and ending points of the loop
statement.
Included below is an example of a loop statement:
FOR (target value1 TO value2 BY value3)
body to be performed for each value
ENDFOR
The first time the code encounters the keyword FOR, the variable target is assigned a value defined by
value1. On the right of the keyword TO is a variable called value2 which is compared with the variable target
as a relational expression to determine if it is ok to exit the repetitive task. If the relational expression evaluates
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
TRUE, then the body is executed. After executing the body of the loop, the variable target is incremented by
the value of the variable after the keyword BY (in this case value3) and the relational expression is re-
evaluated. The body will continue to be executed as long as the relational expression evaluates to TRUE.
Once the relational expression evaluates FALSE, the loop is exited and control continues with the next
statement after the ENDFOR.
Note: The convention used throughout this specification for handling the case where value1 equals value2 is
that the expression is considered TRUE and the body code shall be executed.
3.6.2.1.4 WHILE Statement. While statements are used to execute a body of code as long as a relational
expression evaluates TRUE. The statement uses the keywords WHILE and ENDWHILE to mark the beginning
and ending of this type of statement. When the pseudo code hits a line with a WHILE keyword, the relational
expression in parenthesis after the WHILE is evaluated. If the relational expression evaluates TRUE, the body
is executed. The body is indented one level and ends with the last statement above the ENDWHILE keyword.
WHILE (relational expression)
body when expression is TRUE
ENDWHILE
3.6.2.1.5 REPEAT Statement. Repeat statements are very similar to while statements except that the
relational expression evaluated to determine when to stop executing the body code is not checked until after
the body is executed. The body code will always be executed at least one time. The keywords REPEAT and
UNTIL mark the beginning and ending of this type of statement. An example of this statement is included
below:
REPEAT
body when expression is TRUE (performed at least once)
UNTIL (relational expression)
3.6.2.1.6 CALL Statement. A CALL statement is used to invoke a procedure/subroutine. The
procedure/subroutine may be defined in the description of another diagnostic service within this specification,
or referenced from another specification (e.g., GM LAN Handler Specification). Upon completion of the
procedure/subroutine, control is returned to the point immediately after the CALL statement. An example is
included below:
IF (relational expression) THEN
CALL function( )
ENDIF
3.6.3 Common/Global Pseudo Code Data Dictionary. Following the pseudo code is a data dictionary that
defines the variables and flags used in the pseudo code. Several diagnostic services share common variables
or flags with other diagnostic services. The table below contains the list of the common or global pseudo code
© Copyright 2010 General Motors All Rights Reserved
variables and flags used in the Node Interface Data Dictionary section of each diagnostic service. The
common/global variables will be included in the data dictionary of each diagnostic service but reference this
section of the document for further details. See Table 5.
NO YES/NO
control functions if a TesterPresent ($3E) timeout occurs or if a
ReturnToNormalMode ($20) request is received.
Diag_Services_Disable_DTCs
This flag is used by the device to determine if any diagnostic service FALSE TRUE/FALSE
has been enabled which requires that Diagnostic Trouble Codes
(DTC) be inhibited.
DTCs_Enabled_In_Device_Control
This flag is used to determine whether or not the service $AE
(DeviceControl) will request DTCs to disable when device control is
active. When this flag is equal to NO, activating service $AE would NO YES/NO
inhibit the setting of DTCs. Service $10 (InitiateDiagnosticOperation)
can be used to change the state of this flag if it is requested prior to
activating device control.
Security_Access_Unlocked
Flag set in service $27 (SecurityAccess) which indicates if the device
is unlocked. If an ECU does not support the $27 Security service, then FALSE TRUE/FALSE
this flag shall default to TRUE for the purposes of the pseudo code for
the other modes.
manufacturers_enable_counter
This is a one byte variable used when determining the security status N/A $00 thru $FF
of a node which implements the SecurityAccess ($27) service. Refer
to 9.3.2.6.2 for a description of this variable.
Power
Up - S/W
Variable/Meaning Reset Values
Initial
Value
vulnerability_flag
The vulnerability_flag is a one byte variable in the Node’s calibration
area which is used when determining the security status of a node N/A $00 thru $FF
which implements the SecurityAccess ($27) service. Refer to 9.3.2.6.1
for a description of this variable.
TesterPresent_Timer_State
This status flag is set by any service which requires the tool to send
TesterPresent ($3E) messages to remain active. While
TesterPresent_Timer_State = ACTIVE, the diagnostic application INACTIVE ACTIVE/INACTIVE
checks the TesterPresent_Timer. Mode $3E messages are used to
reset this timer. If a Mode $3E message is not received every P3 C ms,
the timer expires and causes the device to exit Diagnostic Mode.
normal_message_transmission_status
This is a flag that is set in the $28 service when normal ENABLED ENABLED/DISABLED
communications have been shut off and DTCs are disabled.
TesterPresent_Timer
TesterPresent ($3E) service request messages are used to reset this
timer. When active, if a TesterPresent ($3E) request message is not 0 $00 thru P3Cmax
received within the P3C timing window, the timer expires and shall
cause the node to execute the equivalent of a ReturnToNormalMode
($20) service.
DTC_send_on_change_flag
This flag is used to indicate that the send-on-change reporting of DTC
count information is currently active. This flag is activated as soon as $01 = send on change
the tester requests service $A9 message $82 with a non-zero active
$00
send-on-change status mask. It is then used by the steady-state DTC $00 = send on change
count reporting function to enable updated count information to be inactive
calculated and reported back to the tester (if a count change is
detected).
programming_mode_active
This flag is set in service $A5 and is used to keep track of whether or NO YES/NO
not a programming event has been enabled.
programming_mode_entry_ok
This is a flag which is set to YES once the tool has sent a request to NO YES/NO
verify that all devices are capable of entering a programming event at
this time. This flag must be set to YES to enter programming mode.
high_speed_mode_entry_ok
This is a flag which is set to YES once the tool has sent a request to
verify that all devices are capable of entering a high speed NO YES/NO
programming event at this time. This flag must be set to YES to enter
high speed mode. This flag is only valid for devices on the low speed
link.
high_speed_mode_active
This is a flag used to keep track of whether or not high speed mode of NO YES/NO
the Single Wire CAN (SWCAN) has been enabled.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Power
Up - S/W
Variable/Meaning Reset Values
Initial
Value
TransferData_Allowed
This is a flag set in service $34 which is used by the TransferData NO YES/NO
($36) service to determine if the correct sequence has occurred to
begin transferring data.
diagnostic_responses_enabled
This is a flag which is set to YES if the ECU knows its permanent See Mode
diagnostic CANIds or after a sequence of diagnostic messages which $A2
YES/NO
allows an SPS_TYPE_C ECU to enable responses to diagnostic pseudo
requests. See mode $A2 and programming section of this specification code
for more information.
DeviceContol_Security_Level
This is a flag used by the device control logic in determining the
criteria for device control limits exceeded. If security is accessed, then See Mode
the assembly plant device control restrictions are used. Otherwise, the $27 ASSEMBLY_
restrictions imposed on service tools are used. Assembly plant device pseudo PLT/SERVICE
control restrictions are not required in all modules. If an ECU does not code
utilize assembly plant restrictions, then this variable defaults to
SERVICE for the purposes of the pseudo code.
Security_Access_Allowed
Indication that a valid security code as defined in the Vehicle Theft FALSE TRUE/FALSE
Deterrent SSTS has been received.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
when the ECU is in a fully programmed state. An M in this column indicates that the service is mandatory and
shall be implemented by all ECUs as previously defined. A C in this column indicates that the need for a given
service (including specific applicable sub-functions) is to be agreed upon by the Design Release Engineer
(DRE), the appropriate service representative(s), and the appropriate manufacturing representative(s). A U in
this column indicates that the DRE can decide whether or not to implement the service in an ECU. A N/A in
this column indicates that this service is only required for programming and the need to support the service
shall be based upon the contents of the SPS column.
The Programming (SPS) and Boot Memory column applies to ECUs which are programmable via the SPS
system. An M in this column means that all ECUs which are programmable via the SPS system shall
implement the service and that the service shall be available even if the ECU only contains boot software. A C
in this column indicates that a service may be required for programming based on how the ECU supplier has
developed their utility file. If the diagnostic service is used in the utility file, then it shall be supported in boot
software. An N/A in this column indicates that the service is not applicable (or not required) in order to program
the ECU.
Note: Reference the ECU Programming section of this specification for more information on boot software.
Note: Reference the ECU Programming section of this specification for more information about utility files.
Note: All diagnostic services listed below shall be supported by the node regardless of addressing method
used in the request message, as long as the address is valid for that particular node. Refer to 4.5 for more
information on message addressing. For tester limitations on request methods, refer to the tester implication
section of each specific diagnostic service.
ReadDataByIdentifier 1A M M2 USDT
ReturnToNormalOperation 20 M M USDT
ReadDataByParameterIdentifier 22 U N/A USDT
ReadMemoryByAddress 23 U N/A USDT
SecurityAccess 27 C2 M3 USDT
DisableNormalCommunication 28 M M USDT
DynamicallyDefineMessage 2C C N/A USDT
DefinePIDByAddress 2D U N/A USDT
RequestDownload 34 N/A M USDT
TransferData 36 N/A M USDT
WriteDataByIdentifier 3B C M4 USDT
TesterPresent 3E M M USDT
ReportProgrammingState A2 N/A M USDT
ProgrammingMode A5 M M USDT
Supported in:
REQ
Diagnostic Service Name Diagnostics Programming Boot CANId
SID
(Test Mode) (hex) (SPS) Memory Type
ReadDiagnosticInformation A9 M5 N/A UUDT
ReadDataByPacketIdentifier AA C N/A UUDT
DeviceControl AE C N/A USDT
Where:
M1 = This service shall be supported by all ECUs which log DTCs.
M2 = Boot Memory is only required to support the Data Identifiers (DIDs) which are necessary to program the
ECU when the ECU only contains boot software.
M3 = Mandatory for all programmable nodes which are Emission, Safety, or Theft related, or otherwise
required by law.
M4 = This service is required in boot if it is necessary to write information (e.g., option content) into an ECU
before the software reset at the end of the programming event.
M5 = This service shall be mandatory for all ECUs which log DTCs. For applicable ECUs, support of
sub-function parameter $81 (readStatusOfDTCByStatusMask) shall be mandatory, and the functionality
provided by the other sub-functions shall be agreed upon by the DRE, service and manufacturing
representatives.
C1 = The wakeUpLinks (sub-function parameter = $04) may be required for gateway devices that are
connected to a subnet that supports a wake-up feature that is not available to the tester (e.g., wake-up
wire not brought out to the Diagnostic Link Connector (DLC)). If the gateway device is SPS
programmable and required to support the wakeUpLinks sub-function parameter, then it shall also
support the wakeUpLinks sub-function in boot software. Which sub-functions of this service that an ECU
is required to support must be agreed upon by the DRE, service and manufacturing representatives.
C2 = Certain sub-function parameters may be supported on non-programmable ECUs to support
manufacturing needs of the ECU supplier or the vehicle assembly plant.
4.3 Diagnostic Communication Implementation Rules. In applying the rules which follow, a diagnostic
request is considered in process, until the node has fulfilled one of the following (depending on the specific
service requested):
The ECU sent the last consecutive frame of an USDT multi-frame positive response.
The ECU sent an USDT negative response message indicating there is no positive response forthcoming
(response code other than $78).
The ECU sent an USDT single frame positive response message.
The first (or only) UUDT response is received (for services $AA and $A9).
Note: Application timing requirements for UUDT diagnostic responses provided via services $A9 and $AA are
specified in each respective service within this specification. Reference the descriptions of these services for
additional detail.
4.3.1 Tester Rules.
1. A tester is not allowed to send a physically addressed request any time a previous physically addressed
request is in process.
2. A tester is not allowed to send a physical request any time a functional request has been received that will
result in a response, and the response to the functional request is in process.
3. A tester is not allowed to send a functional request that results in a response if a previous physically
addressed request is in process.
4. A tester is not allowed to send a functional request that results in a response if a previous functionally
addressed request is in process.
5. After sending a functionally addressed request which will result in a response, a tester is not allowed to
send a second functionally addressed request that does not result in a response (e.g., TesterPresent
request) until at least 30 ms has elapsed after sending the first request.
6. A tester shall wait a minimum of 30 ms after sending a functionally addressed request that does not result
in a response before sending another functionally addressed request message.
7. A tester can send a functionally addressed request message that does not result in a response (e.g.,
functional tester present) at any point in time during which the ECU is in the process of receiving or
responding to a physically addressed diagnostic request. (In other words the functionally addressed tester
present request may even interleave the transmission of frames of a multi-frame physical request
message or a multi-frame physical response message.)
8. A tester may also send a diagnostic physical request immediately following a diagnostic functional request
as long as the functional request does not require a response.
Table 7 provides an additional overview about the required handling in the tester also taking into consideration
the node specific rules given in paragraph 4.3.2. The Previous Request column refers to the last diagnostic
message sent by the tester and New Request column refers to the diagnostic message that the tester is
attempting to send next.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
A Multiple Subnet Signal Consumer (MSSC) shall process diagnostic services supported on multiple
subnets individually. For example, a service $28 received on one subnet would only stop normal
communications on the subnet which it is received. The ECU would continue normal communications
messages (if otherwise active) on other subnet(s) to which it is attached. Another example of this would be
that a tester present request received on a subnet would not reset the P3C timer on another subnet.
A MSSC device shall support simultaneous programming events on each of the mulitple subnets to which
it is connected. A programming event on one subnet shall not impact or preclude initiating a programming
event on another subnet. This requires processing the following services separately on each subnet:
service $20, service $28, service $A5, service $1A, and service $3E.
Note: See service $A5 for more information on enabling programming events.
Note: A node shall support the DIDs required for programming on both subnets. Reference the programming
chapter within this specification for specific requirements. The other DIDs needed for diagnostics may only be
supported on one subnet.
A MSSC device shall be capable of being diagnosed fully from at least one subnet to which it is connected.
A MSSC shall document in a Component Technical Specification (CTS), Subsystem Technical
Specification (SSTS), or other specification referenced in a CTS or SSTS the diagnostic services that are
supported on each subnet.
A programmable MSSC device shall only be capable of being programmed from one subnet to which it is
connected and the $A2 service shall only be supported on this subnet. This subnet that is used for
programming should be the subnet with the higher baud rate capability.
Note: A programmable MSSC device is one that utilizes the SPS system (utility file concept) for
reprogramming. Refer to Section 9 of this specification for more details.
If a MSSC receives diagnostic requests on both subnets simultaneously, it must respond to each request
within the P2C time, however depending on the service requested and the capabilities of the node one of
the following must happen:
1. For services which the MSSC node supports on both subnets, the MSSC node sends either:
The positive response on each subnet within P2C.
OR the MSSC node sends the positive response on one subnet while sending a negative response $7F
$RequestServiceId $78 message on the second subnet within P2 C (indicating a positive response is
forthcoming), followed by the positive response after transmitting the positive response on the first subnet.
The exceptions are modes $20, $28, and $A5 where the $7F $RequestServiceId $78 is not allowed.
Note: For the special condition of receiving a service $20 ReturntoNormalMode request on multiple
subnets while in programming mode, the MSSC shall perform the required reset (see section 8.5.1) after
the first received service $20 request. It is the tester’s responsibility to coordinate the service $20 requests
on the multiple links so that the link, which requires a baudrate switch, receives the service $20 request
first if the tester is connected to multiple subnets.
2. For diagnostic services only supported on one subnet (e.g., service $AA), the MSSC sends the positive
response on the subnet supporting the service while sending a negative response reject message (e.g.,
$7F $RequestServiceId $11 for service not supported) on the other subnet (a negative response is only
sent if the request is physically addressed).
4.4 Message Identification - Diagnostic CAN Identifiers (CAN Identifiers). Diagnostic CAN Identifiers (CAN
Identifiers) are required in order to separate diagnostic messages from Normal Communication messages. The
diagnostic CANId in a request message also determines the type of addressing used for that message, either
physically addressed (targeted to only a single node) or functionally addressed (targeted to one or multiple
nodes).
4.4.1 Diagnostic CANId Definitions. Each GMLAN node shall support the following types of diagnostic CAN
Identifiers unless otherwise stated in the descriptions below:
Physical Request CAN Identifier (USDT): This CAN Identifier shall be used to transmit physically
addressed single frame or multiple frame request messages to a single ECU utilizing the Network USDT
protocol with normal addressing. This CAN Identifier shall also be used by the tester to send FlowControl
frames to an ECU if the transmission of data from an ECU to the tester requires a multiple frame
transmission.
AllNode Functional Request CAN Identifier (USDT): This CAN Identifier shall be used to transmit
functionally addressed single frame request messages to a functional system which consists of one or
multiple ECUs utilizing the Network USDT Protocol, with extended addressing (EA). All nodes on the
subnet where the request was sent shall receive this CANId and evaluate the extended address in order to
determine if the request is valid for that specific ECU. The extended address represents a functional
system address (see the section on Functional System Assignments for more information).
Note: Only nodes on the subnet where the request was sent shall receive this message. This is because the
diagnostic strategy does not allow gateways to pass diagnostic messages on to other subnets.
Physical USDT Response CAN Identifier: This CAN Identifier shall be used to transmit physically
addressed single frame or multiple frame response messages to the tester utilizing the Network USDT
protocol with normal addressing. This CAN Identifier shall also be used by the ECU to send FlowControl
frames to the tester if the transmission of data from the tester requires a multiple frame transmission.
Physical UUDT Response CAN Identifier: This CAN Identifier shall be used to transmit physically
addressed single frame UUDT response messages to the tester.
OBD/EOBD CAN Identifiers: These CAN Identifiers shall be supported only by emission related devices.
A specific range of Identifiers are reserved for OBD/EOBD purposes and unused identifiers in this range
shall not be used for other purposes. The range of reserved OBD/EOBD identifiers is shown in Table 8.
OBD/EOBD CAN identifiers may also be optionally used by emission related ECUs to support enhanced
diagnostics. Refer to paragraph 4.4.4.1 for further details.
4.4.2 CAN Identifier Memory Map Model. The following requirements apply to the GMLAN diagnostic CAN
Identifiers used by all ECUs with the exception of any emission related ECU(s) that have opted to use their
OBD/EOBD CAN Identifiers to support enhanced diagnostics (refer to paragraph 4.4.4.1 for rules regarding the
optional assignment of OBD/EOBD CAN Identifiers by emissions related ECUs for enhanced diagnostics):
The physical request CAN Identifiers shall be higher priority than the UUDT response CAN Identifiers to be
able to shut down a node which is sending periodic messages.
The UUDT response CAN Identifiers shall be higher priority than the USDT response CAN Identifiers to
allow the periodic messages to be sent prior to a multiple frame response message which is transmitted to
the tester.
Since the priority of the CANId is inversely proportional to its numerical value (i.e., the lower the CANId
number, the higher the priority), the following is true:
Figure 2 gives an overview of the reserved GMLAN diagnostic CAN Identifier ranges to provide a better
understanding of where the GMLAN diagnostic CAN Identifiers are located. It also shows some of the GMLAN
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
CAN Identifiers reserved for normal communication, such as Virtual Network Management Frames (VNMF).
4.4.3 CAN Identifier Table. Table 8 defines the ranges for the GMLAN diagnostic CAN Identifiers to be
reserved for each GMLAN sub-network.
Description Addressing
Address
Identifier Type Address Type CAN Identifier
Scheme
USDT request Physical Normal $241 thru $25F
UUDT response - reserved Physical Normal $540
UUDT response Physical Normal $541 thru $55F
UUDT response (optional for
Physical Normal $5E8 thru $5EF
emissions-related ECUs only)
USDT response - reserved Physical Normal $640
USDT response Physical Normal $641 thru $65F
OBD/EOBD Functional/physical Normal $7DF thru $7EF
Note 1: Defined by GMLAN Message Strategy Specification.
4.4.4 Rules For CAN Identifier Assignment. The CAN Identifiers of a node shall be chosen in a way that the
lower byte of each node CAN Identifier (physical request, USDT response, UUDT response) can be interpreted
as a unique offset relative to the diagnostic CAN Identifier range (for a given subnet). For example, the relative
offset of a node with the USDT response CAN Identifier $646 is $46. This relative offset can be used to
calculate all other diagnostic CAN Identifiers of this node: UUDT = $546, Phys. Request = $246. The tester
only needs to exchange the most significant nibble of the 11-bit CAN Identifier to the one used for the CAN
Identifier ranges. The most significant nibble of the 11-bit CAN Identifier can be interpreted in the following way
(which does not mean that the whole range of 256 CAN Identifiers is reserved for GMLAN diagnostic).
$2xx = physical request CAN Identifier.
$5xx = UUDT response CAN Identifier.
$6xx = USDT response CAN Identifier.
Note: Emission-related ECUs may use optional OBD CANid assignments. Refer to paragraph 4.4.4.1.
Example: Three (nodes) connected to the LS-CAN sub-network (Table 9).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Note 1
Table 9: CAN Identifier Assignments Example
ECU Diagnostic Address
PhysicalReqId USDTRespId UUDTRespId
(physical node Id)
$22 $24A $64A $54A
$42 $243 $643 $543
$11 $25E $65E $55E
Note 1: PhysicalReqId = Physical Request CAN Identifier; USDTRespId = USDT Response CAN Identifier; UUDTRespId = UUDT
Response CAN Identifier
Note: There is no numerical relationship between the ECU Diagnostic Address and the Diagnostic CAN
Identifiers. The Diagnostic address shall be unique for every ECU on the vehicle but the diagnostic CAN
Identifiers are only required to be unique on a given subnet. This means that two devices on different subnets
may use the same set of Diagnostic CAN Identifiers but their Diagnostic addresses are different.
4.4.4.1 Optional CAN Identifier Assignments for Emission Related ECUs. Table 10 details the usage of
the 11-bit OBD/EOBD reserved CAN Identifiers. Each GMLAN emission related ECU that supports legislated
diagnostics (as defined in SAE J1979/ISO 15031-5) with 11-bit CAN Identifiers must support the $7DF
functional request CANId, one of the eight reserved OBD/EOBD physical request CAN Identifiers, and the
OBD/EOBD physical response CANId associated with the supported physical request CANId. All of the
OBD/EOBD CAN Identifiers utilize the USDT protocol and normal addressing. See paragraph 4.5.1.1.1 for
more information on addressing types.
$7E0 Physical request CAN Identifier from the external test equipment to OBD ECU #1
$7E8 Physical response CAN Identifier from OBD ECU #1 to the external test equipment
$7E1 Physical request CAN Identifier from the external test equipment to OBD ECU #2
$7E9 Physical response CAN Identifier from OBD ECU #2 to the external test equipment
$7E2 Physical request CAN Identifier from the external test equipment to OBD ECU #3
$7EA Physical response CAN Identifier from OBD ECU #3 to the external test equipment
$7E3 Physical request CAN Identifier from the external test equipment to OBD ECU #4
$7EB Physical response CAN Identifier from OBD ECU #4 to the external test equipment
$7E4 Physical request CAN Identifier from the external test equipment to OBD ECU #5
$7EC Physical response CAN Identifier from OBD ECU #5 to the external test equipment
$7E5 Physical request CAN Identifier from the external test equipment to OBD ECU #6
$7ED Physical response CAN Identifier from OBD ECU #6 to the external test equipment
$7E6 Physical request CAN Identifier from the external test equipment to OBD ECU #7
$7EE Physical response CAN Identifier from OBD ECU #7 to the external test equipment
$7E7 Physical request CAN Identifier from the external test equipment to OBD ECU #8
$7EF Physical response CAN Identifier from OBD ECU #8 to the external test equipment
GMLAN emission related components that need to utilize the hardware filtering capabilities provided with CAN
controllers may run into a situation where the number of messages that need to be filtered cannot be handled
with the number of message objects available in the CAN controller. In such circumstances, an emission
related ECU may choose to use the OBD/EOBD diagnostic CAN Identifiers to also support enhanced
diagnostics. This is only valid for ECUs that support OBD/EOBD diagnostics with the 11-bit header format.
Emission related ECUs utilizing the OBD/EOBD CAN Identifiers for enhanced diagnostics shall assign the
enhanced diagnostic CAN Identifiers per Table 11. The range of CAN Identifiers from $5E8 thru $5EF on the
high speed bus has been reserved in order to maintain the relationship between the USDT response CANId
and the UUDT response CANId as outlined in paragraph 4.4.4.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Note: Usage of OBD/EOBD CAN Identifiers for enhanced diagnostics does not have any effect on the
maximum number of ECUs allowed on the HSCAN network.
4.4.5 SPS Special Case ECU Programming CANId Assignments. The reserved diagnostic CAN Identifiers
outlined in Table 7 are the CAN Identifiers used for diagnostics on ECUs which are either:
Programmable via the Service Programming System (SPS) and have been completely programmed, or
Fully functional ECUs which are not programmable via the Service Programming System.
The reserved diagnostic CAN Identifiers are further referenced in this document as permanent diagnostic CAN
Identifiers. An ECU which is SPS programmable and has not been completely programmed (e.g., an ECU
shipped to a vehicle assembly plant with boot and operational software and no calibration data), may or may
not comprehend its permanent diagnostic CAN Identifiers. This may be the case where a corporate common
SPS programmable ECU is used across multiple platforms and the platforms are not able to standardize the
permanent diagnostic CAN Identifiers.
Note: It is also possible for an SPS programmable ECU which is not completely programmed to be able to use
its permanent diagnostic CAN Identifiers during programming. This would require that the ECU have the
permanent diagnostic CAN Identifiers stored in memory which is accessible to the software executing upon
boot while the ECU is not completely programmed.
In order to avoid the proliferation of part numbers on SPS programmable ECUs solely due to diagnostic CANId
conflicts across platforms, special case SPS CAN Identifiers have been defined. Each ECU requiring the
special case CAN Identifiers shall support a special case point-to-point USDT diagnostic request CANId
(further referenced as the SPS_PrimeReq CANId) and a special case USDT diagnostic response CANId
(further referenced as the SPS_PrimeRsp CANId). Table 12 defines the assignment of the special case CAN
Identifiers to the ECU.
The diagnostic address embedded in the special case SPS_PrimeReq and SPS_PrimeRsp diagnostic request
and response CAN Identifiers shall be the physical node (ECU) address. See Appendix D for further details on
ECU diagnostic addresses.
An ECU which only comprehends the special case diagnostic CAN Identifiers shall only respond to diagnostic
requests once the tester enables their use. Additional information about the SPS_PrimeReq and
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
SPS_PrimeRsp diagnostic CAN Identifiers and the process to enable them can be found in this specification in
paragraph 9.1.1 - Enabling Diagnostic Responses on SPS_TYPE_C ECUs. The special case CAN Identifiers
must be enabled by the tester after normal communications have been disabled in order to prevent potential
CANId conflicts between normal communications messages and diagnostic messages using the special case
CAN Identifiers.
4.5 Message Addressing. Diagnostic messages may be addressed either physically (targeted to a single
node) or functionally (addressed to one or multiple nodes). The type of message addressing used for
diagnostic request messages is determined by the diagnostic CANId used. All diagnostic response messages
will be physically addressed, using one of the reserved range of physical response CAN Identifiers (defined
previously).
4.5.1 Frame Data Byte Definition Based On Address Method. GMLAN diagnostic messages shall support
different combinations of addressing and segmentation methods as determined by the CANId and diagnostic
service used.
4.5.1.1 General Frame Format. The following sections describe the addressing schemes and CAN frame
formats including the Network Layer Protocol Control Information (PCI). The sections following the general
description section describe the specific usage for GMLAN enhanced diagnostics. Detailed descriptions of the
addressing schemes and the CAN frame formats can be found in ISO 15765-2 and OSEK/COM.
4.5.1.1.1 Addressing Schemes (Table 13).
4.5.1.1.2 Protocol Control Information (PCI) Formats for GMLAN. All references to Protocol Control
Information (PCI) within this specification relate only to the network layer (referenced as N_PCI within
ISO 15765-2). As shown in Tables 14 thru 17 below, the PCI information can be 1, 2, or 3 bytes in length
depending on the frame type.
Table 14: Location of Protocol Control Information (PCI) Using Normal Addressing
Addressing Scheme Name Identifier CAN frame data field
Description ID 1 2 3 4 5 6 7 8
NORMAL - SingleFrame CAN Id PCI
NORMAL - FirstFrame CAN Id PCI
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Table 15: Location of Protocol Control Information (PCI) Using Extended Addressing
Addressing Scheme Name Identifier CAN frame data field
Description ID 1 2 3 4 5 6 7 8
EXTENDED - SingleFrame CAN Id EA PCI
EXTENDED - FirstFrame CAN Id EA PCI
EXTENDED -
CAN Id EA PCI
ConsecutiveFrame
Table 17: Encoding of Protocol Control Information (PCI) Bytes of USDT Frames
USDT PCI Encoding Protocol Control Information (PCI)
Note 1
Byte #1 Byte #2 Byte #3
PCI Frame Mnemonic 7 6 5 4 3 2 1 0
Note 2 Note 2
SingleFrame SF 0 0 0 0 DL N/A N/A
Note 2
FirstFrame FF 0 0 0 1 DL high DL low N/A
Note 2 Note 2
ConsecutiveFrame CF 0 0 1 0 SN N/A N/A
Flow Control frame FC 0 0 1 1 FS BS STmin
Reserved $40 through $FF Reserved Reserved
Note 1: The byte number applies to the position of the information within the PCI. For normal addressing the PCI itself starts on position
#1 of the CAN frame, for extended addressing it starts on position #2 in the CAN frame. A detailed description of the PCI parameters can
be found in ISO 15765-2.
Note 2: Bytes labeled as N/A may be used as data bytes in frames of that type.
Table 18 contains general PCI parameter descriptions as defined by ISO 15765-2. This specification places
restrictions on the allowed ECU and tester implementation of some of these parameters. See paragraph 6.3 for
detailed GMLAN implementation requirements.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
continue to transmit the consecutive frames using the Block Size (BS) and Separation
Time (ST) values from the flow control (FC) frame transmitted by the receiver. A FS value
of $1 indicates a Wait (WT) condition. A wait condition means that the sender has to pause
sending consecutive frames until after the receiver transmits a flow control frame with and
FS value of $0 (ConTS). A FS value of $2 indicates an Oveflow (OVFLW) condition where
the receiver’s buffer is not large enough to receive the incoming message. This flow status
indicates that reception of the message is being terminated.
BS The Block Size (BS) is a 1-byte parameter that defines the number of consecutive frames
that the sender can transmit before waiting for a flow control frame from the receiver. There
shall never be a FC frame following the last CF frame of a multi-frame message.
STmin The Separation Time minimum (STmin) is a 1-byte parameter that defines the minimum
time lapse between consecutive frames. The units on this parameter are 1 ms per count for
values between $00 and $7F. For STmin values between $F1 and $F9, the resolution is
100 µs (microseconds) per count where $F1 = 100 µs and $F9 = 900 µs. All other values
are reserved.
WFTmax The maximum number of Wait Frame Transmissions (WFT max) parameter is used to
(This parameter determine the maximum number of allowed consecutive flow control frames with an FS
is not allowed in value of WT. This parameter is local to each ECU and is not transmitted as part of a flow
GMLAN control frame. A WFTmax value of $0 indicates that the ECU is not allowed to send FC.WT
implementation) frames. ISO 15765-2 restricts the maximum value of the parameter WFTmax.
Note 1: International Organization for Standardization (ISO) uses the acronym CTS for this parameter. In this specification it shall be
referred to as ConTS to avoid confusion with Component Technical Specification which uses the acronym CTS in this specification.
4.5.1.2 Normal Addressing - Physical Request and Response Messages. Physically addressed request
messages, USDT Response messages, and UUDT Response messages shall use a “normal addressing”
frame format where the CANId (one of the reserved physical CAN Identifiers) is the only data used to indicate
the target node. The following three tables show the format for diagnostic message with normal addressing.
In the tables, the following legend is used:
SIDRQ = Service Identifier Request.
SIDPR = Service Identifier Positive response (SID + $40).
LEV = Sub-Function Parameter $Level (usage depends on the diagnostic service).
MSG# = Message Number. This is a one byte value which is used to determine the contents of the
remaining seven bytes of the message. (See note below.)
Other Values in Tables 19 thru 21 are defined in the Terms and Abbreviations section of this specification.
Note: The use of a message number was chosen for UUDT messages instead of a SIDPR in certain critical
diagnostic services because it allows one additional byte of data in the message (with the SIDPR approach,
another data byte would be needed to determine the contents of the remaining data bytes). Refer to Diagnostic
Service $A9 and $AA.
4.5.1.3 Normal Addressing - Flow Control Frames. Table 22 shows the definition of the Flow Control frame
generated by the network layer of the node (or the tester) when receiving multi-frame messages.
4.5.1.4 Extended Addressing - Functional Request Messages. Functionally addressed request messages
shall always be single frame and shall use the “extended addressing” frame format, where the combination of
CANId (one of the reserved Functional CAN Identifiers) and an additional data byte (extended address byte, or
EA) indicates the target node(s). Usually, the extended address byte will designate a node or group of nodes
operating as a specific functional sub-system. However, all resulting response messages will be formatted as
physical diagnostic responses with normal addressing (USDT single or multi-frame response, or a UUDT
response. See diagnostic USDT and UUDT response frame format examples above).
Diagnostic request messages using extended addressing shall always be USDT messages and have the
specific frame formats shown in Table 23 (the legend used is the same as the three previous tables).
Note: See OSEK-COM specification for further details about the UUDT/USDT protocol (message formats,
service primitives).
4.6 ECU Frame Padding Requirements. GMLAN ECUs shall be capable of receiving diagnostic request
messages that are padded. GMLAN ECUs should be capable of receiving diagnostic messages that are not
padded.
Note: Frame padding is adding additional data bytes to a transmitted frame (e.g., single frame, flow control
frame, or the last frame of a multi-frame message) to ensure that the data length code in the CAN header
control field is fixed to 8 bytes.
An ECU can choose to transmit enhanced diagnostic response messages with or without padding (without
padding is preferred to minimize bus bandwidth). These requirements are applicable to the ECU when
executing either the application software or the boot software. An ECU that does not support the reception of
non-padded diagnostic request messages shall document this in a CTS, SSTS, or supplemental diagnostic
specification referenced in a CTS or SSTS.
Note: This specification places no requirements on the value of the pad bytes used in either a diagnostic
request or response message. However, it is recommended to use values of either $55 or $AA (alternating bit
patterns).
Note: The padding requirements detailed in this section deal with frames transmitted for the enhanced
diagnostic services described in Section 8 of this document, however, implementation of diagnostic services
legislated by OBD/EOBD regulations for ECUs classified as “emission” devices shall comply with ISO 15765-4
which specifies that OBD diagnostic response messages must be padded.
4.7 Communication Layer Interaction. The interaction between the communication layers in the tester and
the ECU(s) are guided by the conventions discussed in OSI Service Conventions (ISO/TR 8509). Each layer
provides a set of service primitives, which transports a certain type of parameters and data. The service
specifications of ISO 11898 and OSEK-COM do not specify any implementation requirements but provide
abstract service prototypes to support data exchange with the layers.
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
4.7.1 GMLAN Communication Layer Interaction. Figures 3 and 4 shall illustrate how the communication
layers for a GMLAN based system interact:
Application Layer: GMLAN (e.g., GMW3110).
Network Layer: OSEK-COM (USDT/UUDT Protocol).
Data Link Layer: ISO 11898 (CAN).
Physical Layer: GMW3122 (DW-CAN), GMW3089 (SW-CAN).
GMLAN
APPLICATION LAYER
N_UUData.req N_USData.req
OSEK-COM
N_USData.con
service primitives
N_UUData.con N_USData.ind
(UUDT/USDT protocol)
N_UUData.ind N_USData_FF.ind
OSEK-COM
NETWORK LAYER
ISO 11898
L_Data.req service primitives
L_Data.con
(Tx/Rx CAN frames)
L_Data.ind
ISO 11898
DATA LINK LAYER
A detailed description of the service primitives, and the data passed to each layer and retrieved from each
layer (e.g., address information provided to/from the Network Layer) can be found in OSEK-COM (Network
Layer) and ISO 11898 (CAN Data Link Layer).
ISO 11898 provides service primitives for an unacknowledged data transfer (and unacknowledged remote data
request) with up to 8 additional user data bytes. ISO 11898 only allows addressing via the CAN Identifier.
OSEK-COM provides a set of service primitives for the transmission and reception of messages with up to
4095 user data bytes. OSEK-COM provides a segmentation method for messages which do not fit into a single
CAN frame as provided by ISO 11898 and, in addition, multiple addressing schemes (e.g., normal addressing:
CAN Identifier; extended addressing: CAN Identifier, extended address = 1st data byte of CAN frame). OSEK-
COM uses the unacknowledged data transfer service primitives of ISO 11898 to transmit and receive CAN
frames.
© Copyright 2010 General Motors All Rights Reserved
Figure 4 gives an overview of the occurrence of the ISO 11898 and OSEK-COM service primitives during a
request/response sequence, where the tester transmits a SingleFrame request message to a single ECU using
the USDT protocol and the ECU responds with a multiple frame response message (two (2)
ConsecutiveFrames) using the USDT protocol, too.
Tester ECU
Application OSEK-COM ISO11898 Physical Layer ISO11898 OSEK-COM Application
Req_SF
Request
Request
N_USData.req L_Data.req(SF)
N_USData.con L_Data.con(SF) L_Data.ind(SF) N_USData.ind
Response
L_Data.req(FC) FlowControl
Response
L_Data.con(FC) L_Data.ind(FC)
Resp_CF L_Data.req(CF)
L_Data.ind(CF) L_Data.con(CF)
Resp_CF L_Data.req(CF)
N_USData.ind L_Data.ind(CF) L_Data.con(CF) N_USData.con
Message Level CAN Frame Level CAN Frame Level Message Level
(up to 4095 bytes) (8 byte incl. ext. addr)) (8 byte incl. ext. addr)) (up to 4095 bytes)
Figure 4: Service Primitives During a Request/Response Sequence in the Tester and the ECU
The service specifications of ISO 11898 and OSEK-COM do not specify any implementation requirements but
provide abstract service prototypes to support data exchange with the layers. The service primitive below is an
extraction of ISO 11898 and shall be treated as an example for service primitives:
Semantics of the L_Data.req primitive:
L_Data.req (IDE
IDENTIFIER
DLC
DATA)
Where:
IDE = Identifies the IDENTIFIER’s length
IDENTIFIER = Identifies the data and its priority (CAN Identifier)
DLC = Data Length Code
DATA = Data the user wants to transmit
4.8 Network Layer Buffer Requirements. The USDT protocol allows for segmented messages up to a
maximum of 4095 bytes. The amount of memory that each ECU reserves for network layer support shall be
based on diagnostic and normal communication needs. A SPS programmable ECU may have different
network layer buffer size requirements for normal operations (e.g., normal communications and diagnostics)
than it does while it is being programmed.
4.8.1 Buffer Requirements for Normal Operation and Diagnostics. The size of the network layer buffer
used during normal vehicle operation (including diagnostics and excluding SPS programming) shall be
optimized to minimize RAM requirements while still allowing for the reception and transmission of the largest
normal communications or diagnostic message expected by that ECU.
Note: If the ReadMemoryByAddress ($23) service is supported in an ECU, then the DRE, the appropriate
Service Operations engineer(s), and the appropriate Manufacturing engineer(s) must determine the maximum
amount of memory required to be retrieved via a single request of this service and take this into consideration
when determining the network layer buffer requirements.
The actual buffer size shall be documented in a CTS, SSTS, or supplemental diagnostic specification
referenced by either of the preceding documents.
4.8.2 Buffer Requirements During SPS Programming. During SPS programming, an ECU shall maximize
the size network layer buffer to the largest possible value while taking into account ECU RAM resources, the
size of the programming algorithm to be downloaded, and the 4095 byte restriction provided by the USDT
protocol.
An ECU may have a different buffer size during SPS programming than it would during normal operations. The
RequestDownload ($34) service is used during a programming event to tell an ECU that it is about to be
programmed. An ECU can use the receipt of this diagnostic service to free up RAM resources for programming
which would otherwise be used to support normal vehicle functionality. All ECUs shall perform a software reset
at the conclusion of a programming event at which time the ECU would reinitialize RAM and once again begin
using the allocated memory for normal operations.
4.9 Diagnostic Message Sequence Examples.
4.9.1 General USDT and UUDT Request/Response Sequence Examples. Figure 5 shows the general
structure of a request/response scheme for GMLAN. In this example, the request message is a multi-frame
USDT message and the response message is a single frame USDT message. Figure 5 and Table 24 illustrate
how the sequence number embedded in each consecutive frame of a multi-frame message shall be treated.
Tester ECU
FirstFrame with
DL high = $0, DL low = $24
(DataLength = 36 dec.) FirstFrame
ConsecutiveFrame
with SN = 1
ConsecutiveFrame
ConsecutiveFrame
with SN = 2
ConsecutiveFrame
Request
ConsecutiveFrame
with SN = 3
ConsecutiveFrame
ConsecutiveFrame
with SN = 4
ConsecutiveFrame
ConsecutiveFrame
with SN = 5
ConsecutiveFrame
SingleFrame with
Response DL = 2
SingleFrame
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Request
T(USDT-FF) 241 10 24 3B 45 01 02 03 04
N(USDT-FC) 641 30 00 05 --- --- --- --- ---
T(USDT-CF) 241 21 05 06 07 08 09 0A 0B
T(USDT-CF) 241 22 0C 0D 0E 0F 10 11 12
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
T(USDT-CF) 241 23 13 14 15 16 17 18 19
T(USDT-CF) 241 24 1A 1B 1C 1D 1E 1F 20
T(USDT-CF) 241 25 21 22 --- --- --- --- ---
Positive Response
N(USDT-SF) 641 02 7B 01 --- --- --- --- ---
Figure 6 and Table 25 show the general structure of a request/response scheme for GMLAN using UUDT
messages to transmit the requested data (response). In this example, the request message is a single-frame
USDT message and the response consists of multiple UUDT messages.
Tester ECU
SingleFrame with
Request DL = 5
(DataLength = 5dec) SingleFrame (USDT)
Request
T(USDT-SF) 241 05 AA 01 22 A1 10 --- ---
4.9.2 Interleaving Single Frame and Multi-Frame Diagnostic Messages. The Enhanced Implementation of
Diagnostic Services specification supports the concept of interleaving messages. A multiple frame message
which is sent by either the tester or ECU can be interleaved by other single frame messages which must have
a different frame Identifier (e.g., CAN Identifier). This concept supports the feature of periodic messages sent
by one or multiple ECU(s) while another ECU sends a multiple frame response message. See Figure 7 for a
graphical example of interleaving messages.
Figure 7: Interleaving of a Multiple Frame Message by Periodic/Event Driven Single Frame Messages
4.10.2 Functional System Table. Table 26 lists the standardized functional systems with their associated
Extended Address (EA) for the GMLAN network.
Note: This assumes that the node remains powered. Refer to paragraph 5.2.4 for requirements on how to
determine when a diagnostic service is completed. A node which is in the process of receiving a multi-frame
diagnostic message shall be capable of receiving the complete message without the possibility of remoting off.
This can be accomplished via the use of the network layer service primitives which provide first frame
indications, error indications, and an indication of the reception of a complete message.
If Diagnostic Mode is activated during the course of diagnostic communication, a node shall be capable of
receiving, processing and responding to diagnostic messages for a minimum of 8 s following the termination of
Diagnostic Mode.
Note: Reference the Terms and Definitions section of this specification for a detailed definition of diagnostic
mode.
A GMLAN node that does not support VNMFs shall be capable of receiving, processing, and responding to
diagnostic messages any time that the node would otherwise be communications capable. If diagnostic
functionality is required at a time when a node would not otherwise be communicating (and can be designed
such that diagnostic communications can take place), then the circumstances under which diagnostics can be
performed shall be documented in a CTS, SSTS or applicable diagnostic specification referenced by a CTS or
SSTS.
5.2 Communication State Diagram Based On Version 1.5 of GMW3104. Figure 9 and Figure 10 were taken
from GMW3104 to provide a visual aid in understanding the possible communication states that exist in a
node. The COMM_INIT and COMM_KERNEL_ACTIVE states are the states where a node is either capable of
communications, or in the process of initializing the hardware and software necessary to become capable of
communications. A node which is not in the COMM_INIT or COMM_KERNEL_ACTIVE states is not capable of
communications and must enter the COMM_INIT state (to initialize the communications hardware and
software) prior to communicating with other nodes on the vehicle or an off-board tester.
The following sections of this specification describe what takes place in the COMM_INIT and
COMM_KERNEL_ACTIVE states relative to diagnostics. For more detailed information on these states or
the other states in the figures (reference GMW3104).
ECU_UNPOWERED
[POWERED] [not_POWERED]
ECU_POWERED
ECU_EXECUTING_RESET
RESET_COMPLETE
RESET ECU_ KERNEL_ACTIVE
COMMUNICATION_KERNEL_MGT_LOGIC
COMM_KERNEL_INACTIVE
LOCAL_EVENT_NO_COMM_REQD
ECU_IN_STANDBY ECU_READY
BUS_WAKEUP_MONITOR_ACTIVE
APPL_VN_REQ_MONITOR_ACTIVE
STANDBY_OK
COMM_STARTUP_REQD
COMM_SHUTDOWN_CONFIRMED and
COMM_INIT [COMM_SHUDOWN_STATUS := Enabled]
COMM_INIT_COMPLETE /
APPL_COMM_RESTART_REQ COMM_ENABLED_TIMER := 8 sec;
COMM_SHUTDOWN_STATUS := Disabled
COMM_KERNEL_ACTIVE
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
COMM_ KERNEL_ACTIVE
COMMUNICATION_START_UP_LOGIC
COMM_ENABLED_TIMER = 0 and
COMM_ENABLED_TIMER = 0 and [DLL_RESET_REQD = False ] /
[DLL_RESET_REQD = True] / Generate REQ_COMM_SHUTDOWN_CONFIRM;
NORM_COMM_HALT_MONITOR_ACTIVE
BUS_OFF_TIMER := 0; COMM_SHUTDOWN_STATUS := Enabled;
APPL_HI_SPD_REQ_MONITOR_ACTIVE
COMM_ENABLED_TIMER := 1 sec COMM_ENABLED_TIMER := 8 sec
BUS_OFF_MONITOR_ACTIVE
VNMF_MONITOR_ACTIVE
COMM_ENABLED
[APPL_VN_ACTIVATION_ARRAY = 0 and
[APPL_VN_ACTIVATION_ARRAY != 0 or REMOTE_VN_ACTIVATION_ARRAY = 0 and
REMOTE_VN_ACTIVATION_ARRAY != 0] / VN_TIMER = 0 for all Network Activated VN’s] /
COMM_SHUTDOWN_STATUS := Disabled COMM_ENABLED_TIMER :=
max(COMM_ENABLED_TIMER, 4 sec)
COMM_ACTIVE
5.2.1 Communications Initialization (COMM_INIT) State. This is an initialization state in which serial
communications are not possible for diagnostics or normal communications. In this state a device initializes its
CAN hardware and software variables used for communication. A node enters this state from either the
ECU_READY or ECU_IN_STANDBY states if either of the following occurs:
1. Node control logic evaluates a local input and determines that communications with other nodes are
required.
2. A bus wake-up is received. The wake-up may have been generated by a node on the vehicle or by an
off-board tester.
A node enters this state from the COMM_ACTIVE state upon termination of the Normal Comm Halted handler
service, and a node also enters this state following the completion of a software reset.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
See GMW3104 and the GMLAN Handler specification (GMW3107) for more detail.
5.2.2 Communications Enabled (COMM_ENABLED) State. The state of a node where all communication
capabilities have been established. In the Communication Enabled state a node is capable of receiving and
processing Virtual Network Management Frames (VNMF) (see GMW3104 for more information on VNMF) and
receiving bus wake-ups. Diagnostic messages cannot be sent or received by a node in this state. See the
COMM_ACTIVE state description section for further definition of diagnostic messages.
A node remains in the Communications Enabled state until a Virtual Network (VN) that it supports becomes
active, or until a time period elapses where no VNs have been activated.
Note: Refer to GMW3104 for more information on Virtual Network Management Frames.
If a VN that a node supports becomes active, then the device transitions to the Communications Active state.
A node transitions to the ECU Ready state if a timeout occurs.
Note: GMW3104 also specifies additional requirements of the application before an ECU can transition to the
ECU_READY state.
5.2.3 Communications Active (COMM_ACTIVE) State. The state of a node when it is participating in at least
one active VN. The node may have either internally decided to activate a VN or it may have received a Virtual
Network Management Frame (VNMF) with an activation request for a VN the node supports. The
Communication Active state is entered before any frame can be transmitted.
Note: Refer to GMW3104 for more information on Virtual Network Management Frames.
A node remains in this state as long as it has at least one active VN. This VN can be an initially active VN, an
application triggered VN, or a bus activated VN. Once a node has no VNs active, it can transition to the
Communication Enabled state.
A node shall be capable of receiving, processing, and responding to diagnostic messages in this state any time
the initially active diagnostic VN is active or the application triggered diagnostic VN is active.
5.2.3.1 Initially Active Diagnostic VN. GMW3104 defines initially active VNs as Virtual Networks which are
automatically activated any time a bus wake-up is received. Initially active VNs remain active for a minimum of
8 s following the wake-up, or 8 s after the transmission/reception of a VNMF with the bit set in the VNMF
corresponding to the initially active VN.
GMW3104 defines an initially active diagnostic VN. When the initially active diagnostic VN is active, the
communications kernel enables the use of all diagnostic CAN Identifiers.
Diagnostic CAN Identifiers include the following:
1. A node’s predefined diagnostic point-to-point request CAN Identifier (physical request CAN Identifier).
2. The AllNodes request CAN Identifier (functional request CAN Identifier) with a valid extended address
(functional system address). See the section in this specification on diagnostic CAN Identifiers for more
information on the All Nodes request CAN Identifier and the use of extended addresses.
3. A node’s reserved SPS_PrimeReq CAN Identifier (this CAN Identifier is only valid for a SPS_TYPE_C
ECU during a programming event. See the programming section of this specification for more details on
the use of this type of CAN Identifier).
4. A valid OBD/EOBD request CAN Identifier.
5.2.3.2 Application Triggered Diagnostic VN. To ensure that a node remains in the COMM_ACTIVE state
while a tester is performing diagnostic services, all nodes (which support the diagnostic services described in
this specification) shall support an application triggered diagnostic VN.
The application triggered diagnostic VN shall be activated and deactivated by the node’s diagnostic application
layer. Since the application triggered diagnostic VN is local to each node, no Virtual Network Management
Frame (VNMF) activation bit shall be transmitted in support of this VN.
The Application Layer shall use the service primitives provided by the Network Layer and additional
self-generated flags to determine if an activation or deactivation of the application triggered diagnostic VN is
required.
5.2.4 Enabling Diagnostic Communications. To begin performing diagnostic services, a tool sends out a
wake-up request (for SWCAN this is the high voltage wake-up with CANId $100, for wake-up mechanisms on
other GMLAN links, the tool uses the InitiateDiagnosticOperation service sub-function $04 - wakeUpLinks
targeted to all gateway devices using a functionally addressed request with the Gateway Devices - $FD
extended address). The wake-up causes ECUs to transition into (or remain in) the COMM_ACTIVE state. An
ECU which was previously in the COMM_KERNEL_INACTIVE state (see Figure 9) would transition through
the COMM_INIT state and through the COMM_ENABLED state (due to the initially active diagnostic VN) and
end up in the COMM_ACTIVE state. The diagnostic CAN Identifiers are enabled in the kernel as long as the
initially active diagnostic VN is active (8 s).
While the initially active diagnostic VN is active, the tester can activate the application triggered diagnostic VN
in order to keep the ECU in the COMM_ACTIVE state while it is performing diagnostics.
Figure 11 contains a state transition diagram of the diagnostic application. The following definitions are
provided to aid in understanding the requirements for transitioning into and out of the various states:
Start of Diagnostic Request:
The start of a diagnostic request is defined as reception of either the FirstFrame of a diagnostic request (as
indicated by the Network Layer), or the reception of a SingleFrame diagnostic request message using the
defined diagnostic CAN Identifiers.
Diagnostic Service Finished (successful or with error): A diagnostic service is considered finished (or
completed) if any of the following occurs:
1. The application receives an error indication from the network layer after the reception of a multi-frame
message had started.
2. A request message is successfully received, the application has finished processing the request, and no
response is required.
3. A request is received which requires a response, the application has processed the request and
The application receives confirmation from the Network Layer (or Data Link Layer for UUDT responses)
that the complete diagnostic response message (either USDT single frame, the last frame of a USDT
multiple frame response, or the last UUDT response message) has been successfully transmitted on the
bus, or
© Copyright 2010 General Motors All Rights Reserved
Note: Certain diagnostic services such as the $A9 service may send multiple UUDT responses to a single
request. The service is not considered completed in this case until all of the UUDT responses have been
confirmed or an error is indicated.
The application receives an indication from the Network Layer (or Data Link Layer for UUDT responses)
that an error occurred while transmitting the diagnostic response message on the bus.
Note: A functionally performed TesterPresent service is finished after the reception and the processing of the
request message, because there is no response to a functionally addressed TesterPresent request.
The next several sections describe the required behavior in each of the states.
DIAG_DISABLED
DIAG_INACTIVE
DIAG_ACTIVE_TIMER_OFF DIAG_ACTIVE_TIMER_ON
Start Of Diagnostic Request/
Diagnostic Mode activated Appl_Diag_VN_Timer:=8sec;
Appl_Diag_VN_Timer_Status:=disabled;
DIAG_MODE_ACTIVE
5.2.4.1 DIAG_DISABLED State. This is the state of the diagnostic application when the diagnostic CAN
Identifiers are not enabled and no diagnostics can take place. The diagnostic application exits this state and
enters the DIAG_INACTIVE state once a tester or a node on the link issues a wake-up which enables the
initially active diagnostic VN.
5.2.4.2 DIAG_INACTIVE State. In the DIAG_INACTIVE state, the ECU shall be capable of receiving
diagnostic messages but no diagnostic requests are currently active (i.e., the Application triggered diagnostic
VN is not active). The diagnostic application shall enter this state from the DIAG_DISABLED state after a bus
wake-up is received. The diagnostic applications shall remain in this state while the initially active diagnostic
VN is active and the application triggered diagnostic VN is inactive.
5.2.4.3 DIAG_ACTIVE_TIMER_OFF State. The diagnostic application shall enter this state from the
DIAG_INACTIVE state or the DIAG_ACTIVE_TIMER_ON state upon notification from the Network Layer that a
diagnostic request has started (Start of Diagnostic Request). A node shall enter this state from the
DIAG_MODE_ACTIVE state upon termination of Diagnostic Mode. If the diagnostic application is in the
DIAG_INACTIVE state when a diagnostic request starts, the diagnostic application shall activate the
application triggered diagnostic VN and reset and disable a diagnostic application based VN timer (further
referenced as Appl_Diag_VN_Timer). If the diagnostic application is in the DIAG_ACTIVE_TIMER_ON state
when the diagnostic request starts, then the diagnostic application shall reset and disable its
Appl_Diag_VN_Timer.
Note: “Reset” in this case means modification of the value of the timer such that 8 additional seconds shall
elapse before a timeout occurs.
© Copyright 2010 General Motors All Rights Reserved
Note: “Disable” in this case means preventing the value of the timer from being modified during subsequent
processing loops.
The diagnostic application exits this state and enters the DIAG_MODE_ACTIVE state if a diagnostic request is
received which activates Diagnostic Mode. The diagnostic application enters the DIAG_ACTIVE_TIMER_ON
state from this state once the last diagnostic service has finished. When transitioning to the
DIAG_ACTIVE_TIMER_ON state, the Appl_Diag_VN_Timer is enabled.
Note: “Enable” in this case means allowing the value of the timer to be modified during subsequent processing
loops.
5.2.4.4 DIAG_ACTIVE_TIMER_ON State. The diagnostic application shall enter this state from the
DIAG_ACTIVE_TIMER_OFF state once the last diagnostic service has finished. The diagnostic application
shall remain in this state until either a new diagnostic request is started (which transitions the application back
to the DIAG_ACTIVE_TIMER_OFF state) or the Appl_Diag_VN_Timer times out. The diagnostic application
shall deactivate the application triggered diagnostic VN and transition to the DIAG_INACTIVE state once the
Appl_Diag_VN_Timer times out.
5.2.4.5 DIAG_MODE_ACTIVE State. The diagnostic application shall enter this state anytime Diagnostic
Mode is active and shall remain in this state as long as Diagnostic Mode remains active. The
Appl_Diag_VN_Timer shall remain disabled while in this state. Upon termination of Diagnostic Mode, the
diagnostic application shall transition to the DIAG_ACTIVE_TIMER_OFF state.
5.2.5 Activation of the Application Triggered Diagnostic VN. The application triggered diagnostic VN is
activated when the diagnostic application is in the DIAG_INACTIVE state and a diagnostic request is started.
Once in the DIAG_INACTIVE state, the tester can send a diagnostic request which is made up of one or
multiple frames. Upon receipt of each SingleFrame (SF) diagnostic request, or the FirstFrame (FF) of a
multi-frame diagnostic request, the network layer shall provide an indication to the diagnostic application.
When the diagnostic application is in the DIAG_INACTIVE state and a SF or FF indication is received from the
network layer, the application shall notify the GMLAN Handler that the application triggered diagnostic VN is
requested to be active.
Figure 12 illustrates how the application triggered diagnostic VN is activated based on receipt of a FirstFrame
of a diagnostic request. In the figure, a wake-up (shown as WuP) is generated by the tester when it is first
plugged in to ensure that all nodes transition to (or remain in) the COMM_ACTIVE state (refer to Figure 10)
and that the diagnostic application transitions into (or remains in) the DIAG_INACTIVE state. Upon receipt of
the FirstFrame indication (N_USData_FF.ind) from the Network Layer, the diagnostic application tells the
handler to activate the application triggered diagnostic VN.
ConsecutiveFrame application
N_USData.ind triggered
diagnostic
VN active
:
Figure 12: Application Triggered Diagnostic VN - Activation via FirstFrame Indication
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Note: In Figure 12, it is assumed the node is in the ECU_IN_STANDBY state at the time the Tester initiates
the WuP.
5.2.6 Keeping the Application Triggered Diagnostic VN Active. The diagnostic application shall keep the
application triggered diagnostic VN active as long as the Appl_Diag_VN_Timer has not expired. (Refer to
paragraph 5.2.4 for the detailed handling of the Appl_Diag_VN_Timer - reset, disable and enable conditions.)
5.2.7 Deactivation of the Application Triggered Diagnostic VN. The diagnostic application shall notify the
GMLAN Handler to deactivate application triggered diagnostic VN when the Appl_Diag_VN_Timer elapses. At
this time the diagnostic application shall transition to the DIAG_INACTIVE state.
Figure 13 shows a case where diagnostic mode is not active and the ECU is sending a multiple frame
response to a received request.
Note: It is assumed that the application triggered diagnostic VN is the only active VN.
Figure 14 shows a case where diagnostic mode is not active and the requested diagnostic service results in
3 UUDT responses.
Note: It is assumed that the application triggered diagnostic VN is the only active VN.
Communication State Application State
GMLAN Diagnostic
Tester Handler Application COMM_ACTIVE DIAG_ACTIVE
TIMER_OFF
FirstFrame N_USData.req
FlowControl
ConsecutiveFrame
response
Enable application
ConsecutiveFrame
Appl_Diag_VN_Timer triggered
(diagnostic diagnostic
ConsecutiveFrame mode is not active)
N_USData.con VN active
DIAG_ACTIVE
TIMER_ON
:
Timeout
Deactivate application VN deactivated COMM_ENABLED DIAG_INACTIVE
Note: It is assumed that the application triggered diagnostic VN is the only active VN so when the diagnostic application deactivates it, the
ECUs communication kernel transitions to COMM_ENABLED.
Figure 13: Application Triggered Diagnostic VN - Deactivation after Transmission of USDTResponse
and Diagnostic Mode Is Not Active
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
N_UUData.req
UUDT resp.
N_UUData.con
N_UUData.req
UUDT resp.
response N_UUData.con
Enable
application
Appl_Diag_VN_Timer
N_UUData.req triggered
UUDT resp. (diagnostic
diagnostic
N_UUData.con mode is not active)
VN active
DIAG_ACTIVE
TIMER_ON
:
Timeout
VN deactivated COMM_ENABLED DIAG_INACTIVE
Deactivate application
4-8 sec DIAG_DISABLED
triggered diagnostic VN
ECU_READY
Note: It is assumed that the application triggered diagnostic VN is the only active VN.
Figure 14: Application Triggered Diagnostic VN - Deactivation after Transmission Of Multiple UUDT
Responses Without Diagnostic Mode Active
5.2.8 Verification of Diagnostic VN Deactivation. This section specifies the method on how to check
whether a node correctly deactivates the initially active and the application triggered diagnostic VN. It takes
into account the definitions in the previous sections.
5.2.8.1 Deactivation Verification of the Initially Active Diagnostic VN.
Test Procedure:
Perform a bus wake-up, which activates the initially active diagnostic VN and all other initially active Virtual
Networks in the node.
Wait for all initially active Virtual Networks to timeout (8 s + 1 s safety margin after the bus wake-up). Make
sure that no subsequent bus wake-up occurs.
Transmit a physically addressed ReadDataByIdentifier ($1A) service with DataIdentifier $B0
(diagnosticAddress) to the node using the node’s physical request CAN Identifier and make sure that the node
does not respond to this diagnostic request.
Acceptance Criteria:
The node shall not respond to the last transmitted ReadDataByIdentifier ($1A) service. This indicates that the
node has deactivated the initially active diagnostic VN properly.
5.2.8.2 Deactivation Verification of the Application Triggered Diagnostic VN.
Test Procedure:
a. Perform a bus wake-up, which activates the initially active diagnostic VN and all other initially active Virtual
Networks in the node.
b. Wait for a duration of 7 s (less than the VN timeout value) and transmit a physically addressed
ReadDataByIdentifier ($1A) service with DataIdentifier $B0 (diagnosticAddress) to the node using the
node’s physical request CAN Identifier. Make sure that the node responds with the appropriate response
message. This diagnostic request shall have caused the node to start the application triggered diagnostic
VN and the node shall remain active for additional 8 s.
c. Wait another duration of 7 s (less than the VN timeout value) and again transmit a physically addressed
ReadDataByIdentifier ($1A) service with DataIdentifier $B0 (diagnosticAddress) to the node using the
node’s physical request CAN Identifier. Make sure that the node responds with the appropriate response
message, which indicates that the node had activated the application triggered diagnostic VN with the
previous diagnostic request. This second diagnostic request shall have caused the node to reset the
application triggered diagnostic VN timer and the node shall remain active for additional 8 s.
d. Wait for the VN to timeout (8 s + 1 s safety margin after the reception of the response from the previous
diagnostic request). Make sure that no subsequent bus wake-up occurs.
e. Transmit a physically addressed ReadDataByIdentifier ($1A) service with DataIdentifier $B0
(diagnosticAddress) to the node using the node’s physical request CAN Identifier and make sure that the
node does not respond to this diagnostic request.
Note: ECUs implementing a communications handler based on versions of GMW3104 prior to version 1.5 may
have an additional timer in the handler for deactivating local VNs. This timer value must be added to the 8 s
specified in this verification procedure above.
Acceptance Criteria:
The node shall not respond to the last transmitted ReadDataByIdentifier ($1A) service. This indicates that the
node has deactivated the initially active and application triggered diagnostic VN properly.
5.2.9 Example: Activation and Deactivation of the Application Triggered Diagnostic VN.
Note: It is assumed that the Application Triggered Diagnostic VN is the only Active VN.
Figure 15 provides an additional example for the activation and deactivation of the application triggered
diagnostic VN. In the examples, it is assumed that the ECU is in the ECU_IN_STANDBY communication state
at the time the tester sends a wake-up. Following the wake-up, the diagnostic application enters the
DIAG_INACTIVE state.
1. The first request (1) is a multiple frame request message. Upon receipt of the FirstFrame, the Network
Layer provides an indication to the diagnostic application that a request has started. The diagnostic
application resets and disables the Appl_Diag_VN timer, tells the handler to activate the application
triggered diagnostic VN, and transitions into the DIAG_ACTIVE_TIMER_OFF state. At the end of the
SingleFrame response message the diagnostic application enables the Appl_Diag_VN_Timer and
transitions to the DIAG_ACTIVE_TIMER_ON state (since the requested service does not require
Diagnostic Mode and no response or request message is in progress).
2. The second request (2) is a SingleFrame request message that is received while the application triggered
diagnostic VN is already active. The Network Layer indicates to the diagnostic application that the
SingleFrame request has been received and the application resets and disables the Appl_Diag_VN_Timer
(transitions back to DIAG_ACTIVE_TIMER_OFF state). The requested service requires the node to enable
Diagnostic Mode and therefore the application layer transitions into the DIAG_MODE_ACTIVE state and
does not enable Appl_Diag_VN_Timer after the transmission of the response message.
3. The third request (3) is a functionally addressed SingleFrame TesterPresent message which results in the
node resetting the TesterPresent timer (P3C) to keep Diagnostic Mode active. The diagnostic application
stays in the DIAG_MODE_ACTIVE state.
4. The fourth request (4) is a SingleFrame message for the ReturnToNormalMode ($20) service. Upon
receipt of the request, the Network Layer provides an indication to the diagnostic application that a
diagnostic service has started. The application then processes the $20 request which cancels Diagnostic
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Mode and thus causes the ECU to transition into the DIAG_ACTIVE_TIMER_OFF state. Upon receiving
confirmation from the network layer that the response was successfully transmitted, the diagnostic
application transitions to the DIAG_ACTIVE_TIMER_ON state. After 8 s elapses, the application informs
the handler to deactivate the application triggered diagnostic VN and transitions into the DIAG_INACTIVE
state. Since the initially active diagnostic VN is already deactivated at this point, the diagnostic application
then transitions into the DIAG_DISABLED state.
COMM_ENABLED
initally active
ConsecutiveFrame diagnostic VN
deactivated
ConsecutiveFrame
N_USData.ind
SingleFrame N_USData.req
response
N_USData.con DIAG_ACTIVE
Start Timer TIMER_ON
2) request SingleFrame
(requires diagnostic mode) N_USData.ind
DIAG_ACTIVE
Reset and TIMER_OFF
disable Timer
SingleFrame N_USData.req
response
N_USData.con DIAG_MODE_ACTIVE
3) request SingleFrame
N_USData.ind
(AllNodes TesterPresent) diagnostic
mode
active
4) request SingleFrame
N_USData.ind
(stops diagnostic mode)
SingleFrame N_USData.req
response DIAG_ACTIVE
N_USData.con TIMER_OFF
Start Timer diagnostic mode DIAG_ACTIVE
deactivated TIMER_ON
Timeout
De-Activate VN VN deactivated COMM_ENABLED DIAG_INACTIVE
ECU_READY
Note: It is assumed that the Application Triggered Diagnostic VN is the only active VN.
Figure 15: Diagnostic Local VN - Activation and Deactivation Example
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Note: The tester may have to first wake-up other subnets before being able to have a wake-up issued on the
subnet that diagnostics are to be performed. For example, the tester may need to send the high voltage
wake-up on the LS CAN link and then send the appropriate InitiateDiagnosticOperation request to the gateway
between the LS and MS CAN links in order wake-up devices on the MS CAN bus.
GMLAN diagnostic tools shall allow 500 ms for all nodes on a subnet to reach the Communication Active state
after the tool issues a wake-up request. (See notes below.) This means that vehicle serial data designers must
determine the worst case initialization time after a wake-up for all nodes on a given subnet, and factor that time
in when determining the latency requirements for a gateway to generate wake-ups on the other subnets. In
other words, if the worst case initialization time for all ECUs on a subnet was 350 ms, then the gateway would
be required to transfer the wake-up across the subnet in less than 150 ms. (See note below.)
Note: Refer to the Diagnostics and Node Management chapter within this specification and the GMLAN
Communication Strategy Specification (GMW 3104) for more information on the Communications Enabled
state.
Note: The wake-up request may consist of sending the LS CAN high voltage wake-up message or sending an
InitiateDiagnosticOperation request to a gateway.
Note: The 150 ms also takes into account worst case message traffic.
6.2 Application Timing Parameters Definitions. The following sections define the GMLAN Diagnostic
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Application timing parameters to be fulfilled by GMLAN ECUs and Testers. Each timing parameter definition is
separated into two parts, except for the P3C application timing parameter. See paragraph 6.2.4.
ECU requirements: This part describes the requirements for a single ECU communicating with a tester.
Each timing parameters contains an E to indicate that it applies to a GMLAN ECU.
Tester requirements: This part describes the requirements for the tester when communicating with one or
multiple ECUs. Each timing parameters contains a T to indicate that it applies to a GMLAN Tester.
6.2.1 Application Timing Parameter P2CE/P2CT Definition. The P2CX (see note below) application timing
parameter applies to all diagnostic services defined in this specification. Each service uses a request/response
scheme based on the following:
Note: “x” can either be “E” for ECU, or “T” for Tester.
The request message is always a USDT single frame or multi-frame message and
The response message following the request message is either:
A USDT single frame or multi-frame message positive response (except for diagnostic services $AA and
$A9), or a USDT single frame negative response.
One or multiple diagnostic UUDT positive response message(s) for services $AA or $A9.
Note: If the initial response message is a negative response with response code $78
(RequestCorrectlyReceived-ResponsePending), then there shall also be a final response. Refer to paragraph
6.2.2 for additional information on the final response.
The following sections specify the timing requirements for the ECU and the tester based on the above
described request/response schemes for GMLAN diagnostic services.
Further references to P2C and P2C* within this specification are references to the ECU timing parameters P2CE
and P2CE* unless otherwise noted (e.g., P2CT or P2CT*).
6.2.1.1 ECU Timing Parameter P2CE (Table 27). The timing parameter P2CE is defined to be the time between
the end of the tester request message and the completion of either a single frame response, the first frame of a
multi-frame response message, or the first UUDT message transmitted by the ECU in response to a service
$AA or $A9.
The request message sent by the tester can either be a single frame (with address type either functional or
physical), or a multi-frame message (with address type physical only). The end of a tester request message is
indicated to the application layer in the ECU by the network layer (N_USData.ind).
Note: The network layer of a message sender only indicates the completion of an entire message (single
frame/multi-frame USDT message, or UUDT message - see Figures 16 thru 18) to the application layer
(N_USData.con, N_UUData.con). The network layer does not indicate the completion of the transmission of
only the first frame of a multi-frame message.
P2CE
0 100
Figure 16: ECU P2CE Timing Parameter Definition - Single Frame Response Message
P2CE
0 100
Figure 17: ECU P2C Timing Parameter Definition - Multiple Frame Response Message
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
PX
0 ... ...
P2CE
0 100
Note: Figure 18 describes the timing parameter P2CE for services which send UUDT responses. Refer to
diagnostic services $AA and $A9 for timing requirements (P X) of UUDT responses following the initial UUDT
response (if applicable).
The transmission and reception of USDT messages (single and multi-frame messages) is completely handled
in the network layer.
When the application layer transmits a message, it sends a transmit request (N_USData.req) to the network
layer and provides the data to be transmitted. The network layer performs the necessary timing handling to
make sure that the data is transmitted (segmented data transfer, if data length requires multi-frames). The
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
network layer indicates when the single frame or multi-frame message is completely transmitted
(N_USData.con) or when an error occurred during the transmission (N_USData.ind with negative result code).
When receiving a multi-frame message, the application layer gets an indication from the network layer that a
multi-frame message has started (N_USData_FF.ind) and gets another indication when the USDT multi-frame
message is completely received (N_USData.ind) or when an error occurred (N_USData.ind with negative
result code). Single frame messages are indicated to the application layer after its completion via a single
indication (N_USData.ind with length ≤ 7 for normal addressing and length ≤ 6 for extended addressing).
The segmentation of data into multiple single frame UUDT response messages (diagnostic services $AA and
$A9) is completely handled by the diagnostic application. The diagnostic application builds the individual UUDT
messages and provides them to the network layer for transmission on the link (N_UUData.req). The network
layer indicates when each individual UUDT message is completely transmitted (N_UUData.con).
6.2.1.2 Tester Timing Parameter P2CT (Table 28). For a GMLAN tester the timing parameter P2CT is defined
to be:
The timeout between the end of the tester request message (single frame or multi-frame request
message) and the first received frame of either the USDT response message (single frame, or first frame
of a multi-frame response), or the first UUDT message of the services $AA, $A9 (there may be subsequent
UUDT messages transmitted by the ECU to transmit the requested data), and
The timeout between each response message from multiple nodes responding during functional
communication.
The P2CT timer shall initially be started by the application layer of the tester after the successful transmission of
the request message which is indicated by the network layer (N_USData.con). The P2 CT timer shall be
restarted by the application layer of the tester each time the network layer provides an indication, provided that
the responses are associated with the corresponding request message for any of the following conditions:
Receipt of a single frame USDT response message (N_USData.ind with length ≤ 7, response messages
always use normal addressing).
Receipt of the first frame of a multiple frame USDT response message (N_USData_FF.ind,).
Receipt of the first (or only) UUDT response message from service $AA or $A9 response message
(N_UUData.ind, only the first UUDT message of a service $AA or $A9 response message shall restart
P2CT).
If the tester does NOT know the number of responding ECUs to a functional request the following handling
applies:
The tester shall wait for a P2CT timeout, and
For services other than $AA and $A9, all USDT multi-frame response messages must be completely
received, and
For services $AA and $A9, depending on the sub-level parameter value, the tester either has to wait for
the completion of all expected UUDT response messages, or only the first UUDT response message
(reference services $AA and $A9).
Note: If the tester sends a functionally addressed request message which results in either multiple ECUs
sending multi-frame USDT responses or multiple single frame UUDT responses, then the tester must pick an
appropriate value for P2CTmax which allows all ECUs to have sufficient time to gain access to the bus.
If the tester knows the number of responding ECUs the following handling applies:
The tester should not wait for a P2CT timeout, but
For services other than $AA and $A9, all USDT multi-frame response messages must be completely
received, and
For services $AA and $A9, depending on the sub-level parameter value, the tester either has to wait for
the completion of all expected UUDT response messages, or only the first UUDT response message
(reference services $AA and $A9).
In both above listed cases the application layer has to keep track of the response messages following the
request message.
The tester implementation of P2CT as described assumes that the tester has implemented the network layer
and utilizes the service primitives that it provides. The network layer of the tester provides an indication to the
application layer each time any of the following occurs:
The first frame of a multi-frame response is received (N_USData_FF.ind).
The last consecutive frame of a multi-frame response message is received (N_USData.ind).
A SingleFrame response is received (N_USData.ind with length ≤ 7). See Figure 19.
An error condition is detected by the network layer (N_USData.ind with a negative result code).
A UUDT diagnostic response is received (N_UUData.ind). See Figure 21.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Restart(150)
P2CT
0 150
Restart(150)
P2CT
0 150
Restart(150)
P2CT
0 150
Start (150)
P2CT
0 150
Figure 19: Tester P2C Timing Parameter Definition - Single Frame Response Messages
In Figure19, the tester transmits a functionally addressed request message (single frame message) and three
ECUs respond. Each ECU responds with a single frame response message. If the tester knows the number of
responding ECUs, then the next request message can be transmitted immediately after the reception of the
last response message. If the number of responding ECUs is not known, then the tester shall wait until a P2CT
timeout occurs before transmitting the next request message. See Figure 20.
Restart(150)
P2CT
0 150
Restart(150)
P2CT
0 150
Restart(150)
P2CT
0 150
Start (150)
P2CT
0 150
Figure 20: Tester P2CT Timing Parameter Definition - Single and Multi-Frame Response Messages
In Figure 20, the tester transmits a functionally addressed request message and three ECUs respond. Two
ECUs respond with a single frame response message and one ECU responds with a multi-frame response
message. The tester has to wait until each response message is completely received before transmitting the
next request message.
If the P2CT application timer is not timed out at the point in time when the last pending multi-frame response
message is completely received and the tester does not know the number of responding ECUs, then the tester
has to wait for a timeout of P2CT before transmitting the next request message. If the tester knows the number
of responding ECUs and all expected response messages are completely received then the tester can
immediately transmit the next request message.
Note: The indication of a successful reception of a multi-frame response message does not restart the P2 CT
application timer in the tester. Only the start of the multi-frame response message indicated via the first frame
indication (N_USData_FF.ind) is relevant for the restart of the P2CT timer.
Restart(150)
P2CT
Restart(150) 0 150
P2CT
Restart(150) 0 150
P2CT
0 150
Start (150)
P2CT
0 150
Figure 21: Tester P2CT Timing Parameter Definition - Multiple UUDT Response Messages
Note: The timing handling of the tester that applies to subsequent UUDT messages, optionally following the
first UUDT message is not shown in the figure above.
In Figure 21, the tester transmits a functionally addressed request message (e.g., $A9) and three ECUs
respond. Two ECUs respond with two UUDT messages and one ECU responds with one UUDT message. In
this example the tester either waits for a P2 CT timeout and the completion of all UUDT response messages
(number of responding ECUs not known), or only for the completion of all UUDT response messages (number
of responding ECUs known).
Note: Only the successful reception of the first UUDT response message of each ECU following the request
message restarts the P2CT application timer in the tester.
6.2.2 Application Timing Parameter P2CE*/P2CT*Definition. If an ECU cannot respond with its final USDT
response message or its first UUDT response message following a service $AA or $A9 request message
within the required P2CE timing window as specified in paragraph 6.2.1.1, then the ECU can indicate to the
tester that an enhancement of its response timing parameter to P2CE* is required. This can be done by sending
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
is capable of sending the final USDT response (positive response or negative response with a response
code other than $78) or the first UUDT response message.
For its final USDT response message or UUDT response message the ECU has to make sure that the
single frame response message (positive or negative response other than response code $78), the first
frame of a multi-frame response message or the first UUDT response message is completed (transmitted
on to the CAN bus) within the last requested P2CE*.
The ECU shall be able to receive and process a functionally addressed TesterPresent service request
messages while it has activated the enhanced response timing and prepares the final response message.
Note: This functionality shall keep a node in a previously activated diagnostic mode of operation if the
preparation of the final response message takes longer than P3 C.
P2CE
0 P2CE*
P2CE
0 100
Figure 22: ECU P2CE* Timing Parameter Definition - Single RC78 and Final SF Response Message
P2CE
0 P2CE*
P2CE
0 100
Figure 23: ECU P2CE* Timing Parameter Definition - Single RC78 and Final Multi-Frame
Response Message
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
P2CE
0 P2CE*
P2CE
0 P2CE*
P2CE
0 100
Request USDT-FC
Figure 24: ECU P2CE*Timing Parameter Definition - Multiple RC78 and Final Multi-Frame
Response Message
PX
0 ...
P2CE
0 P2CE*
P2CE
0 100
Figure 25: ECU P2CE*Timing Parameter Definition - Single RC78 and Final UUDT Response Message
(One or Multiple)
Note: The timing that applies to subsequent UUDT messages, optionally transmitted by the ECU following the
first UUDT message is not shown in the figure above.
6.2.2.2 Tester Timing Parameter P2CT* (Table 30 and Figures 26 thru 28). If an ECU requests an enhanced
response timing by responding with a negative response message with response code $78 then the tester has
to modify its P2CT timer reload value to the value of P2CT*. The handling of the enhanced response timing
using the P2CT* timing parameter value is based on the general P2CT handling with the exception that the timer
reload value is modified to be the P2CT* timing parameter value.
current active reload value, which can either be the normal P2CT timing parameter value (normal timing),
or, if at least one ECU requested an enhanced response timing, the P2CT* timing parameter value
(enhanced timing).
The tester shall keep track of the ECUs which requested an enhanced response timing. The tester has to
build an ECU list which contains unique identifications of all ECUs which requested an enhanced response
timing, because the tester has to know the ECUs which requested enhanced response timing in order to
determine when the normal P2CT timing parameter reload value should be re-enabled. The normal P2CT
parameter is re-enabled when all ECUs which have requested enhanced response timing have responded
with a single frame response message, the first frame of a multi-frame response message or the first
USDT response message. The list shall be built based on the negative response messages with response
code $78 sent by the ECU(s).
The tester shall be able to transmit functionally addressed TesterPresent request messages while
performing the enhanced response timing (This functionality shall keep a node in a previously activated
diagnostic mode of operation if the preparation of the final response message takes longer than P3 C.)
Normal
Enhanced Timing Normal Timing
Timing
Normal Timing
re-activated
Enhanced
Timing
activated Restart (150)
Normal Timing P2CT
active 0 150
Restart (P2C*)
P2CT
Restart (P2C*) 0 P2CT*
P2CT
0 P2CT*
Start (150)
P2CT
0 150
Figure 26: Tester P2CT* Timing Parameter Definition - Single ECU Responding with Multi-Frame USDT
Response Message
In Figure 26, the tester transmits a physically addressed request message and the addressed ECU requests
an enhancement of the response timing twice before it finally transmits its multi-frame response message. The
tester initially starts with the normal P2CT reload value (after the confirmation of the complete transmission of
the request message). When it receives the first negative response with response code $78 it restarts its P2CT
timer as defined in the general P2CT handling but with the P2CT* reload value. In addition, the tester stores an
ECU identification that the final response of this ECU is pending. Any subsequent negative response message
with response code $78 restarts the P2CT timer with the currently active P2CT reload value (which is P2CT* in
the above case). When the ECU finally responds (positive or negative response message with response code
other than $78 or first UUDT message), then the tester deletes the ECU identification in its internal list of
pending ECU responses and restarts the P2CT timer with the normal P2CT timing parameter value, because no
further ECU is stored in the tester internal response code $78 ECU list.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Restart (150)
P2CT
0 150
Restart (P2C*)
Enhanced Timing
activated P2CT
Restart (P2C*) 0 P2CT*
P2CT
Restart (P2C*) 0 P2CT*
Normal Timing
active P2CT
Restart (P2C*) 0 P2CT*
P2CT
0 P2CT*
Restart (150)
P2CT
0 150
Start (150)
P2CT
0 150
Tester NWL req con ind ind ind ind ind ind ind
ECU #3 Transmit
SF-RC78 SF-RC78 SF
Figure 27: Tester P2CT* Timing Parameter Definition - Multiple ECUs Responding
In Figure 27, the tester transmits a functionally addressed request message and three ECUs respond. Two
ECUs request enhanced response timing and one ECU immediately responds with a multi-frame response
message (two consecutive frames). Based on the general handling of P2 CT the tester has to restart the P2CT
timer with each starting response message provided the response is associated with the request message. At
the point in time when the tester receives the first negative response with response code $78 the tester
modifies the reload value of P2CT to the enhanced P2CT* timing parameter value and stores an ECU
identification that the final response of this ECU is pending. When the ECU finally responds, the tester deletes
the ECU identification in its internal list of pending ECU responses. At the point in time when the last ECU
which requested an enhanced response timing finally starts its response message, the tester re-enables the
normal P2CT reload value for its P2CT timer. Any subsequent response message (single frame or first frame of
multi-frame response message) during an active enhanced response timing P2 CT*forces the tester to restart its
P2CT timer as defined for the general handling of P2CT using the currently active reload value.
Restart (150)
P2CT
0 150
Restart (P2C*)
Enhanced Timing
activated P2CT
Restart (P2C*) 0 P2CT*
P2CT
Restart (P2C*) 0 P2CT*
Normal Timing
active P2CT
Restart (P2C*) 0 P2CT*
P2CT
0 P2CT*
Restart (150)
P2CT
0 150
Start (150)
P2CT
0 150
Tester NWL req con ind ind ind ind ind ind ind ind
Figure 28: Tester P2CT* Timing Parameter Definition - Multiple ECUs Responding
with UUDT Response Messages
In Figure 28, the tester transmits a functionally addressed service $AA or $A9 request message and three
ECUs respond. Two ECUs request enhanced response timing and one ECU immediately starts to respond
with its UUDT message. Based on the general handling of P2 CT the tester has to restart the P2CT timer with
each starting response message (first UUDT response message) provided the response is associated with the
request message (e.g., the Data Packet Identifier (DPID) number in the UUDT response message to a service
$AA request message must match the list of requested DPID numbers embedded in the transmitted request
message). At the point in time when the tester receives the first negative response with response code $78 the
tester modifies the reload value of P2CT to the enhanced P2CT* timing parameter value and stores an ECU
identification that the final response of this ECU is pending. When the ECU finally starts to respond (first UUDT
message), the tester deletes the ECU identification in its internal list of pending ECU responses. At the point in
time when the last ECU which requested an enhanced response timing finally starts its response message, the
tester re-enables the normal P2CT reload value for its P2CT timer. Any subsequent start of an ECU response
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
message (first UUDT message of this ECU) during an active enhanced response timing P2 CT* forces the tester
to restart its P2CT timer as defined for the general handling of P2CT using the currently active reload value.
6.2.2.3 Enhancement of P2CE*/P2CT* During A Programming Session (Tables 31 and 32). During a
programming session enabled via the sequence defined in the Programming Procedure it is helpful to further
enhance the P2CE*/P2CT* timing to allow ECUs to process, e.g., an Erase Flash Memory command which can
take longer than 5000 ms without having to send any additional negative response messages with response
code $78 (following the initial negative response message with response code $78).
The further enhancement of P2CE*/P2CT*applies to the ECU(s) and the tester only during an enabled
programming session.
Table 31: ECU P2CE* Timing Parameter Value During an Active Programming Session
Minimum Maximum
Parameter Description (Cemin*) (Cemax*)
[ms] [ms]
Enhanced response timing for a single ECU during an active
P2CE* 0 30000
programming session.
Table 32: Tester P2CT* Timing Parameter Value During an Active Programming Session
Minimum Maximum
Parameter Description (Cmin) (Cmax)
[ms] [ms]
Enhanced response timing value for tester P2CT timer during an Note 1
P2CT* 30200 N/A
active programming session.
Note 1: The value that a tester uses for P2CTmax* is left to the discretion of the tester as long as it is greater than P2CTmin*.
The handling which applies to those timing parameter values is identical to the general P2CE*/P2CT* handling.
The only differences are the values to be fulfilled in the ECU (timing requirement) and in the tester (timeout).
6.2.3 Application Timing Parameter Definition for UUDT Response Messages. The diagnostic services
ReadDiagnosticInformation ($A9) and ReadDataByPacketIdentifier ($AA) use UUDT messages to transmit the
requested data to the tester. UUDT messages use a different CAN Identifier than USDT messages, therefore
they can interleave multiple frame USDT messages. UUDT messages are primarily used for the transmission
of dynamic data.
An ECU has to comply with the general request/response scheme and therefore has to respond with the first
UUDT response message after the successful reception of the request message. The timing of this UUDT
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
response message shall be as described for the P2CE application timing parameter. Following this initial
response the ECU can start to transmit the requested data using UUDT messages.
The definition of the timing that applies to the subsequent UUDT response messages can be found in the
description of the diagnostic services ReadDiagnosticInformation ($A9) and ReadDataByPacketIdentifier
($AA).
If the ECU cannot respond to the diagnostic service $A9 or $AA within the P2CE timing, because of, e.g.,
internal checks based on the requested data than it can request an enhanced response timing as defined in
paragraph 6.2.2.
6.2.4 Application Timing Parameter P3C Definition (Table 33). The timing parameter P3C is defined to be
the maximum time between two consecutive TesterPresent ($3E) service request messages. TesterPresent
request messages shall be sent by the tester within P3 C when the tester desires certain previously activated
diagnostic services to remain active within one or multiple ECU(s). The tester shall always use a P3C value
less than the specified P3Cnom value.
Note: It is recommended that the tester transmits a TesterPresent request message every 2 s.
Note: See the sections of this specification describing the individual diagnostic services to determine which
service requires a TesterPresent service to remain active.
TesterPresent service request messages can be physically or functionally addressed. Each ECU shall be able
to receive and process a functionally addressed TesterPresent request message (single frame message with
AllNode CAN Id and valid extended address, e.g., AllNode extended address $FE) in between the
reception/transmission of a physically addressed single or multi-frame request/response message and during
an active enhanced response timing in order to reset its P3C timer.
Note: This functionality shall keep a node in a previously activated diagnostic mode of operation if the
transmission/receipt of the multiple-frame message or the preparation of the final response message during an
active enhanced response timing takes longer than P3 C.
The ECU shall recognize that a P3C timeout (also referred to as TesterPresent timeout) has occurred at a time
greater than or equal to P3Cnom and less than or equal to P3Cmax:
Tester P3C timeout < P3Cnom ≤ ECU P3C timeout < P3Cmax
P3Cmax is equal to P3Cnom plus a 2% tolerance. Further references to P3C within this specification are
references to the nominal value of P3C unless a subscript is included (e.g. P3Cmax). Refer to the TesterPresent
service description in this specification for more information about the TesterPresent timeout.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
P3C
0 P3C
Tester
P3C P3C P3C
0 P3C 0 P3C
Tester NWL req con req con ind req con ind req con req con ind req con
ECU NWL ind ind req ind con ind ind req con ind
P3C P3C
0 P3C 0 P3C
ECU
P3C P3C
0 P3C
Figure 29: P3C Timing Parameter Definition and Handling of the TesterPresent Logic
In Figure 29, the tester has set up its P3C timer to a value less than the P3C value of the ECU. Therefore, the
P3C timer of the tester times out earlier than the ECU P3 C which forces the tester to transmit its functionally
addressed TesterPresent service request message. See Table 34.
Table 34: P3C Start and Reset Definition for the Tester and ECU
P3C Start P3C Reset
Tester Confirmation from the Network Layer that a A P3C timeout triggers the reset of the P3C timer
service has been successfully transmitted that and the transmission of the TesterPresent
requires the tester to send a TesterPresent request message.
message in order to keep the service
functionality active.
ECU When the ECU has received a diagnostic When the ECU has received a diagnostic
message and the application has determined that message and the application has determined that
the service requested requires the activation of the service requested is the TesterPresent
the P3C timer. service.
See pseudo code of the diagnostic services in See pseudo code of the TesterPresent service.
this specification.
The tester implementation of P3C assumes that the tester has implemented the network layer and utilizes the
service primitives that it provides. The network layer of the tester provides a confirmation to the application
layer each time any of the following occurs:
A single frame request is transmitted (N_USData.con).
The last consecutive frame of a multi-frame request message is transmitted (N_USData.con).
An error indication is detected by the network layer (N_USData.con with a negative result code).
6.2.5 Application Timing Parameter Considerations. There is a delay involved in an ECU between the
reception of a request message from the CAN bus and actually performing any action based on the request
(e.g., queuing the transmission of a response message; see Figure 30). The amount of the delay is a function
of:
Whether the CAN controller receive processing is handled via a polling loop or is interrupt driven
The time it takes for the network layer to evaluate the correctness of the last received CAN frame
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
The execution rate of the application which adds an additional delay before network layer indications are
actually acted upon and
The time it takes the application to determine the validity of the received diagnostic message.
There is also a delay involved in an ECU between queuing the transmission of a response message and
actually finishing the transmission of the first frame (or only frame) of the response message (SF or FF) within
the required P2CE timing window. This delay is a function of:
How long it takes to actually put the first frame (SF or FF) of the queued response message into a transmit
object of the CAN controller,
The amount of time that the message cannot be sent on the bus due to lost arbitration with higher priority
CAN frame(s) and
The time to actually transmit the frame on the bus (this is a function of the baud rate, the number of data
bytes in the frame, and the bit pattern which effects the number of stuff bits).
Previous figures in the application timing section do not explicitly show these delays. However, the total delay
time has to be taken into consideration during the ECU design in order to ensure that the timing requirements
are met.
Figure 30 graphically depicts the possible delays involved in the reception of a request message and the
earliest point in time that the request can be acted upon (e.g., queue transmission of a response message or
start/reset the P3C timer, if applicable). It also shows the possible delays involved in the transmission of the
response message and the earliest point in time the frame can be indicated as a successfully received in the
tester.
Note: Reference the diagnostic services chapter of this specification for specific requirements on when it is
appropriate to start/reset the P3C timer.
Note: The ECU has to make sure that the first frame (SF or FF) of the response message is transmitted onto
the CAN bus within P2CE when no loss of arbitration occurs. The value of the P2 CT timeout within the tester is
purposely made greater than P2CE to compensate for bus arbitration under normal operating conditions.
Reset/Start P3C
in the ECU
P3C
0 P3C
P2CT
0 150
0
P2CE 100
TREQUEST TRESPONSE
Figure 30: ECU Delays during Reception of A Tester Request Message - Example With SF Response
The total reception delay TREQUEST is made up from the following components:
TCAN: This delay is comprised of the CAN controller polling rate and the evaluation time that it takes the
network layer to make sure that the frame is correctly received. In an interrupt driven scheme this delay is
based solely on the evaluation time in the network layer.
TApp: This delay is based on an application layer running in a certain time schedule. The application can
only act on network layer indications when it is activated.
TEval: This delay is based on the required evaluation of the request message (check of the service identifier
and evaluation, that the request message is correct). The figure above shows the earliest point in time
when the application can queue its response message.
The total transmit delay TRESPONSE is made up from the following components:
TR1: This is the delay within the ECU between the application queuing the response message and actually
placing the first CAN frame of the response (SF or FF) in a transmit object of the CAN controller.
TR2: This is the delay based on arbitration with higher priority CAN frames which can occur before the
frame is actually transmitted on the CAN bus. This delay varies based on the bus load and the priority of
the response frame compared to the priority of CAN frames in the transmit objects of other ECUs.
TTX: This is the transmit time of a single CAN frame. This time depends on the baud rate of the GMLAN
subnet where the CAN frame is transmitted, the number of data bytes in the frame, and the bit pattern
which determines the number of stuff bits.
Note: The above described delays for the response message have to be considered in order to meet the P2 CE
timing requirements defined in this specification. T R2 depends on the bus load and frame priorities. If no loss of
arbitration occurs, this delay time is equal to 0.
The reception delay (TREQUEST) is also applicable when receiving a service which requires a TesterPresent
(activation of the P3C timer) or when receiving a TesterPresent message which resets the P3 C timer. As
defined in paragraph 6.2.4, an ECU shall not timeout later than P3Cmax. This allows the ECU a total tolerance of
100 ms (2% of 5000 ms) for its P3C timer (P3Cmax = 5100 ms). The TREQUEST delays shall be comprehended
within this 100 ms tolerance.
Note: Each network layer timing parameter (N_Ax, N_Bx, and N_Cx) is specified from the perspective of both
the sender of a multi-frame message (e.g., N_As) and the receiver of a multi-frame message (e.g., N_Ar).
Timeout values define the amount of time a sender or a receiver must wait for the expected frame before
notifying the application of an error condition, and assume that the sender is not transmitting other messages
of higher priority than the diagnostic messages. Performance requirements are the timing requirements placed
on the sender of a specified frame. A detailed description of the network layer timing parameters can be found
in ISO 15765-2 and OSEK/COM specification.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
6.3.2 Tester Network Layer Flow Control Frame Transmit Parameter Requirements. A GMLAN tester
shall support the Network Layer parameters defined in Table 36 when transmitting flow control frames. The
values described in the table are the minimum requirements for the ECU to support when receiving a flow
control frame. See Figures 31 and 32. The ECU may support flow control parameter values over and above
the minimum specified. However, any time an ECU receives a flow control frame with parameter values that
the ECU does NOT support, the ECU shall treat the received frame as an invalid frame and discard it. The
ECU shall continue to wait for a valid flow control frame until one is received, or the network layer N_Br timeout
occurs. See Tables 37 and 39.
Tester ECU
FirstFrame
FirstFrame
x ms
ConsecutiveFrame
ConsecutiveFrame
Response
x ms
x ms
ConsecutiveFrame
ConsecutiveFrame
The ECU can tranmsit the
ConsecutiveFrames as fast
as possible
Figure 31: Tester Requirements for Multi-Frame Response Messages - Example Message Flow
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
6.3.3 ECU Network Layer Flow Control Frame Transmit Parameter Requirements. A GMLAN ECU shall
support the following network layer parameters when transmitting flow control frames (Table 38):
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Tester ECU
FirstFrame
FirstFrame
ConsecutiveFrame
ConsecutiveFrame
5 ms
ConsecutiveFrame
ConsecutiveFrame
Request
5 ms
5 ms
ConsecutiveFrame
ConsecutiveFrame
Figure 32: ECU Requirements for Multi-Frame Request Messages - Example Message Flow
7.2 Return Code Definition. The following subsections specify the definition of each return code. Each
GMLAN Enhanced Diagnostic Service includes a subsection which lists the return code(s) supported by the
service. All values which are currently not used as return codes are reserved by this document for future
expansion as necessary.
7.2.1 ServiceNotSupported ($11, RC_SNS). This response code indicates that the requested action will not
be taken because the ECU does not support the requested service. This return code is only valid for physically
addressed diagnostic requests.
Example: The ECU shall send this response code if the tester sends a physically addressed request message
with a service Identifier which is either unknown or not supported by the ECU. If a tester sends a valid
functionally addressed diagnostic request for a service that is not supported by the ECU, then the ECU shall
ignore the request (no response shall be sent). Refer to the Diag_API_Process_Recv_Msg() function in the
pseudo code of the ReportProgrammedState service ($A2) for implementation details on this response code.
7.2.2 SubFunctionNotSupported-InvalidFormat ($12, RC_SFNS_IF). This response code indicates that the
requested action will not be taken because the ECU does not support the arguments of the request message
or the format of the argument bytes do not match the prescribed format for the specified service.
Example: The ECU shall send this response code in case the tester has sent a request message with a
known and supported service Identifier but with sub-function parameters which are either unknown or not
supported or have an invalid format.
7.2.3 ConditionsNotCorrectOrRequestSequenceError ($22, RC_CNCRSE). This response code indicates
that the requested action will not be taken because the ECU prerequisite conditions are not met. This request
may occur when sequence sensitive requests are issued in the wrong order.
Example: The ECU shall send this response code in:
Case #1: The tester has sent a known and supported request message at a time where the ECUs
conditions to execute the requested service are unsafe or too critical to perform the requested action.
Case #2: The tester has sent a known and supported request message at a time where the ECU has
expected another request message because of a predefined sequence of services. A typical example of
occurrence is the securityAccess service which requires a sequence of messages as specified in the
message description of this service.
7.2.4 RequestOutOfRange ($31, RC_ROOR). This response code indicates that the requested action will not
be taken because the ECU detected a data byte(s) in the request message which attempt(s) to substitute (a)
value(s) beyond its range of authority (e.g., attempting to substitute a data byte of 111 when the data is only
defined to 100).
Example: The ECU shall send this response code in case the tester has sent a request message including
data bytes to adjust a variant which does not exist (invalid) in the ECU. This response code shall be
implemented for all services which allow the tester to write data or adjust functions by data in the ECU.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
7.2.5 InvalidKey ($35, RC_IK). This response code indicates that security access has not been given by the
ECU because the key sent by the tester did not match with the key in the server’s (ECU’s) memory. This
counts as an attempt to gain security. The ECU shall remain locked!
Example: The ECU shall send this response code in case the tester has sent a securityAccess request
message with the sendKey and Key parameter where the key value does not match the key value stored in the
server’s (ECU’s) memory. The ECU shall increment its internal securityAccessFailed counter.
7.2.6 ExceedNumberOfAttempts ($36, RC_ENOA). This response code indicates that the requested action
will not be taken because the tester has unsuccessfully attempted to gain security access more times than the
server’s (ECU’s) security strategy will allow. Refer to message description of the securityAccess service
definition.
Example: The ECU shall send this response code in case the tester has sent a securityAccess request
message with the sendKey and Key parameter where the key value does not match the key value stored in the
ECU’s memory and the number of attempts (securityAccessFailed counter value) have reached the ECU’s
securityAccessFailed calibration value.
7.2.7 RequiredTimeDelayNotExpired ($37, RC_RTDNE). This response code indicates that the requested
action will not be taken because the tester’s latest attempt to gain security access was initiated before the
ECUs required timeout period had elapsed.
Example: An invalid Key requires the tester to start over from the beginning with a securityAccess service. If
the security protection algorithm is not passed after X failed attempts (X = specified in the ECU’s memory), all
additional attempts are rejected for at least Y seconds (Y = specified in the ECU’s memory). The Y second
timer shall begin with the X failed attempt or upon a power/ignition cycle or reset of the ECU to ensure a
security lockout after all power interruptions.
7.2.8 RequestCorrectlyReceived-ResponsePending ($78, RC_RCR-RP). This response code indicates that
the request message was received correctly, and that any parameters in the request message were valid, but
the action to be performed may not be completed yet. This response code can be used to indicate that the
request message was properly received and does not need to be retransmitted, but the server (ECU) is not yet
ready to receive another request. The negative response message with this response code may be repeated
by the ECU(s) within P2C = P2C* until the final response message (which may be positive or negative, where
RC_ is not equal to $78).
Example: A typical example where this response code may be used is when periodic messages are
scheduled (see $AA service) and a new request is sent to modify the contents of the scheduler. It is possible
that the first response may not be sent within P2C due to the status of the other messages in the scheduler.
7.2.9 SchedulerFull ($81, RC_SCHDFULL). This response code indicates that the tester attempted to
schedule a diagnostic message via the $AA service and the ECUs scheduler table was full.
Example: ECU A is capable of scheduling 4 messages and currently has two messages in its scheduler. A
request is received by ECU A which would attempt to schedule three additional messages. This request would
be rejected as it would make the total number of messages that ECU A would have scheduled (5), greater
than the number which it is capable of scheduling.
7.2.10 VoltageOutOfRangeFault (High/Low) ($83 RC_VOLTRNG). This response code indicates that the
voltage is out of the acceptable range at the primary power pin of the ECU.
7.2.11 GeneralProgrammingFailure ($85 RC_PROGFAIL). This response code indicates that the ECU
detected an error when erasing or programming a memory location in the permanent memory device (e.g.,
Flash Memory).
7.2.12 DeviceTypeError ($89 RC_DEV_TYPE_ERR). This response code indicates that the ECU detected an
incompatibility between the programming algorithm downloaded and the permanent memory device type.
Example: In this example, an SPS programmable ECU can be manufactured with a flash memory device
which can come from two possible suppliers. As such, the programming algorithms for each flash device are
contained in the routine section of the utility file. When the programming algorithm is downloaded into the ECU,
it checks for the type of flash device present. If the routine is not compatible with the flash device, a negative
response message is generated with this response code.
7.2.13 ReadyForDownload-DTCStored ($99 RC_RFD-DS). This response code indicates that the ECU is
ready for the download of data but the checksum of flash or EEPROM has resulted in a DTC being set
(reference service $34).
7.2.14 DeviceControlLimitsExceeded ($E3, RC_DCLE). This response code indicates that one or more of
the ECUs internal device control limitations/restrictions have been exceeded and that all active device control
commands have been terminated. This response code requires two additional data bytes to be appended. The
additional data bytes identify the specific cause of why the ECU has aborted the device control requested by
the tester. A GM Corporate list is included in Appendix A of this document. This type of reject message can be
sent any time a limit has been exceeded, not just in response to a request message (see examples below).
Example #1: An Anti-lock Brake System (ABS) controller would not want to allow a tester to release the
brakes if a vehicle was moving down the road. If the ABS controller sensed that the vehicle was moving above
a calibrated threshold and a device control command was received to release the brakes on a given wheel, the
node would reject the request and provide this return code in the reject message.
Example #2: The vehicle is not moving and the ABS controller receives a request to release the brakes on
one or more wheels. The controller sends a positive response to the request and performs the requested
command. Shortly after the request is processed, the vehicle begins moving. When the speed exceeds the
maximum allowed, the ECU will send an unsolicited negative response message with this return code and
terminates all active device control functions.
7.3 Negative Response Message Flow Example.
7.3.1 Tester Requests An Unsupported Service. In the following example (Table 41), a tester sends a
physically addressed request to an ECU for a diagnostic service that is not supported. This results in the ECU
sending a negative response with the returnCode set to $11 (ServiceNotSupported).
The following information is given for the example:
The USDT request CANId for the ECU is $241 (and thus, the USDT response CANId is $641).
The Diagnostic Service Requested is SecurityAccess ($27) and the ECU does not support this service.
8.1.2 Request Message Definition. The ClearDiagnosticInformation request message is used to indicate that
one or multiple nodes shall clear the stored diagnostic information. See Table 42.
8.1.2.1 Request Message Sub-function Parameter $Level (LEV_) Definition. There are no sub-function
parameters used by this service.
8.1.2.2 Request Message Data Parameter Definition. There are no data parameters used by this service.
8.1.3 Positive Response Message Definition (Table 43).
8.1.3.1 Positive Response Message Data Parameter Definition. There are no data parameters used by this
service in the positive response message.
8.1.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 44) shall
be implemented for this service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table 47: Node Interface Data Dictionary of ClearDiagnosticInformation Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global Pseudo Code
Data Dictionary For Definition Of These
Flags/Variables
8.1.6.2 Node Interface Pseudo Code. The following logic is executed upon receipt of a
ClearDiagnosticInformation ($04) service request message:
Powerup States:
None
Each time a $04 message is received, the following logic is executed:
BEGINFUNCTION Serv_04_Msg_Recvd()
IF (message_data_length != 1) THEN
send Negative Response ($7F $04 $12) /* SubfunctionNotSupported-InvalidFormat */
ELSE
IF (conditions are not correct to clear diagnostic information) THEN
send Negative Response ($7F $04 $22) /* ConditionsNotCorrect */
ELSE
IF (the ECU cannot continue to process diagnostics while the DTC clear is in process) THEN
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.1.8 Tester implications. The tester should take into account that it may take the node(s) additional time
after the positive response to actually complete the clearing of all DTC information.
8.2 InitiateDiagnosticOperation ($10) Service. This service allows the tester to perform the following tasks:
Disable the setting of all DTCs while the tool continues to perform other diagnostic services.
Allow ECU DTC algorithms to continue to execute while the DeviceControl ($AE) service is active.
Request a gateway ECU to issue a wake-up request.
8.2.1 Service Description. The disableAllDTCs ($02) and enableDTCsDuringDevCntrl ($03) levels of this
service require that a TesterPresent ($3E) message be sent within the P3 timing window in order to keep the
functionality active.
If a sub-function parameter has been requested by the tester, which is already running, the ECU shall send a
positive response message. If the ECU sends a negative response message to a request for this service, any
levels active due to previous requests shall continue to remain active.
8.2.2 Request Message Definition (Table 48).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.2.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. The sub-function parameter
is used by the InitiateDiagnosticOperation service to select the specific behavior of the ECU. Explanations and
usage of the possible levels are detailed below. The following sub-parameter values are specified in this
document (Table 49).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.2.2.2 Request Message Data Parameter Definition. This service does not support data parameters in the
request message.
8.2.3 Positive Response Message Definition (Table 50).
8.2.3.1 Positive Response Message Data Parameter Definition. There are no data parameters used by this
service in the positive response message.
8.2.4 Supported Negative Response Codes (RC_). The following negative response codes (see Table 51)
shall be implemented for this service. The circumstances under which each response code would occur are
documented in the table below.
8.2.5.3 InitiateDiagnosticOperation(wakeUpLinks). The example below (Table 54) shows how the
InitiateDiagnosticOperation(level = wakeUpLinks) service shall be implemented. The example assumes the
following information to be true:
The request message is sent on the LS-CAN sub-net of GMLAN and there are two gateways connected to
the sub-net (a gateway to HS-CAN and a gateway to MS-CAN).
The USDT response CAN Id of the first gateway is $641.
The functional system address for gateways is $FD (used as extended address in functional request).
The USDT response CAN Id of the second gateway is $64A.
Table 55: Node Interface Data Dictionary of InitiateDiagnosticOperation Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
TesterPresent_Timer_State Pseudo Code Data Dictionary
For Definition Of These
Diag_Services_Disable_DTCs
Flags/Variables
DTCs_Enabled_In_Device_Control
valid_request YES/NO
This flag is locally used within this service to determine if a positive response
is needed and whether to activate the TesterPresent_Timer_State
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
should return the $7F $10 $78 response and verify that proper response is sent.
5. Repeat the previous step of this procedure for each possible reason an ECU would send the negative
response with response code $78.
Procedure 2: (if sub-function $02 is supported).
1. Send a $10 message with the sub-function parameter set to $02 (disableAllDTCs).
2. Create a failure which would set a DTC and verify that no DTC is set.
3. Send TesterPresent messages for 2 minutes and then verify that no DTCs are set.
4. Stop sending diagnostic messages for P3Cmax ms (ensures a TesterPresent timeout to enable DTCs) and
verify that the appropriate DTC is set (once all the criteria to set the DTC have been fulfilled).
5. Repeat steps 1 through 3 of this procedure, and then send a $20 service request. Verify the appropriate
response to the service $20 and then check that the appropriate DTC is set (once all the criteria to set the
DTC have been fulfilled).
Procedure 3: (if sub-function $03 is supported).
1. Send a $10 message with $level = $03 and then activate a device control. Send TesterPresent messages
for a time greater than P3Cmax (but less than any device control restriction timer) and then create a failure
which would set a DTC. Verify that the DTC is set via the $A9 service (undo the failure condition created
and clear DTCs prior to proceeding to step 2 of this procedure).
2. Send a $10 message with $Level = $03 and then activate a device control. Next send a $10 message with
$level = $02. Create a failure which would set a DTC and then verify that no DTC is set.
3. Send a $10 message with $Level = $03 while device control is already active and verify the negative
response ($7F $10 $22).
4. Send a service $28 message on the link and verify the positive response. Then send a $10 request with
$Level = $03 and verify the negative response ($7F $10 $22).
Procedure 4: (if sub-function $04 is supported).
1. Send a $10 request with $Level = $04 and verify that the device performs the appropriate wake-up
mechanism on all GMLAN subnets that it is connected to that support a wake-up.
2. If the wake-up mechanism on any GMLAN link requires continuous activation to keep the ECUs awake
(e.g., gateway provides power through a relay to ECUs on a specific subnet), then send messages to the
gateway to keep the gateways diagnostic VN active. Periodically check that the tester can communicate to
other ECUs on the subnet via diagnostic services. This test should be performed under conditions where
the ECU would otherwise let the link go down if the diagnostic VN were not active. Allow the diagnostic VN
to end, and then verify that communications with other ECUs is no longer possible.
8.2.8 Tester Implications. The disableAllDTCs ($02) and enableDTCsDuringDevCntrl ($03) levels of this
service require a tester to send the TesterPresent ($3E) service at least once every P3C ms or the requested
functionality will be terminated.
8.3 ReadFailureRecordData ($12) Service. This service is used to obtain failure record information that was
captured due to a fault detected within the node.
8.3.1 Service Description. Two levels are used within this service to be able to obtain the failure record
information from a node. One level, readFailureRecordIdentifiers (sub-function parameter = $01), allows the
tester to obtain information necessary to send a request to retrieve the data parameters associated with a
specific failure record stored in a node. The information needed to request specific failure record data is called
a failure record identifier and is comprised of a failure record number and the DTC identifier (2-byte DTC
number + 1-byte DTC fault type). The second level, readFailureRecordParameters (sub-function parameter =
$02), allows the test tool to retrieve the data parameters in the failure record associated with the failure record
identifier.
Note: Refer to the $A9 service and Appendix E for more information.
Note: In emission-related devices, failure record number $00 is also known as the Freeze Frame and shall be
reserved for Emission Related Freeze Frame data required for OBD and EOBD. The Freeze Frame is required
for storing the failure information for the first emission related DTC that is stored. There are certain specified
data parameters that are required to be captured in the freeze frame for OBD and EOBD. The required
parameters for OBD are documented in SAE J1979 and for EOBD are documented in ISO/WD 15031-5.
Additional data parameters may also be captured and stored in the freeze frame if they are needed for
engineering or service.
Data parameters that are stored in a failure record must be identified by the node with either 2-byte Parameter
Identifiers (PID) or 1-byte Data Packet Identifiers (DPID). The node will indicate which format is used with the
failureRecordDataStructureIdentifier parameter in the readFailureRecordIdentifiers positive response. A
failureRecordDataStructureIdentifier parameter value of $00 indicates that PIDs are used to identify the data
parameters in the failure record. A failureRecordDataStructureIdentifier parameter value of $01 indicates that
DPIDs are used to identify the data parameters in the failure record.
All failure records for a given node shall support the same format. PID and DPID numbers and their associated
data shall be coordinated with service and manufacturing and shall be documented within the device’s CTS or
within a supplemental diagnostic specification referenced by the CTS.
Note: Nodes that support failure records shall clear all association of failure record numbers to DTC numbers
upon a successful code clear.
8.3.2 Request Message Definition (Table 56).
#3 failureRecordNumber xx FRN
#4 DTCHighByte xx DTCHB
#5 DTCLowByte xx DTCLB
#6 DTCFailureTypeByte ] xx DTCFT
Note 1: M1 = Bytes 3 thru 6 are mandatory if the sub-function parameter is readFailureRecordParameters ($02). They are not included in
the request message if the sub-function parameter is readFailureRecordIdentifiers ($01).
8.3.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. The following sub-function
$levels (LEV_) of operation are defined for service $12 ReadFailureRecordData (Table 57):
8.3.3 Positive Response Message Definition. Below are the tables which describe the format and content of
positive responses corresponding to the sub-function level of the request message and the structure of the
data record (using PIDs or DPIDs).
8.3.3.1 Positive Response Message - $Level $01 (readFailureRecordIdentifiers). The response to a
readFailureRecordIdentifiers ($01) request contains the failureRecordDataStructureIdentifier parameter and
the failure record identifiers for each failure record linked to a stored DTC within the node. See Table 59. If the
node has no failure record identifiers linked to a stored DTC, then the response to a
readFailureRecordIdentifiers request shall only contain the level byte and the
failureRecordDataStructureIdentifier parameter.
8.3.3.2 Positive Response Message - $Level $02 (readFailureRecordParameters). The positive response
to a readFailureRecordParameters request contains all the failure record data parameters associated with the
requested failure record identifier. Tables 60 thru 63 show the response formats based on the value of the
failureRecordDataStructureIdentifier parameter in the readFailureRecordIdentifiers ($01) response message.
: : : : :
PIDRecord#k = [ C2 PIDREC
Note 2
: PIDHB xx PIDHB
: PIDLB xx PIDLB
: PIDDataByte#1 xx PIDDB
: : xx :
#n PIDDataByte#m] xx PIDDB
Note 1: C1 = The number of data bytes associated with the PIDRecord is determined by the definition of the PID.
Note 2: C2 = The number of PIDRecords in the response is based on the number of PIDs that the ECU records into the failure record each
time a failure record is stored.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
: : : : :
DPIDRecord#k = [ C4 DPIDREC
Note 2
: DPID xx DPID
: DPIDDataByte#1 xx DPIDDB
: : xx :
#n DPIDDataByte#m] xx DPIDDB
Note 1: C3 = The number of bytes in a DPIDRecord is determined by the definition of the DPID. DPIDs can range in length from one to
seven bytes.
Note 2: C4 = The number of DPIDRecords in the response is based on the number of DPIDs that the ECU records into the failure record
each time a failure record is stored.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
8.3.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. The circumstances under which each response code would occur are
documented in Table 63 below:
Table 63: Supported Negative Response Codes
Hex Description Cvt Mnemonic
12 SubFunctionNotSupported-InvalidFormat M SFNS-IF
1. A readFailureRecordIdentifiers request message does not contain one data
byte following the service identifier.
2. A readFailureRecordParameters request message does not contain five data
bytes following the service identifier.
3. The request message contains a sub-parameter which is not supported.
22 ConditionsNotCorrectOrRequestSequenceError C CNCORSE
This response code shall be used if internal conditions within the node (ECU)
prevent the reading of failure record information stored in the node (ECU).
31 RequestOutOfRange M ROOR
A request for the parameters in a failure record contains a failure record
identifier (failure record number + DTC identifier) that does not correspond to a
single unique failure record or is not a valid failure record identifier for the node.
78 RequestCorrectlyReceived-ResponsePending C RCR-RP
See 7.2 Return Code Definition.
8.3.5 Message Flow Examples. The example below (Table 64) shows a request for the failure record
identifiers of the PCM followed by a request for the data parameters from one of the failure records which
contains a DTC. The example assumes the following information to be true:
The point to point request CAN Id for the PCM is $241.
The USDT response CAN Id for the PCM is $641.
The PCM contains failure record numbers $00, $01, $02, and $03.
A failure record is stored for DTC P1671 ($16 $71) with a DTC Fault Type byte = $00 in both failure record
$00 (freeze frame) and $01 (first failure record).
No DTCs are stored in failure records $02 and $03.
The PCM supports providing failure record data with PIDs.
Engine rpm is a 2-byte parameter stored in the failure record and is identified by PID# $000C.
Vehicle Speed is a 1-byte parameter stored in the failure record and is identified by PID# $000D.
Manifold Pressure is a 1-byte parameter stored in the failure record and is identified by PID# $000B.
Engine Coolant Temperature is a 1-byte parameter stored in the failure record and is identified by
PID# $0005.
The USDT flow control parameters Block Size (BS) and Separation Time (ST) are both $00.
8.3.5.1 Example #1 - Obtain Failure Record Identifiers.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
The example below (Table 66) shows a request for the failure record identifiers of the PCM that supports the
failure records from Example 1 (Table 64), but does not have any failure records currently stored.
8.3.5.3 Example #3 - Obtain Failure Record Identifiers.
Table 67: Node Interface Data Dictionary of ReadFailureRecordData Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Pseudo Code Data
Dictionary For Definition Of
These Flags/Variables
record_index $00 thru $FF
This is a local variable used in the pseudo code when searching through the
failure records to find the record that matches the request message.
num_records $00 thru $FF
This is a variable used in the pseudo code to indicate the maximum number of
failure records that a node will store.
record_array The values are described
For the purposes of the pseudo code, it is assumed that the failure record data below for each data type of
is stored as an array of data structures. Each data structure contains the the record:
following elements: 1. $00 thru $255 (node
1. record_number_stored specific)
2. DTC_Number 2. A 2-byte value is used to
indicate the DTC set.
3. DTC_FailureType
Reference mode $A9 for
4. Data more details on DTC
The data referenced in element 4 above is the first byte of DTC specific data format.
stored in the failure record. 3. A 1-byte value used to
To access an element of the data structure, the following nomenclature is used: describe the FailureType
record_array[record_index].element of a stored DTC.
Where: record_index is described above in the data dictionary and element is 4. This field can be multiple
one of the four types listed here. bytes long and contain
data which must be
specified in a CTS or
supplemental diagnostic
specification.
Variable/Meaning Values
Record_match_found YES/NO
This is a flag used in the pseudo code to keep track of whether a record exists
which matches the one requested.
DTC_Number Matches the value from the
This is a local variable that is set equal to the DTC Number from the request request message
message.
8.4 ReadDataByIdentifier ($1A) Service. The purpose of this service is to provide the ability to read the
content of pre-defined ECU data referenced by a dataIdentifier (DID) which contains static information such as
ECU identification data or other information which does not require real-time updates. (Real-time data is
intended to be retrieved via the ReadDataByPacketIdentifier ($AA) service.)
8.4.1 Service Description. The request message shall always include one dataIdentifier. The length of the
positive response message shall be adapted to the size of data referenced by the dataIdentifier parameter
value. This message shall include the dataIdentifier parameter value received in the request message.
The tester is only required to provide the dataIdentifier value desired. The target ECU is responsible for
knowing the address location and block length corresponding to the requested DID. An ECU is not required to
support all corporate defined DIDs, and may support additional application specific DIDs.
Note: Appendix C of this specification contains a list of corporate standard DIDs.
8.4.2 Request Message Definition (Table 68).
8.4.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. This service does not use a
sub-function parameter.
8.4.2.2 Request Message Data Parameter Definition. Table 69 specifies the data parameter definitions for
this service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.4.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 72) shall
be implemented for this service.
Table 72: Supported Negative Response Codes
Hex Description Cvt Mnemonic
12 SubFunctionNotSupported-InvalidFormat M SFNS-IF
This response code shall be sent if the request message does not have a DID
number after the Request Service Id, or if additional data bytes are included
beyond the DID byte.
22 ConditionsNotCorrectOrRequestSequenceError C CNC-RSE
This response code shall be sent if the operating conditions of the ECU are
such that it cannot perform the required action (e.g., the data for a DID is
stored in EEPROM and an EEPROM failure has occured). This response code
is not intended to be used if the ECU conditions are such that the request
temporarily cannot be performed (e.g., the data to be retrieved temporarily
cannot be read from EEPROM because another application task is currently
writing to EEPROM). Response code $78 is used when conditions are
temporarily not met. If this response code is supported by a node, the
reason(s) to generate this return code must be documented in the Component
Technical Specification (CTS).
31 RequestOutOfRange M ROOR
This code shall be sent if the dataIdentifier value requested is not
supported by the device.
This code shall be sent if the dataIdentifier is secured and the ECU is not in
an unlocked state.
78 RequestCorrectlyReceived-ResponsePending C RCR-RP
This response code shall be sent if reading the data from the address(es),
which is referenced by the dataIdentifier, takes longer than P2C ms (e.g.,
the data to be read has to be retrieved from another processor via an ECU
internal Serial Peripheral Interface (SPI) bus).
This response code shall be sent if the ECU operating conditions are such
that the request temporarily cannot be performed (e.g., the data to be
retrieved cannot be read from EEPROM because another application task
is currently writing to EEPROM).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
N(USDT-CF) $641 $21 “J” “B” “F” “3” “5” “W” “1”
N(USDT-CF) $641 $22 “0” “4” “2” “7” “6” “5” ---
Table 74: Node Interface Data Dictionary of InitiateDiagnosticOperation Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Security_Access_Unlocked Pseudo Code Data
Dictionary For Definition Of
Security_Access_Allowed
These Flags/Variables
IF (device cannot respond with block contents within P2C ms) THEN
send Negative Response ($7F $1A $78) /* RequestCorrectlyReceived-ResponsePending */
ENDIF
/*Get data values from memory address associated with the $dataIdentifier*/
send ($5A $dataIdentifier $Data) /* send response message with DID data */
ENDIF
ENDIF
ENDFUNCTION
8.4.7 Node Verification Procedure.
Procedure 1:
1. Send a $1A message with each $dataIdentifier supported and verify proper response (test data
formatting).
Procedure 2: (Only applicable if ECU has secure DIDs).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
1. Send a $1A message with a secure $dataIdentifier value when the device is the manufacturers enable
counter (MEC) = $00 and the vulnerability flag < $FF and verify the negative response ($31 - Request Out
Of Range).
2. Send a $1A message with a secure $dataIdentifier value when the manufacturers enable counter > $00 or
vulnerability flag = $FF and security has not been accessed (SecurityAccess ($27) request has not been
sent) and verify the negative response ($31 - Request Out Of Range).
3. Send a $1A message with a secure $dataIdentifier value when the manufacturers enable counter > $00 or
vulnerability flag = $FF and security has been accessed (SecurityAccess ($27) request has been sent) and
verify the appropriate positive response.
4. Repeats steps 1 through 3 for each secure DID.
Procedure 3:
1. Send a $1A message with an invalid $dataIdentifier parameter and verify the negative response ($31 -
Request Out Of Range).
2. Send a $1A message without a dataIdentifier included (e.g., request message ends after the service Id)
and verify the negative response ($12 - Invalid Format).
3. Send a $1A message with data bytes after the sub-parameter and verify the negative response ($12 -
Invalid Format).
4. Send a $1A message to the ECU with a dataIdentifier where the ECU needs more than P2C ms to read
data bytes from memory and send the positive response (if applicable). Verify that the ECU sends the
negative response ($78 - RequestCorrectlyReceived-ResponsePending) within P2C ms followed by a
positive response (reference application timing section of this specification).
Procedure 4: (Applicable if the ECU implements this return code).
1. Send a request for a valid dataIdentifier at a time when ECU internal conditions will not allow the data to
be retrieved (e.g., EEPROM failure) and verify that the ECU sends the correct negative response ($22
ConditionsNotCorrect).
Procedure 5: (Only applicable if ECU has DIDs that require the usage of a security code).
Note: Security code as defined in the Vehicle Theft Deterrent SSTS.
1. Send a $1A message with a security code required $dataIdentifier value when the security code has not
been sent, manufacturers enable counter = $00, and the vulnerability flag < $FF. Verify the negative
response ($31 - Request Out Of Range) is sent.
2. Send a $1A message with a security code required $dataIdentifier value when the manufacturers enable
counter > $00 or vulnerability flag = $FF and the security code has not been sent. Verify the negative
response ($31 - Request Out Of Range) is sent.
3. Send a $1A message with a security code required $dataIdentifier value when the manufacturers enable
counter > $00 or vulnerability flag = $FF and the security code has been sent. Verify the appropriate
positive response is sent.
© Copyright 2010 General Motors All Rights Reserved
4. Repeats steps 1 thru 3 for each security code required $dataIdentifier value.
8.4.8 Tester Implications. This service can result in responses which are single frame or multiple frame
based on the DID requested. The tester should not functionally address requests for this service for a DID
which results in multiple frame responses unless it can handle sending the flow control frames to each
responding node within the allowable network timing parameters.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.5 ReturnToNormalMode ($20) Service. The purpose of this service is to return a node or group of nodes to
normal mode operation by canceling all active diagnostic services and resetting normal message
communications (if they were interrupted by a diagnostic operation).
All nodes participating in a GMLAN network shall support this service even if the node itself is diagnosed over
another vehicle bus (e.g., KWP2000 or Class 2). This requirement is necessary to facilitate programming of
other devices on the GMLAN subnet.
8.5.1 Service Description. The following enhanced diagnostic services are terminated and/or reset by service
$20:
All levels of service $10 InitiateDiagnosticOperation are terminated.
Service $27 SecurityAccess is terminated and a node shall become locked if the Manufacturers Enable
Counter is $00 and the Vulnerability Flag (if implemented) is not $FF.
Service $28 DisableNormalCommunication is terminated.
All levels of service $A5 ProgrammingMode are terminated.
Service $A9 ReadDiagnosticInformation send-on-change reporting of DTC count information is
terminated.
Service $AA ReadDataByPacketIdentifier periodic message scheduler logic is reset. However, the node
shall retain all dynamically defined message (DPID) information.
Service $AE DeviceControl is terminated, thereby returning full control of input(s)/output(s) to the node.
Any ECU resources allocated for the DataTransfer ($36) service which were a result of receiving a
RequestDownload ($34) request, shall be re-allocated back to their original purpose.
In addition, if a request for this service is received during a programming session (activated via the $A5
service), the programming session shall be considered concluded and all devices receiving the request shall
perform a software reset.
Note: The software reset allows a device which had just been programmed to begin executing the new
software and calibrations downloaded. The reset of all nodes also resynchronizes the start-up of normal
communications.
If a high speed programming event was enabled on the low speed SWCAN link when a request for this service
is received, then all ECUs (including the tester) shall initialize their protocol converter hardware within 30 ms
from the time that the $20 request is successfully transmitted on the link. The low speed ECUs shall perform
the software reset after re-initializing the protocol converter hardware. If the low speed ECUs can reset the
CAN controller and perform a software reset in less than 30 ms, the low speed ECUs shall reset the CAN
controller immediately and delay the software reset the necessary amount of time to ensure that
communication does not begin in less than 30 ms from the time that the $20 request is transmitted on the link.
Note: The delay is necessary to prevent bus errors that would occur if all nodes are not at the same baud rate
when one node begins normal communication.
Note: Any node which uses a polling loop to service the protocol device shall ensure that the polling loop is
fast enough to process the request message and initialize the protocol converter hardware within 30 ms. The
reset of the protocol device shall take place prior to invoking the software reset. This is necessary to ensure
that no timing issues exist with some nodes completing the reset and attempting to initialize normal
communications before another device can initialize its protocol converter during its reset.
When using this service to end a programming session, the tester must target the request at all nodes on the
network via a functionally addressed request ($101 $FE $01 $20). A valid request for this service which
concludes a programming event shall not be followed by a positive response. The positive response for this
case has been eliminated due to timing issues involved with the possibility of transitioning back to the normal
baud rate on the low speed subnet.
If a request for this service is received while normal communications are disabled with the ($28)
DisableNormalCommunications service, and a programming session is not active, then the node shall
reinitialize normal communications. Reinitializing normal communications consists of the nodes application
performing necessary tasks (e.g., resetting or clearing flags, variables, etc.) as needed, and then invoking the
handler function(s) executed while in the Comm Init state.
Note: Refer to GMW 3104 and the Diagnostics And Node Management section of this specification for more
details about the Comm Init state.
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
If the setting of diagnostic trouble codes (DTC) has been disabled via the $10, $28, or $AE services, then the
node shall re-enable the diagnostics and take the necessary steps to reinitialize diagnostic counters, flags,
timers, etc in order to prevent false DTCs from being set due to the fact that the algorithm was disabled for
some period of time.
Note: It may be necessary for a node to reset certain DTC algorithms or variables used within these algorithms
prior to executing a software reset at the conclusion of a programming event.
An ECU shall send an unsolicited service $20 positive response message any time a TesterPresent ($3E)
timeout (P3C) occurs and a programming session is not active.
Note: If a P3C timeout occurs while the ECU is in the process of receiving or transmitting a multi-frame USDT
diagnostic message, the unsolicited service $20 positive response message shall be delayed until after the
multi-frame message (reception or transmission) has completed.
8.5.2 Request Message Definition (Table 75).
8.5.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. Because this service is
defined as a single operation, there are no sub-parameters required or valid for the request message.
8.5.2.2 Request Message Data Parameter Definition. There are no data parameters used by this service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
8.5.3.1 Positive Response Message Data Parameter Definition. There are no data parameters used by this
service in the positive response message.
8.5.4 Supported negative response codes (RC_). The following negative response codes (Table 77) shall
be implemented for this service. The circumstances under which each response code would occur are
documented in the table below.
8.5.5 ReturnToNormalMode Message Flow Example. The following message flow example (Table 78)
shows what happens when a tester transmits a $20 ReturnToNormalMode request while diagnostic periodic
data is active ($AA service) and one-shot DTC information is being returned by the node in response to earlier
tester requests. Since the DTC response messages are one-shot data, the node is able to continue sending
the single shot UUDT frames after receiving the $20 request. Refer to the ReadDiagnosticInformation section
for more details regarding the operation of service $A9.
Since the information encapsulated in DPID $FE was scheduled, no further updates are received after the
service $20 acknowledgement (although there is a residual message $FE response between the service $20
request and positive acknowledgement. This is because the $FE DPID message was already in the protocol
device at the time the $20 request was received).
Refer to service $AA ReadDataByPacketIdentifier for more details regarding the operation of service $AA, and
the Flash Programming section of this specification for more details about how mode $20 is used to end a
programming session.
The following assumptions are made in the example below:
1. The tester had previously requested the node to report DTCs with a request for the $A9 service with a $81
value in the sub-parameter field. The response to this request is in progress but has not completed at the
time the $20 request is received.
2. The tester had previously requested the node to transmit DPID $FE periodically.
3. The node has loaded into the protocol device (but not yet sent) a periodic update of DPID $FE when it
received the mode $20 request.
4. The node has a USDT physical request CAN ID of $241.
5. The node has a UUDT physical response CAN ID of $541.
6. The node has a USDT physical response CAN ID of $641.
Table 79: Node Interface Data Dictionary of ReturnToNormalMode Service Pseudo Code
Variable Meaning Values
manufacturers_enable_counter Reference Common/Global
message_data_length Pseudo Code Data Dictionary
For Definition Of These
Diag_Services_Disable_DTCs
Flags/Variables
DTCs_Enabled_In_Device_Control
request_DeviceControl_exit
Dev_Cntrl_Active
Security_Access_Unlocked
DTC_send_on_change_flag
vulnerability_flag
normal_message_transmission_status
programming_mode_active
high_speed_mode_active
programming_mode_entry_OK
high_speed_mode_entry_OK
diagnostic_responses_enabled
TransferData_Allowed
DeviceContol_Security_Level
TesterPresent_Timer_State
TesterPresent_Timer
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Each time a valid $20 message is received, or if a TesterPresent timeout occurs, the following function is
called:
BEGINFUNCTION Exit_Diagnostic_Services()
TesterPresent_Timer_State INACTIVE
TesterPresent_Timer 0
IF (programming_mode_active = NO) THEN
/***************************************************************************
* Release All Device Controls
****************************************************************************/
IF (Dev_Cntrl_Active = YES)
request_DeviceControl_exit YES
CALL Background_DeviceControl_Logic() /* procedure defined in $AE */
ENDIF
/***************************************************************************
* Reset Security Access
****************************************************************************/
DeviceContol_Security_Level SERVICE
Security_Access_Unlocked FALSE
/***************************************************************************
* Reset Message Scheduler (but retain dynamic DPID definitions)
****************************************************************************/
CALL ClearAndDisablePDS() /* procedure defined in service $AA */
/***************************************************************************
* Reset Send-On-Change DTC Reporting
****************************************************************************/
DTC_send_on_change_flag 0
/***************************************************************************
* Reset levels of service $10 that have not already been covered
****************************************************************************/
DTCs_Enabled_In_Device_Control NO
/***************************************************************************
* Enable DTCs to set again
****************************************************************************/
IF (Diag_Services_Disable_DTCs = TRUE) THEN
Diag_Services_Disable_DTCs FALSE
CALL Diag_App_Reset_Vars() /* local diagnostic application to reset flags, timers, and variables as
appropriate */
ENDIF
/***************************************************************************
* check if normal message transmission was disabled and reinitialize
* communications if it was. In addition, reset mode $A5 flags that may have
* been set prior to the mode $20 request or the P3C timeout.
****************************************************************************/
IF (normal_message_transmission_status = DISABLED) THEN
IF (high_speed_mode_active = YES)
high_speed_mode_active NO
CALL hnd_Init_CAN_Device() /* handler call to reinit the baud rate in order to prevent bus errors
which could be caused if reset times differ greatly*/
ENDIF
/***************************************************************************
* check to see if any diagnostic information which is retained across multiple
* drive cycles needs to be reinitialized before performing a software reset
****************************************************************************/
DTCs_Enabled_In_Device_Control NO
IF (Diag_Services_Disable_DTCs = TRUE) THEN
Diag_Services_Disable_DTCs FALSE
CALL Diag_App_Reset_Vars() /* local diagnostic application to reset flags, timers, and variables
as appropriate */
ENDIF
CALL Invoke_Sw_Reset() /* causes a software reset to occur */
ENDIF
ENDFUNCTION
8.5.7 Node Verification Procedure.
Procedure 1:
1. While not in programming mode, transmit a $20 service request with extra information appended to the
message resulting in an incorrect length and verify negative response ($7F $20 $12).
2. Repeat step 1 while programming mode is active and verify that the negative response ($7F $20 $12).is
sent.
Procedure 2:
1. While in programming mode, transmit a service $20 request message using the functional all-nodes CAN
Identifier ($101) + all-nodes extended address ($FE). Verify that there is no response sent.
Procedure 3:
1. While not in programming mode, transmit a service $20 request message while periodic DPIDs are
scheduled. Verify the positive response and that the scheduled messages are halted.
2. If the node supports dynamic DPIDs, define a dynamic message number via service $2C, and configure
the node to schedule the message periodically via service $AA. Verify that periodic responses are
received. Next transmit a service $20 request to the node and verify that the just-defined periodic
message(s) are halted.
3. Repeat the $AA request to schedule the dynamically defined message, and verify that the format of the
dynamically defined message was not lost after the service $20 request.
Procedure 4: (Valid if the send on change DTC logic is supported by the node).
1. While not in programming mode, transmit a service $20 request message while the DTC send-on-change
algorithm is activated. Verify the positive response and that the updated DTC count information is no
longer reported by the node. (This can be done by causing a code to transition to a state that satisfies the
send-on-change DTC status mask, and verifying that no information is reported by the node.)
Procedure 5:
1. While not in programming mode, transmit a service $20 request message while tester-requested device
controls are active. Verify the positive response and that full control of inputs/outputs is returned to the
ECU.
Procedure 6: (Valid if the SPS security access levels of the $27 service are supported).
1. While not in programming mode, transmit a service $20 request message to a node whose security is
currently unlocked via service $27 SecurityAccess (with Manufacturers Enable Counter set to $00 and
vulnerability flag not $FF). After the $60 positive response, verify via a service $27 $01 request that the
node becomes locked (seed != $0000).
2. While not in programming mode, transmit a service $20 request to a node with a non-zero Manufacturers
Enable Counter (MEC) and vulnerability flag not equal to $FF. After the $60 positive response, verify via a
service $27 $01 request that the node unlocks (seed = $0000).
3. While not in programming mode, transmit a service $20 request to a node with a Vulnerability Flag set to
$FF (if applicable) and MEC set to $00. After the $60 positive response, verify via a service $27 $01
request that the node unlocks (seed = $0000).
Procedure 7: (Valid if the Device Control security access levels of the $27 service are supported. All steps
assume programming mode is not active)
1. Transmit a service $20 request to a node with a non-zero Manufacturers Enable Counter (MEC). After the
$60 positive response, verify via a service $27 $03 request that the node becomes unlocked (seed =
$0000).
2. Transmit a service $20 request message to a node with the MEC = $00 and at a time when device control
security is currently unlocked via service $27 SecurityAccess. After the $60 positive response, verify via a
service $27 $03 request that the node is locked (seed != $0000).
Procedure 8:
1. While not in programming mode, transmit a service $28 request to disable normal mode communications.
After normal communications have been halted, transmit a $20 service request message to return the
node back to normal communications. Verify that the positive response is sent. Transmit a diagnostic
request that should result in a diagnostic response and verify that the response is transmitted by the ECU.
Then have the operator initiate a vehicle function, which should result in VN activation and normal
communication. Verify that the ECU starts transmitting the appropriate normal mode message.
Procedure 9:
1. Invoke a diagnostic service that results in DTCs being disabled ($10, $28, or $AE). Disconnect any input
which would normally result in a DTC being set. Verify that the DTC does not set via the $A9 service. Send
a $20 request message and verify the positive response and that the DTC will set after the appropriate
conditions are met to set the DTC.
2. Repeat step 1 of this procedure for each supported service that can disable the setting of DTCs.
8.5.8 Tester Implications. When sending a request for this service to terminate a high speed programming
event on the SWCAN link, the tester shall reinitialize its CAN protocol converter hardware to low speed
© Copyright 2010 General Motors All Rights Reserved
operation within 30 ms after the request. In addition, the test device must wait at least 50 ms before attempting
communication at low speed.
Note: The tester should wait for approximately 1 s before attempting normal communications after exiting a
programming event in order to allow the nodes adequate time to perform a software reset and reinitialize
communications.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.6.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. This service does not use a
sub-function parameter.
8.6.2.2 Request Message Data Parameter Definition. Table 81 specifies the data parameter definitions for
this service.
8.6.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 84) shall
be implemented for this service.
8.6.5 Message Flow Example ReadDataByParameterIdentifier Service. This section specifies the
conditions to be fulfilled for the example to perform a ReadDataByParameterIdentifier service. The tester may
request PID data at any time independent of the status of the server (as long as another USDT response is not
pending currently).
8.6.5.1 Request OBD PID $0C - Engine RPM. In the example below (Table 85), the following is assumed
true:
The point to point request CAN Id for the ECU is $7E0.
The USDT response CAN Id of the ECU is $7E8.
The PID for engine rpm (as defined in SAE J1979/ISO 15031-5) is $0C (so this service requests with
$000C). The data returned is 2 bytes with a transfer function of rpm = N/4.
Engine Speed is assumed to be 750 rpm at the time of the request.
8.6.5.2 Physically Request Multiple PIDs Resulting In Multi-Frame Response. In the example below
(Table 86), the following is assumed true:
The ECU supports retrieving at least three PIDs in a single request.
The point to point request CAN Id for the ECU is $7E0.
The USDT response CAN Id of the ECU is $7E8.
The PID for Engine Coolant Temperature (as defined in SAE J1979/ISO 15031-5) is $05 (so this service
requests with $0005). The data returned is a single byte with a transfer function of °C = (N - 40). This
provides a temperature range from -40 to 215°C.
Engine Coolant Temperature is assumed to be 92°C at the time of the request.
The PID for engine rpm (as defined in SAE J1979/ISO 15031-5) is $0C (so this service requests with
$000C). The data returned is two bytes with a transfer function of rpm = N/4.
Engine Speed is assumed to be 750 rpm at the time of the request.
The time since engine start is defined in PID $001F contains two bytes of data with a scaling of 1 s per
count.
It is assumed that the engine has been running for 200 s.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.6.5.3 Functionally Request OBD PID $0C - Engine RPM. In the example below (Table 87), the following is
assumed true:
The bus has two ECUs on it.
Both ECUs support this service.
ECU 1 supports PID $0C and ECU 2 does not.
The point to point request CAN Id for the ECU 1 is $7E0.
The USDT response CAN Id of the ECU 1 is $7E8.
The point to point request and response CAN Identifiers for the ECU 2 are not detailed here as ECU 2 will
send no response because the request is functional and the PID is not supported.
The PID for engine rpm (as defined in SAE J1979/ISO 15031-5) is $0C (so this service requests with
$000C). The data returned is 2 bytes with a transfer function of rpm = N/4.
Engine Speed is assumed to be 750 rpm at the time of the request.
8.6.5.4 Functionally Request PID Resulting In Multi-Frame Response. In the example below (Table 88),
the following is assumed true:
The vehicle bus has multiple ECUs but only one ECU supports the requested PID.
The PID requested is $FF0D (this is only an example).
PID $FF0D is defined to be seven bytes in length.
The point to point request CAN Id for the responding ECU is $7E0.
The USDT response CAN Id of the responding ECU is $7E8.
8.6.5.5 Functionally Request Two PIDs Resulting In Response from Multiple ECUs. In the example below
(Table 89), the following is assumed true:
The vehicle bus has two ECUs that support this service and both ECUs support requesting at least two
PIDs in a single request.
The point to point request CAN Id for ECU 1 is $7E0 and the USDT response CAN Id is $7E8.
The point to point request CAN Id for ECU 2 is $7E2 and the USDT response CAN Id is $7EA.
The PID for engine rpm (as defined in SAE J1979/ISO 15031-5) is $0C (so this service requests with
$000C). The data returned is two bytes with a transfer function of rpm = N/4.
Engine Speed is assumed to be 750 rpm at the time of the request.
The PID for Transmission range select (PRNDL) is PID $194F.
This PID has one byte of response data where $00 = illegal range, $01 = Park, $02 = Reverse,
$04 = Neutral, $06 = Drive 6, $08 = Drive 5, $10 = Drive 4, $20 = Drive 3, $40 = Drive 2, and
$80 = Drive 1.
The gear select position is assumed to be park for this example.
ECU 1 supports PID $000C but not PID $194F.
ECU 2 supports PID $194F but not $000C.
Table 90: Node Interface Data Dictionary of InitiateDiagnosticOperation Service Pseudo Code
Variable/Meaning Values
message_data_length Reference
Security_Access_Unlocked Common/Global Pseudo
Code Data Dictionary For
message_address_type
Definition Of These
Security_Access_Allowed Flags/Variables
Variable/Meaning Values
max_22_Msglength 1 + 2(number of PIDs
This is a local flag that is set to 2 times the max number of PIDs supported in a allowed in Single request)
single request and then add 1 (to accommodate the SID byte).
Srv_22_NRC $00, $12, $22, $31, $78
This is a local flag that is used to keep track of the negative response code if a
negative response needs to be sent
Num_PIDs_Requested 1 to number of PIDs
This is variable that contains the number of PIDs in the request message. This is allowed in a single
calculated by taking the message length, subtracting 1, and then dividing by 2. request
ReqPIDArray[] N/A
This is an array that contains the PID number from the request message.
Process_Request YES/NO
This is a local flag used to keep track of whether or not a positive response is to be
generated based on the request message.
PidStructArray[] N/A
This is an array of structures that contain the data needed to support PIDs. for the
purposes of the pseudo code of this service it is assumed that each structure
contains the following information:
1. PidNumber - The PID number.
2. Rc78Needed - Set to YES if it is necessary to send a $7F $SID 78 response
and NO if no $7F$SID $78 is needed.
3. PidSecure - Set to YES if security access is required to retrieve PID data.
4. PidSecurityCode - Set to YES if security code access is required to retrieve
PID data.
Other elements may exist in the structure such as a pointer to a function to retrieve
the data, memory address and length information (for a dynamic PID, see $2D
service), etc. Only the PidNumber, Rc78Needed, PidSecure, and PidSecurityCode
are shown here for the purposes of the pseudo code.
The pseudo code uses the following convention to access an element of the
structure:
PidStructArray[0].PidNumber would be the PID number of the first PID structure in
the array.
ReqIndex 0 to
This is a local flag used for indexing through the array of PIDs in the request array. (Num_PIDs_Requested-
1)
NumArrayElements ECU dependent
This is a local flag set to the number of elements in the PidStructArray.
Index 0 to
This is a local flag used to index through the array of PID structures when (NumArrayElements -1)
determining if the PID requested is valid
/* Populate ReqPIDArray[] with PID numbers from request message. There is no eloquent way to show
this in pseudo code so it is assumed in the pseudo code that it gets done through typecasting or some
type of pointer manipulation (language dependant) */
Process_Request FALSE
/* obtain PID data - The pseudo code does not dictate how this is done. For example, the data may be
retrieved via a call to a function whose pointer is contained in the PID structure. Another example
would be to obtain the data via a global variable or by accessing memory and length information for a
dynamic PID. This is not intended to be the comprehensive list on how to do this */
ENDFUNCTION
8.6.7 Node Verification Procedure.
Procedure 1:
1. Send a physically addressed $22 message for one (unsecure) $PID that is supported by the ECU. Verify
proper response, containing the data of the requested $PID (test data formatting).
2. Send a physically addressed $22 message for a single $PID where that $PID is not supported by the ECU.
Verify the negative response ($7F $22 $31 - Request Out Of Range).
3. If applicable, send a physically addressed $22 message for one secure $PID (that is supported by the
ECU) at a time when the ECU is secure. Verify the negative response ($7F $22 $31 - Request Out Of
Range).
4. If applicable, unlock the ECU via the security access service then repeat the request in the previous
procedure and verify the appropriate positive response and data content.
5. Send a physically addressed $22 request message for multiple $PIDs (if the ECU supports multiple PIDs
in a single request), where at least one, but not all, of the requested $PIDs is supported by the ECU and
does not require security access. Ensure that the number of PIDs in the request is less than or equal to the
maximum number supported in a single request. Verify proper response, containing only the data of the
requested $PID(s) which are supported by the ECU and do not require security access.
6. Send a physically addressed $22 request message for multiple $PIDs (if the ECU supports multiple PIDs
in a single request), where all of the requested $PIDs are supported by the ECU (and do not require
security access). Ensure that the number of PIDs in the request is less than or equal to the maximum
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
number supported in a single request. Verify proper response, containing data for all of the requested
$PID(s).
7. If applicable, repeat the last procedure but include a secure PID in the request. Ensure that this is done at
a time when security access has not been granted. Verify the proper response for the unsecure PID(s) and
that no data is reported for the secure PID.
8. If applicable, use service $27 to access security and then repeat the previous procedure. Verify that the
proper response is sent including data for all PIDs in the request.
9. Send a physically addressed $22 message with less than two bytes in the $PID field (0 or 1 data byte after
the service indentifier $22). Verify the negative response ($7F $22 $12 - SubFunctionNotSupported-
InvalidFormat).
10. Send a physically addressed $22 message with more data bytes than allowed per the maximum request
message length (see pseudo code above). Verify the negative response ($7F $22 $12 -
SubFunctionNotSupported-InvalidFormat).
11. Send a physically addressed $22 message for multiple $PIDs (if the ECU supports multiple PIDs in a
single request) where all requested $PIDs are not supported by the ECU. Verify the negative response
($7F $22 $31 - Request Out Of Range).
12. If the ECU supports the use of negative response code $78, send a $22 message to the ECU with a valid
$PID where the ECU needs more than P2C ms to read data bytes from memory and send the positive
response. Verify that the ECU sends the negative response ($78 - RequestCorrectlyReceived-
ResponsePending) within P2C ms followed by a positive response (reference application timing section of
this specification).
13. (If applicable) Send a request for a valid $PID at a time when ECU internal conditions would not allow the
data to be retrieved (e.g., EEPROM failure) and verify that the ECU sends the correct negative response
($7F $22 $22 ConditionsNotCorrect)).
14. If applicable, send a physically addressed $22 message for one security code (as defined in the Vehicle
Theft Deterrent SSTS) required $PID (that is supported by the ECU) at a time when the security code has
not been entered. Verify the negative response ($7F $22 $31 - Request Out Of Range).
15. If applicable, enter the security code then repeat the request in the previous procedure and verify the
appropriate positive response and data content.
16. If applicable, send a physically addressed $22 request message for multiple $PIDs (if the ECU supports
multiple PIDs in a single request), where at least one, but not all, of the requested $PIDs is supported by
the ECU and include a security code required PID in the request. Ensure that this is done at a time when
the security code has not been entered. Verify the proper response for the unsecure PID(s) and that no
data is reported for the secure PID.
17. If applicable, enter the security code and then repeat the previous procedure. Verify that the proper
response is sent including data for all PIDs in the request.
Procedure 2:
1. Send functionally addressed $22 request message for one $PID that is supported by the ECU and does
not require security access (use $101 AllNode CAN Id and $FE AllNode functional system). Verify proper
response, containing the data of the requested $PID (test data formatting).
2. If applicable, send a functionally addressed $22 message for a $PID that is supported by the ECU, where
the PID is a secure $PID and the ECU is locked. Verify there is no response.
3. If applicable, use service $27 to access security then repeat the request from the previous step. Verify the
proper positive response and data.
4. Send functionally addressed $22 request message for two $PIDs (if the ECU supports multiple PIDs in a
single request) where only one of the requested PIDs is supported by the ECU and does not require
security access (use $101 AllNode CAN Id and $FE AllNode functional system). Verify proper response,
containing the only the data of the supported unsecure $PID.
5. If applicable, repeat the last procedure but include a secure PID in the request. Ensure that this is done at
a time when security access has not been granted. Verify the proper response for the unsecure PID and
that no data is reported for the secure PID.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
6. If applicable, use service $27 to access security and then repeat the previous procedure. Verify that the
proper response is sent including data for all PIDs in the request.
7. Send a functionally addressed $22 message with less than 2 bytes in the $PID field (0 or 1 data byte after
the service indentifier $22). Verify the negative response ($7F $22 $12 - SubFunctionNotSupported-
InvalidFormat).
8. Send a functionally addressed $22 message with more data bytes than allowed per the maximum request
message length (see pseudo code above). Verify the negative response ($7F $22 $12 -
SubFunctionNotSupported-InvalidFormat).
9. Send a correctly formatted functionally addressed $22 message for a $PID that is not supported by the
ECU. Verify there is no response.
10. If the ECU supports the use of negative response code $78, send a functionally requested $22 message to
the ECU with a valid $PID where the ECU needs more than P2 C ms to read data bytes from memory and
send the positive response. Verify that the ECU sends the negative response ($78 -
RequestCorrectlyReceived-ResponsePending) within P2C ms followed by a positive response (reference
application timing section of this specification).
11. (If applicable) Send a functional request for a valid $PID at a time when ECU internal conditions would not
allow the data to be retrieved (e.g., EEPROM failure) and verify that the ECU sends the correct negative
response ($7F $22 $22 ConditionsNotCorrect).
12. If applicable, send a functionally addressed $22 message for a $PID that is supported by the ECU, where
the PID requires a security code (as defined in the Vehicle Theft Deterrent SSTS) and the security code
has not been entered. Verify there is no response.
13. If applicable, enter the security code then repeat the request from the previous step. Verify the proper
positive response and data.
14. If applicable, send functionally addressed $22 request message for two $PIDs (if the ECU supports
multiple PIDs in a single request) where only one of the requested PIDs is supported by the ECU (use
$101 AllNode CAN Id and $FE AllNode functional system), but include a secure code required PID in the
request. Ensure that this is done at a time when the security code has not been entered. Verify the proper
response for the unsecure PID and that no data is reported for the secure PID.
15. If applicable, enter the security code and then repeat the previous procedure. Verify that the proper
response is sent including data for all PIDs in the request.
8.6.8 Tester Implications. This service can result in responses that are single frame or multiple frame based
on the PID(s) requested. The tester should not functionally address requests for this service which result in a
multiple frame response(s) unless it can handle sending the flow control frame(s) to each responding node
within the allowable network timing parameters. The tester must be careful when requesting multiple PIDs
functionally. If any ECU only allows requesting a single PID per request message then that ECU would
generate a negative response even if it supported one of the PIDs in the request message. In addition,
functionally addressed requests for this service should not contain more than two PIDs as this would generate
a multi-frame request which would result in the transmission of flow frames from every ECU on the subnet.
8.7 ReadMemoryByAddress ($23) Service. The purpose of this service is to retrieve data from a contiguous
range of ECU memory addresses. The range of ECU addresses is defined by a starting memory address
parameter and a length (memory size) parameter included in the request message. This service is intended to
be used during a device’s development cycle to allow access to data that may not be available via another
diagnostic service. The ReadMemoryByAddress service is only available as a one shot request-response
service.
8.7.1 Service Description.The ReadMemoryByAddress service allows a tester to request the ECU to provide
the data content of a range of ECU memory. The memory data to be read is identified by the parameters
memoryAddress (MA) and memorySize (MS). The size of the memoryAddress parameter in the request
message can be 2, 3, or 4 bytes in length depending on the ECU internal addressing scheme. The number of
bytes that a tester shall use in the memoryAddress portion of the request message for a given ECU shall be
documented in the appropriate CTS, SSTS, or supplemental diagnostic specification referenced by either of
the preceding documents. The memorySize parameter in the request message shall always be two bytes.
The ReadMemoryByAddress positive response message includes the start address (MA), specified in request
message, and requested memory data. Memory data shall be sent in ascending order beginning with the
memory location determined by the memoryAddress parameter.
This diagnostic service shall be used to read RAM, Calibrations and unprotected areas of EEPROM/Flash
memory. A device may choose to deny access to an address or a range of addresses. This allows production
ECUs to protect their operating system and other secure data.
An ECU may restrict the testers ability to read specific addresses or ranges of addresses based on the security
status of the ECU. If any of the addresses (that fall in the range of the request message) have security
restrictions then the request shall be rejected unless the tester had previously successfully accessed security.
Note: Security access is only required if the ECU is locked based on the status of the MEC and/or the
vulnerability flag see the SecurityAccess ($27) service for more information.
8.7.2 Request Message Definition (Table 91).
8.7.2.1 Request Message Sub-Function $Level Parameter Definition. Because this service is defined as a
single operation, there are no sub-function levels required or valid for the request message.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.7.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 95) shall
be implemented for this service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.7.5.2 ReadMemoryByAddress Example with 3 Byte memoryAddress. In this example (Table 97), it is
assumed:
The ECU uses 3-byte addressing and the tester requests memory data in addresses $011102 to $011110 (15
bytes of memory data so memorySize is $00 $0F).
The ECU responds with the memory data $34 (data in start address), $56, $78, $9A, $BC, $DE, $F0, $12,
$34, $56, $78, $9A, $BC, $DE and $F0.
The node has a physical request CANId of $241.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Table 98: Node Interface Data Dictionary of ReadMemoryByAddress Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Security_Access_Unlocked Pseudo Code Data Dictionary
For Definition Of These
Flags/Variables
Bad_Address TRUE/FALSE
Status flag that indicates whether any of the range of addresses in the
request is not valid.
memoryAddress Varies based on ECU
This is the starting address in ECU memory from the request message.
MemorySize $01 to maximum size, where
This is the number or consecutive memory addresses that the tester has maximum size is the lesser of
requested (parameter of request message). the NWL buffer size or 4094
minus the number of bytes in
the memoryAddress parameter
Memory_Address Varies based on ECU
This is a local variable used to point to ECU memory when indexing through
the requested addresses to determine if any portion of the requested memory
is invalid, protected, or requires security access. The pseudo code uses
Memory_Address.data to reflect the contents of a given memory address.
memoryDataRecord[] N/A
This is the buffer that stores the contents of the memory addresses from the
request message for transmission in the response.
Index 0 to (messageSize -1)
This is an index into the buffer for the response data
ENDIF
\* Check whether any memory address in the requested interval is protected, restricted (by Security
Status) or invalid*/
FOR (Memory_Address messageAddress TO (messageAddress + memorySize- $01) BY $01)
IF ((Memory_Address is restricted) OR (Memory_Address is Invalid) OR
((Memory_Address is secure) AND (Security_Access_Unlocked = FALSE))) THEN
Bad_Address TRUE
Memory_Address (messageAddress + memorySize) /* exit for loop */
send Negative Response ($7F $23 $31) /*Request Out Of Range */
ELSE
IF (operating conditions do not allow access to memory address)
send Negative Response ($7F $23 $22) /* Condition Not Correct */
Memory_Address (messageAddress + memorySize) /*exit for loop*/
Bad_Address TRUE
ELSE
memoryDataRecord[Index] Memory_Address.data
Index (Index + 1)
ENDIF
ENDIF
ENDFOR
IF (Bad_Address = FALSE) THEN
/* send positive response message */
send ($63 $MA_B1 $MA_B2 ... $memoryDataRecord[0]... $memoryDataRecord[m])
ENDIF
ENDIF
ENDFUNCTION
8.7.7 Node Verification Procedure.
Procedure 1:
1. Request one valid memory address which is not restricted, and non-secured (MS = $0001). Verify the
proper positive response.
2. Request the maximum number of consecutive addresses allowed by the ECU (max value is the lesser of
the NWL buffer size or 4094, minus the number of bytes in the memoryAddress parameter) starting at a
memory address which will result in all addresses being valid, not restricted, and not secure. Verify the
proper positive response.
3. If applicable, send a request to an unlocked ECU for an address range that is completely valid, not
restricted, and includes secure locations. Verify the proper positive response.
Procedure 2:
1. Send a request with less than the required number of data bytes (3 + the number of bytes in the
memoryAddress parameter), verify negative response ($7F $23 $12).
2. Send a request with more than the required number of data bytes (3 + the number of bytes in the
memoryAddress parameter), verify negative response ($7F $23 $12).
3. Send a request with a valid SA and a MS that results in an invalid ECU address. Verify negative response
($7F $23 $31).
4. Send a request with valid SA and MS = 0. Verify the negative response ($7F $23 $31).
5. Send a request with a MS greater than the maximum MS supported by the ECU. Verify the negative
response ($7F $23 $31).
6. If applicable, send a request with a valid range of non secure addresses that includes at least one
restricted address. Verify negative response ($7F $23 $31).
7. If applicable, send a request to an ECU with a manufacturers enable counter = $00 and a vulnerability flag
< $FF, with a range of valid and non restricted addresses that includes at least one secure address. Verify
negative response ($7F $23 $31).
8. If applicable, send a request to an ECU with a manufacturers enable counter > $00 or vulnerability flag =
$FF when security has not been accessed (SecurityAccess ($27) request has not been sent), with a range
of valid and non restricted addresses that includes at least one secure address. Verify negative response
($7F $23 $31).
9. If applicable, send a request to an ECU with a manufacturers enable counter > $00 or vulnerability flag =
$FF when security has been accessed (SecurityAccess ($27) request has been sent), with a range of valid
and non restricted addresses that includes at least one secure address. Verify positive response.
10. If negative response code $78 is supported by the ECU, then create the conditions under which the ECU
should return the $7F $23 $78 response and verify that proper response is sent. Repeat for each possible
reason an ECU would send the negative response with response code $78.
11. If negative response code $22 is supported by the ECU, then create the conditions under which the ECU
should return the $7F $23 $22 response and verify that proper response is sent. Repeat for each possible
reason an ECU would send the negative response with response code $22.
8.7.8 Tester Implications. The tester needs to ensure that it transmits the correct number of bytes in the
memoryAddress parameter or the message shall be rejected.
8.8 SecurityAccess ($27) Service. The purpose of this service is to provide a means to access data and/or
diagnostic services which have restricted access for security, emissions, or safety reasons. Diagnostic modes
for downloading routines or data into a node and reading specific memory locations from a node are situations
where security access may be required. Improper routines or data downloaded into a node could potentially
damage the electronics or other vehicle components or risk the vehicle’s compliance to emission, safety, or
security standards. This mode is intended to be used to implement the data link security measures defined in
SAE J2186 (E/E Data Link Security).
8.8.1 Service Description. The security concept uses a seed and key relationship. The seed and key are
each 16-bit numbers (2-byte). The security seed and key shall be stored in non-volatile memory during the
manufacturing process of the Node.
Note: The security seed shall be a random non-zero and non-$FFFF number. The security seed shall be
generated for each individual part (all nodes with the same part number shall NOT have the same security
key).
The security key shall be derived from the security seed using an external encryption algorithm. The SPS
programming security algorithm for a node is assigned by GM Service and Parts Operations. The
manufacturing device control security algorithm for a node is assigned by the Manufacturing Serial Data
Design Engineer. Under no circumstances shall the encryption algorithm ever reside in the node.
A typical example of the use of this service is as follows:
Tester requests the Seed.
Node sends the Seed.
Tester sends the Key (appropriate for the Seed received).
Node responds that the Key was valid and that it will unlock itself
A 10 s time delay shall be required before the node can positively respond to a service SecurityAccess
requestSeed message from the tester after node power-on. This delay is only required if the MEC > 0 or the
vulnerability flag is = $FF when powered on. Reference the pseudo code in paragraph 8.8.6.2 for further
clarification.
The tester shall request the node to unlock itself by sending the service SecurityAccess requestSeed
message. The node shall respond by sending a seed using the service SecurityAccess “requestSeed” positive
response message. The tester shall then respond by returning a key number back to the node using the
service SecurityAccess sendKey request message. The node shall compare this key to one internally stored. If
the two numbers match, then the node shall enable (unlock) the tester’s access to specific services and
indicate that with the service SecurityAccess sendKey positive response message. If upon two attempts of a
service SecurityAccess “sendKey” request message by the tester, where the two keys do not match, then the
node shall insert a 10 s time delay before allowing further attempts. The 10 s delay shall be invoked for each
subsequent failed attempt. An invalid key requires the external tester to start over from the beginning with a
Security Access request message.
If a device supports security, but is already unlocked (MEC > 0 or the vulnerability flag is = $FF) when a
SecurityAccess requestSeed message is received, that node shall respond with a SecurityAccess
requestSeed positive response message service with a seed value of $0000. A tester shall use this method to
determine if a node is locked by checking for a non-zero seed.
Attempts to access security shall not prevent normal vehicle communications or other diagnostic
communication.
Nodes which provide security shall support reject messages if a secure service is requested while the node is
locked (e.g., TransferData $36 service). Reference the description and pseudo code sections of each
diagnostic service to determine where security access applies.
This service requires a TesterPresent ($3E) to be sent prior to a P3 C timeout or the node shall lock itself
(unless it was already unlocked when this service was first requested).
Nodes are considered locked or unlocked based on the table below. See paragraph 9.3.2.6 for definitions of
the Manufacturers Enable Counter and Vulnerability Flag. The Security Status does not change state when the
MEC value is written to $00. The Security Status is evaluated when a SecurityAccess “requestSeed” message
is received. See Table 99.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.8.2 Request Message Definition. Table 100 indicates the structures of the valid request messages for this
service.
8.8.2.1 Request Message Sub-function Parameter $Level (LEV_) Definition. The sub-parameter used in
the request message of the SecurityAccess service indicates to the node the step in progress for this service.
The sub-parameters defined as valid for the request message of this service are indicated in Table 101.
The values of the parameter seed are not defined in this document except for the value $0000 which indicates
to the tester that the node is not locked, and $FFFF which shall not be used because this value may occur if
the Nodes memory has been erased.
The values of the parameter key are not defined in this document.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.8.3 Positive Response Message Definition. Table 103 indicates the separate message structures for the
positive responses relating to the requestSeed and sendKey request levels.
8.8.4 Supported Negative Response Codes. The following negative response codes shall be implemented
for this service. The circumstances under which each response code would occur are documented in
Table 105.
8.8.5.2 SecurityAccess (sendKey) Positive Response. In the following example (Table 107), it is assumed:
The node is programmable (supports mode $27).
The tester has already requested a seed and calculated the corresponding key.
$ccdd is a valid key value for the target node.
The node has a USDT physical request CANId of $241.
The node has a USDT physical response CANId of $641.
Table 108: Node Interface Data Dictionary of SecurityAccess Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Security_Access_Unlocked Pseudo Code Data Dictionary
For Definition Of These
TesterPresent_Timer_State
Flags/Variables
vulnerability_flag
manufacturers_enable_counter
Dev_Cntrl_Active
DeviceContol_Security_Level
SPS_Bad_Key_Counter Range: 0 to 2 counts
Counter of invalid Mode $27 requests. Following two invalid requests, the Resolution: 1 count
device will reject any further Mode $27 requests for the next 10 s.
DevCtrl_Bad_Key_Counter Range: 0 to 2 counts
Counter of invalid Mode $27 requests. Following 2 invalid requests, the Resolution: 1 count
device will reject any further Mode $27 requests for the next 10 s.
Security_Delay_Timer Range: 0 to 10 s
Count down timer used to reject Mode $27 requests for 10 s following two Resolution: 0.1 s
level $02 requests with an incorrect key.
SPS_Security_Key_Allowed TRUE/FALSE
Indication that a level $01 security request for the seed has been received by
the device and a level $02 security key request is allowed.
DevCtrl_Security_Key_Allowed TRUE/FALSE
Indication that a level $03 security request for the seed has been received by
the device and a level $04 security key request is allowed.
Security_Access_Allowed TRUE/FALSE
Indication that a valid security code (as defined in the Vehicle Theft Deterrent
SSTS) has been received.
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
ELSE
send a ($7F $27 $35) message
ENDIF
ELSE
Security_Access_Unlocked TRUE
TesterPresent_Timer_State ACTIVE
SPS_Bad_Key_Counter 2
Send ($67 $02 ) message.
ENDIF
ELSE
send Negative Response ($7F $27 $22) /*Sequence Error */
ENDIF
WHEN ($Level=$03)
IF (Security_Delay_Timer > 0) THEN
Send ($7F $27 $37) /* Time Delay Not Expired */
ELSE IF ((Dev_Cntrl_Active = YES) AND
(DeviceContol_Security_Level = SERVICE)) THEN
send ($7F $27 $22) /* conditions not correct or sequence error*/
ELSE
IF ((DeviceContol_Security_Level = ASSEMBLY_PLT) OR
(manufacturers_enable_counter > 0) OR
(Vulnerability_flag=$FF)) THEN
DeviceContol_Security_Level ASSEMBLY_PLT
TesterPresent_Timer_State ACTIVE
Send ($67 $03 $00 $00) message
ELSE
DevCtrl_Security_Key_Allowed TRUE
Send ($67 $03 $Seed) message
ENDIF
ENDIF
WHEN ($Level=$04)
IF (DevCtrl_Security_Key_Allowed = FALSE) THEN
send ($7F $27 $22) /* conditions not correct or sequence error*/
DevCtrl_Security_Key_Allowed FALSE
ELSE
DevCtrl_Security_Key_Allowed FALSE
IF ($Key does not match stored key) THEN
DevCtrl_Bad_Key_Counter DevCtrl_Bad_Key_Counter - 1
IF (DevCtrl_Bad_Key_Counter = 0) THEN
Security_Delay_Timer10 s
DevCtrl_Bad_Key_Counter 1
send ($7F $27 $36) /* for Exceeded Number Of Attempts */
ELSE
send a ($7F $27 $35) message
ENDIF
ELSE
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
DeviceContol_Security_Level ASSEMBLY_PLT
TesterPresent_Timer_State ACTIVE
DevCtrl_Bad_Key_Counter 2
Send ($67 $04) message.
ENDIF
ENDIF
WHEN ((($Level > $0A)AND($Level < $FB)) AND ($Level MOD 2 = 1))
/* vehicle manufacturer specific - request seed */
WHEN ((($Level > $0A)AND($Level < $FB)) AND ($Level MOD 2 = 0))
/* vehicle manufacturer specific - send key */
WHEN ($Level ≥ $FB AND ($Level MOD 2 = 1))
/* system supplier specific - requestSeed*/
WHEN ($Level ≥ $FB AND ($Level MOD 2 = 0))
/* system supplier specific */
ENDSELECT
ELSE
send Negative Response ($7F $27 $12) /*Subfunction Not Supported-Invalid Format*/
ENDIF
ENDFUNCTION
The following logic is executed periodically (suggested execution rate = 100 ms.):
IF (Security_Delay_Timer > 0) THEN
Decrement the Security_Delay_Timer by the execution rate.
ENDIF
8.8.7 Node Verification Procedures.
8.8.7.1 General Procedures.
Procedure 1:
1. Send a security access request message with the sub-function parameter ($Level) equal to a value that is
not supported and verify $7F $27 $12 response.
2. If negative response code $78 is supported by the ECU, then create the conditions under which the ECU
should return the $7F $27 $78 response and verify that proper response is sent.
3. Repeat step 2 of this procedure for each possible reason an ECU would send the negative response with
response code $78. Verify this for each applicable supported sub-function parameter.
8.8.7.2 Verification Procedures for SPS Programming Security Levels ($01, $02). The steps for Procedure
1 below shall be performed within 10 s of the ECU being powered up (executing operational software). For
Procedures 2 through 5 below, the verification procedures shall be performed after the ECU has been powered
up (executing operational software) for at least 10 s.
Procedure 1:
1. Within 10 s of power-up send a valid security access request message $01 to an ECU when its
vulnerability_flag !=$FF and its MEC = $00. Verify that the response is $7F $27 $37.
2. Repeat step 1 of this procedure periodically (approximately every 500 ms) and verify that the $7F $27 $37
response is sent each time until the ECU has been powered for 10 s.
3. Send a valid security access request message $01 within 10 s of power-up to an ECU when the
vulnerability_flag = $FF (if supported) and the MEC = $00. Verify the proper positive response message
$67 $01 $00 $00.
4. Send a valid security access request message $01 within 10 s of power-up to an ECU when the MEC >
$00 and the vulnerability_flag (if supported) is not set to $FF. Verify the proper positive response message
$67 $01 $00 $00.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Procedure 2: This procedure is to be performed twice, once while the ECU is secured (manufacturers enable
counter = $00, vulnerability flag < $FF, and security has not been accessed (SecurityAccess ($27) request has
not been sent)) and once when the ECU is unsecured ((manufacturers enable counter > $00 or vulnerability
flag = $FF), and security has been accessed (SecurityAccess ($27) request has been sent)).
1. Send a security access request message $01 with an incorrect number of data bytes and verify $7F $27
$12 response.
2. Send a security access request message $02 without sending a security access request message $01 and
verify $7F $27 $22.
3. Send a valid security access request message $01 and verify the security access positive response
message $01. Then send a request message $02 with an incorrect number of data bytes and verify the
$7F $27 $12 response (only perform this step when the seed response to the level $01 request is a non
zero seed).
Procedure 3: This procedure is to be performed while the ECU is unsecured ((manufacturers enable counter
> $00 or vulnerability flag = $FF), and security has been accessed (SecurityAccess ($27) request has been
sent)).
1. Send a valid security access request message $01 with the device already unsecured and verify $67 $01
$00 $00 response.
2. Repeat step 1 of this procedure and then send a security access request message with level $02. Verify
$7F $27 $22 response.
3. After performing steps 1 and 2 of this procedure, verify that the ECU remains unsecured by attempting a
secure service and verifying the correct positive response.
Procedure 4: The steps in this procedure are to be performed sequentially. This procedure is to be performed
twice, once while the ECU is secured (manufacturers enable counter = $00, vulnerability flag < $FF, and
security has not been accessed (SecurityAccess ($27) request has not been sent)) and once while the ECU is
unsecured ((manufacturers enable counter > $00 or vulnerability flag = $FF), and security has been accessed
(SecurityAccess ($27) request has been sent)).
1. Send a valid security access request message with $Level = $01. Verify the proper positive response
($0000 seed if unlocked and non zero seed if locked).
2. This step is performed when the seed in the above step is a non zero value. Send a valid security access
request message $02 with a correct key and verify the proper positive response message.
3. Verify that the device is now unsecured by attempting a secure mode and verifying the appropriate positive
response.
4. Send valid $3E message within P3C ms for 2 minutes. Then verify the device remains unsecured by
attempting a secure service and verifying the appropriate positive response.
5. Stop sending TesterPresent ($3E) messages. Verify that after P3 Cmax ms without sending a $3E message
the device is secured by requesting a secure service and verifying the appropriate negative response.
Procedure 5: This procedure is to be performed when the ECU vulnerability flag is not $FF (if supported) and
the MEC = 0.
1. Send a valid security access request message $01 and verify $67 $01 $seedMsb $seedLsb response.
2. After step 1 is complete, send a security access request message with level $02 and an incorrect key.
Verify $7F $27 $35 response.
3. Repeat step 1 and 2 of this procedure and verify that the response from step 2 (the second level $02
message) changes to $7F $27 $36. Then send a request for this service with $Level = $01 within 10 s and
verify $7F $27 $37 message.
4. After performing steps 1 through 3 of this procedure, verify that the ECU remains locked by attempting a
secure service and verifying the correct negative response.
8.8.7.3 Verification Procedures for Device Control Security Levels ($03, $04). The procedures below shall
be followed if the ECU supports the Device Control security access levels ($03 and $04). The steps for
Procedure 1 below shall be performed within 10 s of the ECU being powered up (executing operational
software). For procedures 2 through 6 below, the verification procedures shall be performed after the ECU has
been powered up (executing operational software) for at least 10 s.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Procedure 1:
1. Send a valid security access request message $03 within 10 s of power-up to an ECU when the
vulnerability_flag !=$FF (if supported) and the MEC = $00. Verify $7F $27 $37 response.
2. Repeat step 1 of this procedure periodically (approximately every 500 ms) and verify that the $7F $27 $37
response is sent each time until the ECU has been powered for 10 s.
3. Send a valid security access request message $03 within 10 s of power-up to an ECU when the MEC >
$00 and vulnerability flag not equal to $FF (if supported). Verify the proper positive response message $67
$03 $00 $00.
4. Send a valid security access request message $03 within 10 s of power-up to an ECU when the MEC
equals $00 and vulnerability flag is set to $FF (if supported). Verify the proper positive response message
$67 $03 $00 $00.
Procedure 2: This procedure is to be performed twice, once while the ECU has the service device control
restrictions active and once while the ECU has the assembly plant device control restrictions active.
1. Send a security access request message $03 with an incorrect number of data bytes and verify $7F $27
$12 response.
2. Send a security access request message $04 without sending a security access request message $03 and
verify $7F $27 $22.
3. Send a valid security access request message $03 and verify the security access positive response
message $03. Then send a request message $04 with an incorrect number of data bytes and verify the
$7F $27 $12 response.
Procedure 3: This procedure is to be performed while the ECU has the assembly plant device control
restrictions active.
1. Send a valid security access request message $03 while the device has assembly plant restrictions active
and verify $67 $03 $00 $00 response.
2. Repeat step 1 of this procedure and then send a security access request message with level $04. Verify
$7F $27 $22 response.
3. After performing steps 1 and 2 of this procedure, verify that the ECU keeps the assembly plant device
control restrictions active. This can be done by sending a device control command that is valid for the
assembly plant restrictions but invalid for service restrictions and verifying a positive response message.
Procedure 4: The steps in this procedure are to be performed sequentially. This procedure is to be started
when the ECU has the service device control restrictions active, the MEC = $00, and the vulnerability_flag (if
supported) not equal to $FF.
1. Send a valid security access request message with $Level = $03. Verify the proper positive response.
2. Send a valid security access request message $04 with a correct key and verify the proper positive
response message.
3. Verify that the device is now enforcing assembly plant device control restrictions by sending a device
control command that is valid for the assembly plant restrictions but invalid for service restrictions and
verifying a positive response message.
4. Send valid $3E message within P3C ms for 2 minutes (provided that the device control chosen can be
active for 2 minutes - if not, adjust as necessary) while maintaining the conditions which are valid for the
assembly plant restrictions and invalid for service restrictions. Verify that the ECU keeps the device control
active and does not send any device control limits exceeded $7F $AE $E3 $xx $yy reject messages.
5. Stop sending TesterPresent ($3E) messages. Verify that after P3Cmax ms without sending a $3E message
that the device reverts back to the service device control restrictions. This can be done by sending a
device control command that is valid for the assembly plant restrictions but invalid for service restrictions
and verifying the correct $7F $AE $E3 $xx $yy negative response message.
Procedure 5:
1. Send a valid device control request (mode $AE) and verify the proper positive response. Then send a valid
security access request message $03 and verify the negative response $7F $27 $22 (the negative
response is sent because device control is already active using service restrictions when the request is
received).
Procedure 6: This procedure is to be performed when the MEC = $00 and the vulnerability_flag (if supported)
not equal to $FF.
1. Send a valid security access request message $03 and verify $67 $03 $seedMsb $seedLsb response.
2. After step 1 is complete, send a security access request message with level $04 and an incorrect key.
Verify $7F $27 $35 response.
3. Repeat step 1 and 2 of this procedure and verify that the response from step 2 (the second level $04
message) changes to $7F $27 $36. Then send a request for this service with $Level = $03 within 10 s and
verify $7F $27 $37 message.
4. After performing steps 1 through 3 of this procedure, verify that the service device control restrictions
remain active. This can be done by sending a device control command that is valid for the assembly plant
restrictions but invalid for service restrictions and verifying the correct $7F $AE $E3 $xx $yy negative
response message.
8.8.8 Tester Implications. This test mode will be terminated if a $3E message is not received every P3 C ms.
Upon a Mode $3E time-out, the node shall lock itself (also revert back to service device control restrictions if
applicable).
An invalid key requires the external tester to start over from the beginning with a mode $27 (level 1) request
message. This is a requirement of SAE J2186. The tester cannot send a key to a secured device without first
requesting the seed.
8.9 DisableNormalCommunication ($28) Service. The purpose of this service is to prevent a device from
transmitting or receiving all messages which are not the direct result of a diagnostic request. The primary use
of the service is to set up a programming event. This is a required service that must be supported by all nodes.
8.9.1 Service Description. When this service is activated, a node shall cease transmission of all normal mode
(non-diagnostic) messages. Normal messages are halted by invoking a handler function(s) which performs the
following tasks:
1. Inhibits the transmission of all non-diagnostic signals/messages. Non-diagnostic frames already loaded
into the protocol device do not have to be flushed, but no additional non-diagnostic frames shall be loaded.
2. De-queue all queued messages and inhibit further queuing of non-diagnostic messages.
3. Disable the processing of all received messages except for those corresponding to the specific diagnostic
CAN Identifiers supported by the ECU.
A node shall not send out any normal communication frames after sending the positive response to this
service, until after this service is no longer active. Disabling the processing of normal mode messages is
necessary to facilitate module programming for service and assembly. During the programming process,
certain normal communication CAN Identifiers may be temporarily used as diagnostic CAN Identifiers. See the
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
chapter in this specification on programming for further details on the use of these CAN Identifiers for
programming.
This service also disables the setting of all diagnostic trouble codes. A device receiving and complying with this
request shall take failsoft action on all necessary parameters.
Note: A device which is connected to more than one GMLAN link shall be able to receive, process and
respond to a service $28 request on each link to which it is connected.
Note: Use of this service during a programming event should always be targeted to all nodes using the
AllNodes functional diagnostic request CANId ($101) and the AllNodes extended address ($FE).
This service requires a periodic TesterPresent ($3E) service message to be transmitted by the tester to remain
active.
This service shall be terminated when:
A node receives a $20 request.
A P3C (TesterPresent) time-out occurs.
8.9.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. Because this service is
defined as a single operation, there are no sub-function parameters required or valid for the request message.
8.9.2.2 Request Message Data Parameter Definition. There are no data parameters used with this service.
8.9.3 Positive Response Message Definition (Table 110).
8.9.3.1 Response Message Data Parameter Definition. There are no data parameters used by this service
in the positive response message.
8.9.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 111) shall
be implemented for this service. The circumstances under which each response code would occur are
documented in the table below.
Table 113: Node Interface Data Dictionary of SecurityAccess Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
TesterPresent_Timer_State Pseudo Code Data
Dictionary For Definition Of
normal_message_transmission_status
These Flags/Variables
Diag_Services_Disable_DTCs
diagnostic_responses_enabled
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
IF (message_data_length != 1) THEN
IF (diagnostic_responses_enabled = YES) THEN
Reject the request with a ($7F $28 $12) for invalid format
ENDIF
ELSE
IF (Device cannot disable normal communications at this time) THEN
/* do not need to check if diag resp enabled here because if they are not, then there would be no
reason why the device would not already have disabled normal comm */
Reject the request with a ($7F $28 $22) for conditions not correct
ELSE
Diag_Services_Disable_DTCs TRUE
normal_message_transmission_status DISABLED
CALL hnd_halt_normal_comm() /* handler call to halt normal comm */
TesterPresent_Timer_State ACTIVE
IF (diagnostic_responses_enabled = YES) THEN
Send ($68) response message
ENDIF
ENDIF
ENDIF
ENDFUNCTION
8.9.7 Node Verification Procedure. Perform procedures 1 and 2 below on devices that are completely
programmed (SPS_TYPE_A ECU).
Procedure 1:
1. Send a DisableNormalCommunication request with data bytes after the Service Id and verify the negative
response ($7F $28 $12) message is sent.
2. Send a DisableNormalCommunication request message at a time when the device cannot disable Normal
Mode communication and verify the negative response ($7F $28 $22) message is sent. (This is only
required for devices which support such a situation.)
Procedure 2:
1. Verify that the device has no Current or History DTCs stored (use $A9 service).
2. Send a DisableNormalCommunication request message. Keep mode active with Tester present messages
(mode $3E) for at least 2 minutes. Verify that all Normal Mode communications are disabled.
3. Stop sending TesterPresent messages and wait P3Cmax ms. Verify that normal communications are
reinitialized.
4. Verify that the device has no Current or History DTCs stored (use $A9 service).
Procedure 3: For SPS_TYPE_C ECUs that do not have diagnostic responses enabled.
1. Send a DisableNormalCommunication functional request with data bytes after the Service Id and verify
that there is no response from the SPS_TYPE_C ECU.
2. Next, send a $A2 service request and verify that no response is sent (because a valid $28 service had not
been received).
Procedure 4: For SPS_TYPE_B ECUs
1. Send a valid DisableNormalCommunication request and verify the correct positive response from the
SPS_TYPE_B ECU.
8.9.8 Tester Implications. Upon receipt of the response to this request, the test device may assume that the
link will now be quiet for at least P3 C ms. This mode will be terminated if a TesterPresent ($3E) message is not
received at least once every P3C ms.
The tester is also responsible to send a ReturnToNormalMode ($20) request (to all nodes) if any single node
rejects the request for service $28. Otherwise, the device that rejected the $28 service would still be expecting
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
normal communications traffic while the nodes that accepted the $28 request would quit communicating,
resulting in erroneous serial data DTCs being set.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.10 DynamicallyDefineMessage ($2C) Service. This service is used to dynamically define the contents of
diagnostic data packets which are formatted as UUDT messages and can be requested via the
ReadDataByPacketIdentifier ($AA) service. The use of dynamic data packets allows a test device to optimize
its diagnostic routines and bus bandwidth utilization by packing messages to only contain the diagnostic
signal/parameter information that is required for the current test.
8.10.1 Service Description. Diagnostic data packets contain a one byte Data Packet Identifier (DPID #) and
one to seven bytes of signal/parameter data. UUDT diagnostic messages contain a message number and up
to seven bytes of data. The DPID# for a diagnostic data packet shall be the same as the message number
used when the diagnostic UUDT message is transmitted (i.e., DPID# $FE will be identified as diagnostic UUDT
message # $FE). Dynamically definable data packet Identifiers shall start with $FE and be numbered
sequentially backwards. No DPIDs are allowed to occupy the range of UUDT message numbers from $80
through $8F as these UUDT message numbers are reserved for the Diagnostic Trouble Code (DTC) services.
Dynamic data packets will be referenced in subsequent sections of this service as a DPID.
Each diagnostic signal/parameter is assigned a 2-byte Parameter Identifier (PID) number which is used to
build the dynamic DPIDs. The term PID will be used to reference diagnostic signals/parameters in subsequent
sections of this service.
All of the PIDs packed into a dynamic DPID shall be defined with a single request of this service. This request
may be a single-frame or multiple-frame message depending on the number of PIDs being packed in the
DPID. Once the test device receives a positive response from a $2C request, the PIDs in each subsequent
transmission of the corresponding UUDT message (as requested via service $AA) shall match those of the last
$2C service request message. A dynamic data packet shall be capable of being initially defined or modified
any time a node is capable of communications and shall only require a $2C service request to do so (i.e., no
key cycles or any other special events can be required). It shall also be possible to redefine a DPID while it is
currently being scheduled by the periodic scheduler. See Service $AA description for more detail on the ability
to schedule periodic UUDT messages. If the tester redefines a DPID without stopping the scheduler, the PIDs
in the response message may not be correct until the 2nd response of that message. This is the case because
a message may be queued for transmission at the time the DPID is being redefined and may not gain access
to the link until after successful completion of the $2C service. If the tester wants to guarantee that the next
transmission of the corresponding UUDT message contains the correct information, then the tester should
remove that DPID from the scheduler prior to redefining it.
If a $3E (TesterPresent) time-out occurs, or upon receipt of a $20 service (ReturnToNormalMode) request
message, the device shall retain the contents of all dynamic DPIDs. In addition, the periodic message
scheduler may be stopped and started without affecting the contents of any dynamic DPIDs.
A device which implements this service shall be capable of buffering a 3-frame request message. This is the
maximum number of frames needed to define a single dynamic DPID.
8.10.2 Request Message Definition (Table 114).
8.10.2.1 Request Message Sub-function Parameter $Level Definition. Because this service is defined as a
single operation, there are no sub-parameters required or valid for the request message.
© Copyright 2010 General Motors All Rights Reserved
8.10.2.2 Request Message Data Parameter Definition. Table 115 specifies the data parameter definitions for
this service.
8.10.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 118)
shall be implemented for this service. The circumstances under which each response code would occur are
documented in Table 118.
8.10.5 Message Flow Example(s) DynamicallyDefineMessage. The examples below (Tables 119 thru 122)
show how a dynamic DPID is defined for a Powertrain Control Module (PCM). All of the examples assume the
following information to be true for the PCM:
The diagnostic CAN Identifiers for the PCM are: $241-USDT Request, $541-UUDT Response, and
$641-USDT Response.
$FE thru $F7 is the valid range for dynamically definable DPIDs.
Engine rpm is a 2-byte parameter and is identified by PID# $000C.
Vehicle Speed is a 1-byte parameter and is identified by PID# $000D.
Manifold Pressure is a 1-byte parameter and is identified by PID# $000B.
Engine Coolant Temperature is a 1-byte parameter and is identified by PID# $0005.
Engine Mass Airflow is a 2-byte parameter and is identified by PID# $0004.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
The UUDT response to a $AA service request for message $FE, would look like Table 120:
8.10.5.2 Example 2 Define DPID with Single PID. In this example (Table 121), the tool sends a $2C request
message to define DPID $F7 with Spark Advance.
The UUDT response to a $AA service request for message $F7, would look like Table 122:
valid_request YES/NO
This is a local flag which is used to keep track of whether or not the request
message is OK to process.
invalid_PID YES/NO
This is a flag used to keep track of whether or not all of the PIDs in the request
message are supported by the device.
total_length $01 thru $07
This is a counter used to keep track of the number of data bytes contained within
a DPID. A DPID can contain a maximum of seven data bytes. As each PID in the
request message is processed, the number of bytes needed to transmit that PID
in the frame is added to this counter.
Variable/Meaning Values
max_PID_index constant determined at
This is a constant that is used when indexing through the array of supported PIDs compile time
to determine if a PID is supported. Its value is equal to 1 less than the number of
PIDs supported by the ECU.
PID_Req_Index 0 to max_PID_index
This is a local variable used to index through the array of supported PIDs to
determine if a PID is supported.
Requested_PID $0000 to $FFFF
This is a local variable which is set equal to a specific PID number from the
request message when indexing through the list of requested PIDS to determine
if all requested PIDs are supported.
PID_Found YES/NO
This is a flag used to determine if a requested PID has been found in the list of
supported PIDs.
PIDs_Supported[] N/A
This is an array of data structures that contains the list of supported PIDs and the
length of the data for each supported PID. PIDs_Supported[].PID_Number is
used in the pseudo code when checking the PID number to see if it is supported.
PIDs_Supported[].length is the number of data bytes associated with the given
PID.
Supported_Dyn_DPIDs[] N/A
This is an array that contains all of the supported dynamically definable DPID
numbers.
max_Dynamic_DPID_Index constant determined at
This is a constant that is used when indexing through the array of supported compile time
dynamic DPIDs to determine if a DPID is supported. Its value is equal to 1 less
than the number of DPIDs supported by the ECU.
DPID_Index 0 to
This is a local index variable used when indexing through the array of supported max_Dynamic_DPID_Index
dynamic DPIDs to determine if the DPID from the request message is valid.
PidStructArray[] N/A
This is an array of structures that contain the data needed to support PIDs. for
the purposes of the pseudo code of this service it is assumed that each structure
contains the following information:
1. PidSecure - Set to YES if security access is required to retrieve PID data
2. PidSecurityCode – Set to YES if security code access is required to retrieve
PID data
Other elements may exist in the structure such as a pointer to a function to
retrieve the data, memory address and length information (for a dynamic PID,
see $2D service), etc. Only the PidSecure and PidSecurityCode are shown here
for the purposes of the pseudo code.
The pseudo code uses the following convention to access an element of the
structure:
PidStructArray[0].PidSecure would indicate if security access is required for the
first PID structure in the array.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Procedure 3:
1. If the ECU supports the use of the negative response code $78, then send a request under conditions
which would cause the $7F $2C $78 to be sent. Verify that the negative response is sent and that the
appropriate last response is sent within the P2C* timing criteria.
8.10.8 Tester Implications.
1. The test device may assume the contents of dynamic DPIDs are retained upon a $3E time-out or after a
$20 service request.
2. If the tester redefines a DPID without stopping the scheduler, the PIDs in the response message may not
be correct until the 2nd response of that message. This is the case because a message may be queued
for transmission at the time the DPID is being redefined and may not gain access to the link until after
successful completion of the $2C service.
3. This service should only be requested with physical addressing.
8.11 DefinePIDByAddress ($2D) Service. The purpose of the $2D DefinePIDbyAddress service is to provide
the ability to map ECU variables to a dynamic Parameter Identifier (PID) using ECU memory addresses. The
resulting PID defined by this service can then be requested via diagnostic service $22 or diagnostic service
$AA.
Note: To retrieve a PID via the ReadDataByPacketIdentifier service the PID must first be packed into a
dynamic DPID using the $2C service.
This service ($2D) supports defining a single PID per request (multiple PIDs can be defined in a given ECU,
using multiple requests).
This service is intended for use during a device’s development cycle to allow access to data that may not be
available via another diagnostic service. This service is only intended for use in engineering development. It
will not be used in field service applications.
8.11.1 Service Description. The DefinePIDbyAddress service allows a tester to dynamically assign an ECU
variable to a PID via the address of the variable. The resulting PID data can then be read using either the $22
service or the $AA service. The service is intended to be used to retrieve RAM variables. Calibrations and
unprotected areas of EEPROM/Flash memory should not be packed into a dynamic PID. This type of data is
static in nature and can be obtained using service $23.
The dynamic PID being defined is identified by parameterIdentifier (PID), memoryAddress (MA) and
memorySize (MS). The size of parameterIdentifier is fixed at two bytes; the size of the memoryAddress
parameter in the request message can be two, three, or four bytes in length depending on the ECU internal
addressing scheme. The number of bytes that a tester shall use in the memoryAddress portion of the request
message for a given ECU shall be documented in the appropriate CTS, SSTS, or supplemental diagnostic
specification referenced by either of the preceding documents. The memorySize parameter in the request
message can range from one to seven bytes. (Seven bytes is the maximum in order to allow the PID to be part
of a DPID.)
The DefinePIDbyAddress positive response message includes the parameterIdentifier (PID), specified in
request message.
A device may deny access to specific addresses in order to protect their operating system and other secure
data. An ECU may also restrict the testers ability to read specific addresses based on the security status of the
ECU. If any of the addresses (that fall in the range of the request message) have security restrictions then the
request shall be rejected unless the tester had previously successfully accessed security.
Note: Security access is only required if the ECU is locked based on the status of the MEC and/or the
vulnerability flag see the SecurityAccess ($27) service for more information.
The range of PIDs that can be dynamically defined by this service in a given ECU shall be documented in the
appropriate CTS, SSTS, or supplemental diagnostic specification referenced by either of the preceding
documents.
Note: If a tool requests a dynamic PID before this service is called to define the PID then the resulting
response is undefined.
8.11.2.1 Request Message Sub-Function $Level Parameter Definition. Because this service is defined as a
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
single operation, there are no sub-function levels required or valid for the request message.
8.11.2.2 Request Message Data Parameter Definitions (Table 125).
8.11.4 Supported Negative Response Codes (RC_). The following negative response codes (Table 128)
shall be implemented for this service.
The ECU uses 4-byte addressing and the tester requests memory data in address $00011102,
The value of the memorySize parameter is $02,
The tester responds with a positive response with PID $CCFF,
The node has a physical request CANId of $241,
The node has a physical USDT response CANId of $641.
Table 131: Node Interface Data Dictionary of ReadMemoryByAddress Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Security_Access_Unlocked Pseudo Code Data
Dictionary For Definition Of
These Flags/Variables
Bad_Address TRUE/FALSE
Status flag that indicates whether any of the range of addresses in the request is
not valid.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Variable/Meaning Values
memoryAddress Varies based on ECU
This is the starting address in ECU memory from the request message.
numAddressBytes 2 to 4, depending on ECU
This is a local variable used to identify the number of bytes in the tester request Addressing scheme
message for the memoryAddress parameter.
memorySize $01 to $07
This is the number or consecutive memory addresses that the tester has
requested (parameter of request message).
Memory_Address Varies based on ECU
This is a local variable used to point to ECU memory when indexing through the
requested addresses to determine if any portion of the requested memory is
invalid, protected, or requires security access. The pseudo code uses
Memory_Address.data to reflect the contents of a given memory address.
DynamicPidStructArray[] N/A
This is an array of structures that contain the data needed to support dynamic
PIDs. Each structure contains the following information:
PidNumber - The dynamic PID number. This is hardcoded in the structure
and is not modified by this service. The DynamicPidStructArray contains an
array element (which is a structure) for each dynamic PID that the ECU
supports.
MemAddr - The starting memory address assigned to this dynamic PID via
this service.
Length - The number of bytes to be transmitted starting with the contents of
MemAddr when this PID is requested.
The pseudo code uses the following convention to access an element of the
structure:
DynamicPidStructArray[0]. PidNumber would be the PID number of the first
dynamic PID structure in the array.
NumArrayElements ECU dependent
This is a local variable that contains the number of elements in the
DynamicPidStructArray.
Index 0 to
This is a local variable used in the pseudo code to index into the (NumArrayElements -1)
DynamicPidStructArray.
ValidIndex 0 to NumArrayElements
This is a local variable used in the pseudo code to record the value of Index
when the PID in the request message matches the PidNumber element of the
DynamicPidStructArray.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
ValidIndex NumArrayElements
IF (message_data_length != (4 + numAddressBytes) ) THEN
send Negative Response ($7F $2D $12) /*Subfunction Not Supported or Invalid Format */
ELSE
IF (the response cannot be sent within P2C ms) THEN
send Negative Response ($7F $2D $78) /*RequestCorrectlyReceived-ResponsePending */
ENDIF
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
and number of bytes for the defined PID are reported when requesting the PID with either a $22 or $AA
request.
3. If applicable, with the ECU manufacturers enable counter > $00, the vulnerability flag = $FF, and security
has been accessed (SecurityAccess ($27) request has been sent), send a request to define a valid
dynamic PID with an address range that is completely valid, not restricted, and includes secure locations.
Verify the proper positive response. Verify that the correct data and number of bytes for the defined PID
are reported when requesting the PID with either a $22 or $AA request.
Procedure 2:
1. Send a request with less than the required number of data bytes (4 + the number of bytes in the
memoryAddress parameter), verify negative response ($7F $2D $12).
2. Send a request with more than the required number of data bytes (4 + the number of bytes in the
memoryAddress parameter), verify negative response ($7F $2D $12).
3. Send a request with an invalid dynamic PID. Verify negative response ($7F $2D $31).
4. Define a valid dynamic PID with more than seven consecutive valid memory addresses (MS = $08) that
are not restricted, and non-secured. Verify negative response ($7F $2D $31).
5. Define a valid dynamic PID with a valid MA but with zero number of memory addresses (MS = $00). Verify
negative response ($7F $2D $31).
6. Define a valid dynamic PID with at least one invalid ECU address in the range of addresses specified by
MA and MS. Verify negative response ($7F $2D $31).
7. If applicable, define a valid dynamic PID with a valid range of non-secure addresses that includes at least
one restricted address. Verify negative response ($7F $2D $31).
8. If applicable, with the ECU manufacturers enable counter = $00, the vulnerability flag < $FF, and security
has not been accessed (SecurityAccess ($27) request has not been sent), define a valid dynamic PID with
a range of valid and non-restricted addresses that includes at least one secure address. Verify negative
response ($7F $2D $31).
9. If applicable, with the manufacturers enable counter > $00 or vulnerability flag = $FF and security has not
been accessed (SecurityAccess ($27) request has not been sent), define a valid dynamic PID with a range
of valid and non-restricted addresses that includes at least one secure address. Verify negative response
($7F $2D $31).
10. If applicable, with the manufacturers enable counter > $00 or vulnerability flag = $FF and security has
been accessed (SecurityAccess ($27) request has been sent), define a valid dynamic PID with a range of
valid and non-restricted addresses that includes at least one secure address. Verify positive response.
11. If negative response code $78 is supported by the ECU, then create the conditions under which the ECU
should return the $7F $2D $78 response and verify that proper response is sent. Repeat for each possible
reason an ECU would send the negative response with response code $78.
8.11.8 Tester Implications. The tester needs to ensure that it transmits the correct number of bytes in the
memoryAddress parameter or the message shall be rejected.
If the tester attempts to request a dynamic PID (via the $22, $2C/$AA services) and the PID has not been
previously defined via the $2D service, the results are undefined.
If the tester packs a dynamic PID into a dynamic DPID, then attempts to redefine the dynamic PID (using the
$2D service) without subsequently redefining the dynamic DPID, then the data transmitted when the DPID is
requested is undefined. Anytime a tester has packed a dynamic PID into a dynamic DPID and wants to
redefine the dynamic PID, then the tester should first remove the dynamic DPID from the DPID scheduler,
redefine the dynamic PID, redefine the dynamic DPID and then put the DPID back into the periodic message
scheduler (via the $AA service).
This service should only be requested with physical addressing.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.12 RequestDownload ($34) Service. This service is used in order to prepare a node to be programmed.
8.12.1 Service Description. The service is used to indicate to the programming routines which encryption and
compression techniques are utilized so that the programming routines can correctly decode the data received
with subsequent TransferData ($36) services. This is a secured service. Nodes that support security access
must be unlocked before a request for this service is accepted (see Mode $27 Request SecurityAccess).
This service is also used by the test device to request a Node to transfer program operation from the
application software to the boot software (for nodes that support a boot) so that the node can be programmed.
ECUs that utilize the SPS system to program operational software are required to have boot software. See
programming chapter within this specification. ECUs that have their software in ROM and utilize the SPS
system to program calibrations are not required to support a boot.
The DisableNormalCommunication ($28) and ProgrammingMode ($A5) services must be active prior to the
mode $34 request. However, high speed programming (enabled with service $A5 on the Single Wire CAN link)
is not required to be active to perform programming. This means that even though the intent is to perform
programming in high speed mode (for devices on the low speed link), it will be possible to program these
nodes in normal speed if circumstances dictate the need.
Only a single $34 service request is required to initiate a download sequence of multiple software or calibration
modules to the node. However, it is also possible to send a $34 service request each time a download of a
single software or calibration module starts (clear separation of all downloaded modules).
Note: If Encryption or Compression techniques are utilized, then multiple requests for this service (one per
module downloaded) may be required as determined by the encryption or compression techniques for each
module. Ideally, all software or calibration modules downloaded to a single node should use a single
encryption and/or compression technique.
8.12.2 Request Message Definition (Table 132).
8.12.2.1 Request Message Sub-Function $Level Parameter Definition. There are no sub-function
parameters used by this service.
8.12.2.2 Request Message Data Parameter Definition. Table 133 contains the data parameter values
defined for this service.
8.12.3.1 Positive Response Message Data Parameter Definition. There are no data parameters in a
response to a request for this service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
8.12.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. The circumstances under which each response code would occur are
documented in Table 135.
Table 137: Node Interface Data Dictionary of RequestDownload Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Security_Access_Unlocked Pseudo Code Data Dictionary
For Definition Of These
TransferData_Allowed
Flags/Variables
programming_mode_active YES/NO
This is a flag used to keep track of whether or not a programming event has
been enabled.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
TransferData_Allowed YES
4. Perform a valid download of data with the download scheme defined, using service $28, $A5, $27 (if
applicable), $34 and $36. While the ECU expects more data to be downloaded with the service $36
transmit a service $34 request message and verify the negative response message ($7F $34 $22,
conditions not correct) is sent.
5. Send a request message with less than the required amount of data bytes and verify the negative
response message ($7F $34 $12) is sent.
6. Send a request message with more than the required amount of data bytes and verify the negative
response message ($7F $34 $12) is sent.
7. Perform security sequence. Send a DisableNormalCommunication request message, verify positive
response. Begin TesterPresent message periodic. Enable programming mode with the $A5 service. Send
RequestDownload message with the correct number of data bytes and an invalid dataFormatIdentifier
parameter value. Verify proper negative response reject message ($7F $34 $12, sub-function not
supported) is sent.
© Copyright 2010 General Motors All Rights Reserved
information in the utility file (reference the programming chapter within this specification and also the
Interpreter Specification listed in the Normative References section of this specification for more details).
8.13.2 Request Message Definition. Table 138 defines the structure of the TransferData request message.
Note: A request message must always include the sub-function parameter level of operation AND a starting
address. Additional data bytes beyond the starting address are optional and would not be present in the case
of a request to execute a previously downloaded block of data.
The starting address parameter (startingAddress) can be two, three, or four bytes based on the ECU internal
addressing scheme. All TransferData requests to the same ECU shall use the same number of bytes in the
startingAddress parameter (independent of the actual address value). During SPS programming, the
programming tool determines the number of bytes to use in the startingAddress parameter from information in
the utility file.
startingAddress[] = [
#3 Byte1 - MSB M xx SA_B1
#4 Byte2 M xx SA_B2
#5 Byte3 C1 xx SA_B3
#6 Byte4 ] C2 xx SA_B4
dataRecord[] = [ C3 DREC_
#5/6/7 data byte #1 yy DATA_1
: : : :
#n data byte #m (where m ≤ 4093 minus the zz DATA_m
number of bytes in the
startingAddress) ]
Where:
C1: Byte 3 is present when the memoryAddress parameter contains 3 or 4 bytes.
C2: Byte 4 is present when the memoryAddress parameter contains 4 bytes.
C3: The size of the dataRecord parameter shall be at least one byte if the sub-function value is of type
download and may be 0 bytes if the sub-function value is of type downloadAndExecuteOrExecute
Note 1: Byte1 in the memoryAddress parameter is always the most significant byte of the address and the last byte of the memoryAddress
parameter (Byte2 for 2-byte addressing, Byte3 for 3-byte addressing, or Byte4 for 4-byte addressing) is always the least significant byte of
the memoryAddress parameter.
8.13.2.1 Request Message Sub-Function $Level Parameter Definition. The following definitions apply to
the sub-function levels of operation for service $36 TransferData. All other sub-function values are reserved for
future definition within this specification. See Table 139.
8.13.3.1 Positive Response Message Data Parameter Definition. There are no data parameters in a
response to a request for this service.
8.13.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. See Table 142.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.13.5.2 TransferData Negative Response Example (ECU Uses 2 Byte Address). The following example
(Table 144) assumes:
The node uses 2-byte addressing (e.g., startingAddress is 2 bytes).
The node targeted is programmable.
The node has security unlocked.
Mode $28 is already active.
Mode $A5 is already active (programming mode enabled).
A Mode $34 request was sent and a positive response resulted.
The starting address ($23 $FF) plus the number of data bytes all fall into valid ECU memory address
space.
The programming routines are executing and the address space to be written to has already been erased.
The tester is now sending data to be written to permanent memory with the download transfer type
(sub-function = $00).
The data (dataRecord[]) to be transferred contains 250 bytes of data (so message_data_length = 250 + 4
or 254 bytes. The 4 bytes come from the Service ID plus the sub-function parameter byte plus the 2-byte
startingAddress).
It takes the node longer than P2C ms to completely download and write the data block (so the node sends
a negative response with response code $78 to indicate to the tester that the final response shall be sent
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
within the P2CE* enhanced programming timing window). While writing the data to permanent memory, the
ECU detects an error so it sends a negative response to indicate that the programming failed.
The target node physical request CANId is $241.
The target node USDT physical response CANId is $641.
The USDT flow control parameters Block Size (BS) and Separation Time (ST) are both $00.
TesterPresent messages are sent (but not shown in the example).
8.13.6.2 Node Interface Pseudo Code. If a node supports boot software then the operational software only
needs minimum support of this service. This is true for nodes with boot software because a service $34
transitions the program operation back to the boot software (see service $34) and the $34 service is required
before the $36 service is allowed. ECUs with boot software only need to support the Serv_36_Msg_Recvd()
pseudo code in the operational software and the Boot_36_Msg_Recvd() in the boot software. ECUs that do not
have boot software shall support the functionality of the Boot_36_Msg_Recvd() pseudo code in the operational
software.
BEGINFUNCTION Serv_36_Msg_Recvd()
send Negative Response ($7F $36 $22)/* conditions not correct since the $34 service is not active if the ECU
is executing the operational software. */
ENDFUNCTION
BEGINFUNCTION Boot_36_Msg_Recvd()
/* The check below for $Level $80 is only needed if that sub function is supported by the ECU */
IF ( (($Level != $00) AND ($Level != $80)) OR
(message_data_length < (2+C_NumAddrBytes)) OR
(($Level = $00) AND (message_data_length < (3+C_NumAddrBytes ))) ) THEN
send Negative Response ($7F $36 $12) /* invalid format */
ELSE IF (TransferData_Allowed = NO) THEN
send Negative Response ($7F $36 $22)
ELSE IF(($startingAddress is invalid) OR ($startingAddress + (message_data_length - $02 -
C_NumAddrBytes) is invalid)) THEN
send Negative Response ($7F $36 $31) /* Request out of range */
ELSE
SELECT FIRST
WHEN ($Level = $DL)/* $00 Download */
IF (the node cannot process the request within P2C) THEN
send Negative Response ($7F $36 $78) /* RequestCorrectlyReceived-ResponsePending */
perform any necessary actions to the data block /*, i.e., program to flash memory etc.*/
ENDIF
IF (errors are detected) THEN
send the appropriate negative response ($7F $36 $22) or ($7F $36 $83) or ($7F $36 $85).
ELSE
send ($76) /* programming of block successfully completed */
ENDIF
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
/* The psuedo code from this point until the ENDSELECT statement is only needed if $level $80 is
supported by the ECU */
WHEN ($Level = $DLEXOE) /* $80 Download and Execute or just Execute */
IF (the node cannot process the request within P2C) THEN
send Negative Response ($7F $36 $78) /* RequestCorrectlyReceived-ResponsePending */
ENDIF
/* Execute the code (typically a programming routine)at the downloaded address. */
CALL (function at $startingAddress)
IF (errors are detected) THEN
send the appropriate negative response ($7F $36 $83) or ($7F $36 $85) or ($7F $36 $89)
ELSE
send ($76) /* download complete */
ENDIF
ENDSELECT
ENDIF
ENDFUNCTION
8.13.7 Node Verification Procedure.
Procedure 1: (Enable Programming Session).
1. Perform the steps necessary to activate ProgrammingMode (reference service $A5 for proper procedure).
Begin sending periodic TesterPresent ($3E) messages to satisfy the P3 C timing requirements. Perform the
necessary steps to unlock ECU security (reference service $27) if applicable. Next, send a valid mode $34
message and verify the positive response.
Procedure 2:
1. Perform Procedure 1 and then send a block of data using mode 36 and verify the $76 positive response.
2. If it takes more than P2C ms to write the block of data sent in step 1 of this procedure, verify that the node
sends a $7F $36 $78 within the P2C ms required time, followed by a $76 positive response.
3. Repeat step 1 (and 2) as necessary to transfer all data necessary to complete the download of the module
or programming of the node and verify the $76 positive response after each subsequent block transfer and
the final mode $36 message.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
4. If it takes more than P2C ms to write any data block, the node shall send a $7F $36 $78 within the P2 C ms
required time after each transfer of a block of data, followed by a $76 response when the node has
completed writing the block of data.
Procedure 3:
1. Perform Procedure 1 and then send a mode $36 with an invalid $Level value; verify the $7F $36 $12
response.
2. Perform Procedure 1 and then send a mode $36 request with ONLY the $Level data byte (starting address
bytes missing), verify the node responds with $7F $36 $12.
3. Perform Procedure 1 and then send a mode $36 request with $Level $00, a valid starting address and no
additional data. Verify the node responds with $7F $36 $12.
4. Perform Procedure 1 and then send a mode $36 request $Level $00 with valid data and an invalid starting
address, verify the node responds with $7F $36 $31.
5. Perform Procedure 1 and then send a mode $36 request with $Level $00, a valid starting address, and a
data block size that results in an invalid address. Verify that the node responds with $7F $36 $31.
6. Perform Procedure 1 without sending the valid mode $34 request. Then send a valid mode $36 and verify
the $7F $36 $22 response.
7. Create a condition that will cause the programming algorithm to detect an error (e.g., put incorrect
checksum or CRC in a calibration file if the programming algorithm includes a module based checksum or
CRC verification) and verify the $7F $36 $85 response.
8. Prior to programming, increase/reduce the voltage level to a value where the device is not capable of
being programmed. Verify that the node sends back a $7F $36 $83 negative response to a request for this
service.
Procedure 4: Optional. These additional steps should be performed if $Level $80 is implemented.
1. Perform Procedure 1 and then send a mode $36 request with ONLY the $Level data byte (starting address
bytes missing), verify the node responds with $7F $36 $12.
2. Perform Procedure 1 and then send a mode $36 request with $Level $80 and an invalid starting address,
verify the node responds with $7F $36 $31.
3. Perform Procedure 1 and then send a mode $36 request with $Level $80, a valid starting address, and a
data block size that results in an invalid address. Verify that the node responds with $7F $36 $31.
Procedure 5: Optional. To be verified if the node requires a specific order in which software/calibration files
are downloaded.
1. Obtain an archive file or a utility file which will cause the software/calibration parts to be downloaded in an
order that is unacceptable to the boot software programming executive. Attempt to program the node using
a programming tool (e.g., DPS Tool or SPS Tool created by Service Operations). Verify that the
programming event fails as a result of a $7F $36 $22 response at the appropriate time.
Procedure 6: Optional - to be performed if the ECU supports negative response code $89
(DEVICE_TYPE_ERROR).
1. Obtain ECUs with each possible type of permanent memory device. Perform Procedure number 1 and
then download one of the allowed programming algorithms. Verify that the negative response $7F $36 $89
is sent if the algorithm downloaded was not the correct one for that permanent memory device. Verify that
the positive response is sent if the correct algorithm was downloaded.
2. Repeat step 1 of this procedure for each possible combination of programming algorithm and permanent
memory device.
Procedure 7: Optional. To be verified if the node requires data file compatibility checks.
1. Obtain an archive file that contains data files that are not compatible (either operational software not
compatible with the boot software or a calibration file that is not compatible with the operational software).
Attempt to program the node using a programming tool (e.g., DPS Tool or SPS Tool created by Service
Operations). Verify that the programming event fails as a result of a $7F $36 $85 response at the
appropriate time.
8.13.8 Tester Implications. This service should only be physically addressed (point to point). The size of the
startingAddress parameter is determined via information in the utility file.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.14 WriteDataByIdentifier ($3B) Service. The purpose of this service is to provide the ability to change
(write/program) the content of pre-defined ECU data referenced by a dataIdentifier (DID) which contains static
information like ECU identification data, or other information which does not require real-time updates.
8.14.1 Service Description. The tester is required to provide the dataIdentifier value desired, while the target
ECU shall be responsible for knowing the address location and block length corresponding to the requested
dataIdentifier. An ECU is not required to support all corporate standard DIDs, and may support additional
application specific DIDs. Application specific DIDs supported by this service shall be documented in the
ECU’s CTS or supplemental diagnostic specification referenced in the CTS.
Note: Appendix C of this specification contains a list of corporate standard DIDs.
It shall be possible for Nodes to restrict the tester’s ability to write certain dataIdentifiers based on the security
status of the node.
8.14.2 Request Message Definition. The length of the request message is dependant upon the size of the
data referenced by the dataIdentifier parameter. Only one dataIdentifier which is supported by the ECU shall
be included in the request message. See Table 146.
dataRecord[] = [ DREC_
#3 data#1 M xx DTA_1
: : : : :
#n data#m ] U xx DTA_m
8.14.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. There are no sub-function
parameters used by this service.
8.14.2.2 Request Message Data Parameter Definition. Table 147 specifies the data parameter definitions for
this service.
8.14.3.1 Positive Response Message Data Parameter Definition. Table 149 specifies the data parameter
definitions for this service.
8.14.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. See Table 150.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table 152: Node Interface Data Dictionary of WriteDataByIdentifier Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
Security_Access_Unlocked Pseudo Code Data
Dictionary For Definition Of
Security_Access_Allowed
These Flags/Variables
ENDIF
ENDFUNCTION
8.14.7 Node Verification Procedure.
Procedure 1:
1. Send a $3B message for each $dataIdentifier supported including good data and verify positive response
message (test data formatting).
Procedure 2:
1. Send a $3B message with an invalid $dataIdentifier parameter and verify the negative response ($7F $3B
$31 - RequestOutOfRange).
2. Send a $3B message with no data included after the Service Identifier and verify the negative response
($7F $3B $12 - InvalidFormat).
3. Send a $3B message with a valid dataIdentifier and an invalid number of data bytes after the dataIdentifier
and verify the negative response ($7F $3B $12 - InvalidFormat).
4. Repeat step 3 for each dataIdentifier supported.
Procedure 3: (If ECU implements this RC_).
1. Send a $3B message with a valid dataIdentifier and associated data bytes at a time when ECU internal
conditions would not allow the data to be written (e.g., EEPROM failure) and verify that the ECU sends the
correct negative response ($7F $3B $22 - ConditionsNotCorrect).
Procedure 4: (If ECU supports secure DIDs).
1. Send a $3B message with a secured dataIdentifier and associated data bytes after the data - parameter to
a secured ECU and verify the negative response ($7F $3B $31 - RequestOutOfRange).
2. Send a $3B message with a secured dataIdentifier and associated data bytes after the dataIdentifier when
the manufacturers enable counter > $00 or vulnerability flag = $FF and security has not been accessed
(SecurityAccess ($27) request has not been sent) and verify the negative response ($7F $3B $31 -
RequestOutOfRange).
3. Send a $3B message with a secured dataIdentifier and associated data bytes after the dataIdentifier when
the manufacturers enable counter > $00 or vulnerability flag = $FF and security has been accessed
(SecurityAccess ($27) request has been sent) and verify the positive response (to unlock an ECU see
SecurityAccess service).
4. Repeat steps 1 and 2 for each DID that requires security.
Procedure 5: (If ECU implements this RC_).
1. Send a $3B message with a dataIdentifier and associated data bytes after the sub-parameter to the ECU
when the ECU needs more than P2C ms to write data bytes to memory and verify the negative response
($7F $3B $78 - RequestCorrectlyReceived-ResponsePending) within P2C ms and eventually a positive
response message.
Procedure 6: (If applicable).
1. If the ECU does any type of validity checks on the data being written, send a request with invalid data and
verify the $7F $3B $31 negative response.
Procedure 7: (Only applicable if ECU has DIDs that require the usage of a security code).
Note: Security code as defined in the Vehicle Theft Deterrent SSTS
1. Send a $3B message with a security code required dataIdentifier and associated data bytes after the
dataIdentifier to a secured ECU (security code has not been entered) and verify the negative response
($7F $3B $31 - RequestOutOfRange).
2. Send a $3B message with a security code required dataIdentifier and associated data bytes after the
dataIdentifier when the security code has been entered and verify the positive response.
3. Repeat steps 1 and 2 for each DID that requires the security code.
8.14.8 Tester Implications. This service should be used with physical addressing.
8.15 TesterPresent ($3E) Service. This service is used to indicate to a node (or nodes) that a tester is still
connected to the vehicle and that certain diagnostic services that have been previously activated are to remain
active. Some diagnostic services require that a tester send a request for this service periodically in order to
keep the functionality of the other service active. Documentation within this specification of each diagnostic
service indicates if a given service requires the periodic TesterPresent request to remain active.
8.15.1 Service Description. This service keeps other diagnostic services active by resetting the diagnostic
timer (TesterPresent_Timer) each time a request for this service is received. A portion of the ECU diagnostic
application executes in the background that modifies and tests the value of the timer (modification based on
the processing loop time). When the value of the TesterPresent_Timer meets or exceeds the value of the P3C
application timer, a TesterPresent or P3C timeout occurs.
Note: See the paragraphs within this specification on application timing requirements for more information on
P3C.
When a P3C timeout occurs, the node shall execute the same logic that would be executed if a
ReturnToNormalMode ($20) service request was received. This includes the transmission of a
ReturnToNormalMode positive response message. (See note below) Nodes are required to time out no sooner
than P3C and no later than P3Cmax.
Note: The unsolicited service $20 positive response is only sent if programming mode was not active prior to
the TesterPresent timeout. See service $A5 for more information on programming mode.
There shall only be a response to a request for this service if the request is physically addressed.
Note: Receiving a TesterPresent request message shall not put a node into a diagnostic mode (i.e., the
TesterPresent_Timer_State shall not be set to ACTIVE by this message; see pseudo code).
8.15.2 Request Message Definition (Table 153).
8.15.2.1 Request Message Sub-Function $Level Parameter Definition. There are no sub-function
parameters used by this service.
8.15.2.2 Request Message Data Parameter Definition. This service does not contain a data-parameter(s).
8.15.3 Positive Response Message Definition. (Table 154) The use of any response, either positive or
negative is dependant on how the request message was addressed. If the request message is addressed
functionally (to multiple nodes using the AllNodes $101 CANId) then there shall be no response, either positive
or negative. If the request message is addressed physically (using the nodes point to point diagnostic request
CANId) then there shall be a response, either positive or negative.
8.15.3.1 Positive Response Message Data Parameter Definition. There are no data parameters used by
this service in the positive response message.
8.15.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. See Table 155.
The tester sends a TesterPresent request message to a functional system. See Table 157.
Network parameter:
Functional System Address (FSA): $FE = All nodes.
The nodes shall not send a positive response message.
Table 158: Node Interface Data Dictionary of TesterPresent Service Pseudo Code
Variable/Meaning Values
message_address_type Reference Common/Global
message_data_length Pseudo Code Data Dictionary
For Definition Of These
TesterPresent_Timer_State
Flags/Variables
diagnostic_responses_enabled
TesterPresent_Timer
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Procedure 2:
1. Send a service request message which requires a TesterPresent service to remain active (excluding
service $A5).
2. Send functionally addressed TesterPresent ($3E) request messages with an invalid message length (not
equal to 1) and verify that no negative response message is sent by the node (ECU).
3. Verify that the node (ECU) sends a ReturnToNormalMode positive response message between P3 C and
P3Cmax.
Procedure 3: (Uses Functional TesterPresent message).
1. Send a service request message to the node using a service that requires a TesterPresent to keep its
functionality active (e.g., schedule periodic DPID via $AA service or use DeviceControl $AE service). Pick
a service where it can be easily verified that the functionality remains active if TesterPresent messages are
sent.
2. Wait 2 s.
3. Send a valid functionally addressed TesterPresent ($3E) request message using the AllNodes CANId
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.16.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. There are no sub-function
parameters in a request for this service.
8.16.2.2 Request Message Data Parameter Definition. There are no data parameters in a request for this
service.
8.16.3 Positive Response Message Definition (Table 160).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.16.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. The circumstances under which each response code would occur are
documented in Table 162.
Table 164: Node Interface Data Dictionary of ReportProgrammedState Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
message_address_type Pseudo Code Data
Dictionary For Definition Of
normal_message_transmission_status
These Flags/Variables
diagnostic_responses_enabled
programmedState See Response Message
This is a variable which is used to indicate whether or not a programmable ECU Definitions Section
is fully programmed, or if any memory errors exist.
Service_Id $00 thru $FF
This is a variable used in the pseudo code of the diagnostic application function
which is used to represent the diagnostic service which is being requested (first
data byte after the network layer information for diagnostic request messages).
The following pseudo code is correct for service $A2 provided that the portion of the diagnostic application
program interface (API) which handles processing diagnostic received messages is functionally equivalent to
the diagnostic API pseudo code below:
BEGINFUNCTION Serv_A2_Msg_Recvd()
IF (message_data_length != 1) THEN
IF (diagnostic_responses_enabled = YES) THEN
Reject the request with a ($7F $A2 $12) for invalid format
ENDIF
ELSE
diagnostic_responses_enabled YES
/* in larger ECUs, it may be possible for a tester to request this service
after an ECU powers up but before the ECU completes the programmedState
calculation. If this occurs, an ECU can send the $7F $78 response and then
send the positive response after the calculation is complete */
© Copyright 2010 General Motors All Rights Reserved
The following pseudo code is the portion of the diagnostic API which handles the processing of diagnostic
received messages. The pseudo code assumes that a node has implemented all of the diagnostic services
documented within this specification.
BEGINFUNCTION Diag_API_Process_Recv_Msg()
IF (diagnostic_responses_enabled = NO)
IF ((normal_message_transmission_status = DISABLED) AND
($Service_Id = $A2) THEN
CALL Serv_A2_Msg_Recvd()
ENDIF
IF ($Service_Id = $28) THEN
CALL Serv_28_Msg_Recvd()
ELSEIF ($Service_Id = $3E) THEN
CALL Serv_3E_Msg_Recvd()
ENDIF
ELSE
SELECT FIRST
WHEN ($Service_Id = $04)
CALL Serv_04_Msg_Recvd()
WHEN ($Service_Id = $10)
CALL Serv_10_Msg_Recvd()
WHEN ($Service_Id = $12)
CALL Serv_12_Msg_Recvd()
WHEN ($Service_Id = $1A)
CALL Serv_1A_Msg_Recvd()
WHEN ($Service_Id = $20)
CALL Serv_20_Msg_Recvd()
WHEN ($Service_Id = $22)
CALL Serv_22_Msg_Recvd()
WHEN ($Service_Id = $23)
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
CALL Serv_23_Msg_Recvd()
WHEN ($Service_Id = $27)
CALL Serv_27_Msg_Recvd()
WHEN ($Service_Id = $28)
CALL Serv_28_Msg_Recvd()
WHEN ($Service_Id = $2C)
CALL Serv_2C_Msg_Recvd()
WHEN ($Service_Id = $2D)
CALL Serv_2D_Msg_Recvd()
WHEN ($Service_Id = $34)
CALL Serv_34_Msg_Recvd()
WHEN ($Service_Id = $36)
CALL Serv_36_Msg_Recvd()
WHEN ($Service_Id = $3B)
CALL Serv_3B_Msg_Recvd()
WHEN ($Service_Id = $3E)
CALL Serv_3E_Msg_Recvd()
WHEN ($Service_Id = $A2)
CALL Serv_A2_Msg_Recvd()
WHEN ($Service_Id = $A5)
CALL Serv_A5_Msg_Recvd()
WHEN ($Service_Id = $A9)
CALL Serv_A9_Msg_Recvd()
WHEN ($Service_Id = $AA)
CALL Serv_AA_Msg_Recvd()
WHEN ($Service_Id = $AE)
CALL Serv_AE_Msg_Recvd()
OTHERWISE
IF (message_address_type = PHYSICAL) THEN
Send Negative Response ($7F $Service_Id $11)
ENDIF
ENDSELECT
ENDIF
ENDFUNCTION
8.16.7 Node Verification Procedure.
Procedure 1: (For Devices which have stored their permanent diagnostic CAN Identifiers.)
1. Send a ReportProgrammedState request with invalid additional data bytes and verify the proper negative
response reject message is sent ($7F $A2 $12).
2. Send a ReportProgrammedState request at a time when the device cannot process this request within P2C
(programmedState calculation not done) and verify the proper negative response (This is only required for
devices which support such a situation.) followed by the proper positive response within P2C*.
Procedure 2: (For Devices which have stored their permanent diagnostic CAN Identifiers.)
1. Send a request for this service to the ECU when it is fully programmed and verify the proper response.
2. Send a request for this service to the ECU when it only has boot software present and verify the proper
response.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
3. Send a request for this service to the ECU when it has boot software and operational software present
(no calibration data) and verify the proper response.
4. Obtain a controller with default calibrations programmed in (only applicable if the ECU supports $A2
response $03). Send a request for this service and verify that the ECU sends the $E2 $03 response.
5. Create situations for each of the memory failure response codes that the ECU supports and verify the
proper response.
Procedure 3: (For SPS_TYPE_C ECUs when operating out of boot software.)
1. Send a request for each diagnostic service supported in the ECU (except services $28 and $A2) and
verify that no response is sent.
2. Send an all nodes request for service $28 and verify no response. Wait for a positive response from all
ECUs (that have stored permanent diagnostic CAN Identifiers) and then send a request for $A2 service.
Verify that a positive response is sent using the ECU’s SPS_PrimeRsp CANId ($3xx).
3. Repeat step 2 for each valid positive response value (programmedState) supported by the ECU when
running out of boot, and verify the proper positive responses for each case.
4. Send an all nodes request for service $28 and then repeat step 2 of Procedure 1 (if applicable).
5. Repeat step 2 of this procedure. Send TesterPresent $3E messages at least once every P3C ms while
requesting the other supported diagnostic services with the SPS_PrimeReq CANId ($0xx). Verify that the
ECU continues to respond properly using the SPS_PrimeRsp CANId ($3xx). Stop sending TesterPresent
($3E) messages and wait P3Cmax ms. Verify that the ECU no longer responds to diagnostic requests.
8.16.8 Tester Implications. For SPS_TYPE_C ECUs, the tester must first send a mode $28
(DisableNormalCommunication) request to all nodes, AND verify all normal communication has ceased before
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
sending the mode $A2 request. Sending the mode $28 to all nodes first ensures that there will be no conflicts
with normal message CAN Identifiers and any of the SPS_PrimeRsp response CAN Identifiers.
The tester must send TesterPresent ($3E) messages at an interval less than P3 C to keep an SPS_TYPE_C
ECU actively responding to diagnostic service request messages.
8.17 ProgrammingMode ($A5) Service. This service provides for the following levels of operation:
Verifies that all criteria are met to enable the programming services for all receiving nodes.
Enables the high speed mode of operation (83.33 kbps) for all receiving nodes on the Single Wire CAN
(SWCAN) bus (if high speed programming was requested by the tool).
Enables programming services for all receiving nodes.
This service shall only be available if normal communications have already been disabled (via service $28).
8.17.1 Service Description. There are two steps required to enter a programming event. The first step
(initiating the programming event) is to verify that it is possible for all nodes to begin a programming event.
This step includes indicating to the nodes the baud rate that will be used during the programming event. The
second step is to actually enable the programming event. During this step, the tester and the nodes shall
initialize their CAN protocol converter hardware to the correct baud rate for the duration of the programming
event. Once programming mode has been enabled, the tester must send a TesterPresent (mode $3E)
message to all nodes (and any sub-nets as required by the programming event) at least once every P3 C ms to
keep this mode active.
There are two possible options when initiating a programming event. The first is to request programming in
normal speed (sub-parameter $Level = $01 requestProgrammingMode), and the second is to request
programming in high speed mode (sub-parameter $Level = $02 requestProgrammingMode_HighSpeed). High
speed programming mode is only available on the low speed link (SWCAN). Programming at normal speed
shall be supported on any of the links. A request for this service with the sub-parameter value set to
requestProgrammingMode ($01), or requestProgrammingMode_HighSpeed ($02), is used to verify that
conditions are correct for a programming event to occur. A node can reject a request to initiate a programming
event (sub-parameter = $01 or $02) if specific enabling criteria are not met (e.g., The engine control module
should reject a request to initiate a programming event if the engine were running. The ABS module should
reject a request to initiate a programming event if it detected that the vehicle was moving). The tester must
ensure that a positive response is received from all nodes before actually enabling the programming event.
Each node shall respond to a request to initiate a programming event. However, the node shall not actually
enter programming mode until it receives a request from the tester to enable programming mode (sub-
parameter $Level = $03 enableProgrammingMode). There is no positive response message sent by the nodes
in response to an enableProgrammingMode request.
If the message to initiate a programming event was sent requesting high speed programming mode, then the
request to enable the programming event shall cause all devices (including the tester) on the SWCAN link to
switch to the high speed data rate within 30 ms. The test device shall wait at least 50 ms after the request has
been transmitted before sending any messages at high speed. This provides time for nodes on the low speed
link to switch to high speed and avoid error conditions caused by nodes transmitting at different baud rates
simultaneously. Once the 50 ms wait time is expired, the test device will be able to program a node (or nodes)
at high speed.
Note: All ECUs (including the tester) shall initialize their protocol converter hardware within 30 ms from the
time that the request message has been successfully transmitted on the bus. This means that any node which
uses a polling loop to service the protocol device shall ensure that the polling loop is fast enough to process
the request message and initialize the protocol converter hardware within 30 ms.
The tester can end a programming event by sending a ReturntoNormalMode ($20) request message, or by
allowing a P3C timeout to occur. At the end of the programming event, each node shall transition out of high
speed mode (if high speed mode was active) and all devices shall perform a software reset. The software reset
allows a node which was just programmed to begin executing the new software/calibrations downloaded, and
is also used to synchronize communications among the nodes on the subnet.
Note: When programming mode is active, there shall be no response to the mode $20 request. This minimizes
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
possible link errors from devices switching out of high speed mode. See the description of the
ReturnToNormalMode ($20) service for tester timing requirements when exiting high speed mode.
Although devices are not required to be programmable, all nodes must be tolerant of programming mode. This
means a node shall not reject a request to initiate a programming event just because that particular node is not
programmable. A negative response shall only be sent if a node detects specific vehicle operating criteria
which must prevent the programming event from taking place. The reasons why a specific node refuses or is
unable to enter Programming mode shall be documented in the device CTS.
Note: Since current draw during a programming event may drain a battery, nodes should failsoft to a state
which draws only necessary current.
8.17.2 Request Message Definition (Table 165).
8.17.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. The sub-parameters for this
service are indicated in Table 166.
Where:
M1 = This level is mandatory for all ECUs on the SWCAN link and not applicable to the DWCAN links.
8.17.2.2 Request Message Data Parameter Definition. There are no data parameters in a request for this
service.
8.17.3 Positive Response Message Definition (Table 167).
8.17.3.1 Positive Response Message Data Parameter Definition. There are no data parameters in a
response to a request for this service.
8.17.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. See Table 168.
No Response Allowed.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table 171: Node Interface Data Dictionary of ProgrammingMode Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
programming_mode_active Pseudo Code Data
Dictionary For Definition Of
normal_message_transmission_status
These Flags/Variables
high_speed_mode_active
programming_mode_entry_OK
high_speed_mode_entry_OK
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
/* This level shall be supported by all ECUs on the low speed link */
/* This level shall not be supported by ECUs on the two wire links and
shall result in a negative response $7F $A5 $12 if sent */
/*check if high speed programming mode is ok and $28 service is active*/
/*$28 service disables setting DTCs and inhibits normal communication*/
IF ( (device cannot enter high speed programming mode)OR
(normal_message_transmission_status = ENABLED)) THEN
send Negative Response ($7F $A5 $22) /* Conditions Not Correct */
ELSE
IF (device temporarily cannot enter programming mode)
send Negative Response ($7F $A5 $78) /* RequestCorrectlyReceived-ResponsePending */
ENDIF
programming_mode_entry_OK YES
high_speed_mode_entry_OK YES
send Positive Response ($E5)
ENDIF
WHEN ($Level = LEV_EPM) /* ($03) Enable Programming */
/* verify that a previous request was sent with $Level = LEV_RQPM or */
/* $Level = LEV_RQPM_HS */
IF (programming_mode_entry_OK = NO) THEN
send Negative Response ($7F $A5 $22) /* ConditionsNotCorrect */
ELSE
IF (high_speed_mode_entry_OK = YES) THEN
CALL hnd_Invoke_High_Spd_Mode() /* handler function */
high_speed_mode_active YES
ENDIF
programming_mode_active YES
ENDIF
OTHERWISE
send Negative Response ($7F $A5 $12) /* Invalid Format */
IF ((programming_mode_entry_OK = YES) AND
(programming_mode_active = NO)) THEN
programming_mode_entry_OK NO
high_speed_mode_entry_OK NO
ENDIF
ENDSELECT
ENDIF
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
ENDFUNCTION
8.17.7 Node Verification Procedure.
8.17.7.1 General Verification Procedures (any node, any link).
Procedure 1: (Perform this procedure when conditions would allow a programming event).
1. Disable normal communication, send a requestProgrammingMode message ($A5 $01). Verify the positive
response ($E5) message.
2. Send an enableProgrammingMode request ($A5 $03). Verify no response is sent.
3. Wait at least 100ms (but less than P3C ms), send a request for a supported mode (e.g., Mode $34
RequestDownload). Verify the proper response.
4. Keep the device in enableProgrammingMode for at least 2 minutes by sending TesterPresent (mode $3E)
messages at an interval less than P3C ms. Verify that no normal communication messages are
transmitted.
5. Verify that the device communicates in Programming Mode by periodically sending valid request
messages.
6. If the device is programmable, verify that the device is capable of being programmed using a released
utility file and the correct interpreter software.
7. Repeat the first 4 steps of this procedure and then send a ReturnToNormalMode ($20) message. Verify
that the ECU performs a software reset.
8. Repeat the above procedure except end the programming event by allowing a P3 C (TesterPresent) timeout
to occur (instead of sending a mode $20 request). Verify that the ECU performs a software reset.
Procedure 2:
1. Disable normal communication then send a requestProgrammingMode message ($A5 $01) with extra data
bytes. Verify the negative response ($7F $A5 $12) message.
2. Disable normal communication then send a message with no sub-function parameter byte after the service
Id. Verify the negative response ($7F $A5 $12) message.
3. Disable normal communication then send a message with an invalid sub-function parameter byte after the
service Id. Verify the negative response ($7F $A5 $12) message.
4. Send requestProgrammingMode message ($A5 $01) without disabling normal communication. Verify the
negative response ($7F $A5 $22) message.
5. If applicable, create conditions under which the node should not allow a programming event to take place.
Then send a requestProgrammingMode message ($A5 $01). Verify the negative response ($7F $A5 $22)
message.
6. Send a request to enableProgrammingMode ($03) without having previously sent a
requestProgrammingMode ($01) request. Verify the negative response ($7F $A5 $22) message.
7. Disable normal communication, send a requestProgrammingMode message ($A5 $01). Verify the positive
response ($E5) message. Send a ReturnToNormalMode ($20) request message and verify the positive
response. Then send a request to enableProgrammingMode ($03) and verify the negative response ($7F
$A5 $22) message.
8. Disable normal communication, send a requestProgrammingMode message ($A5 $01). Verify the positive
response ($E5) message. Allow a P3C timeout to occur and then send a request to
enableProgrammingMode ($03) and verify the negative response ($7F $A5 $22) message.
9. Repeat steps 1 and 2 of Procedure 1 above. Then send a request for this service with a supported sub-
parameter. Verify the proper negative response (7F $A5 $22) and that there is no impact to the current
programming event. Repeat this procedure for each supported sub-parameter of this service.
10. Repeat steps 1 and 2 of Procedure 1 above. Then send a request for this service with an unsupported
sub-parameter. Verify the proper negative response (7F $A5 $22) and that there is no impact to the
current programming event.
Procedure 3: (If negative response code $78 is supported by the ECU.)
1. Disable normal communication and verify the positive response. Send TesterPresent requests as
necessary to keep normal communications disabled.
2. Create conditions under which the ECU should return the $7F $A5 $78 response to a request for this
service. Send a valid request for this service and verify the $7F $A5 $78 response followed by a final
response within the P2C* timing window.
3. Repeat steps 1 and 2 of this procedure for each possible reason an ECU would send the negative
response with response code $78. Verify this for each applicable supported sub-function parameter.
8.17.7 2 Additional Verification Procedures for Nodes on Mid-Speed or High Speed Busses.
Procedure 1:
1. Disable normal communication, send a requestProgrammingMode_HighSpeed message ($A5 $02), and
verify that the ECU sends a negative response ($7F $A5 $12).
8.17.7.3 Additional Verification Procedures for Switch To High Speed Programming Mode. (SWCAN
only)
Procedure 1: (Perform this procedure when conditions would allow a programming event.)
1. Disable normal communication, send a requestProgrammingMode_HighSpeed message ($A5 $02).
Verify the positive response ($E5) message.
2. Send an enableProgrammingMode request ($A5 $03). Verify no response is sent.
3. Wait at least 30ms (but less than 50 ms), then send a request for a supported mode (e.g., Mode $34
RequestDownload). Verify the proper high speed response.
4. Keep the device in enableProgrammingMode for at least 2 minutes by sending TesterPresent (mode $3E)
messages at an interval less than P3C ms. Verify that no normal communication messages are
transmitted.
5. Verify that the device communicates in high speed Programming Mode by periodically sending valid
request messages.
6. If the device is programmable, verify that the device is capable of being programmed using a released
utility file for high speed programming and the correct interpreter software.
7. Repeat steps 1 thru 4 of this procedure and then send a ReturnToNormalMode ($20) message. Verify
that the ECU switches the protocol converter back to low speed operation and then performs a software
reset. Wait 1 s and then send a request for a supported diagnostic service at low speed. Verify the proper
response.
8. Repeat the above procedure except end the programming event by allowing a P3C (TesterPresent)
timeout to occur (instead of sending a mode $20 request). Verify that the ECU switches the protocol
converter back to low speed operation and performs a software reset. Wait 1 s and then send a request
for a supported diagnostic service at low speed. Verify the proper response.
Procedure 2:
1. Disable normal communication then send a requestProgrammingMode_HighSpeed message ($A5 $02)
with extra data bytes. Verify the negative response ($7F $A5 $12) message.
2. Send a requestProgrammingMode_HighSpeed message ($A5 $02) without disabling normal
communication. Verify the negative response ($7F $A5 $22) message.
3. If applicable, create conditions under which the node should not allow a programming event to take place
in high speed mode. Then send a requestProgrammingMode_HighSpeed message ($A5 $02). Verify the
negative response ($7F $A5 $22) message.
4. Disable normal communication, send a requestProgrammingMode_HighSpeed message ($A5 $02). Verify
the positive response ($E5) message. Send a ReturnToNormalMode ($20) request message and verify
the positive response. Then send a request to enableProgrammingMode ($03) and verify the negative
response ($7F $A5 $22) message.
5. Disable normal communication, send a requestProgrammingMode_HighSpeed message ($A5 $02). Verify
the positive response ($E5) message. Allow a P3C timeout to occur and then send a request to
enableProgrammingMode ($03) and verify the negative response ($7F $A5 $22) message.
6. Repeat steps 1 and 2 of Procedure 1 above (for high speed devices). Then send a request for this service
with a supported sub-parameter. Verify the proper negative response (7F $A5 $22) and that there is no
impact to the current programming event. Repeat this procedure for each supported sub-parameter of this
service. In addition, verify that the device remains in high speed operation.
Procedure 3:
1. Disable normal communication, then send a requestProgrammingMode_HighSpeed message ($A5 $02).
After receiving responses from all ECUs, send a requestProgrammingMode message ($A5 $01) when
conditions are correct to begin a low speed programming event. Verify positive responses from all ECUs to
the requestProgrammingMode request. Next send an enableProgrammingMode ($A5 $03) request. Verify
no responses are sent to the enableProgrammingMode request and then verify that the ECU stayed in low
speed operation by requesting an additional diagnostic service.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.17.8 Tester implications. The tester should only request this service with the ALL NODES request CANId
($101) and the ALL NODES extended address ($FE).
The tester should not enable a programming event if it has received a negative response (from any node) to
the initiate programming request is sent.
After enabling a programming event (sending a requestProgrammingMode_HighSpeed request followed by an
enableProgrammingMode message), the tester must not transmit any messages for 50 ms. The test device
must also initialize its protocol converter hardware to high speed operation within 30 ms from the time that the
enableProgrammingMode request message was successfully transmitted on the data link.
TesterPresent (Mode $3E) messages must be sent to all nodes at least once every P3 C ms to keep the
programming mode active, otherwise the nodes shall return to normal operation (same as receiving a
ReturntoNormalMode $20 request or a P3C timeout).
The tester must be capable of returning the bus to normal speed mode by issuing a mode $20
ReturntoNormalMode message. After sending a mode $20 request (when the link is in high speed mode), the
tester should wait 1 s before transmitting any messages to allow devices to reset and to prevent possible bus
error or bus off conditions from occurring.
8.18 ReadDiagnosticInformation ($A9) Service. This service allows a tester to read the status of
node-resident Diagnostic Trouble Code (DTC) information from any controller, or group of controllers within a
vehicle. This service allows the tester to do the following:
1. Retrieve the status of a specific DTC and FaultType combination.
2. Retrieve the list of DTCs that match a tester defined DTC status mask.
3. Enable a node resident algorithm which periodically calculates the number of DTCs that match a tester
defined DTC status mask. The ECU shall send a response message each time the calculation yields a
different result than the one calculated the previous time.
8.18.1 Service Description. This service uses a sub-parameter to determine which type of DTC information is
being requested by the tester. The message number in the UUDT response message shall be the same as the
sub-parameter byte in the request message. UUDT message numbers ranging from $80 thru $8F have been
reserved for UUDT diagnostic responses for this service and shall not be used for UUDT responses to the $AA
service. ECU timing requirements for transmitting the UUDT responses are defined in the description sections
below.
Note: An ECU will not transmit a USDT-SF message to positively acknowledge a tester’s service $A9 request.
However, if conditions necessitate, a $7F negative response message (USDT-SF) may be sent in response to
the tester’s request (see supported negative responses within this service description for more details).
It shall be possible for a tester to send a request to retrieve the status of a single DTC and Failure type
combination, or send a request to determine which DTCs match a tester defined status mask, while the node
resident send on change DTC count algorithm is running. However, to ease the burden on an ECU, a node
may temporarily suspend the DTC count algorithm while processing a request of the other types.
8.18.1.1 Retrieving the Status of a DTC and Failure Type Combination. A tester can retrieve the status of a
specific DTC and DTCFailureTypeByte (symptom) combination by sending a request for this service with the
sub-parameter set to readStatusOfDTCByDTCNumber ($80). The response to this request is a UUDT
message (message number = $80) containing the two byte DTC Number, the one byte DTCFailureTypeByte,
and the one byte DTCStatusByte. The definitions of the DTCFailureTypeByte and the DTCStatusByte can be
found in Appendix E.
If the ECU diagnostic application determines that the tester request is NOT acceptable (e.g., incorrect format),
the ECU shall return an appropriate USDT-SF negative response within the P2C time window followed by NO
($80) UUDT message.
8.18.1.2 Retrieving the List Of DTCs That Match A Tester Defined Status Mask. The tester can retrieve a
list of DTC numbers and DTCFailureTypes which satisfy a tester defined status mask by sending a request
with the sub-parameter byte set to readStatusOfDTCByStatusMask ($81). Nodes shall be able to mask on
more than one bit of the status byte field at a time via a logical OR-ing operation, making it possible for the
tester to request a node to transmit all DTCs that are current OR history OR , etc., with a single request. If a
tester specifies a status mask that contains bits that the node does not support, then the node shall process
the DTC information using only the bits that it does support. In response to the tester’s request, the ECU shall
return a UUDT message to the tester for each DTC and DTCFailureTypeByte combination that satisfies the
masking criteria specified by the tester (refer to diagram below for response timing). The UUDT response
message(s) shall contain the 2-byte DTC number, the one byte DTCFailureTypeByte, and the one byte
DTCStatusByte. Once all DTCs satisfying the tester-specified masking criteria have been transmitted, the ECU
shall transmit a special endOfDTCReport UUDT message to flag the end of the transmission. Refer to the
corresponding response message definition table below for formatting details regarding the endOfDTCReport
message. If no DTC/DTCFailureTypeByte combinations match the masking criteria, then the ECU shall only
transmit the endOfDTCReport message in response to the tester’s request.
The ECU diagnostic application shall transmit the first UUDT response (or USDT-SF negative response) within
P2C of receiving the tester request. Once the first UUDT response has been sent, each subsequent UUDT
response message(s) shall be transmitted within P2C from the previously transmitted ($81) UUDT response
message.
Note: The P2C timing is the maximum interval that an ECU should send the UUDT responses. It is acceptable
to send them at a rate faster than P2C.
If the ECU diagnostic application determines that the tester request message is acceptable, but cannot
transmit the first UUDT response message within the P2C time window, it shall transmit a $7F $A9 $78
RequestCorrectlyReceived-ResponsePending to the tester to invoke enhanced timing P2 C*. Once the ECU is
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
able to transmit the first ($81) UUDT response message (within the P2 C* time window), each subsequent
UUDT response message(s) shall be transmitted within P2 C.
If the ECU diagnostic application determines that the tester request is NOT acceptable (i.e., formatted
incorrectly), the ECU shall return an appropriate USDT-SF negative response within the P2C time window
followed by NO ($81) UUDT message(s).
See Figure 33 for a graphical representation of the ECU UUDT timing requirements for this service.
P2CE
0 100
P2CE
0 100
UUDT timing
P2CE
0 100
P2CE
0 100
general
P2CE timing
ECU NWL ind req con req con req con req con
Tester NWL req con ind ind ind ind
Figure 33: ECU UUDT Timing Parameter Definition for service $A9, $Level $81
8.18.1.3 Enabling the Node Resident DTC Count Algorithm. The tester can enable a node-resident DTC
count algorithm by requesting the $A9 service with the sub-parameter set to sendOnChangeDTCCount ($82).
If the requested mask value is not $00, the node shall enable a background algorithm that scans through the
list of supported DTCs to count the total number of DTCs that match the masking criteria. As soon as the
computation is complete, the node shall return a UUDT message back to the tester containing the 2-byte count
value. Thereafter, the node resident DTC count algorithm shall count the number of DTCs satisfying the tester
defined mask at a periodic rate of approximately 1 s (exact value to be documented in the component technical
specification). If the count is different from that which was calculated on the previous execution, the node shall
transmit a single UUDT message back to the tester with the updated 2-byte DTC count. The latest count shall
then be stored as a reference for the next calculation. Masking shall consist of a logical OR-ing operation and
shall only be performed on the status byte associated with each DTC/FailureType combination (unsupported
status bits are ignored).
Note: If the algorithm which calculates the number of DTCs cannot complete within the P2C timing window, the
ECU shall respond with a $7F $A9 $78 RequestCorrectlyReceived-ResponsePending negative response to
institute P2C* timing for the pending UUDT positive response message. The ECU shall always send at least
one positive ($82) UUDT response message to the tester’s request. Subsequent ($82) UUDT responses will
only be returned if and when the background algorithm results in a different count.
A node shall support only one sendOnChangeDTCCount transmission arrangement at a time. Redefinition of
the sendOnChangeDTCCount status mask shall occur by sending another sendOnChangeDTCCount request
message with a different status mask. A UUDT message with a DTC count of $00 00 shall be returned in
response to a request in which the status mask = $00, and the receiving ECU shall halt all background
sendOnChangeDTCCount computations.
Once a sendOnChangeDTCCount request message has been sent, the tester must periodically transmit
TesterPresent ($3E) messages to keep this level of the service active within the node. If a P3C (TesterPresent)
timeout occurs, the node shall deactivate sendOnChangeDTCCount reporting. The node shall also deactivate
this level if the tester transmits a ReturnToNormalMode ($20) service request, or the node is powered down. In
each of the three cases described, the node is NOT required to transmit any $A9 specific response message
to inform the tester that the send-on-change algorithm has been deactivated.
If a code clear request is received while this level is active, the send-on-change DTC count checking shall
remain active. To lessen the burden on the ECU, the send-on-change DTC count algorithm may be temporarily
© Copyright 2010 General Motors All Rights Reserved
disabled while a DTC clear request is being processed. The algorithm shall be re-enabled after the DTC clear
event has completed. The DTC clear does not modify the count value calculated on the previous execution of
the algorithm so there is a good chance that a response message will be sent with the new count after the
DTC clear has completed.
8.18.2 Request Message Definition.
8.18.2.1 Request Message Definition - $Level $80 (readStatusOfDTCByDTCNumber) (Table 172).
8.18.2.4 Request Message Sub-Function Parameter $Level (LEV_) Definition. The following definitions
apply to the sub-function levels of operation for service $A9 ReadDiagnosticInformation. All other sub-function
values are reserved for future definition within this specification. Future enhancements to this service, which
require UUDT responses, shall have sub-function parameter levels within the range from $80 thru $8F as this
range of UUDT responses are reserved for this service. See Table 175.
8.18.2.5 Request Message Data Parameter Definition. Table 176 specifies the data parameter definitions for
this service.
Note: There are no subsequent UUDT responses associated with $Level $80 of mode $A9.
8.18.3.2 Positive Response Message Definition - $Level $81 (readStatusOfDTCByStatusMask). The
following UUDT response to the $A9 $Level $81 request is sent for each DTC that satisfies the tester defined
masking criteria. See Table 178.
The following UUDT endOfDTCReport message shall be sent after all ($81) UUDT messages containing DTC
information have been returned to the tester. If no ($81) UUDT messages containing DTC information are sent
(because the ECU determined that no DTCs matched the tester-specified masking criteria), the
endOfDTCReport message shall still be sent.
8.18.3.3 Positive Response Message Definition - $Level $81 (readStatusOfDTCByStatusMask -
endOfDTCReport) (Table 179).
8.18.3.4 Positive Response Msg. Definition - $Level $82 (sendOnChangeDTCCount). The following UUDT
message shall be sent in response to the tester’s $A9 $Level $82 request. It shall also be sent whenever the
count of the number of DTCs satisfying the tester defined mask changes during background execution of the
send-on-change DTC count algorithm. See Table 180.
8.18.3.5 Positive Response Message Data Parameter Definition. Table 181 specifies the response
message data parameter definitions for this service.
8.18.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. The circumstances under which each response code would occur are
documented in Table 182.
8.18.5 Message Flow Examples - ReadDiagnosticInformation. The examples below illustrate the operation
of each sub-function parameter of service $A9 ReadDiagnosticInformation. The following is assumed for all of
the examples:
CAN Identifiers for the ECM (node #1) are $241 (USDT Req) and $541 (UUDT Resp).
CAN Identifiers for the TCM (node #2) are $243 (USDT Req) and $543 (UUDT Resp).
The ECM and TCM are the only ECUs connected to the theoretical GMLAN sub-network over which the
following messaging examples are conducted.
8.18.5.1 Example #1 - Read Status of DTC by DTC Number. This example (Table 183) demonstrates how a
tester can request a node to report the status of DTC P0700 ($0700) FailureType $02. The request with $Level
= $80 is followed by a positive ($80) UUDT response message including the DTCH, DTCL, DTCFT, DTCSB.
Table 183: Example of Physical Request for ReadDiagnosticInformation With Sub-Parameter = $80
T = Frame Sent By Tester, N = Frame Sent By Node, shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $05 $A9 $80 $07 $00 $02 --- ---
N1(UUDT) $541 $80 $07 $00 $02 $63 --- --- ---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table 184 is the same as Table 183 example except DTCFailureTypeByte = $00 and the request is
functionally addressed with extended address = $FE (all functional systems). It is assumed for the purpose of
this example that both ECUs support P0700 DTC with FailureType $00.
Table 184: Example of Functional Request for ReadDiagnosticInformation with Sub-Parameter = $80
T = Frame Sent By Tester, N = Frame Sent By Node, shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $101 $FE $05 $A9 $80 $07 $00 $00 ---
N1(UUDT) $541 $80 $07 $00 $00 $63 --- --- ---
N2(UUDT) $543 $80 $07 $00 $00 $63 --- --- ---
8.18.5.2 Example #2 - Functional Read Status of DTC by Status Mask. In this example (Table 185), the
tester requests all ECUs to report all DTCs that have a current or history status (status mask = $12). The
request with $Level = $81 is followed by a single UUDT message from each ECU for each DTC that matches
the masking criteria. Once all DTC information has been sent, each ECU will transmit an endOfDTCReport
message to flag the completion of the transfer to the tester.
Assume the TCM has no DTCs matching the masking criteria. As a result, only the endOfDTCReport
message is sent.
Assume the ECM has two DTCs matching the masking criteria: P0100 (DTCFailureTypeByte $00) and
P1864 (DTCFailureTypeByte $00).
Table 185: Example of Functional Request For ReadDiagnosticInformation with Sub-Parameter = $81
T = Frame Sent By Tester, N = Frame Sent By Node, shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $101 $FE $03 $A9 $81 $12 --- --- ---
N1(UUDT) $541 $81 $01 $00 $00 $39 --- --- ---
N2(UUDT) $543 $81 $00 $00 $00 $FF --- --- ---
N1(UUDT) $541 $81 $18 $64 $00 $07 --- --- ---
N1(UUDT) $541 $81 $00 $00 $00 $FF --- --- ---
Note: Tester should wait for all ECU(s) to return the endOfDTCReport message before transmitting another
$A9 $Level $81 request message.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.18.5.3 Example #3 - Send on Change Reporting of DTC Information. This messaging example
(Table 186) shows how the tester can request DTC count information to be sent using a send-on-change
message transmission model. The ECM will return the current number of DTCs that satisfy the masking criteria
as soon as the tester’s request is received. The ECM will then return fresh count information as soon as the
node-resident periodic DTC scanning algorithm detects any change in the number of DTCs matching the
masking criteria.
Note: The tester must periodically transmit service $3E TesterPresent messages to keep the send-on-change
model active.
As was mentioned above, the masking algorithm consists of a logical OR-ing operation between actual DTC
statuses and the tester defined filtering mask.
This example shows that there were four DTCs present in the ECM that matched the status mask $02 at
the time of the tester’s request (status mask = $02 corresponds to current DTCs).
At some time later, the ECM returns an updated DTC count indicating that another DTC has satisfied the
$02 filtering criteria, bringing the total number of matches to $00 05. (Aside: An off-board tester could use
this message from the node to trigger a message $81 request for DTC information by status mask to
determine which DTC(s) actually set).
Note that the count is not monotonically increasing (i.e., If it is determined by a node that fewer DTCs
currently match the masking criteria than that which was calculated previously, then the DTC count will
decrement). This can be seen below as the count drops from $00 05 back down to $00 04.
This example also shows how to terminate the send-on-change session by defining a status mask of $00.
After positively acknowledging this request with a UUDT message containing a DTC count of $00 00, the
ECM will halt all subsequent computation/transmission of send-on-change DTC count information.
Table 186: Example of Physical Request for ReadDiagnosticInformation With Sub-Parameter = $82
T = Frame Sent By Tester, N = Frame Sent By Node, shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $03 $A9 $82 $02 --- --- --- ---
N1(UUDT) $541 $82 $00 $04 --- --- --- --- ---
:
N1(UUDT) $541 $82 $00 $05 --- --- --- --- ---
:
N1(UUDT) $541 $82 $00 $04 --- --- --- --- ---
:
T(USDT-SF) $241 $03 $A9 $82 $00 --- --- --- ---
N1(UUDT) $541 $82 $00 $00 --- --- --- --- ---
Table 187 is the same as the example in Table 186, but with negative response message RC_78.
Table 187: Example of Physical Request for ReadDiagnosticInformation With Sub-Parameter = $82 And
RC = $78
T = Frame Sent By Tester, N = Frame Sent By Node, shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $03 $A9 $82 $02 --- --- --- ---
N1(USDT-SF) $641 $03 $7F $A9 $78 --- --- --- ---
:
N1(UUDT) $541 $82 $00 $04 --- --- --- --- ---
:
N1(UUDT) $541 $82 $00 $05 --- --- --- --- ---
:
N1(UUDT) $541 $82 $00 $04 --- --- --- --- ---
:
T(USDT-SF) $241 $03 $A9 $82 $00 --- --- --- ---
:
N1(UUDT) $541 $82 $00 $00 --- --- --- --- ---
Table 188: Node Interface Data Dictionary of ReadDiagnosticInformation Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
TesterPresent_Timer_State Pseudo Code Data
Dictionary For Definition Of
DTC_send_on_change_flag
These Flags/Variables
stored_status_mask $00 thru $FF
This variable is used to store the most recently requested status mask in
association with a message $82 request.
dtc_found TRUE, FALSE
This local flag is used to indicate whether a DTC number/FailureType
combination requested via message $80 is locally supported.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Variable/Meaning Values
send_on_change_count $0000 thru $FFFF
This variable is used to store the most recently tabulated count of DTCs Signed value.
matching the single tester-defined send-on-change DTC status mask. As soon
as service $A9 message $82 is activated, the node will calculate the number of
DTCs satisfying the tester-defined masking criteria and store the count in this
variable.
After acknowledging the tester’s request, the node operating in steady state will
send updated DTC count information if the current count is different from that
which is stored in this variable. This variable will then be updated with the
current count of DTCs satisfying the filtering criteria.
temp_count $0000 thru $FFFF
This is a temporary storage variable for message $82. It is a 2-byte counter Signed value.
used to store the current count of DTCs that match the tester-defined filtering
criteria.
temp_count_hi $00 thru $FF
This is a temporary storage variable for message $82. It is the upper byte of
temp_count.
temp_count_lo $00 thru $FF
This is a temporary storage variable for message $82. It is the lower byte of
temp_count.
total_num_local_dtcs $0001 thru $FFFF
This static variable contains the total number of DTCs any particular node
supports. (Note that this number is specific to each node).
M $0000 thru $FFFF
This is a temporary loop index variable that is used in the pseudo code for
searching through local DTC lists.
N $0000 thru $FFFF
This is a temporary loop index variable that is used in the pseudo code for
searching through local DTC lists.
DTC_Index 0 to total_num_local_dtcs
This is an index variable used by the background loop for sending level $81
responses.
Level_81_Active YES/NO
This is a flag which is used to keep track of whether a response to a level $81
request is in progress.
Request_Status_Mask $00 thru $FF
This variable is used to store the requested status mask to a level $81 request
and is used by the background function which transmits the responses.
msg_sent YES/NO
This is a local variable used to prevent the ECU from attempting to transmit two
messages in response to a level $81 request in the same pass of the
background loop.
Variable/Meaning Values
DTC_Info The values for each element
This is an array of data structures used to house DTC specific information within of the DTC_Info structure
a node. The following elements comprise this structure: are described below:
1. DTCH = most significant byte of diagnostic trouble code. 1. $00 ≤ DTCH $FF
2. DTCL = least significant byte of diagnostic trouble code. 2. $00 DTCL $FF
3. DTCFT = failure type information associated with the DTC. 3. $00 DTCFT $FF
4. DTCSB = status information associated with the DTC (refer to Table E1: 4. $00 DTCSB $FF
DTC Status Bit Assignments for more details.)
To access information in this structure, the following nomenclature is used:
DTC_Info[x].element, where x = m or n as described above in the data
dictionary, and element is one of the four types listed above.
Powerup States:
DTC_send_on_change_flag 0
Level_81_Active NO
Each time a $A9 message is received, the following logic is executed:
BEGINFUNCTION Serv_A9_Msg_Recvd()
/************************************************************************************
* Verify that a valid sub-function is being requested and that the message length is
* valid
*************************************************************************************/
IF (($Level not locally supported) OR
(($Level = $LEV_RSDTCBN) AND (message_data_length != $05)) OR /* $Level = $80 */
((message_data_length != $03) AND /* $Level = $82 or $81 and length not 3 */
(($Level = $LEV_ SOCDTCC) OR ($Level = $LEV_RSDTCBS)))) THEN
send Negative Response($7F $A9 $12)
ELSE
IF ((Node cannot service DTC request because read/write memory conflict) OR
(Tester’s request takes longer than P2C ms to process)) THEN
send Negative Response($7F $A9 $78)
ENDIF
SELECT FIRST
/************************************************************************************
* Handle Message $80 Request “readStatusOfDtcByDtcNumber”
*************************************************************************************/
WHEN ($Level= $LEV_RSDTCBN)
dtc_found = FALSE
FOR (m 0 TO (total_num_local_dtcs - 1) BY 1)
IF ((DTC_Info[m].DTCH = $DTCH) AND (DTC_Info[m].DTCL = $DTCL) AND
(DTC_Info[m].DTCFT = $DTCFT)) THEN
dtc_found TRUE
/* send UUDT positive response */
send ($80 $DTC_Info[m].DTCH $DTC_Info[m].DTCL
$DTC_Info[m].DTCFT $DTC_Info[m].DTCSB)
m total_num_local_dtcs /* exit FOR loop */
© Copyright 2010 General Motors All Rights Reserved
ENDIF
ENDFOR
IF (dtc_found = FALSE)
This function handles the sending of UUDT response messages for service $A9 requests with the
sub-parameter set to $81. The function shall be executed in a background loop at a rate which satisfies the
UUDT timing requirements specified in the Service Description section of this diagnostic service.
BEGINFUNCTION Service_A9_Process_Level_81( )
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
ENDIF
ENDFUNCTION
This function handles the sending of UUDT response messages for service $A9 requests with the
sub-parameter set to $82. The function shall be executed in a background loop at a rate which satisfies the
UUDT timing requirements specified in the Service Description section of this diagnostic service
BEGINFUNCTION Send_On_Change_DTC_Count( )
/************************************************************************************
* Handle Message $82 Steady State “sendOnChangeDTCCount”
* This background algorithm is halted when any of the following conditions occur:
* 1. Tester transmits service $20 request to return to normal mode
* 2. The node is powered down
* 3. Tester stops sending service $3E tester present requests
* NOTE: this algorithm is intended to be run in parallel to internal node-resident
* diagnostic trouble code testing.
*************************************************************************************/
IF (DTC_send_on_change_flag = 1) THEN
temp_count 0
FOR (m 0 TO (total_num_local_dtcs -1) BY 1)
IF (($DTC_Info[m].DTCSB & stored_status_mask) != $00) THEN
temp_count temp_count + 1
ENDIF
ENDFOR
IF (temp_count != send_on_change_count) THEN
send_on_change_count temp_count
temp_count_hi ((send_on_change_count & $FF00) >> 8)
temp_count_lo (send_on_change_count & $00FF)
/* send UUDT response with updated count information */
send ($82 $temp_count_hi $temp_count_lo)
ENDIF
ENDIF
ENDFUNCTION
8.18.7 Node Verification Procedure.
Procedure 1:
1. Send a request for level $80 (if supported) with less than 3 data bytes after the sub-function parameter in
the message. Verify the proper negative response ($7F $A9 $12).
2. Send a request for level $80 (if supported) with more than 3 data bytes after the sub-function parameter in
the message. Verify the proper negative response ($7F $A9 $12).
3. Send a request for level $81 with no data bytes after the sub-function parameter. Verify the proper
negative response ($7F $A9 $12).
4. Send a request for level $81 with more than 1 data byte after the sub-function parameter. Verify the proper
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
P2CE).
Note: See the application timing requirements section within this specification for further details.
The ECU shall transmit all subsequent DPID responses within P2 CE of the previous DPID response transmitted
as a result of this request. Any deviations from the sendOneResponse UUDT timing requirements shall be
agreed upon by the DRE, Service and Manufacturing serial data engineers, and shall be documented in a
CTS, SSTS, or supplemental diagnostic specification referenced by a CTS or SSTS.
© Copyright 2010 General Motors All Rights Reserved
8.19.1.2 Requesting Periodic DPID Scheduling - Sub-Function Parameters ($02 sendAtSlowRate, $03
sendAtMediumRate, and $04 sendAtFastRate). If the Node supports any of the levels that allow a tester to
schedule periodic DPID transmissions (sub-function parameters $02 through $04), it shall have a Periodic
DPID Scheduler (PDS). The maximum number of simultaneously scheduled DPIDs that the Node is required
to support shall be documented in the ECU Component Technical Specification (CTS). Each DPID in the PDS
shall be capable of being scheduled at one of the allowable periodic rates independent of the rate applied to
the other DPIDs in the PDS. The ECU shall be able to support in a single periodic DPID request, as many
DPIDs as there are items in the PDS. Refer to parameter PDS_Length in pseudo code.
The default periodic rates (scheduling rates) for the periodic DPID scheduler are 1000 ms for slow, 200 ms for
medium, and 25 ms for fast. Periodic rate is defined as the time between any two consecutive messages of
the same DPID when it is scheduled by this service.
Note: This service does not require an ECU to transmit ALL scheduled DPIDs at the same time. It is allowable
to have a minimum time between different DPIDs. The periodic rate is the time between consecutive
transmissions of a single given scheduled DPID, NOT the time between transmission of ALL scheduled DPIDs.
The default rates are guidelines and may be modified based on ECU capabilities. The actual data rates
associated with slow, medium, and fast, shall be documented in the CTS.
Note: The actual rate at which a specific periodic DPID is transmitted can vary from the requested periodic
rate based on the number of DPIDs in the PDS, the rate at which the ECU services the PDS, and the amount
of bus traffic. Reference the pseudo code (paragraph 8.19.6.2) and the examples (paragraph 8.19.6.3) for
specifics on how the number of DPIDs in the PDS and the rate at which the PDS is serviced affects the
periodic transmission rate.
Each time a valid $AA request for periodic transmission is received the PDS shall be started (if not already
active) and the corresponding DPID(s) shall be put into the PDS or be updated with the requested (new) rate.
Multiple copies of the same DPID are not allowed in the PDS (i.e., if the ECU receives a request to schedule a
DPID already present in the PDS, only the scheduling rate will be updated). If a $AA request for periodic
transmission does not include a DPID already active for periodic transmission, this DPID shall remain
unaffected (e.g., if DPIDs 1, 4 and 5 are periodically sent and a new $AA request for periodic transmission only
includes DPIDs 1 and 4, the scheduled rate for DPID 5 shall remain unaffected while the scheduling rate for
DPIDs 1 and 4 are set to the new requested scheduling rate).
It shall be possible to request additional DPIDs to be scheduled at any allowed rate while the periodic
scheduler is active provided that the request does not attempt to place more DPIDs in the PDS then the PDS
supports. It shall also be possible to request scheduling DPIDs while a sendOneResponse DPID request is in
progress provided that the initial UUDT DPID response to the sendOneResponse DPID request has been
received. It shall be possible to redefine the rate of one or several DPID(s) while periodic transmission is
active. If dynamic DPIDs are supported by a Node, the Node shall allow redefinition of any/all dynamic DPID(s)
(via the $2C service) while periodic transmission is active.
When a P3C (TesterPresent) time-out occurs, the ECU shall stop periodic transmission of all DPIDs (stop the
PDS) and the entire PDS shall be cleared. No UUDT response shall be sent on this action. See TesterPresent
($3E) service regarding actions at tester present time-out.
After issuing a request for this service using one of the supported periodic rates, the tester must wait before
issuing any new diagnostic requests until one of the following occur:
Note: The exception to this is the possibility of interleaving a functionally addressed TesterPresent ($3E)
request message to keep certain diagnostic services active. See TesterPresent service description and the
section on Diagnostic Communication Implementation Rules for more information.
A UUDT DPID response is received for a DPID which was not previously in the PDS, or
The tester receives any negative response message, or
The tester receives at least one previously scheduled UUDT DPID response from the periodic request
after P2C.
Note: The tester is allowed to send a new diagnostic request after receiving a negative response that contains
a request service Id of $AA and a negative response code $78 (RequestCorrectlyReceived-ResponsePending)
because no further USDT response (either positive or negative) shall follow. All positive responses are UUDT
messages and no additional USDT negative response shall follow in this case because the ECU is required to
verify that the entire request for this service is valid before sending any response. This means that the negative
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
response with response code $78 is only used with this service when it is possible that the ECU may not be
able to send any of the requested DPIDs within the P2 C timing window. The ECU is only allowed to transmit a
single negative response with response code $78 to a periodic request for this service. Refer to the pseudo
code (Process_AA_Msgs function for more details).
Timing of additional UUDT responses is handled in the applications PDS logic.
8.19.1.3 Stopping Scheduled Periodic DPID(s) - Sub-Function Parameter ($00). If a node supports any of
the periodic levels of this service, then it shall also support the stopSending ($00) sub-function parameter. The
positive response to a stopSending DPID request is a single UUDT diagnostic message with a value of $00 in
the DPID/message number position and no additional data bytes.
When a stopSending request is received without any DPIDs after the sub-function parameter, the ECU shall
stop the periodic transmission of all DPIDs (stop the PDS) and the entire PDS shall be cleared (cleared = all
DPIDs removed from the PDS. Reference the pseudo-code for the required implementation). When a
stopSending request is received with one or more DPID(s) after the sub-function parameter, then all DPID(s) in
the PDS that match a DPID number in the request shall be stopped. The ECU shall be able to support in a
single stopSending DPID request, as many DPIDs as there are items in the PDS. Refer to parameter
PDS_Length in pseudo code.
Note: The ECU shall stop only the matching DPIDs. All other scheduled DPIDs shall remain unaffected. A
stopped DPID shall not be transmitted after the UUDT positive response with message number $00 has been
sent.
8.19.2 Request Message Definition.
8.19.2.1 ReadDataByPacketIdentifier Request Message (Table 189).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.19.2.1.1 Sub-Function Parameter $Level (LEV_) Definition. The following sub-function parameter values
are defined for service $AA ReadDataByPacketIdentifier. The sub-function parameter shall be used in a $AA
service request to select the level of functionality. The sub-function parameter is always present in a request
message. See Table 190.
The sub-function parameters supported by a Node are vehicle manufacturer optional and shall be documented
in the Component Technical Specification (CTS).
8.19.2.2 Request Message Data Parameter Definition. Tables 191 and 192 specifiy the data parameter
definitions and valid ranges for this service.
number of elements in this array can vary based on the preceding sub-function parameter byte. A further
definition of the meaning of the DPID data contained in this array can be found below.
8.19.3 Positive Response Message Definition. Positive responses to this service are UUDT message(s).
The first byte of a UUDT diagnostic message contains a message number. For this service, the DPID#
occupies the message number field. The number of data bytes after the message number depends on the sub-
function parameter value or the DPID requested. If sub-function parameter ($Level) $00 is requested, then the
response message contains only the message number (DPID $00) and no additional data as illustrated by
Table 193.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
If the request message contains any other sub-function parameter ($Level) value, then the positive response
message contains the DPID number requested and data bytes associated with that DPID, as illustrated by
Table 194.
Table 194: ReadDataByPacketIdentifier, $Level = $01, $02, $03, or $04 Positive Response Message
Data Byte Parameter Name Cvt Hex Value Mnemonic
#1 MessageNumber = [ M 01 thru 7F, DPID_
DPID#] or
90 thru FE
#2 dataRecord = [ Data Byte #1 M2 xx DB_1
: : : : :
#8 Data Byte #7] U xx DB_7
Where:
M2 = This byte shall always be present for static DPIDs. For dynamic DPIDs this byte shall always be
present once the DPID contents have been assigned via the $2C service. The number of bytes
transmitted in the data record shall be 0 for a given dynamic DPID if that DPID had not previously
been defined via the $2C service.
8.19.3.1 Response Message Data Parameter Definition. Table 195 specifies the data parameter definitions
for this service.
8.19.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. See Table 196.
8.19.5 Message Flow Example ReadDataByPacketIdentifier. For all of the examples of this service below:
The tester to Node point-to-point request CAN Identifier is $241 and
The Node to tester UUDT response CAN Identifier is $541.
8.19.5.1 ReadDataByPacketIdentifier Scheduled UUDT Positive Responses. In the example below
(Table 197):
The tester sends a ReadDataByPacketIdentifier request with the sub-function parameter = $03
(scheduleAtMediumRate) to schedule DPIDs $10, $23 and $30.
DPID $10 consists of four bytes data,
DPID $23 consists of six bytes data and
DPID $30 consists of seven bytes data.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table 197: ReadDataByPacketIdentifier Request ($Level = $03) - Scheduled UUDT Positive Responses
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $05 $AA $03 $10 $23 $30 --- ---
N(UUDT-SF) $541 $10 $32 $33 $EF $44 --- --- ---
:
N(UUDT) $541 $23 $21 $32 $15 $01 $11 $55 ---
:
N(UUDT) $541 $30 $33 $33 $11 $45 $98 $A3 $AA
Note: The TesterPresent ($3E) messages Necessary to keep periodic responses active are not shown in the
example.
8.19.5.2 ReadDataByPacketIdentifier Stop Periodic Messages Positive Response.
In the example below (Table 198):
The tester sends a ReadDataByPacketIdentifier request with the sub-function parameter = $00
(StopSending), and no additional data parameters. This causes the Node to stop sending all scheduled
DPIDs.
The Node then confirms the performed action with a UUDT positive response message with the
MessageNumber = $00.
DPIDs active for periodic transmission not shown in example below.
Table 198: ReadDataByPacketIdentifier Request ($Level = $00) - Single UUDT Positive Response
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $02 $AA $00 --- --- --- --- ---
N(UUDT-SF) $541 $00 --- --- --- --- --- --- ---
Note: The ECU(s) shall first disable the scheduler prior to sending the positive UUDT response message.
8.19.5.3 ReadDataByPacketIdentifier Request Single Shot UUDT Frame(s) Positive Response. In the
example below (Table 199):
The tester sends a ReadDataByPacketIdentifier request with the sub-function parameter = $01
(SendOneResponse), with DPIDs $A1 and $22 as data parameters.
DPID $A1 contains three bytes of data.
DPID $22 contains two bytes of data.
The example below is independent on whether scheduling is active or not at time of request.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Table 200: ReadDataByPacketIdentifier Request ($Level = $03) - Scheduled UUDT Positive Responses
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $04 $AA $03 $30 $10 --- --- ---
N(UUDT) $541 $30 $32 $33 $EF $44 --- --- ---
:
N(UUDT) $541 $10 $21 $32 $15 $01 $11 $55 ---
Table 201: ReadDataByPacketIdentifier Request ($Level = $04) - Scheduled UUDT Positive Responses
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $03 $AA $04 $4C --- --- --- ---
N(UUDT) $541 $4C $32 $33 $EF --- --- --- ---
:
N(UUDT) $541 $4C $32 $34 $FF --- --- --- ---
:
N(UUDT) $541 $30 $00 $11 $34 $00 --- --- ---
:
N(UUDT) $541 $4C $32 $34 $FF --- --- --- ---
:
N(UUDT) $541 $10 $22 $12 $00 $21 $01 $23 ---
Table 202: ReadDataByPacketIdentifier Request ($Level = $00) - StopSending DPID# $30 Positive
Response
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $03 $AA $00 $30 --- --- --- ---
N(UUDT-SF) $541 $00 --- --- --- --- --- --- ---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table 203: ReadDataByPacketIdentifier Request ($Level = $01) - OneShot DPID# $12 Positive Response
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $03 $AA $01 $12 --- --- --- ---
N(UUDT) $541 $4C $32 $33 $EF --- --- --- ---
N(UUDT) $541 $12 $11 $DC --- --- --- --- ---
:
N(UUDT) $541 $4C $32 $34 $FF --- --- --- ---
:
N(UUDT) $541 $10 $23 $12 $14 $01 $13 $F5 ---
Table 204: ReadDataByPacketIdentifier Request ($Level = $00) - StopSending All DPIDs UUDT Positive
Response
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT-SF) $241 $02 $AA $00 --- --- --- --- ---
N(UUDT-SF) $541 $00 --- --- --- --- --- --- ---
Table 205: Node Interface Data Dictionary of ReadDataByPacketIdentifier Service Pseudo Code
Variable/Meaning Values
message_data_length Reference Common/Global
TesterPresent_Timer_State Pseudo Code Data
Dictionary For Definition Of
These Flags/Variables
PDS N/A
(Periodic DPID Scheduler) A multi-dimensional array of pointers and data used by
the application’s periodic scheduler. The array contains the scheduled DPIDs,
DPID count down loop counters, and DPID data scheduling rate data.
PDS[].Transmit_Count $00 to Slow_Rate_Count
This variable is counter which decrements by 1 each time the
DecrementPDS_Counters() function is executed until the counter reaches $00.
Once the counter hits $00, the DPID shall be transmitted as soon as possible.
PDS[].Scheduling_Rate Slow_Rate_Count,
The scheduling rate for a scheduled DPID in the PDS. Medium_Rate_Count, or
Fast_Rate_Count
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Variable/Meaning Values
PDS[].DPID $01 thru $7F, $90 thru $FE
Identifier (DPID) of the scheduled data.
PDS_Length According to CTS
Reference to the maximum length of the PDS (maximum number of DPIDs that
can be scheduled simultaneously).
PDS_Number_Active 0 to PDS_length
The number of active scheduled DPIDs in the PDS.
PDS_Xmit_Index 0 to (PDS_length -1)
This is an index variable which is used to keep track of the starting offset into the
PDS each time the Process_AA_Msgs() function is executed. This is necessary
to make sure that all DPIDs with expired timers will be sent before a single DPID
may be sent twice.
AA_Msg_Rate x ms
This is the amount of time between two executions of the Process_AA_Msgs()
function.
all_DPIDs_valid YES/NO
A flag used to indicate whether all DPIDs in a request message are valid or not.
DPID_already_scheduled YES/NO
A flag used to indicate whether a DPID# is already in PDS or not.
vacant_position_found YES/NO
A flag used to indicate that a vacant position to put a new DPID# in the PDS has
been found.
vacant_position 0 to (PDS_length -1)
A flag used to indicate the index into the PDS where the first vacant position to
put a new DPID# in the PDS has been found.
max_No_of_01_DPIDs According to CTS
The max. # of DPIDs that an ECU supports for a sub-function parameter $01
(OneShot) request.
num_new_sched_DPIDs 0 to 4093
The number of DPIDs in a received request that are not already scheduled at
time of request.
No_of_DPIDs 0 to 4093
The total number of DPIDs in a received request.
Request_Valid YES/NO
This is a local flag used to keep track of whether or not the request message is a
valid request.
request_DPIDs[] Each array element
This is an array which contains all of the DPIDs from the request message. The contains a DPID number
first element (request_DPIDs[0]) of this array contains the first data byte after the
sub function parameter in the request message.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Variable/Meaning Values
Req_Index 0 to PDS_length
This is a counter which is used as an index into the array of requested DPIDs
when trying to determine if all DPIDs in the request are valid.
PDS_Index 0 to max of either
This is a counter which is used as an index into the PDS when modifying the PDS_length
DPIDs stored in the PDS. It is also used as an index into the array of supported or
DPIDs when determining if all DPIDs in the request are supported. num_supported_DPIDs
supported_DPIDs[] N/A
This is an array which contains all of the DPID numbers that the ECU supports.
num_supported_DPIDs Determined in ECU
This is a variable which indicates the number of entries in the supported_DPIDs[] software based on the
array. number of DPIDs
supported
Resp_01_DPIDs[] This array shall contain at
This is an array which is used to store the DPID numbers for the send one least
response level of this service. The size of this array shall be at least as large as max_No_of_01_DPIDs
the maximum number of DPIDs allowed with a send one response $Level = $01 element
request. This array shall be initialized at powerup to have all elements equal to
$00.
Resp_01_Index $00 to
This is a variable used to index into the Resp_01_DPIDs[] array when sending max_No_of_01_DPIDs - 1
the one shot responses.
Resp_01_Num_To_Send $00 to
This is a variable which is used to keep track of how many one shot responses max_No_of_01_DPIDs
still need to be sent. This variable shall be initialized to $00 at powerup.
Num_Loops_For_01 $00 to
This is a counter which is used by the Process_AA_Msgs() function to determine Max_01_Wait_Count
when it is time to send a one shot response. This variable shall be initialized to
$00 at powerup.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Variable/Meaning Values
Max_01_Wait_Count This is a counter used to compare against the Value to be determined by
Num_Loops_For_01 counter to determine when to send a one shot DPID instead ECU serial data design
of a periodic scheduled DPID. The value of this variable should be set based on engineer.
the number of times the Process_AA_Msgs() function gets called in the
background before a P2C time interval will have elapsed. The objective is to set
this variable to a value which will ensure that a one shot DPID will be sent at a
time interval less than P2C.
Service_AA_Msg_Sent YES/NO
This is a flag used in the Process_AA_Msgs() function to keep track of whether or
not a one shot or periodic DPID has been transmitted.
Min_Loops_Since_Periodic Value determined at
This is a counter which can be used to force a minimum amount of time between compile time of the ECU
the transmission of two periodic DPIDs. This can be used to allow one shot software.
DPIDs to be transmitted during loops when the periodics are not allowed.
Num_Loops_Since_Periodic $00 to
This is a counter used to keep track of the number of times the Min_Loops_Since_Periodic
Process_AA_Msgs() function gets called in the background without sending a
periodic DPID.
ENDFOR
ENDFOR
IF (PDS_Number_Active = $00)
PDS_Xmit_Index $00
ENDIF
ELSE
Call ClearAndDisablePDS()
ENDIF
Send Positive Response ($UUDTCANId $00)
WHEN ($Level = LEV_SOR ) /* $01 Send One Shot Responses*/
IF (processing the first response will take more than P2C ms) THEN
Send Negative Response ($7F $AA $78) /*for request received-response pending */
ENDIF
FOR (Req_Index $00 TO (No_of_DPIDs - $01) BY $01)
Resp_01_DPIDs[Req_Index] request_DPIDs[Req_Index]
ENDFOR
Resp_01_Num_To_Send No_of_DPIDs
Num_Loops_For_01 Max_01_Wait_Count /* ensure one shot is sent next time Process_AA_Msgs()
function is called */
WHEN ($Level > LEV_SOR ) /* $02, $03, or $04 Periodic Rates */
IF (processing the first response will take more than P2C ms) THEN
Send Negative Response ($7F $AA $78) /*for request received-response pending */
ENDIF
TesterPresent_Timer_State ACTIVE
IF ($Level = LEV_SAFR) THEN
Req_Sched_Rate_Count Fast_Rate_Count
ELSE IF ($Level = LEV_SAMR) THEN
Req_Sched_Rate_Count Medium_Rate_Count
ELSE
Req_Sched_Rate_Count Slow_Rate_Count
ENDIF
/**************************************************************
* Check for each DPID in request to see if it is already scheduled
* (present in PDS). If already scheduled, clear the transmit counter
* so the DPID will be sent and then update the data rate for that DPID.
* If the DPID is not in the PDS, then put it into the first vacant
* location in the PDS, set its rate, and initialize its transmit
* counter to $00 so it will be sent as soon as possible.
**************************************************************/
vacant_position $00
Num_Loops_Since_Periodic Min_Loops_Since_Periodic
FOR (Req_Index $00 TO (No_of_DPIDs - $01) BY $01)
PDS_Index $00 /*Start with first row in PDS each loop*/
DPID_already_scheduled NO
vacant_position_found NO
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
REPEAT
IF (request_DPIDs[Req_Index] = PDS[PDS_Index].DPID)
DPID_already_scheduled YES
PDS[PDS_Index].Transmit_Count $00
PDS[PDS_Index].Scheduling_Rate Req_Sched_Rate_Count
ELSE IF ((PDS[PDS_Index].DPID = $00) AND
(vacant_position_found = NO)) THEN
vacant_position PDS_Index
vacant_position_found YES
ENDIF
PDS_Index PDS_Index +1
UNTIL ((DPID_already_scheduled = YES)OR(PDS_Index = PDS_Length))
IF (DPID_already_scheduled = NO)
PDS_Number_Active (PDS_Number_Active + $01)
PDS[vacant_position].DPID request_DPIDs[Req_Index]
PDS[vacant_position].Transmit_Count $00
PDS[vacant_position].Scheduling_Rate Req_Sched_Rate_Count
ENDIF
ENDFOR
ENDSELECT
ENDIF
ENDFUNCTION
The following function is called from the Process_AA_Msgs() function and is used to control sending the
periodic DPIDs in the PDS.
BEGINFUNCTION Send_AA_Periodic_Msgs()
/* check if the PDS should be running by looking at the number of DPIDs in the PDS */
IF (PDS_Number_Active > $00)THEN
/*Decrement transmit count by one unless already $00*/
CALL DecrementPDS_Counters()
/* check to see if any DPIDs need to be sent */
IF (Num_Loops_Since_Periodic ≥ Min_Loops_Since_Periodic) THEN
FOR (PDS_Index $01 TO PDS_Length BY $01)
IF ( (PDS[PDS_Xmit_Index].DPID != $00) AND
(PDS[PDS_Xmit_Index].Transmit_Count = $00)
/* Get current data (DB_1,... DBx) for this DPID and send it*/
Send positive response ($UUDTCANId $PDS[PDS_Xmit_Index].DPID $DB_1, ....)
PDS[PDS_Xmit_Index].Transmit_Count PDS[PDS_Xmit_Index].Scheduling_Rate
PDS_Index PDS_Length
Service_AA_Msg_Sent YES
Num_Loops_Since_Periodic $00
ENDIF
PDS_Xmit_Index ((PDS_Xmit_Index + $01) MOD PDS_Length)
ENDFOR
ENDIF
ENDIF
ENDFUNCTION
The following function, Send_AA_One_Shot(), is called by the background function Process_AA_Msgs() that
handles processing one time and periodic responses for the $AA service. This function will send one DPID
each time that it is called.
BEGINFUNCTION Send_AA_One_Shot()
IF (Resp_01_Num_To_Send > $00) THEN
FOR (Resp_01_Index $00 TO (max_No_of_01_DPIDs - $01) BY $01)
IF (Resp_01_DPIDs[Resp_01_Index] != $00)
/* Get current data (DB_1,... DBx) for this DPID and send it*/
Send positive response ($UUDTCANId $Resp_01_DPIDs[Resp_01_Index] $DB_1, ....)
Resp_01_Num_To_Send (Resp_01_Num_To_Send - $01)
Resp_01_DPIDs[Resp_01_Index] $00
Resp_01_Index max_No_of_01_DPIDs
Num_Loops_For_01 $00
Service_AA_Msg_Sent YES
ENDIF
ENDFOR
ENDIF
ENDFUNCTION
The following function, Process_AA_Msgs(), is called in a background loop and handles sending one shot
($Level = LEV_SOR) and periodic ($Level = LEV_SAFR, LEV_SAMR, or LEV_SASR) DPID responses. The
execution rate of this function shall be fast enough to ensure that each element of the PDS has the opportunity
to be transmitted within the P2C* timing window. This ensures a maximum of 1 negative response with
response code $78 per periodic request. This execution rate of this function shall also be at an interval less
than or equal to half of the fast periodic rate. If the value of the fast periodic rate is close to the value of P2C,
then the execution interval must be small enough to ensure that responses to level $01 requests can meet the
P2C timing requirements.
BEGINFUNCTION Process_AA_Msgs()
IF ((PDS_Number_Active > $00) OR (Resp_01_Num_To_Send > $00)) THEN
Service_AA_Msg_Sent NO
IF (Num_Loops_For_01 ≥ Max_01_Wait_Count) THEN
CALL Send_AA_One_Shot()
IF (PDS_Number_Active > $00) THEN
CALL DecrementPDS_Counters()
ENDIF
ELSE
CALL Send_AA_Periodic_Msgs()
IF (Service_AA_Msg_Sent = NO) THEN
CALL Send_AA_One_Shot()
ELSE
IF (Resp_01_Num_To_Send > $00) THEN
Num_Loops_For_01 (Num_Loops_For_01 + $01)
ENDIF
ENDIF
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
ENDIF
ENDIF
ENDFUNCTION
The following function, DecrementPDS_Counters, is used to decrement the loop counters associated with
each DPID in the PDS. The loop counters are used to determine when a DPID is ready for transmission. This
function is called from the Send_AA_Periodic_Msgs() function and also from the Process_AA_Msgs() function.
BEGINFUNCTION DecrementPDS_Counters()
FOR (PDS_Index $00 TO (PDS_Length - $01) BY $01)
IF ((PDS[PDS_Index].DPID!=$00) AND (PDS[PDS_Index].Transmit_Count>$00)) THEN
PDS[PDS_Index].Transmit_Count(PDS[PDS_Index].Transmit_Count-$01)
ENDIF
ENDFOR
IF (Num_Loops_Since_Periodic < Min_Loops_Since_Periodic) THEN
Num_Loops_Since_Periodic (Num_Loops_Since_Periodic + $01)
ENDIF
ENDFUNCTION
The following function, ClearAndDisablePDS, is called by this and other services to stop and clear the PDS
BEGINFUNCTION ClearAndDisablePDS()
FOR (PDS_Index $00 TO (PDS_Length -$01) BY $01)
PDS[PDS_Index].DPID $00
ENDFOR
PDS_Number_Active $00
PDS_Xmit_Index $00
8.19.6.3 Graphical and Tabular Examples of Mode $AA Periodic Scheduled Rates. This section contains
two examples of scheduled periodic data. Each example contains a graphical depiction of what messages are
transmitted on the bus, followed by a table which shows the PDS variables and how they change each time the
Process_AA_Msgs() function is executed. In the examples below, the following information is given:
The fast rate is 25 ms.
The medium rate is 200 ms for Figure 34.
The medium rate is 300 ms for Figure 35.
The Process_AA_Msgs() function is executed every 12.5 ms (AA_Msg_Rate = 12.5 ms).
The PDS can hold a maximum of four scheduled items.
It is possible to send a DPID any time its counter has expired (Min_Loops_Since_Periodic = 0).
Since the AA_Msg_Rate is 12.5 ms, the fast rate loop counter would be set to 2 (this value is based on the
scheduled rate (25 ms) divided by the AA_Msg_Rate (12.5 ms) or 25/12.5) each time a fast rate DPID is sent
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
and the medium rate loop counter is reset to 16 (or 24) (scheduled rate divided by AA_Msg_Rate or 200
(or 300)/12.5) each time a medium rate DPID is sent.
8.19.6.3.1 Example #1 - Single DPID Schedule Rates. In this example, four DPIDs ($01, $02, $03, and $04)
are scheduled at the medium rate. At t = 0.0 ms, the tool begins sending the request to schedule the four
DPIDs at the medium rate. For the purposes of this example, the ECU receives the request and executes the
PDS code for the first time t = 25.0 ms. See Figure 34 and Table 206.
Time ( t )
Tester ECU
Mode $AA
0 ms
request
25 ms DPID #1
37.5 ms DPID #2
50 ms DPID #3
62.5 ms DPID #4
Actual
schedule
rate
225 ms DPID #1
237.5 ms DPID #2
250 ms DPID #3
262.5 ms DPID #4
Figure 34: Example #1 - Four DPIDs at Medium Rate (200 ms) with 12.5 ms AA_Msg_Rate Rate
Table 206: Example #1 - Four DPIDs at Medium Rate (200 ms) with 12.5 ms AA_Msg_Rate Rate
t (ms) PDS DPID PDS PDS[0] PDS[1] PDS[2] PDS[3]
Xmit Sent Loop # Transmit Transmit Transmit Transmit
Index Count Count Count Count
25.0 0 1 1 0 to 16 0 0 0
37.5 1 2 2 15 0 to 16 0 0
50.0 2 3 3 14 15 0 to 16 0
62.5 3 4 4 13 14 15 0 to 16
75.0 0 None 5 12 13 14 15
87.5 0 None 6 11 12 13 14
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
100.0 0 None 7 10 11 12 13
112.5 0 None 8 9 10 11 12
125.0 0 None 9 8 9 10 11
137.5 0 None 10 7 8 9 10
150.0 0 None 11 6 7 8 9
162.5 0 None 12 5 6 7 8
175.0 0 None 13 4 5 6 7
187.5 0 None 14 3 4 5 6
200.0 0 None 15 2 3 4 5
212.5 0 None 16 1 2 3 4
225.0 0 1 17 0 to 16 1 2 3
237.5 1 2 18 15 0 to 16 1 2
250.0 2 3 19 14 15 0 to 16 1
262.5 3 4 20 13 14 15 0 to 16
8.19.6.3.2 Example #2 - Mixed DPID Schedule Rates. In this example, three DPIDs ($01, $02, $03) are
scheduled at the fast rate and then another request is sent for a single DPID ($04) to be scheduled at the
medium rate. For the purposes of this example, the ECU receives the first mode $AA request and executes the
PDS code for the first time t = 25.0 ms. The second mode $AA request is received and processed just prior to
the device executing the Process_AA_Msgs() function at t = 50.0 ms. See Figure 35 and Table 207.
Time ( t )
Tester ECU
25 ms DPID #1
37.5 ms DPID #2
50 ms DPID #3
62.5 ms DPID #4
300 ms DPID #1
350 ms DPID #2
Fast
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
rate =
362.5 ms DPID #3
50 ms
375 ms DPID #4
387.5 ms DPID #1
425 ms DPID #1
Table 207: Example #2 - Three DPIDs at Fast Rate (25 ms) and 1 DPID at Medium Rate (300 ms)
PDS PDS[0] PDS[1] PDS[2] PDS[3]
DPID PDS
t (ms) Xmit Transmit Transmit Transmit Transmit
Sent Loop #
Index Count Count Count Count
25.0 0 1 1 0 to 2 0 0 N/A
37.5 1 2 2 1 0 to 2 0 N/A
50.0 2 3 3 0 1 0 to 2 0
62.5 3 4 4 0 0 1 0 to 24
75.0 0 1 5 0 to 2 0 0 23
87.5 1 2 6 1 0 to 2 0 22
100.0 2 3 7 0 1 0 to 2 21
112.5 3 1 8 0 to 2 0 1 20
125.0 1 2 9 1 0 to 2 0 19
137.5 2 3 10 0 1 0 to 2 18
150.0 3 1 11 0 to 2 0 1 17
162.5 1 2 12 1 0 to 2 0 16
175.0 2 3 13 0 1 0 to 2 15
187.5 3 1 14 0 to 2 0 1 14
200.0 1 2 15 1 0 to 2 0 13
212.5 2 3 16 0 1 0 to 2 12
225.0 3 1 17 0 to 2 0 1 11
237.5 1 2 18 1 0 to 2 0 10
250.0 2 3 19 0 1 0 to 2 9
262.5 3 1 20 0 to 2 0 1 8
275.0 1 2 21 1 0 to 2 0 7
287.5 2 3 22 0 1 0 to 2 6
300.0 3 1 23 0 to 2 0 1 5
312.5 1 2 24 1 0 to 2 0 4
325.0 2 3 25 0 1 0 to 2 3
337.5 3 1 26 0 to 2 0 1 2
350.0 1 2 27 1 0 to 2 0 1
362.5 2 3 28 0 1 0 to 2 0
375.0 3 4 29 0 0 1 0 to 24
387.5 0 1 30 0 to 2 0 0 23
request less than the maximum number of periodic DPIDs allowed in the PDS). Verify the negative
response ($7F $AA $31). Repeat this step for each supported periodic rate.
10. Verify that it is possible to periodically schedule all supported DPIDs in the ECU.
11. Send a periodic request with no DPIDs, verify negative response ($7F $AA $12). Repeat for each periodic
rate supported.
Procedure 3:
1. Verify that periodically sent items (DPIDs) can be stopped individually with Service $AA sub-function
parameter $00 which includes DPIDs to be stopped. Verify that DPIDs in request are stopped and that
DPIDs which are not in the request (but in the PDS) continue to be sent. Verify proper positive response.
2. Verify that all the periodic scheduler items can be stopped with Service $AA sub-function parameter $00
(sent without any DPIDs). Verify proper positive response and that no scheduled DPIDs are sent after the
positive response.
3. Send a request with a sub-function parameter equal to $00 and additional DPIDs in the request such that
the number of DPIDs exceeds the maximum number that can be scheduled. Verify the proper negative
response ($7F $AA $12).
Procedure 4:
1. Request a number of DPIDs to be sent periodically at one supported rate. Request additional DPIDs to be
sent at another supported rate (Not equal to the first rate). Repeat until DPIDs are sent with all supported
rates simultaneously. Request one valid DPID as One-shot with service $AA sub-function parameter $01.
Verify responses, timing.
2. Request a number of DPIDs to be sent periodically at one supported rate. Request additional DPIDs to be
sent at another supported rate (Not equal to the first rate). Repeat until DPIDs are sent with all supported
rates simultaneously. Request Maximum number of (valid) DPIDs as One-shot with service $AA sub-
function parameter $01. Verify responses, timing.
3. Request a number of DPIDs to be sent periodically at one supported rate. Request additional DPIDs to be
sent at another supported rate (Not equal to the first rate). Repeat until DPIDs are sent with all supported
rates simultaneously. Request the same DPIDs which are scheduled as One-shot with service $AA
sub-function parameter ($Level) $01 without stopping the PDS. Verify proper one-shot responses, timing.
Verify that proper scheduling is maintained.
Procedure 5:
1. Send a service $AA without sub-function parameter and DPID parameters. Verify negative response ($7F
$AA $12).
2. Verify that a service $AA request with all non-supported sub-function parameters is negatively responded
to with a negative response ($7F $AA $12).
Procedure 6: (Additional checks for ECUs that support dynamic DPIDs.)
1. Verify that a dynamic DPID can be redefined using the service $2C while that DPID is currently in the
periodic scheduler. Verify that the data is correct for the newly defined DPID by the second transmission of
that DPID after the $2C positive response. (The first response of that DPID may be invalid since the DPID
may have already been queued for transmission prior to the redefinition).
2. Request a dynamic DPID prior to defining its contents via the $2C service. Verify that a positive response
is sent with no data after the DPID number.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
3. Repeat step 2 for all supported one shot and periodic rates.
Procedure 7: (Additional checks if the ECU supports negative response code $78.)
1. Create conditions under which the ECU should return the $7F $AA $78 response. Send a valid request for
this service (including applicable sub-function parameter) and verify that the $7F $AA $78 response is
received followed by the appropriate final response within the P2 C* timing window.
2. Repeat step 1 of this procedure for each possible reason an ECU would send the negative response with
response code $78. Verify this for each applicable supported sub-function parameter.
8.19.8 Tester Implications. It is recommended that a tester use this service with physical addressing.
Functionally addressed requests for this service may result in unwanted negative response messages from
one or multiple ECUs.
Positive response(s) to this service are formatted as UUDT messages. Since it is possible for multiple UUDT
responses to be sent as a result of a single request, the tester must ensure that it properly handles the timing
requirements outlined in the description section of this service for each available sub-function.
The test device shall send a Service $3E message at least once every P3C ms when using any of the periodic
rates of service $AA, otherwise the device will exit the periodic transmission as if receiving a Service $AA
sub-function parameter $00 request (without DPIDs).
© Copyright 2010 General Motors All Rights Reserved
If a tester sends a periodic request with multiple copies of the same DPID in the request, and the DPID (which
was included more than once) is not currently in the PDS, then the tester may receive a $7F $81 (scheduler
full) negative response (based on the number of open items in the PDS at the time of the request).
8.20 DeviceControl ($AE) Service. The purpose of this service is to allow a test device to override normal
output control functions in order to verify proper operation of a component or system, or to reset/clear variables
used within normal control algorithms. The tool may take control of multiple outputs simultaneously with a
single request message or by sending multiple device control service messages.
8.20.1 Service Description. Device control is performed by manipulating predefined bits and/or bytes within a
message to indicate to the device which output(s) or control function(s) the tool wants to override. When a
CPID is defined with multiple output controls, the ECU shall support simultaneous control of multiple outputs
contained in that CPID as part of a single diagnostic request.
Note: Certain combinations of outputs may not be allowed to be controlled at the same time due to safety or to
avoid product damage. Any such restrictions shall be negotiated between the DRE, service and manufacturing
engineering and documented in a CTS, SSTS, or supplemental diagnostic specification referenced by either of
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
a CTS or SSTS. The type of DeviceControl restrictions enforced (service or Assembly plant) shall remain
unaffected if a DeviceControl restriction is exceeded. Refer to the SecurityAccess ($27) and the
ReturnToNormalMode ($20) service descriptions within this specification for additional details on how the type
of DeviceControl restriction is determined.
Upon receiving a DeviceControl request message, an ECU shall normally inhibit the setting of Diagnostic
Trouble Codes (DTCs). This is done to prevent DTCs from setting as a result of the off board testers
modifications to the normal output control algorithms. Once DTCs are inhibited, they will remain inhibited until
a TesterPresent ($3E) timeout occurs or until a ReturnToNormalMode ($20) service request is received. In
order to facilitate vehicle manufacturing needs to quickly diagnose vehicles during the assembly process,
certain ECUs shall be required to keep diagnostic algorithms active while DeviceControl functions are active.
The tester can keep the diagnostic algorithms active during DeviceControl by sending the appropriate
InitiateDiagnosticOperation (service $10) request prior to activating DeviceControl. See service $10 for more
information.
This service requires that a TesterPresent ($3E) service be sent at least once every P3 C ms or the device will
cancel all active device controls and resume normal control of its outputs.
If a device has any CPIDs which are used during SPS programming, are required for theft related functions
(e.g., deterrent key re-learn), or are somehow safety related, the device must then support the SPS security
levels of the SecurityAccess ($27) service.
A given device control is allowed to be packed into more than one CPID if necessary to meet test timing
requirements. If a given device control is in more than one CPID, the actions requested by the last message
containing that device control shall remain active.
All device controls shall be terminated if any of the following occur:
A TesterPresent (P3C) time-out occurs.
A device control request is received with a CPID number of $00.
A device control limit is exceeded on any active device control.
A ReturnToNormalMode($20) request message is received.
The device is powered down.
An individual device control can be terminated in the following manner:
1. A device control request is received with the same CPID number and the enabling criteria turned off.
2. Any of the criteria listed above to cancel all device controls are met.
Note: ECU normal control algorithms determine the state of a given output once the appropriate DeviceControl
has been terminated (unless the termination is the result of an ECU power down).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
This service shall be allowed while other diagnostic services are also active (e.g., diagnostic periodic data
scheduler, etc.) If data is requested which includes the state of a node’s outputs while those outputs are under
device control, the data representing the output state shall reflect its commanded state. In other words, if a
node’s normal output control algorithm is commanding an output to the off state and a DeviceControl request is
processed which turns that same output to the on state, periodic or other data containing the state of the
output shall indicate that the output is on.
8.20.2.1 Request Message Sub-Function Parameter $Level (LEV_) Definition. This service does not use a
sub-function parameter.
8.20.2.2 Request Message Data Parameter Definition. Table 209 specifies the data parameter definitions for
this service.
8.20.4 Supported Negative Response Codes (RC_). The following negative response codes shall be
implemented for this service. The circumstances under which each response code would occur are
documented in Table 212.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
8.20.5 Message Flow Example DeviceControl. The example in this section will show how a tool could send
device control messages to a Powertrain Control Module (PCM) to control two of its outputs.
8.20.5.1 DeviceControl Example Data. The output control mapping is based on the CPID control byte
definitions in Tables 213 and 214, and the brief descriptions that follow:
Based on the above definition, CPID $01 contains 5 bytes of control data. CPID $01 allows the tool to take
control of the Idle Air Control (IAC) motor by placing a 1 in bit 0 of byte 2, and then command a pintle position
or desired engine idle speed (based on the value of byte 2 bit 1) by placing the appropriate value in byte 5. The
unused bits/bytes are ignored for the purposes of the examples in this section.
Based on the above definition, CPID $02 contains 4 bytes of control data. CPID $02 allows the tool to take
control of the Exhaust Gas Recirculation (EGR) Valve by making bit 0 of byte 1 a 1, and then placing a value
corresponding to the desired duty cycle to the valve in data byte 3. The unused bits are ignored for the
purposes of the example in this section.
The example in this section also assumes the following:
The point-to-point request CAN Id for the PCM is $241.
The USDT response CAN Id for the PCM is $641.
The PCM has a device control restriction built in which will not allow the tool to command an idle speed
above 1000 rpm if the vehicle is in gear.
The value of the 2-byte reject code for the rpm limitation while the vehicle is in gear is $0902.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
8.20.5.2 DeviceControl (EGR and IAC Control). In this example (Tables 215 thru 217), the tool will send a
series of messages to verify the EGR system. The tool will request the PCM to raise the desired idle speed to
1500 rpm and after the rpm has stabilized at the commanded value, the tool will send a second request to
open the EGR valve by requesting a 50% duty cycle. The TesterPresent ($3E) messages will not be shown in
the example but are assumed to be sent. The message to monitor the engine speed are also not shown in this
example but are assumed to be sent on the bus.
After the idle speed reaches 1500 rpm and stabilizes the following messages are sent:
At this point the PCM will keep the IAC RPM device control active and command the 50% duty cycle to the
EGR valve. The IAC RPM command is kept active because the last device control command received for
CPID $01 included the IAC RPM device control and the tester present messages are being sent per the
assumptions.
Assume that some time has elapsed and then the operator in the vehicle bumps the gear shift lever resulting in
the lever being moved to the overdrive position. The ECU will cancel the IAC RPM and EGR device controls
(returning control of those outputs to the PCM) and send the following unsolicited response message to the
tool:
Variable/Meaning Values
Secure_CPID YES/NO
This is a flag which is used to keep track of whether or not the requested CPID
is one which requires security access.
Valid_CPID_Data_Length YES/NO
This is a flag which is used to keep track of whether or not the number of
control bytes in the request message is valid.
Valid_Msg_Length YES/NO
This is a flag used in the initial message length check which verifies that the
request is a single frame and includes at least a CPID number.
SecurityCodeAccess_CPID YES / NO
This is a flag which is used to keep track of whether or not the requested CPID
is one which requires security code access.
IF ((Valid_CPID = NO) OR
((Secure_CPID = YES) AND (Security_Access_Unlocked=FALSE)) OR ((SecurityAccessCode_CPID =
YES) AND (Security_Access_Allowed=FALSE))) THEN
send Negative Response ($7F $AE $31) /* Request Out Of Range. */
ELSE IF (Valid_CPID_Data_Length = NO)
send Negative Response ($7F $AE $12) /* Invalid Format. */
/* Note: there is a flag in mode $27 (DeviceContol_Security_Level) which is used to determine if the
assembly plant or service device control restrictions apply */
ELSE IF (($CPID attempts to control outside device’s acceptable range) OR (Device conditions prohibit
requested control)) THEN
send Negative Response ($7F $AE $E3 $xx $yy) /*Device Control Limits Exceeded*/
Dev_Cntrl_Active NO
Set all the individual device control status flags to FALSE.
ELSE IF ($CPID = $00) THEN
Dev_Cntrl_Active NO
Set all the individual device control status flags to FALSE
Send ($EE $00 )
ELSE
TesterPresent_Timer_State ACTIVE
IF (the following logic cannot be completed within P2C ms.) THEN
send a Negative Response ($7F $AE $78) /*RequestCorrectlyReceived-ResponsePending */
ENDIF
Send ($EE $CPID)
Dev_Cntrl_Active YES
IF (DTCs_Enabled_In_Device_Control = NO) THEN
Diag_Services_Disable_DTCs TRUE
ENDIF
Set the appropriate device control status flags which are used by the
individual control functions to TRUE.
ENDIF
ENDIF
ENDFUNCTION
/* The following logic is executed in a background loop and can also be called based on a TesterPresent $3E
timeout or upon receipt of a ReturnToNormalMode ($20) service request. */
BEGINFUNCTION Background_DeviceControl_Logic( )
IF ((Dev_Cntrl_Active = YES) AND (request_DeviceControl_exit = NO)) THEN
/* Note: there is a flag in mode $27 (DeviceContol_Security_Level) which is used to determine if the
assembly plant or service device control restrictions apply */
IF (Device conditions are outside of device’s acceptable range) THEN
send a Negative Response ($7F $AE $E3 $xx $yy) /* Device Control Limit Exceeded */
Dev_Cntrl_Active NO
set all the individual device control status flags to FALSE
ELSE
remain in device control
ENDIF
ELSE IF ((Dev_Cntrl_Active = YES) AND (request_DeviceControl_exit = YES)) THEN
request_DeviceControl_exit NO
Dev_Cntrl_Active NO
set all the individual device control status flags to FALSE
ENDIF
ENDFUNCTION
8.20.7 Node Verification Procedure.
Procedure 1:
1. Send a $AE message with less than two data bytes (no CPID in request) and verify the $7F $AE $12
response.
2. Send a multiple frame $AE message and verify $7F $AE $12 response.
3. Send a $AE message with an invalid number of control bytes for a given CPID and verify the $7F $AE $12
response.
4. Send a $AE message with an unsupported CPID and verify $7F $AE $31 response.
5. Send a $AE message with a secure CPID (if applicable) with with the manufacturers enable counter = $00
or vulnerability flag < $FF and security has not been accessed (SecurityAccess ($27) request has not been
sent) and verify $7F $AE $31 response.
6. Send a $AE message with a secure CPID (if applicable) when the manufacturers enable counter > $00 or
vulnerability flag = $FF and security has not been accessed (SecurityAccess ($27) request has not been
sent) and verify $7F $AE $31 response.
7. Send a $AE message with a secure CPID (if applicable) when the manufacturers enable counter > $00 or
vulnerability flag = $FF and security has been accessed (SecurityAccess ($27) request has been sent) and
verify the appropriate positive response.
8. Send a $AE message with a security code required CPID (if applicable) with the security code (as defined
in the Vehicle Theft Deterrent SSTS) has not been entered and verify $7F $AE $31 response.
9. Send a $AE message with a security code required CPID (if applicable) when the security code has been
entered and verify the appropriate positive response.
Procedure 2:
1. Send a $AE message with a valid CPID and data and verify the activation of device control. Repeat this
step for each device control function supported.
Procedure 3:
1. Send a $AE message with CPID of $00 while device control is active, verify that active device control
function(s) are cancelled.
2. Repeat Item 1 for each device control supported.
3. Activate a device control function and then verify that the control function is cancelled after P3 Cmax ms
without any TesterPresent ($3E) messages sent on the bus.
4. Repeat Item 3 for each device control supported.
Procedure 4:
1. Send a $AE message with a valid CPID and data, cause a device control limit to be exceeded, verify $7F
$AE $E3 $xx $yy (limit exceeded) response. Verify that the values of $xx and $yy are correct for the limit
which was exceeded.
2. Repeat step 1 for each possible device control restriction.
Procedure 5:
1. Send a valid device control command without the InitiateDiagnosticOperation ($10) service active. Create
a fault condition and verify that no DTC is set (via the $A9 service) for the fault condition created.
2. Send the appropriate InitiateDiagnosticOperation ($10) request (if applicable) to allow DTC algorithms to
run while DeviceControl is active. Activate a device control and then create a fault condition and verify that
the appropriate DTC is logged (via the $A9 service).
Procedure 6: (For Devices that support Device Control Security Access for Restriction Overrides.)
1. Access the device control security level (via $27 service) and repeat procedure 4 for each device control
that has a manufacturing restriction that differs from the service restriction and verify that device controls
remain active and that no negative response is sent.
2. After step 1 above, send no messages for P3C and verify that all device controls are cancelled. Then
repeat step 1 of procedure 4 (for a single device control) and verify that the device control restrictions are
enabled.
Procedure 7: (Additional checks if the ECU supports negative response code $78.)
1. Create conditions under which the ECU should return the $7F $AE $78 response. Send a valid request for
this service (including applicable CPID and device control parameters) and verify that the $7F $AE $78
response is received followed by the appropriate final response within the P2 C* timing window.
2. Repeat step 1 of this procedure for each possible combination of device control and RC = $78 reason.
8.20.8 Tester Implications. If DTCs are inhibited as a result of this service, a $20 service request message or
TesterPresent timeout shall be required to re-enable the DTC logic.
This service should only be requested using physical addressing.
SPS_TYPE_B and SPS_TYPE_C ECUs are programmable ECUs that are missing some element of their full
combination of operational software and calibrations, or are executing boot software due to a memory error. An
ECU which is missing calibrations (or is missing operational software and calibrations) may, or may not, have
permanent diagnostic CAN Identifiers preprogrammed. An SPS programmable ECU which is not fully
programmed and is used on a single platform would most likely have its permanent diagnostic CAN Identifiers
preprogrammed. An SPS programmable ECU which is not fully programmed and can be used in multiple
platforms, may not have the permanent diagnostic CAN Identifiers preprogrammed unless all of the platforms
can standardize the CAN Identifiers used by that ECU (or multiple parts are released to accommodate the
differences in CAN Identifiers between platforms). An SPS_TYPE_B ECU meets the above criteria and has its
permanent diagnostic CAN Identifiers preprogrammed. An SPS_TYPE_C ECU meets the above criteria and
does not have its permanent diagnostic CAN Identifiers preprogrammed. SPS_TYPE_B and SPS_TYPE_C
ECUs shall not attempt to participate in normal communication message exchange.
Note: An ECU executing boot software due to a memory fault is considered to be SPS_TYPE_B if permanent
diagnostic CAN Identifiers are comprehended in the boot software. If the permanent diagnostic CAN Identifiers
are not comprehended in boot software, then the ECU is considered SPS_TYPE_C.
If permanent diagnostic CAN Identifiers are preprogrammed, an SPS programmable ECU shall respond to all
diagnostic requests which contain one of the permanent diagnostic CAN Identifiers supported by the ECU
(SPS_TYPE_A and SPS_TYPE_B). If permanent diagnostic CAN Identifiers are not preprogrammed
(SPS_TYPE_C), the ECU shall not respond to diagnostic request messages until diagnostic responses are
enabled. While diagnostic responses are disabled, an SPS_TYPE_C ECU shall only receive and process (but
not respond to) diagnostic messages addressed to it with the AllNodes request CANId and an extended
address of AllNodes. The process of enabling diagnostic responses is described in section 9.1.1 of this
specification.
At the conclusion of a programming event, all ECUs on a given subnet shall perform a software reset.
Note: The software reset allows an ECU which was just programmed to begin executing the new operational
software and calibration data downloaded. In addition, the reset of all devices synchronizes the start-up of
normal communications.
A programming event is considered to have concluded upon receipt of a valid ReturnToNormalMode ($20)
request message, or if a TesterPresent timeout occurs. The tester must ensure that the TesterPresent service
messages are sent on all GMLAN subnets simultaneously (as close as possible) to ensure that all subnets
would exit a programming event at the same time should a TesterPresent timeout occur. The same logic
applies to the tester when sending a ReturnToNormalMode message to end a programming event.
9.1.1 Enabling Diagnostic Responses on SPS_TYPE_C ECUs. An SPS_TYPE_C ECU shall not send
positive or negative response messages for any diagnostic service until the programming tool enables them.
While diagnostic responses are disabled, the ECU shall only process (but not respond to) diagnostic requests
sent using the AllNodes request CANId and AllNodes extended address. Diagnostic responses shall become
enabled once the ECU receives a DisableNormalCommunication ($28) request followed by a
ReportProgrammedState ($A2) request. The SPS_TYPE_C ECU shall only respond to the $A2 request during
this sequence, and shall respond to all subsequent diagnostic requests until a TesterPresent timeout occurs or
a ReturnToNormalMode ($20) request is received.
Once an SPS_TYPE_C ECU has enabled diagnostic responses, it shall enable two special-case diagnostic
CAN Identifiers for programming purposes. The special case CAN Identifiers are defined as:
SPS_PrimeReq CANId = $0xx, where xx represents the ECU diagnostic address value. This CANId shall
be used as the point-to-point (PTP) request CANId.
SPS_PrimeRsp CANId = $3xx, where xx represents the ECU diagnostic address value. This CANId shall
be used as the USDT response CANId.
During the sequence to enable diagnostic responses, the SPS_TYPE_C ECU shall respond to the $A2 request
using the SPS_PrimeRsp ($3xx) CANId.
Diagnostic CAN Identifiers and normal mode message CAN Identifiers for a fully programmed ECU are part of
the calibration data downloaded to the ECU during a programming event. Upon completion of a software reset,
the now completely programmed ECU(s) shall recognize their specific CANId assignments for normal and
diagnostic messaging.
9.1.2 Information Contained Within The Utility File. A utility file is used to provide ECU step-by-step
programming instructions to a programming tool. The utility file concept was developed to keep the
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
proliferation of tool programming software to a minimum. A utility file is broken into 3 distinct sections; the
Header Information section, the Interpreter Instruction section, and a Routine section. The Header Information
section contains data that is typically constant during a programming event (e.g., the interpreter type which
defines the communications protocol used for programming). The Instruction section contains the Operation
Codes (op-codes) used by the programming tool to step through the programming event. The Routine section
contains ECU specific programming routines or programming algorithms (e.g., flash erase and write routines).
The Header Information section of the utility file includes data which defines the interpreter type. For GMLAN
controllers, the interpreter type indicates that the ECU resides on a GMLAN CAN protocol link (as opposed to
a Class 2 or KWP2000 link). The utility file does not contain any information which tells the programming tool
which GMLAN subnet the ECU resides on. The programming tool must determine subnet location of
programmable ECUs in the steps prior to the execution of a utility file. Refer to paragraph 9.4.1 for further
details on how the programming tool determines which subnet the ECU resides on.
The utility file does not contain ECU CANId information. The op-codes within the Interpreter instruction section
contain action fields which include the diagnostic address of a GMLAN ECU. Using the diagnostic address
within the utility file (instead of the CANId) allows a single utility file to be used on the same ECU across
multiple platforms where the CAN Identifiers could not be standardized. The identification of CAN Identifiers
assigned to the target ECU(s) must be determined in the steps prior to the execution of a utility file. Refer to
paragraph 9.4.1 for further details on how the programming tool correlates the diagnostic address to the
appropriate request and response diagnostic CAN Identifiers.
All diagnostic services executed via utility file instructions shall be physically addressed to the ECU to be
programmed to allow for parallel programming. See paragraph 9.4 for more details.
9.2 Requirements for All ECUs to Support Programming. The following applies to all ECUs on the link (not
limited to the node actively being programmed):
The ProgrammingMode ($A5) service shall be used by the ECU to recognize the start of a programming
event.
1. During a programming event, ECUs shall default their physical input/output (I/O) pins (wherever possible
and without risk of damage to the ECU/vehicle and without risk of safety hazards) to a predefined state
which minimizes current draw.
2. ECUs shall ensure that they can handle 100% bus utilization at any allowed programming baud rate
without dropping frames during the programming event. An ECU may need to modify its hardware
acceptance filtering to only receive the AllNodes CANId (non-programmable ECU), or the AllNodes CANId
and either the diagnostic point-to-point CANId or SPS_PrimeReq CANId (for programmable ECUs) in
order to meet this requirement.
The DisableNormalCommunication ($28) service shall be used by the ECU to recognize the disabling of
normal communication and to ensure that an ECU does not set DTCs while another ECU is being
programmed. This includes not only disabling the transmission of normal communication messages, but
also disabling the processing of any received normal communication messages.
Note: There may be some vehicle link configurations where a mode $10 request must be sent prior to the
Mode $28 to ensure no DTCs are set when normal mode is disabled.
The receipt of a ReturnToNormalMode ($20) request shall be used by the ECU to conclude an active
programming event. At the conclusion of a programming event, each ECU shall perform a software reset,
and all fully programmed ECUs shall resume normal communications (including re-enabling DTCs). For
special issues regarding resets for MSSC devices, see paragraph 4.3.4.
The TesterPresent ($3E) service shall be used by the ECU to recognize that the active programming event
is still in process.
The ReadDataByIdentifier ($1A) service and the DataIdentifier $B0 (diagnosticAddress) shall be supported
by the ECU in order to provide the tester its diagnostic address. The diagnostic address information in
conjunction with the ECU CAN Identifiers is used by the tester to recognize the correct response(s) of the
ECU(s) connected to the GMLAN subnets during the Pre-Utility File Process. MSSC ECUs shall support
this functionality on each GM LAN subnet they are connected to. SPS_TYPE_C ECUs are not required to
report the diagnostic address when executing out of the boot software as this information can be obtained
from the SPS_PrimeRsp CANId.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Note: An ECU that was SPS_TYPE_C prior to being successfully programmed is required to be capable of
reporting its diagnostic address once it is fully programmed and executing operational software.
The programming tool shall be able to connect to the DLC with the vehicle in any power mode without
causing damage to any ECU or components attached to the physical I/O pins of any ECU.
The sequence of signals during connection to the DLC shall not cause any degradation in performance or
damage to the ECU or components attached to the physical I/O pins of any ECU.
All ECUs shall meet the frame padding requirements as outlined in paragraph 4.6 of this specification.
9.3 Requirements for SPS Programmable ECUs to Support Programming.
9.3.1 Hardware Requirements. All ECUs that are SPS programmable must be able to interface with the
programming tools used by development, the assembly plant, and by service via the appropriate GMLAN pins
of the vehicle 16-pin DLC specified in GM J1962. The only power required at the DLC for programming shall
be vehicle battery power.
Any ECU that is properly installed in the vehicle and is SPS programmable shall be able to be programmed via
the DLC. It shall not be required to remove the ECU from the vehicle in order to perform programming.
9.3.1.1 Memory Requirements.
The ECU memory shall be permanently affixed (non-removable) to the circuit board.
There are three different types of memory required that can be categorized into the following retention levels.
Examples of memory that is typically used for each memory type is given in parenthesis. All voltage levels (Vp)
are at the ECU connector and apply to the primary power pin.
1. Type 1 memory (typically RAM) contents shall be capable of being retained while
(Vp) is ≥ 9.0 VDC.
The ECU shall be capable of reading and writing to Type 1 memory with
9.0 VDC ≤ (Vp) ≤ 16.0 VDC.
An ECU must provide enough Type 1 memory to hold the programming routines and provide adequate
buffer space to meet the programming timing requirements specified in the General Assembly
Programming And Test section of the GM Bill Of Process (BOP).
2. Type 2 memory (typically EEPROM) contents shall be retained at all times even without (V p) voltage
present.
The ECU shall be capable of reading and writing to Type 2 memory with
9.0 VDC ≤ (Vp) ≤ 16.0 VDC.
The number of erase/write cycles shall be documented in a CTS or SSTS. Type 2 memory used solely for
programming (i.e., not updated by operational software during normal vehicle operation) requires a
minimum of 500 erase/write cycles.
3. Type 3 memory (typically Flash) contents shall be retained at all times even without (V p) voltage present
and it shall be protected from unauthorized erasure or modification.
The ECU shall be capable of reading Type 3 memory with
9.0 VDC ≤ (Vp) ≤ 16.0 VDC.
It shall be possible via the GMLAN bus to erase and program the contents of Type 3 memory of an ECU
with 9.0 VDC ≤ (Vp) ≤ 16.0 VDC.
The number of programming cycles shall be documented in a CTS or SSTS. Type 3 memory used solely
for programming (i.e., not updated by operational software during normal vehicle operation) requires a
minimum of 100 erase/write cycles.
Note: The voltage levels for retaining memory contents specified in this section are for use during a
programming event. Product performance requirements will most likely result in more stringent requirements.
9.3.2 Software Requirements. An SPS_TYPE_A ECU shall be capable of reporting the base model part
number (DIDs $CC/$DC), end model part number (DIDs $CB/$DB), and all supported software module part
numbers (DIDs $C1 thru $CA/$D1 thru $DA, plus $DD and any application specific DIDs if more than
10 software/calibration parts exist) via the ReadDataByIdentifier ($1A) service. Support of other DIDs (e.g.,
$92, $97, $98, $99) is optional and shall be specified in the CTS if needed.
9.3.2.1 Operational Software. If the operational software is programmable via SPS, then the operational
software shall be capable of being programmed separately from the calibrations. This allows for assembly
plant programming of only calibrations. Deviations from this requirement must be agreed upon by appropriate
release responsible engineer, service operations and manufacturing representatives and shall be documented
in the CTS.
The operational software shall have its own unique identifier retrievable via the ReadDataByIdentifier ($1A)
service.
9.3.2.1.1 Requirements for SPS ECUs Where Operational Software Is Not Programmable. SPS_TYPE_C
ECUs executing operational software (only valid if operational software is not programmable via SPS) shall be
able to receive diagnostic messages using the AllNodes request CANId with AllNodes extended address. SPS
Programmable ECUs with preprogrammed permanent diagnostic CAN Identifiers (SPS_TYPE_A or
SPS_TYPE_B) shall also be able to receive messages addressed with its PTP request CANId. SPS_TYPE_C
ECUs (which do not have preprogrammed permanent diagnostic CAN Identifiers) shall respond to requests
sent with the SPS_PrimeReq ($0xx) CANId once diagnostic responses have been enabled.
An ECU shall be capable of using the same diagnostic CAN Identifiers for the duration of a programming
event. This means that an ECU which stores the permanent diagnostic CAN Identifiers in calibration and is
fully programmed at the beginning of a programming event (SPS_TYPE_A ECU) shall use the permanent
diagnostic CAN Identifiers even after the calibrations have been erased. The operational software is not
required to retain the permanent diagnostic CAN Identifiers if the programming event is interrupted prior to its
completion and the ECU has performed a software reset.
An ECU that is only capable of calibration programming (e.g., the operational software is part of ROM and
calibrations stored in EEPROM) shall have in the operational software the equivalent functionality specified for
the boot software in the subsequent sections of this chapter.
9.3.2.2 Calibrations. Calibrations shall be capable of being programmed separately from the operational
software. This allows for assembly plant programming of only calibrations. Deviations from this requirement
must be agreed upon by appropriate release responsible engineer, service operations and manufacturing
representatives and shall be documented in the CTS.
Each calibration module shall have its own unique identifier retrievable via the ReadDataByIdentifier ($1A)
service.
The ECU shall support either one or both of the following methods of programming calibrations.
Programming an individual calibration module.
Programming multiple (or all) of the calibration modules during a single programming event.
9.3.2.3 Boot Software Description and Requirements. All SPS programmable ECUs that support
programming of the operational software shall contain boot software in a boot memory region. ECUs that
support boot software shall continue to execute out of the boot until a complete set of Operational software and
calibrations are programmed.
The boot memory shall be protected against inadvertent erasure such that a failed attempt to modify program
calibrations or operational software does not prohibit the ability of the ECU to recover and be programmed
after the failed attempt. The ECU shall be able to recover and be reprogrammed if any of the following error
conditions occur during the programming process.
1. Loss of supplied power connection.
2. Loss of the ground connection.
3. Disruption of GMLAN communication.
4. Over or under voltage conditions.
Boot software resides in the boot memory region and is the software that an ECU begins executing upon
powerup. Transfer of program control to the boot software also occurs once the ECU is informed that it is
about to be programmed (refer to the $34 service). All SPS Programmable ECUs operating out of Boot
memory shall not transmit any normal communication messages or any unsolicited diagnostic messages.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
The boot software can be broken down into the following components: Power Management, System
Initialization, Message Handler, Programming Executive/Program Loader, Diagnostic Service Manager, and
Programming Routines. See Figure 36.
9.3.2.3.1 Boot Software Power Management. The power management portion of the boot software handles
the wake-up mechanism supported by the ECU (if applicable). The wake-up mechanism for SWCAN ECUs is
defined in GMW3104. Dual Wire CAN (DWCAN) ECUs that support a wake-up mechanism must document the
mechanism used in the CTS.
The power management component of the boot software also interfaces with the programming executive. If the
programming executive does not detect the start of a programming event within 1 minute of the receipt of a
wake-up, then the programming executive shall inform the power management logic which in turn shall cause
the ECU to enter the low power state.
The start of a programming event is defined to be the point where the programming_mode_active flag is set to
YES. Refer to paragraph 8.17.6.2 (service $A5 pseudo code) for additional details. Once the programming
event has started, the ECU shall remain awake until the programming event concludes (via the receipt of the
$20 service or a P3C timeout). The ECU shall perform a software reset at the conclusion of the programming
event.
9.3.2.3.2 Boot Software System Initialization. The system initialization component of the boot software is
responsible for ECU initialization upon powerup or after a reset. Tasks of this component include (but are not
limited to) I/O initialization and determining if valid operational software and calibrations are present in the
ECU. The system initialization software shall be able to determine if the ECU has only boot software present,
boot software and operational software present, or if boot software, operational software and calibrations are
all present. The exact method used to determine if valid operational software and calibrations are present must
be documented in a CTS, GM provided bootloader specification or ECU specific diagnostic implementation
specification. If valid operational software and calibrations are present, then the system initialization
component completes its initialization and transfers control to the operational software. Otherwise, the ECU
transfers program control to the boot software programming executive or program loader.
If valid operational software and calibrations are not present, then the initialization component of the boot
software shall initialize the ECU I/O in a manner that meets the requirements specified in paragraph 9.2.
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
9.3.2.3.3 Boot Software Message Handler. The boot software message handler is responsible for
transferring information between the programming tool and the boot software programming executive. Included
in this component of the boot software are the CAN driver, the CAN hardware message filtering logic, support
of the Network Transport Layer, and high speed support for SWCAN ECUs.
The Network Layer supported in the ECU boot software shall maximize the size of the network layer buffer and
minimize the size of the network layer parameter ST min to maximize the efficiency of data block transfers. The
ECU shall allocate some or all of its RAM resources used for normal operation for the network layer buffer
when operating out of the boot code. The value of STmin during normal operation can be different than the
value used during programming.
The CAN hardware message filtering logic in the boot software shall meet the requirements specified in
paragraph 9.2 - Requirements for All ECUs to Support Programming.
9.3.2.3.4 Boot Software Programming Executive and Program Loader. The boot software programming
executive coordinates the sequence of events during a programming session. The programming executive has
knowledge of the memory map including the allowed application program area, RAM location, and logic for
handling flash sectors (if applicable).
The programming executive keeps track of the various software and calibration modules, their starting
address, length, and checksum. The executive interfaces with the boot software diagnostic service manager
and the boot software message handler to verify incoming data from the programming tool and to provide
responses to the programming tool. The executive handles transferring the programming routines to RAM and
interfaces with the programming routines to transfer the software and calibration modules to permanent
memory.
During the download of a data file (operational software or calibration data) the programming executive
interfaces with the programming routines to verify the successful erase/write performed on a section of
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
memory, The programming executive shall also perform a verification of successful programming at the
conclusion of each downloaded software or calibration module (data file) by calculating a running checksum or
CRC as a module is being downloaded. When the last TransferData request of a module has been processed
(confirmation from the programming routine that the data was successfully written to permanent memory), the
programming executive shall compare the checksum or CRC against the value in the product memory file
header (refer to paragraph 9.3.3.1). If the calculated value does not match the value in the product memory file
header, a negative response shall be sent indicating a programming fault (Negative response code $85
General Programming Failure). The method used to calculate the checksum or CRC of the data files shall be
specified in a CTS, SSTS, supplemental diagnostic specification, or bootloader specification referenced by
either the CTS or SSTS.
The programming executive is also responsible for performing compatibility checks (if required) to ensure that
the operational software will work with the bootloader and that each calibration data file is compatible with the
operational software that is programmed in the ECU. Performing compatibility checks prevents the possibility
of continuous running resets due to a mismatch in the data files (e.g., calibration file size changes due to
software change and programming done with new software module and old calibration file) which can leave
the part unrecoverable. The programming executive performs the compatibility checks using the DCID values
as defined in paragraph 9.3.3.1. For an operational software file the DCID in the data file header is compared
against a constant stored in the bootloader. If the two compatibility values do not match, the data file is not
downloaded to permanent memory. For calibration data files the DCID is compared against a corresponding
value in the operational software header (e.g., DCID_am1) and if the two do not match the data file is not
downloaded to permanent memory. Any compatibility check failure shall result in a negative response
message with response code $85 General Programming Failure. The appropriate CTS, SSTS, supplemental
diagnostic specification, or bootloader specification referenced by either the CTS or SSTS shall document
whether or not compatibility checks are required for a particular ECU and any additional requirements relative
to their values or implementation.
When the programming executive detects the end of the programming event (e.g., a service $20 request is
received or a P3C timeout occurs), it shall inform the message handler to reset back to the normal baud rate (if
applicable for SWCAN) and trigger a software reset. The executive also interfaces with the power
management component of the boot software to allow an ECU to run out of the boot software to enter a low
power state if a programming event has not begun within 1 minute of a wake-up or power being applied to the
ECU.
The programming executive may reside in boot memory or it may be contained within the routine section of the
ECU utility file, downloaded into RAM, and then executed. The advantage of placing the programming
executive in RAM is that it allows the boot to be smaller and it also allows updates to the programming
executive without requiring a new hardware part. The disadvantage to this approach is a slight increase in
programming time in order to transfer the programming executive to RAM via the serial data bus and begin its
execution. If the programming executive is located in the utility file then a portion of the programming executive
(called the program loader) remains in the boot memory. The program loader component gets program control
from the boot software initialization component if some portion of the software or calibration data is not present
in the ECU. The program loader interfaces with the power management component to allow an ECU to enter a
low power state if no programming session has been established within 1 minute of a wake-up. The program
loader also interfaces with the boot software diagnostic service manager and the boot software message
handler in order to receive the download of the programming executive, and then transfer program control to
the programming executive. If the programming executive resides in boot memory then the program loader
and programming executive are considered as one component. See Figure 36.
9.3.2.3.5 Boot Software Diagnostic Service Manager. The boot software diagnostic service manager
contains the logic for handling diagnostic requests and responses during programming. The level of support of
diagnostic services within the boot shall be minimized in order to keep the size of the boot software as small as
possible. Refer to paragraph 9.3.2.4 for specific requirements on the implementation of diagnostic services
within the boot software.
The diagnostic service manager interfaces with the boot software programming executive which controls the
sequence of events during programming.
9.3.2.3.6 Boot Software Programming Routines. The boot software programming routines are those
hardware specific routines needed to program the ECU permanent memory. Examples include memory erase,
memory write, routines to turn programming voltage on or off, and checksum calculation routines. These
routines provide pass or fail indications back to the boot software programming executive so that it can make a
decision whether or not to continue the programming event.
At the end of writing/erasing a section of memory, the memory that has been erased/written to shall be
checked to ensure that it was done successfully. The success or failure of the erase/write operation(s) shall be
communicated back to the programming executive. The programming executive shall then interface with the
diagnostic service manager and the message handler to communicate the result to the programming tool in the
form of a TransferData ($36) positive response message or through a negative response ($7F) message
including the appropriate response code (other than response code $78).
Although the programming routines can technically either reside in the boot software or in the routine section of
the programming Utility File, it is recommended that these routines be stored in the Utility File to minimize the
size of the boot software.
If the programming routines are stored in the Utility File and more than one supplier of permanent memory
exists for that type of programmable ECU, then the Utility file shall contain all of the programming routines for
all types of permanent memory allowed.
9.3.2.3.7 Boot Software General Requirements. All ECUs operating out of boot memory shall be able to
receive diagnostic messages using the AllNodes request CANId with AllNodes extended address. SPS
Programmable ECUs with preprogrammed permanent diagnostic CAN Identifiers (SPS_TYPE_A or
SPS_TYPE_B) shall also be able to receive messages addressed with its PTP request CANId. SPS_TYPE_C
ECUs (which do not have preprogrammed permanent diagnostic CAN Identifiers) shall respond to requests
sent with the SPS_PrimeReq ($0xx) CANId once diagnostic responses have been enabled.
An ECU shall be capable of using the same diagnostic CAN Identifiers for the duration of a programming
event. This means that an ECU which is fully programmed at the beginning of a programming event
(SPS_TYPE_A ECU), shall use its permanent diagnostic CAN Identifiers during the programming event even if
the boot code only contains the SPS_Prime CANIds. To accomplish this, the permanent diagnostic CAN
Identifiers must be provided to the boot software from the normal operational software when program control is
transferred back to the boot software. The boot software is not required to retain the permanent diagnostic
CAN Identifiers passed from the operational software if the programming event is interrupted prior to its
completion and the ECU has performed a software reset (this is valid if the boot software only supports the
SPS_Prime CAN Identifiers).
The boot software shall be protected. The boot software can be protected via hardware (e.g., via settings in a
control register which prevents certain sectors of the memory from being erased or written to) or software (e.g.,
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
address range restrictions in the programming routines). It is recommended that the boot software is not
capable of being modified by the same programming erase/write routines that are used to modify the
operational software and calibrations. Programming the boot software as part of the SPS programming
process may be allowed provided that a mechanism is in place to ensure that there is no possibility that the
ECU could fail at a point in the programming process where it cannot recover and be programmed with a
subsequent programming event. The ECU supplier and the appropriate GM Engineer(s) (Release, Service,
and Manufacturing) must review the mechanism implemented and agree that it meets the requirements if the
boot is to be programmed as part of the SPS process. If the boot software can be reprogrammed as part of the
SPS process, then the boot software should be a unique software module with a unique part number.
Changes to the boot software in a production ECU shall result in a change to the ECU hardware part number
(DID $CC) in a module where the boot software is not reprogrammable via the SPS system (e.g., the boot may
be capable of being modified at the supplier). However, changes to the boot software in a production ECU
shall not result in a change to the ECU hardware part number (DID $CC) in a module where the boot software
is reprogrammable via the SPS system. The part number of the software module containing the boot software
would reflect the change to the boot software.
9.3.2.4 Boot Software Diagnostic Service Requirements. The following are GMLAN Enhanced Diagnostic
Service requirements for the boot software diagnostic service manager of a GMLAN SPS programmable ECU.
An ECU that is programmed with operational software and calibrations must also meet the requirements listed
in its CTS and/or SSTS. See the appropriate section of this specification for complete definition of each
diagnostic service.
Note: Additional diagnostic services may be implemented in an unprogrammed or partially programmed ECU.
These additional services must be defined in the ECU CTS.
In each of the diagnostic services described below, only the minimum required sub-function levels and
responses are listed.
9.3.2.4.1 Service $10 - InitiateDiagnosticOperation. This service is only required for a gateway ECU
connected to a GMLAN subnet which utilizes a wake-up mechanism that is not available to the tool (e.g.,
wake-up wire not brought out to the DLC). In this case, the gateway ECU shall support the sub-function
parameter $04 (wakeUpLinks).
9.3.2.4.1.1 Pseudo Code. (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
BEGINFUNCTION Boot_10_Msg_Recvd()
IF ($Level = LEV_WUPLNK ) THEN
IF (more than P2C is needed to process this request) THEN
send Negative Response ($7F $10 $78) /* request correctly received - response pending */
ENDIF
generate wake-up on all GMLAN links where wake-up mechanism is supported
Send ($50) positive response message
ENDIF
ENDFUNCTION
9.3.2.4.2 Service $1A - ReadDatabyIdentifier. This service shall be supported so a programming tool can
determine the correct file(s) needed for programming.
The following DIDs shall be supported when executing out of the Boot Software:
DID $B0 for determining the ECU Diagnostic Address (except for SPS_TYPE_C ECUs).
DIDs as required for determining the ECU Base Model part number. Minimum DIDs $CC and $DC.
Support of DID $92 is optional and shall be specified in the CTS (or SSTS or supplemental diagnostic
specification referenced by the CTS or SSTS) if needed.
The boot software shall be capable of reporting the Software Module Identifier (SWMI) and the Software
Module Identifier Alpha Code (SWMIAC) DIDs associated with operational software module(s) once the
operational software is programmed into the ECU.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
If the utility file is designed to allow individual calibration modules to be programmed, then the boot
software shall be capable of reporting the SWMI and SWMIAC for each calibration module once it has
been programmed into the ECU.
Support of Traceability data (DID $B4) and Broadcast Code (DID $B5) may also be required based on
regional practices. If any/all of these DIDs are required, they shall be specified in the CTS (or SSTS or
supplemental diagnostic specification referenced by the CTS or SSTS).
The boot software shall be capable of reporting the Software End Model part number (DID $CB).
9.3.2.4.2.1 Pseudo Code. (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
BEGIN FUNCTION Boot_1A_Msg_Recvd()
IF ($dataIdentifier is NOT supported) THEN
send Negative Response ($7F $1A $31) /* Request Out Of Range */
ELSE
IF (device cannot respond with block contents within P2C ms) THEN
send Negative Response ($7F $1A $78) /* RequestCorrectlyReceived-ResponsePending */
ENDIF
/*Get data values from memory address associated with the $dataIdentifier*/
send ($5A $dataIdentifier $Data) /* send response message with DID data */
ENDIF
ENDFUNCTION
Note: The above pseudo code assumes that the ECU is unlocked when operating out of the boot software.
9.3.2.4.3 Service $20 - ReturnToNormalMode. This mode is required to conclude a programming event.
Receipt of a mode $20 (during a programming event) requires the ECU to perform a software reset. If a high
speed programming event was enabled on the low speed SWCAN link when a request for this service is
received, then all ECUs (including the tester) shall re-initialize their protocol converter hardware. The low
speed ECUs shall perform the software reset after re-initializing the protocol converter hardware.
There are no responses allowed to this service during a programming event.
9.3.2.4.3.1 Pseudo Code. (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
BEGINFUNCTION Boot_20_Msg_Recvd()
CALL Boot_Exit_Diagnostic_Services() /* procedure defined below to gracefully exit all active diagnostic
services */
ENDFUNCTION
Each time a valid $20 message is received, or if a TesterPresent timeout occurs, the following function is
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
called:
BEGINFUNCTION Boot_Exit_Diagnostic_Services()
Service_28_MsgReceived NO
TesterPresent_Timer_State INACTIVE
TesterPresent_Timer 0
IF (permanent diagnostic CAN Identifiers are not programmed) THEN /* For SPS_TYPE_C ECUs */
diagnostic_responses_enabled NO
ENDIF
IF (programming_mode_active = YES) THEN
TransferData_Allowed NO
programming_mode_active NO
/***************************************************************************
* Reset CAN Protocol Device if high speed mode was active before doing
* S/W Reset
**************************************************************************/
IF (high_speed_mode_active = YES)
high_speed_mode_active NO
CALL hnd_Init_CAN_Device() /* handler call to reinit the baud rate in order to prevent bus errors which
could be caused if reset times differ greatly*/
ENDIF
CALL Invoke_Sw_Reset() /* causes a software reset to occur */
ENDIF
ENDFUNCTION
Note: The above pseudo code assumes that the ECU is unlocked when operating out of the boot software.
9.3.2.4.4 Service $27 - Security Access. This service shall be supported in the boot software if the ECU is
theft, emission, safety related, or if the ECU contains functionality which requires the use of this service to
meet legal requirements. If implemented, the minimum sub-function levels required are:
1. Level $01 – SPSrequestSeed.
2. Level $02 - SPSsendKey - This sub-function is only required for ECUs that require this service and are
sent to the field as an SPS_TYPE_B or SPS_TYPE_C ECU.
Note: An ECU that is sent to the field with operational software and a dummy calibration (fully programmed but
not completely functional) is considered to be an SPS_TYPE_A ECU. In this case it is assumed that the
dummy calibration would activate the security feature and it would not be necessary to support the Level $02
in the boot software.
9.3.2.4.4.1 Pseudo Code. (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
BEGINFUNCTION Boot_27_Msg_Recvd()
IF ($Level = $01) THEN
Send ($67 $01 $00 $00) message
ENDIF
ENDFUNCTION
Note: The above pseudo code assumes that the ECU is unlocked when operating out of the boot software.
9.3.2.4.5 Service $28 - Disable Normal Message Transmission. This mode is required to be supported to
allow a common utility file for Service and Manufacturing, and to assure no conflicts between programming
messages and normal communication messages.
An SPS_TYPE_C ECU which only has knowledge of its SPS_Prime CAN Identifiers does not respond
unless the SPS_Prime CAN Identifiers have already been enabled. Refer to paragraph 9.1.1 - Enabling
Diagnostic Responses on SPS_TYPE_C ECUs for more detail.
9.3.2.4.5.1 Pseudo Code. (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
BEGINFUNCTION Boot _28_Msg_Recvd()
Service_28_MsgReceived YES
TesterPresent_Timer_State ACTIVE
IF (diagnostic_responses_enabled = YES) THEN
Send ($68) response message
ENDIF
ENDFUNCTION
9.3.2.4.6 Service $34 - Request to Download Data Block. Receipt of a valid request for this service causes
an SPS_TYPE_A ECU to transfer program control back to the boot software. Transferring control back to the
boot software allows the ECU to allocate the necessary resources to support being reprogrammed. Examples
of resource allocation include a larger buffer for the Network layer and use of a smaller STmin value to
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
optimize data transfer. The ECU shall support in the boot software the same dataFormatIdentifier values as
supported by the operational software.
9.3.2.4.6.1 Pseudo Code (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
BEGINFUNCTION Boot_34_Msg_Recvd()
IF ( (dataFormatIdentifier is invalid) OR ((dataFormatIdentifier != $00) AND (unCompressedMemory size is
invalid)) ) THEN
send Negative Response($7F $34 $12) /* Invalid Format */
ELSE
IF ( (programming_mode_active = NO) OR (a software or calibration module download is in progress))
THEN
send Negative Response ($7F $34 $22) /* for conditionsNotCorrect */
ELSE
IF (more than P2C ms is needed to process this request) THEN
send Negative Response ($7F $34 $78) /* RequestCorrectlyReceived-ResponsePending */
ENDIF
/* at this time the module shall do whatever is necessary to prepare for a DataTransfer service
request. */
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
BEGINFUNCTION Boot_3E_Background_Logic()
IF (TesterPresent_Timer_State = ACTIVE) THEN
increment TesterPresent_Timer by the length of the main processing loop
IF (TesterPresent_Timer ≥ P3C) THEN
Call Boot_Exit_Diagnostic_Services() /* function in service $20 */
ENDIF
ENDIF
ENDFUNCTION
9.3.2.4.10 Service $A2 - ReportProgrammedState. The ReportProgrammedState is used by the tester to
determine which nodes on the link are programmable, and the current programmed state of each
programmable node. This service is also used as part of the sequence to enable the SPS_Prime CAN
Identifiers for SPS_TYPE_C ECUs.
While operating in boot, the ECU shall evaluate the Presence Pattern at the time of the Service $A2 request to
report the current programmed state of the ECU.
9.3.2.4.10.1 Pseudo Code. (Refer to the data dictionary of the application implementation of this service for
variable definitions.)
The following logic is executed when a device powers up or reboots after a software reset:
Check memory for errors
Check for operational software and calibrations
Store result of memory, software and calibration checks in $programmedState
IF (permanent diagnostic CAN Identifiers are programmed) THEN
diagnostic_responses_enabled YES
ELSE
diagnostic_responses_enabled NO
ENDIF
Note: If the program operation is transferred from the operational software to the boot software when the
service $34 is received, the permanent diagnostic CAN Identifiers must be made available to the boot
software. See requirement in paragraph 9.3.2.3.7. In this case, the flag diagnostic_responses_enabled shall be
set to YES for the purposes of the pseudo code.
BEGINFUNCTION Boot_A2_Msg_Recvd()
diagnostic_responses_enabled YES
IF (calculation for programmedState is not complete)
send negative response ($7F $A2 $78 ..)
ENDIF
IF (memory fault exists)
send a ($E2 $programmedState) /* memory faults shall be reported first */
ELSE IF (only calibration data is missing)
send ($E2 $02)
ELSE IF (software and calibrations are missing)
send ($E2 $01)
ELSE
send ($E2 $00) /* this can occur if a request is sent to determine the programmed state after the ECU is
programmed but before the software reset occurs concluding part 1 of the utility file */
ENDIF
ENDFUNCTION
9.3.2.4.11 Service $A5 - ProgrammingMode. This mode allows a tester to verify that conditions are correct
for a programming event and to enable the programming mode in order to begin the programming event. This
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
mode also allows the tester to request high speed programming mode to be enabled on the GMLAN low speed
(SWCAN) link.
This service shall be fully implemented as described in paragraph 8.17.
9.3.2.4.12 Boot Software Receive Message Handler. The following pseudo code defines the receive
message handling logic within the boot software:
BEGINFUNCTION Boot_Process_Recv_Msg()
IF (diagnostic_responses_enabled = NO)
IF ((Service_28_MsgReceived = YES) AND ($Service_Id = $A2) THEN
CALL Boot_A2_Msg_Recvd()
ENDIF
IF ($Service_Id = $28) THEN
CALL Boot_28_Msg_Recvd()
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Note: Services $10, $27, and $3B are optional and may not be present based on the type of ECU.
Note: The pseudo code flag Service_28_MsgReceived is used by the Boot_Process_Recv_Msg( ) function,
the Boot _28_Msg_Recvd( ) function, and the Boot_Exit_Diagnostic_Services( ) function to illustrate enabling
of the special case diagnostic CAN Identifiers used by SPS_TYPE_C ECUs.
9.3.2.5 Security Requirements. All programmable ECUs that have emission, safety, or theft related features
shall employ a seed and key security feature, accessible via the SecurityAccess ($27) service, to protect the
programmed ECU from inadvertent erasure and unauthorized programming from the GMLAN interface. All
field service replacement ECUs that meet the above criteria, shall be shipped to the field with the security
feature activated (i.e., a programming tool cannot gain access to the ECU without first gaining access through
the SecurityAccess service).
All ECUs that support security for SPS shall implement the seed and key relationship supplied by GM Service
and Parts Operations. Once a security algorithm is assigned, a change to the algorithm shall result in a change
to the ECU Base Model Part Number. See DID $CC in Appendix C of this specification.
Note: A change to the security algorithm shall also result in a change to the utility file needed to program the
ECU.
All development ECUs shall use the ones-complement of the seed as the valid key.
9.3.2.6 The Vulnerability Flag And Manufacturers Enable Counter (MEC). The Manufacturers Enable
Counter (MEC) and Vulnerability Flag are variables which are used to bypass a nodes security system during
development or during portions of the node and vehicle manufacturing process. The variables
manufacturers_enable_counter and vulnerability_flag are used in the pseudo code of the applicable diagnostic
services described within this specification to represent the MEC and Vulnerability Flag respectively.
Reference the SecurityAccess ($27) service within this specification for more information on accessing node
security.
9.3.2.6.1 The Vulnerability Flag. The Vulnerability Flag is a single byte in the node’s calibration area. The
node shall remain unlocked as long as the Vulnerability Flag equals $FF. Any value other than $FF will cause
the node to lock if this is the only security system bypass mechanism (see section below on the Manufacturers
Enable Counter). This use of the Vulnerability Flag is optional but it is shown in the pseudo code of each of the
applicable diagnostic services within this specification. Nodes which do not implement this variable can follow
the path in the pseudo code as if the value were other than $FF. The Vulnerability Flag shall only be used to
bypass a node’s security system during the development process. All fully programmed (SPS_TYPE_A)
production ECUs that implement the Vulnerability Flag shall have its value set to something other than $FF to
ensure that the security system is enabled once the MEC is set to $00.
9.3.2.6.2 The Manufacturers Enable Counter (MEC). The MEC shall be supported during ECU development
and production by all nodes which implement the SecurityAccess ($27) service. The MEC is a single byte in
permanent (EEPROM or equivalent) memory which allows a node to remain unlocked as long as its value is
not $00. When the value of the MEC becomes $00, security shall be enabled (provided that the Vulnerability
Flag is not $FF) and the SecurityAccess ($27) service shall be required to access security.
Production ECUs shipped to the vehicle assembly plants shall have the value of the MEC initialized by the
ECU supplier to a value specified in a CTS, SSTS, or supplemental diagnostic specification referenced by a
CTS or SSTS. Service Replacement ECUs shall be shipped to the dealerships with the MEC already set to
$00.
The MEC must be programmed to $00 at some point in the vehicle assembly plant process (typically, the MEC
is programmed to $00 at the conclusion of a passed Dynamic Vehicle Test).
Note: The MEC is programmed with the WriteDataByIdentifier ($3B) service. Refer to Appendix C to determine
the Data Identifier (DID) number for the MEC.
A node shall not allow the value of the MEC to change once it becomes $00, unless SecurityAccess ($27) is
successfully initiated. The ability to allow writing a new value to the MEC for any specific ECU which supports
the MEC shall be negotiated by representatives from Service and Assembly Verification, and the responsible
DRE, and documented in the CTS. The platforms should employ a backup mechanism to ensure that a node
will lock itself in the event that the vehicle somehow manages to make its way out of the assembly plant with
one or more nodes unlocked.
9.3.2.6.3 Example Implementation of the Manufacturers Enable Counter (MEC). In this example, the MEC
is used as a counter which decrements by 1 each time the ignition is cycled. The MEC is initialized to a
calibratable value ($FE for this example) by the supplier before the node is shipped to the vehicle assembly
plant. In this scenario, any node which was not locked prior to the vehicle leaving the assembly plant would
become locked after a calculated number of ignition cycles (254 - the number of ignition cycles which took
place at the vehicle assembly plant).
If all nodes on the vehicle which support a MEC also have an ignition input, then each node would decrement
the MEC by 1 each time its ignition input transitions from a high voltage state to a low voltage state (e.g., Run
to Off transition). If the vehicle has one or more nodes which support a MEC, do not have an ignition input, and
can remote off, then a more complex method of decrementing the MEC is required.
Note: It would not be desirable to decrement the MEC each time the node remotes off as this approach greatly
increases the possibility that the node would lock itself before all assembly plant programming and testing
processes have been completed.
To solve the issue of decrementing the MEC for the nodes which have no ignition input and remote off, a MEC
master is used. The MEC master is a node which does have an ignition input and is capable of communication
after the ignition input goes to a low voltage state. The MEC master detects the ignition transition and
generates a bus wake-up. The master then transmits a message which contains the value of the MEC. (See
Note below.) The nodes which were remoted off would wake-up and then synchronize their MEC with the
value provided by the MEC master. When synchronizing the MEC, nodes which already have their MEC at $00
would not modify the value. This prevents the possibility of replacing a single node on the vehicle (the MEC
master) and unlocking all nodes on the vehicle.
Note: This message may need to span subnets based on the vehicle configuration.
9.3.3 Product Memory (Operational Software and Calibration) File Requirements. Product memory files
released to the assembly plant or service shall be in binary format.
All files (e.g., software, calibration, utility file, drawing files, archives, etc.) distributed to GMNA assembly plants
or GMNA service facilities shall meet all of the requirements specified in the GM World Wide Software and
Calibration Parts Application Program Interface specification. In addition, all binary files (e.g., software,
calibration, utility file) and their associated drawing files shall have the file base name the same as the part
number released through the Product Description System (PDS).
The Module ID for the Operational Software data file shall be $01.
Note: If the ECU has more than one microprocessor, then Module Id $01 shall be assigned to the operational
software module of the processor that handles serial data for reprogramming.
The ECU software and calibration files shall have a header as defined in paragraph 9.3.3.1. The header
information is transferred to the appropriate ECU during the programming event. Portions of the header
information are optionally programmed into the ECU permanent memory.
9.3.3.1 Software and Calibration File Header Requirements (Table 219).
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Number
Offset Name Description Cvt
of Bytes
$05 4 to 16 SWMI This is a variable-length field that contains the SWMI (refer to M
DID $C1 thru $CA definitions in Appendix C) data reported
via the $1A service. The Header Format Identifier field
contains length information for this field of the header.
End of 2 to 3 DLS This is a variable length field that contains the modules M
SWMI Design Level Suffix (DLS) or Alpha Code (ASCII)
+1
End of 2 DCID_ This optional field is present if the H_NSize bit of the HFI is 1, U
previous and the DCID bit in the HFI field is also a 1. This field is two
field bytes in length and contains a Data Compatibility identifier
+1 value. For an operational software module header this value
is compared against a constant in the bootloader to ensure
that the software being downloaded is compatible with the
boot software in the ECU. For a calibration file header this
value is compare by the programming executive against a
corresponding value in the operational software header to
ensure that there is no mismatch between the calibration file
and the operational software.
End of 1 to 2 NOAR This optional field is present if the Product Memory Address U
previous (PMA) bit of the HFI is set to a one. If present, this field is
field one byte in length if the H_NSize bit of the HFI is 0, and two
+1 bytes in length if the H_Nsize bit of the HFI is 1. This field
contains the Number Of Address Regions (NOAR) within the
software/calibration module. This field is used to
accommodate programming of a software or calibration
module that has data that is broken up into separate memory
regions in the ECU. The number in this field represents the
number of different address regions addressed when the
module is downloaded.
End of 4 PMA#1 This optional field contains the starting PMA of the first (or U
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Number
Offset Name Description Cvt
of Bytes
End of 4 PMA#n This optional field is present if the PMA bit of the HFI is set to U
previous a one and the NOAR field indicates that there are (n)
field address regions (where n > 2) contained within the module.
th
+1 This field would contain the starting address of the n
memory region.
End of 4 NOB#n This optional field contains the number of bytes to be sent U
th
previous starting with the address of the n memory region.
field
+1
End of 2 NOAM The Number Of Additional Modules optional field is only U
previous present if this header includes the address information of all
field software/calibration modules to be downloaded into the ECU
+1 (MPFH and PMA bits of HFI must be a “1”). This 2-byte value
represents the number of additional calibration modules for
which this header includes the address information.
End of 2 DCID_am1 This optional field is present if the H_NSize bit of the HFI is 1, U
previous and the DCID bit in the HFI field is also a 1. This field is two
field bytes in length and contains a Data Compatibility identifier
+1 value for the first additional module. This value is compared
by the programming executive against a corresponding value
in the calibration data file header (DCID_) to ensure that
there is no mismatch between the calibration file and the
operational software.
End of 2 NOAR_am1 This field is optional and is only present if the NOAM field is U
previous ≥ 1. The data represents the number of address regions of
field the first additional module.
+1
End of 4 PMA#1_am1 This optional field contains the starting Product Memory U
previous Address of the first (or only) Address Region of the first
field additional module (NOAM ≥ 1). If the product uses less than
+1 four bytes for addressing, then the most significant byte(s)
shall be set to $00.
End of 4 NOB#1_am1 This optional field contains the number of bytes to be sent U
previous starting with the address from the PMA#1_am1 field.
field
+1
End of 4 PMA#2_am1 This optional field is present if the NOAR_am1 field of the U
previous header is present and set to a value greater than 1. This field
nd
field contains the starting address of the 2 memory region of the
+1 first additional module.
End of 4 NOB#2_am1 This optional field is present if the PMA#2_am1 field of the U
previous header is present. This field contains the number of bytes to
nd
field be sent starting with the address of the 2 memory region of
+1 the first additional module.
: : : U
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Number
Offset Name Description Cvt
of Bytes
th
End of 4 PMA#n_am1 This optional field represents the starting address of the n U
previous memory region within the first additional module.
field
+1
End of 4 NOB#n_am1 This optional field contains the number of bytes to be sent U
previous starting with the address of the PMA#n_am1 field.
field
+1
: : : U
x
End of 2 DCID_am This optional field is present if the H_NSize bit of the HFI is 1, U
previous and the DCID bit in the HFI field is also a 1. This field is two
field bytes in length and contains a Data Compatibility identifier
th
+1 value for the x additional module. This value is compared by
the programming executive against a corresponding value in
the calibration data file header (DCID_) to ensure that there
is no mismatch between the calibration file and the
operational software.
x
End of 2 NOAR_am This field is optional and is only present if the NOAM field is U
previous > 1. The data represents the number of address regions of
th
field the x additional module.
+1
x
End of 4 PMA#1_am This optional field contains the starting Product Memory U
th
previous Address of the first (or only) Address Region of the x
field addiotnal module (NOAM > 1). If the product uses less than
+1 4 bytes for addressing, then the most significant byte(s) shall
be set to $00.
x
End of 4 NOB#1_am This optional field contains the number of bytes to be sent U
x
previous starting with the address from the PMA#1_am field.
field
+1
x x
End of 4 PMA#2_am This optional field is present if the NOAR_am field of the U
previous header is present and set to a value greater than 1. This field
nd
field would contain the starting address of the 2 memory region
th
+1 of the x additional module.
x x
End of 4 NOB#2_am This optional field is present if the PMA#2_am field of the U
previous header is present. This field would contain the number of
nd
field bytes to be sent starting with the address of the 2 memory
th
+1 region of the x additional module.
: : : U
x th
End of 4 PMA#n_am This optional field represents the starting address of the n U
th
previous memory region within the x additional module.
field
+1
x
End of 4 NOB#n_am This optional field contains the number of bytes to be sent U
x
previous starting with the address of the PMA#n_am field.
field
+1
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
The Header Format Identifier (HFI) byte is defined as follows (Tables 220 and 221):
B7 B6 B5 B4 B3 B2 B1 B0
B7 B6 B5 B4 B3 B2 B1 B0
MPFH DCID
Where:
LSWMI = The length of the SWMI field (bit 7 the MSB and bit 3 the LSB).
LDLS = The length of the Design Level Suffix or Alpha Code field (“0” = 2-byte, “1” = 3-byte).
H_NSize = This bit is used to determine the size of the HFI field and also the size of the NOAR field(s) if
present. A “0” in this bit indicates that the HFI field in the header is a single byte with bit definitions
as defined in Table 220. A “1” in this bit indicates that the HFI field in the header is two bytes in
length with the bits in Table 220 representing the bits of the most significant byte and the bits in
Table 221 representing the bits of the least significant byte. A “1” in this bit shall also mean that all
NOAR field(s) present in the header are 2 bytes in length. A “0” in this bit shall mean that the only
NOAR field (if present based on value of PMA bit) is a single byte in length.
PMA = A “1” in this bit indicates that the NOAR field(s), the Product Memory Address field(s), and the
Memory Length field(s) are used. The value contained within the NOAR field determines the number
of PMA fields and Memory Length fields contained for a given module within the module header. A
“0” in this bit indicates that there are no NOAR fields, PMA fields, or Memory Length fields included
in the module header.
MPFH = This bit is used when a controller wants to include the address information for all of the calibration
files into the header of the operational software module (multi-part file header). A “1” in this bit
means that the address information of all files is included in this module header. This bit shall be set
to a “0” if the LSB of the HFI is included in the header and the PMA bit is set to “0”.
DCID = This bit indicates that the data file header contains a data compatibility identifier. The value
contained in this field is checked to see if a software data file is compatible with the version of boot
software in the ECU or to see if a calibration data file is compatible with the operational software in
the ECU.
Note: Unused Bits in the LSB of the HFI field (if LSB is included in the header) are reserved for future
definition and shall be set to 0 until defined.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
9.3.3.1.1 Examples of Software/Calibration File Headers. In the first example, the boot software is utilizing
the PMA information provided in the header of the calibration module to determine the ECU physical
addresses for programming. The data within a calibration module will occupy two memory regions in the ECU
according to Figure 37. The start address of memory region 1 is $8000 and the length is $1000 bytes. The
start address of memory region 2 is $A500 and the length is $0B00 bytes. The calibration module part number
is used as the SWMI and is stored in the header in 4 byte hexadecimal format. The Design Level Suffix or
Alpha Code is stored in 2-byte ASCII format. See Figure 37.
$8000
Memory
Region
1 Calibration Module
$9000
Void • Module Id = $02
Memory • Part # = 12345678
Region
$A500 • Alpha Code = AA
Memory
Region
2 $B000
Figure 37: Calibration Module Consisting Of Two Memory Regions
The header for this example would contain the following information (Table 222):
In the next example, the boot software determines the address information for the software and calibration
modules from information stored in the software module header. The ECU is broken up into three modules
(one operational software module and two calibration modules) as depicted in Figure 38.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
$002000
Op s/w Region 1
$00A400
Void Memory Region Op s/w Module
$00A500
Op s/w Memory • Module Id = $01
Region 2
• Part # = 56781234
$020000
Calibration Calibration Module 1
Module 1 • Module Id = $02
$022000 • Part # =1234 5678
Calibration Module 2
Calibration
• Module Id = $03
Module 2 • Part # =34 567812
$028000
Figure 38: Example 2 - ECU with One Software Module and Two Calibration Modules
Number
Offset Description
of Bytes
$3A 2 NOAR_am2 = $00 01
$3C 4 PMA#1_am2 = $00 02 20 00
$40 4 NOB#1_am2 = $00 00 60 00
The headers for the calibration modules in this example would contain the following information (Tables 224
and 225):
st
Table 224: 1 Calibration Module Header Data for Example 2
Number
Offset Description
of Bytes
$00 2 Module checksum or CRC (hex) = $xx xx
$02 2 Module ID = $00 02
$04 2 Header Format Identifier = $22 00
$06 4 SWMI (part # 12345678) = $00 BC 61 4E
$0A 2 Alpha Code = AA ($41 41)
Note: If the header of the operational software contains address information for all of the modules in the ECU
then the boot software must be capable of determining which additional module address information correlates
to a given Module Identifier. This can be accomplished by having the Module Identifiers sequentially numbered
for each calibration module. With this approach the address information for the first additional module
(contained in the operational software header) would correspond to Module Id $00 02 (since $00 01 is the
operational software), the address information for the second additional module would be for Module Id $00 03
etc. This approach also supports downloading calibrations in any order since the boot software can
mathematically determine which address information in the software module header is correct for the
calibration module being downloaded based on the Module Id in the calibration module header.
In this final example, the boot software is utilizing the PMA information provided in the header of the module to
determine the ECU physical addresses for programming. The data within a calibration module will occupy a
single contiguous memory region in the ECU. The starting address where the module will be loaded in memory
is $8000 and the length is $1000 bytes. The calibration module part number is used as the SWMI and is stored
in the header in 4-byte hexadecimal format. The Design Level Suffix or Alpha Code is stored in 2-byte ASCII
format. The tool set used to create the headers uses only a single byte for the HFI field and the NOAR field.
For this example, the following information is given:
© Copyright 2010 General Motors All Rights Reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
9.3.4 Utility File Requirements. All utility files shall meet the requirements specified in the Service
Programming System (SPS) Interpreter Programmers Reference Manual.
Utility files shall be designed such that calibrations are reprogrammed any time there is a change to the
operational software. If the ECU contains multiple microprocessors (each with their own operational software
and calibrations), then the utility file shall be designed such that calibrations are always reprogrammed on a
microprocessor any time that that same processors operational software is programmed. Utility file design
requirements (for multi-processor ECUs) relative to the reprogramming of operational software and/or
calibrations of one processor when a second processor is reprogrammed shall be specified in the CTS (or
SSTS or supplemental diagnostic specification referenced by either of the preceeding documents).
Utility files released to the assembly plant or service shall be in binary format. The Module ID for the
Programming Utility data file shall be $00.
9.3.5 ECU Supplier Requirements. Boot software shall be programmed by the ECU supplier.
If the ECU supports the SecurityAccess ($27) service for SPS programming then the supplier shall program a
random seed and the corresponding key value assigned by GM Service and Parts Operations into the ECU
during the ECU manufacturing process.
The utility file necessary for SPS programming shall be developed by the ECU supplier.
The CTS shall specify if operational software and/or calibrations are to be programmed by the supplier.
9.3.6 Assembly Plant Requirements. The cumulative time to program all ECUs in the vehicle assembly
process shall be less than the maximum time specified in the General Assembly Programming And Test
section of the GM Bill Of Process (BOP).
The ECU received at the vehicle assembly plant must be externally identifiable prior to installation into the
vehicle.
All ECUs that implement the SecurityAccess service for SPS programming shall be shipped to the vehicle
assembly plant with the security mechanism unlocked (via the use of the MEC). Refer to paragraph 9.3.2.6 for
specifics.
Note: The MEC is not required to be supported in the boot software if the ECU is always unlocked when
operating out of the boot software. Even though the boot software may not evaluate the value of the MEC, the
memory address where the MEC is located shall be initialized as documented in paragraph 9.3.2.6.2.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
9.4 ECU Programming Process. The overall programming procedure is comprised of the following
sub-processes:
a. Read Identification Information. This is a single path consisting of all the steps required to retrieve the
necessary ECU identification data for a proper selection of the data in the SPS database. This step is
required for service, not necessarily for assembly plant programming.
b. Retrieve SPS data. This is a single path consisting of all steps required to retrieve the proper SPS data out
of the SPS database. The selection is based on information read during step a. (service) or known in
advance (assembly plant).
c. Programming Session.
1. Setup (Pre-Utility File). This is a single path consisting of all the steps necessary to identify the target
node(s), and prepare the GMLAN link(s) for the programming event. All steps of the pre-utility file
process, except certain steps required for the verification process, are functionally addressed to all
nodes on the GMLAN sub-networks.
2. Utility File. These are all the steps defined within the utility file(s) for the target node(s). This may be a
single path of steps (in the case of a single node being programmed or multiple nodes programmed
sequentially), or multiple paths if multiple nodes are being programmed in parallel (multiple utility files
running in parallel). This path also includes steps to conclude a programming event (synchronization
between utility files running in parallel). All diagnostic services contained in one utility file are physically
addressed to the ECU to be programmed to allow for parallel programming.
9.4.1 Read Identification Information Process. The following steps are required to read the necessary
identification data out of the vehicle in order to retrieve the correct data out of the SPS data base. All steps are
performed automatically they are not utility file driven. See Table 227.
Note: All steps defined are required for field service programming and are not necessarily required for
assembly plant programming.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Step Action
5 Send a DisableNormalCommunication ($28) request (with AllNodes CANId and AllNodes
extended address - on each link as needed).
This disables sending and processing of normal mode data.
An SPS_TYPE_C ECU does not respond to the $28 request but tracks receipt of the $28
request (in order to enable diagnostic responses after receiving the $A2 service later in the
process).
The tester shall not enable diagnostic responses in SPS_TYPE_C ECUs (via mode $A2) until
after it has received positive responses to the $28 request from all other ECUs on the link (as
stored in the diagnostic configuration matrix).
6 Determine which nodes are programmable using the service ReportProgrammedState ($A2) with
the AllNodes CANId and AllNodes extended address (finalization of the diagnostic configuration
matrix - on each link as needed).
Each SPS programmable ECU shall respond.
SPS_TYPE_A and SPS_TYPE_B ECUs respond with their permanent diagnostic USDT
response CANId (which falls within the reserved range of diagnostic response CAN Identifiers).
An SPS_TYPE_C ECU responds with the SPS_PrimeRsp CANId ($3xx where xx = diagnostic
address).
At this point the SPS_TYPE_C ECU would activate and accept the SPS_PrimeReq ($0xx)
CANId as a diagnostic PTP request CANId (where xx = diagnostic address).
MSSC ECUs shall only respond to the $A2 service on the subnet where they support
programming (MSSC ECUs shall only be programmable on one subnet – see 4.3.4.
7 Retrieve necessary ECU ID and vehicle option content (e.g., engine type) information from the
programmable node(s) (using ReadDataByIdentifier ($1A) service).
Use the SPS_PrimeReq ($0xx) diagnostic request CANId for each SPS_TYPE_C ECU targeted.
Use USDT permanent diagnostic request CANId (determined based on offset from response
CANId received) for SPS_TYPE_A and SPS_TYPE_B ECUs.
Use information received via the previously executed service ReportProgrammedState ($A2) to
identify all SPS programmable ECUs.
8 Retrieve seed of programmable module(s) using the SecurityAccess ($27) service.
Security may not be implemented in all ECUs that are SPS programmable. The SecurityAccess
service is required for all SPS programmable ECUs that are Emission, Safety, or Theft related.
9 Send a ReturnToNormalMode ($20) request (with AllNodes CANId and AllNodes extended
optional address - on each link as needed).
step This request transitions all subnets back to normal operation while the tool is retrieving
information from the SPS database. This step is optional since a P3C timeout would occur after
the tester is disconnected and this shall also cause all nodes on all subnets to revert back to
normal operation.
10 Disconnect tester.
9.4.2 Retrieve SPS Data Process. This process is performed to retrieve the proper SPS data out of the SPS
database. See Table 228.
Note: For service, this process uses the information retrieved during the Read Identification Information
process to retrieve the SPS data out of the SPS database.
Table 228: Steps of the Retrieve SPS Data Process Programming Session
Step Action
11 Connect tester to SPS database.
Select node(s) to be programmed.
If node replacement, identify information (if necessary) to be retrieved from the old ECU to transfer
Note 1
to the new ECU .
Generate security key(s).
Retrieve SW/CAL Modules to download.
12 Reconnect tester.
Note 1: For remote programming, where an ECU is replaced and requires data read from the old ECU and written into the replacement
ECU the technician must connect to the SPS database twice. The first time is to identify which data must be read from the old ECU, the
second time is to generate the key for the replacement ECU and to retrieve the software/calibration file(s) to be downloaded.
9.4.3 Programming Session. (Figure 39) The Programming Session consists of two distinct types of
diagnostic service executions:
1. Master Execute. All steps required to start a programming event and all steps required to be synchronized
between multiple utility files running in parallel are executed only once (master execute). Those steps are
the ones defined for the Pre-Utility File Process and the synchronization between the utility file at the
point in time when the utility file reaches the point where a SW-reset of the physical ECU is required to
finalize the programming of this node (conclusion of the programming event). All steps controlled by the
master execute are vehicle oriented steps (functionally addressed to all nodes).
2. Interpreter Execute. All steps required to program an ECU are contained in a utility file. Those steps do
not need to be synchronized between multiple utility files running in parallel, therefore no master execute
is required during the execution of these steps. All steps controlled by the interpreter (interpreter execute)
are ECU oriented steps (physically addressed to the ECU to be programmed).
9.4.3.1 Programming Setup (Pre-Utility File) Process. The following steps (Table 229) are performed prior
to the execution of one or multiple utility file(s) to make sure that the GMLAN network (including all GMLAN
sub-networks) transitions to the programming state (vehicle oriented step). In addition the Pre-Utility File
process determines the CAN communication parameters (setup of the diagnostic configuration matrix). All
steps of the pre-utility file process are functionally addressed to all nodes on the GMLAN sub-networks (except
certain steps included in the verification process) and performed automatically.
Step Action
18 Determine which nodes are programmable using the service ReportProgrammedState ($A2) with
the AllNodes CANId and AllNodes extended address (finalization of the diagnostic configuration
matrix - on each link as needed).
Each programmable ECU shall respond.
SPS_TYPE_A and SPS_TYPE_B ECUs respond with their permanent diagnostic USDT
response CANId (which falls within the reserved range of diagnostic response CAN Identifiers).
An SPS_TYPE_C ECU responds with its SPS_PrimeRsp CANId ($3xx where xx = ECU
diagnostic address).
At this point the SPS_TYPE_C ECU would activate and accept the SPS_PrimeReq ($0xx)
CANId as a diagnostic PTP request CANId (where xx = diagnostic address).
MSSC ECUs shall only respond to the $A2 service on the subnet where they support
programming (MSSC ECUs shall only be programmable on one subnet - see 4.3.4.)
19 Verify that the tester is connected to the correct vehicle - the same vehicle from which the seed was
optional retrieved (e.g., use the service ReadDataByIdentifier ($1A) with specific DID to read certain ECU
step Id data).
This step can only be performed after the enabling of the diagnostic response messages of
SPS_TYPE_C ECUs.
This step may be used for service (e.g., required for remote programming) to make sure that the
tester is connected to the same vehicle as during the Request Identification Information
Process.
20 Request the appropriate level of the ProgrammingMode ($A5) service used to determine if it is OK
to establish a programming event (send to all nodes/on all links).
On HS-CAN and MS-CAN the sub-parameter level $01 (requestProgramming) shall be used.
On LS-CAN the sub-parameter level $01 (requestProgramming) or level $02
(requestProgramming_HighSpeed) shall be used.
The tester shall verify that no negative responses are sent prior to the next step which enables
the programming mode.
All ECUs shall respond.
21 Enable programming mode with service InitiateProgramming ($A5) and sub-parameter level $03
(enableProgramming).
No response to this request from any ECU.
ECUs shall transition to high speed mode if high speed was specified in the previous step.
The tester shall transition its protocol device to high speed operation (if requested for the low
speed subnet) and wait before communicating at high speed 100 ms longer than the time value
specified in service $A5.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
9.4.3.2 Programming Utility File Process. This part contains all steps required to perform a security access
to the node to be programmed and the steps for the transfer of the data to the physical node. See Table 230.
For the physically addressed request messages contained in the utility file, the tester uses the diagnostic PTP
request CANId of the individual node(s) to be programmed (as determined via the diagnostic services $1A,
$A2 and stored in the diagnostic mapping matrix). The exceptions to this are the TesterPresent messages
transmitted automatically by the SPS communication layer and the synchronization step where the master
execute transmits a functionally addressed (AllNode) ReturnToNormalMode ($20) request.
Table 230 shows the general process incorporated within the utility file. The actual utility file instruction set may
incorporate more steps as required by the specific node, particularly regarding the actual data transfer steps.
begin operating out of boot software if boot exists and the node is not already executing out of the
boot).
Note: Steps performed by the ECU on reception of this service depend on the ECU internal structure.
A node which has been previously programmed shall store its permanent PTP request and USDT
diagnostic response CAN Identifiers in a way such, that the boot software can access them during
the remainder of the programming event.
24 DataTransfer ($36)
Used to download a programming algorithm into a node or execute a node resident routine and to
transfer the operational software and/or calibration data to the node.
Interleave TesterPresent messages using AllNodes CANId with AllNodes extended address.
Continue until the node is completely programmed.
25 Optionally use the WriteDataByIdentifier ($3B) service to write any data which needs to be
performed prior to executing a software reset.
Note: It may be necessary to perform multiple service $34/$36 sequences to download the data into the ECU
(e.g., one sequence for each downloaded module).
Certain steps may be required to be performed after a software reset of an ECU. When the utility file of an
ECU reaches this point, the interpreter has to synchronize a software reset with all other interpreters running in
parallel. At the point in time when each interpreter reaches the step in the utility file where the conclusion of the
programming session is requested the tester shall conclude the programming event by transmitting a
ReturnToNormalMode ($20) request message onto each GMLAN subnet (master execute). See Table 231.
Note: Following a ReturnToNormalMode ($20) service the determination of the diagnostic addresses and
diagnostic CAN Identifiers (using the service $1A with DataIdentifier $B0) is performed automatically prior to
the execution of a diagnostic service. See Table 232, Step 29.
Following the ReturnToNormalMode ($20) service additional action can be performed for each ECU (utility file
driven - interpreter execute) to finalize the programming. This part contains all steps required to finally
conclude a programming event of a single ECU. For some nodes it may be required to write data after the
software reset, when the operational software is running. Those steps are contained in the ECU specific utility
file. See Table 232.
This part is utility file driven except for the determination of the GMLAN communication parameters (CAN
Identifiers).
Table 232: Optional Utility File Steps Following the Programming Conclusion Step
Step Action
27 Wake-up link(s) - High voltage wake-up for SWCAN - gateways may cascade wake-ups (where
applicable) across to the other subnets on the vehicle or the tester may need to use level $04 of
diagnostic service InitiateDiagnosticOperation ($10) to generate the wake-up (functionally
addressed to gateway ECUs only). This is necessary because the gateway ECU(s) has (have) been
reset and might have lost the internal information about keeping a wake-up signal line asserted on
another subnet on the vehicle.
Note: The tester must allow at least 500ms after issuing a wake-up before transmitting any diagnostic
request message (including tester present) to allow the ECU to process the wake-up and transition to
a communication active state. Refer to paragraph 6.1 for wake-up requirements.
28 Start sending TesterPresent ($3E) periodic messages to all nodes - all links as needed (using the
AllNodes CANId and AllNodes extended address).
29 The tester must now issue a request for service ReadDataByIdentifier ($1A) with DID $B0 in order to
perform a relearn of the diagnostic address and CANIds. This is necessary because an ECU which
was programmed and performed a reset after the ReturnToNormalMode ($20) service from Step 23,
would now use its permanent CAN Identifiers. This step is performed automatically prior to the
execution of utility file driven diagnostic service (e.g., Step 25) following the ReturnToNormalMode
($20) service.
30 The WriteDataByIdentifier ($3B) service may be used to program option content information into
SPS programmable ECUs which were just programmed.
Note: The tester may send a service $04 request to clear DTCs at the conclusion of the programming event.
This is typically done at the conclusion of module programming in the vehicle assembly plant.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
9.4.4 Summary. Figure 40 contains the graphical representation of the GMLAN Programming Procedure as
defined in the previous sections.
Start
Return to Normal Retrieve SPS Data Reconnect the Perform Security Return To Normal Optional Steps
Wake-Up Link(s) out of the SPS Wake-Up Link(s)
Mode (Opt) Tester Access Mode Required to be
Database Performed After the
SW-Reset
Disconnect the Start TesterPresent RequestDownload Synchronization
Start TesterPresent Tester
step between all Write Data After
SW-Reset
utility files. (Optional)
Determine GMLAN Determine GMLAN
Communication Communication TransferData
Parameters Parameters
Disable Setting
Disable Setting DTCs (Opt.) RequestDownload
DTCs (Opt.)
End
Disable Normal
Disable Normal Communication TransferData
Communicion
Note: The Programming Procedure Summary shows the general steps of the GMLAN programming
procedure. Optional steps are indicated with (Opt).
9.5 ECU Programming Message Flow Example.The following example assumes:
Programming is to be performed on a single node on the SWCAN low speed link.
There are four nodes on the SWCAN link.
Node 1 (N1) is an SPS_TYPE_A ECU that has a diagnostic USDT response CANId of $641, and a
diagnostic address of $28.
Node 2 (N2) is not programmable, has a diagnostic USDT response CANId of $64D, and a diagnostic
address of $60.
Node 3 (N3) is an SPS_TYPE_C ECU without operational software or calibration data and a
diagnostic address of $40, (so its SPS_PrimeReq and SPS_PrimeRsp programming request and
response CAN Identifiers are $040 and $340 respectively). Once Node 3 is programmed, its physical
diagnostic request and response CANIds are $247 and $647 respectively.
Node 4 (N4) is a Gateway ECU that is not programmable, has a diagnostic USDT response CANId of
$651, and a diagnostic address of $42.
Only the low speed subnet (SWCAN link) high voltage wake-up method is shown in the following
examples. The High Voltage wake-up message for the SWCAN low speed link uses CANId $100.
Node 3 (N3) is the only node which will be programmed during the programming event.
For this example, it is assumed the ECU being programmed supports 4-byte addressing (uses address
$00 $00 $23 $FF) and also is expecting a 4-byte uncompressed memory size with the $34 service.
For this example, it is assumed that the tester pads all diagnostic USDT request messages and all ECUs
pad the response messages. Pad bytes are all filled with $AA to make it easy to distinguish which bytes
are pad bytes.
9.5.1 Request Identification Information Process. (Tables 233 thru 254).
Wake-up link(s).
Perform a high voltage wake-up on LS-CAN.
Wait 500 ms after wake-up, then transmit a service $10 request message (level $04), that forces Gateway
ECUs to perform a wake-up on the sub-nets nets to which they are connected.
T = Frame Sent By Tester, N = Frame Sent By Node; shaded region indicates PCI
Frame Type CAN Id #1 #2 #3 #4 #5 #6 #7 #8
T(USDT) $101 $FD $02 $10 $04 $AA $AA $AA $AA
N4(USDT) $651 $01 $50 $AA $AA $AA $AA $AA $AA
Note: No response from the non-programmable ECUs because a functional request for a service which is not
supported results in no response message being sent.
At this point, the tester would request ECU ID information using mode $1A in order to determine which files are
needed for the programming event. This step is not shown in this example.
Next step, read seed.
Use service $27 to read the seed from the programmable ECUs.
At this point the technician disconnects from the vehicle and plugs the tool into the SPS database computer.
The technician selects only node N3 to be programmed. The SPS database transfers the security key and the
programming files to the tester. Once completed, the tester is reconnected to the vehicle.
9.5.2 Programming Session.
9.5.2.1 Pre-Utility File Process.
Wake-up link.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Wait 500 ms after wake-up, then transmit a service $10 request message (level $04), that forces Gateway
ECUs to perform a wake-up on the sub-nets to which they are connected.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Note: No response from the non-programmable ECUs because a functional request for a service which is not
supported results in no response message being sent.
Initiate programming mode $A5 - request programming mode in high speed.
Use service $A5 with sub-parameters $01 for HS- and MS-CAN and $02 for LS-CAN to request, if it is OK
to start a programming event.
Note: No responses are allowed to the request to enable programming mode to ensure that bus errors and/or
bus off conditions do not occur.
After enabling high speed mode, the tester must delay for a period of time (reference the $A5 service for
minimum time interval) before sending the next diagnostic request.
9.5.2.2 Utility File Process.
SecurityAccess ($27) service (using key information generated in the SPS data retrieval step).
Request Seed.
Retrieve the seed from the physical ECU to be programmed.
Send Key.
Send the Key to the physical ECU.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
RequestDownload ($34).
Request the download of data via service $34.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
TransferData ($36).
Download the data into the physical ECU.
Conclusion of the programming event (Software reset, to be synchronized with optionally running utility files in
parallel):
ReturntoNormalMode request ($20).
Use service $20 to conclude the programming event. This will force the ECUs to perform a software reset
and transitions the LS-CAN subnet from high speed mode to normal speed mode.
Note: No responses to the service $20 request from any node (because programming mode was active). This
eliminates any link errors due to unsynchronized switching from high speed mode. At this point all nodes
perform a software reset.
Note: After issuing the ReturnToNormalMode ($20) service in this step, the tester suspends the TesterPresent
($3E) service, and must wait 1 s before proceeding to the next step to allow sufficient time for all the nodes to
reset and syncronize normal communication.
Optionally steps may follow the ReturnToNormalMode ($20) request message to finalize the programming of
the ECU. Those steps are controlled by the utility file of the ECU. The following shows a generic example of a
service $3B write performed as part 2 of the utility file process.
Wake-up link.
Perform a high voltage wake-up on LS-CAN.
Wait 500 ms after wake-up, then transmit a service $10 request message (level $04), that forces Gateway
ECUs to perform a wake-up on the sub-nets to which they are connected.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
15.2 Revisions.
Rev Approval Description (Organization)
Date
D FEB 2004 Version 1.5 (GMLAN
Diagnostics Sub-Group)
E FEB 2010 Version 1.6. (GMLAN
Diagnostics Sub-Group)
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
B1 CPID $FE
B1.1 Theft Deterrent Relearn. A scan tool implementation of this device control allows the user to request
that the Powertrain or Engine Control Module (PCM/ECM) relearn the new password from the vehicle theft
deterrent controller. Upon receipt of this device control, the PCM/ECM shall verify that none of the device
control limits are exceeded and begin a ten minute timer. The scan tool is not required to remain connected for
the next ten minutes. Therefore, the PCM software shall not expect a Mode $3E message to be sent every P3 C
ms. The PCM/ECM must remain powered (ignition must not be cycled to OFF) for the next ten minutes. When
the ten minutes have expired, the PCM/ECM will be armed to learn the new password on the next powerup.
This device control will only be allowed if all the following are TRUE:
1. PCM/ECM is unsecured (unlocked) or reject with ($7F $AE $31) message.
2. Engine is not running or reject with ($7F $AE $E3 $FE $01); $FE $01 is the limit exceeded.
B1.2 Theft Deterrent EEPROM Access. Implementation of this device control allows a tool user to
read/modify EEPROM variables within the vehicle theft deterrent controller. This device control requires that
the theft deterrent controller be unlocked (reference security access service $27) at the time of the request for
activation of this device control. Upon receipt of a valid request for this device control, the device will start a 10
minute timer. When the 10 minute timer is expired, the device can read/modify EEPROM variables within the
theft deterrent controller using the diagnostic services $3B and $1A. A TesterPresent message is required to
keep this device control active.
If the device is secure at the time a request for this device control is received, the device shall reject the
request with a $7F $AE $31 response.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
If a TesterPresent timeout occurs while this device control is active, the device shall terminate this device
control but no negative response is sent. The device will however send the unsolicited mode $20 response
message when the timeout occurs.
B2 CPID $FD
B2.1 Disable All System Outputs. A scan tool implementation of this device control allows the user to
deactivate all output devices of an ECU simultaneously or, if this is not possible, freeze the output(s) at its
(their) current value. This prevents random behavior or periodic switching of loads during a current
measurement. Upon receipt of this device control, the ECU shall verify that none of the device control limits are
exceeded.
When this device control is active, all device controls assigned in other CPIDs for that ECU can be
activated/deactivated independently by the other CPID (overrides CPID $FD for that output).
This device control will only be allowed if all the following are TRUE:
1. Vehicle Speed = 0.
2. Engine is not running.
A TesterPresent ($3E) message is required to keep this device control active.
B2.2 ECU Reset. Implementation of this device control allows a tool user to force the ECU to restart the
application program (soft reset). Previously learned configuration data, adaptive factors, and other long-term
adjustments shall not be reinitialized. The actual performed action is implementation specific.
This device control will only be allowed if all the following are TRUE:
1. Vehicle Speed = 0.
2. Engine is not running.
The ECU must respond to the request prior to performing the reset.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
B2.3 Learned Source ID Reset. Implementation of this device control allows a tool user to force the ECU
relearn of all previously learned Source IDs. This is accomplished by resetting the learned Source IDs as
follows:
Required messages that are always guaranteed to be present in the system shall be associated with
Source ID $FF.
Optional messages whose presence is determined by the presence of a build option shall be associated
with Source ID $FE.
The module’s handler shall relearn Source IDs for any message that contains supervised signals each time the
message is received. Only the most recently received Source ID shall be associated with each message that
contains supervised signals. Support of this device control allows ECU swapping between vehicles. Otherwise,
ECU swapping can only occur when all build options are identical between the two vehicles or false Lost
Communication DTCs will occur. If this device control is used when an ECU is not communicating (valid Lost
Communication DTC), the bus speed specific CAN Communication Bus Performance DTC will set rather than
the ECU-specific Lost Communication DTC.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table C4: Definition of Repair Shop Code Or Tester Serial Number dataIdentifier
DID Description R/W Data Type Len
$98 RepairShopCodeOrTesterSerialNumber (RSCOTSN) R/W ASCII 10
This DID contains the RepairShopCodeOrTesterSerialNumber which identifies the dealer code or the
tester serial number. This ASCII string is programmed into the ECU memory during the last
programming session (SPS) at the dealer site.
Position 1 2 3 4 5 6 7 8 9 10 …
RSCOSN S N 1 2 3 4 5 6 7 8 …
Hex Value 53 4E 31 32 33 34 35 36 37 38 …
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table C14: Definition of ECU Functional Systems and Virtual Devices dataIdentifier
DID Description R/W Data Type Len
$B1 ECUFunctionalSystemsAndVirtualDevices (ECUFSAVD) R USN ≥2
This DID contains the list of functional systems and virtual devices supported by the node (ECU). The
two lists are separated by a $FE separation character (AllNode functional system address). If an ECU
does not support any VD (because it does not support any VN) then it shall report a $00 following the
$FE to indicate that no VD is supported. The length of the DID depends on the number of supported
functional systems and virtual devices.
Position 1 2 3 …
ECUFSAVD 253 254 0 …
Hex Value FD FE 00 The $FD functional system corresponds to gateway devices
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Legacy Format (To be phased out per GMW15862) A description of each field follows:
Component Identifier (Comp Id)
The component Identifier is a 2 byte field (starting at byte 1 of the DID) that is used to indicate the
component type.
Part Number / Broadcast Code (PN/BC)
This is a 4-byte field (starting at byte 3 of the DID) and contains either the ECU Broadcast Code or the
last 4 digits of the ECU part number.
Supplier Code (sup)
th
This is a one byte field occupying the 7 byte of the DID that identifies the supplier and manufacturing
location of the ECU.
Traceability Number
This field starts at byte 8 of the DID and is 9 bytes in length. The content is assigned by the module
manufacturer. This field contains information about the ECU at the time of its manufacture. Examples of
the type of data included in this field are Julian Date of production, shift build data, production assembly
line information and ECU serial number. If less than 9 characters are required to uniquely identify an
ECU, then the leading characters shall be filled with zeroes (0x30).
Position 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ---
MTC A S 7 0 8 1 K 1 5 0 6 1 0 0 0 F ---
Hex value 41 53 37 30 38 31 4B 31 35 30 36 31 30 30 30 46 ---
Field Desc. Comp Id PN/BC sup Traceability Number ---
GMW15862 Format (To be phased in per GMW15862) A description of each field follows:
Line Identification (Line Id)
The Line Identifier is a 1 byte field (starting at byte 1 of the DID) that is used to indicate the component
assembly line.
Shift Identification 1, 2 or 3 (Shift Id)
This is a one byte field (starting at byte 2 of the DID) that identifies the shift that assembled the
component.
Last Two Digits of Year (Year)
This is a two byte field (starting at byte 3 of the DID) that contains the last two digits of the year that the
component was assembled.
Day Of the Year (Day)
This is a three byte field (starting at byte 5 of the DID) that contains the Julian day of the Year that the
component was assembled.
Traceability Number
This value is a supplier assigned serial, lot or batch number. This field starts at byte 8 of the DID and is
up to 9 bytes in length. The content is assigned by the module manufacturer. If less than 9 characters
are required to uniquely identify an ECU, then the leading characters shall be filled with zeroes (0x30).
Position 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ---
MTC A 1 0 8 2 8 2 1 5 0 6 1 0 0 0 F ---
Hex value 41 31 30 38 32 38 32 31 35 30 36 31 30 30 30 46 ---
Field Desc. Line Shift Year Day Traceability Number ---
Table C25: Definition of Subnet Config Lists for Non-CAN Buses 1 - 2 dataIdentifier
DID Description R/W Data Type Len
$BC Subnet_Config_List_NonCan 1 - 2 (SCLNC 1/2) R/W BIN ≥1
$BD These 2 DIDs are allocated to contain subnet config lists for data links not directly connected to the DLC
but contain a member node which is diagnosed via a GMLAN subnet. The tool can write the
configuration information of the non GMLAN network into the GMLAN node which is also present on the
non GMLAN network, for the purpose of network management of the non GMLAN network. Examples of
this may be a GMLAN node that is also an entertainment ECU that is part of a MOST network.
Each bit represents one ECU (with unique Diagnostic Address, see Appendix D) that can exist on the
subnet. A logic “1” indicates that a given ECU is present on the vehicle. The bit mapping of ECUs must
be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
EHU Entertainment Head Unit (MOST)
Position 1 2
Bit location 7 6 to 1 0 7 6 to 1 0 …
Bit state 0 … 1 0 … 0 …
DA (hex) … … 81 … … … …
ECU name … … EHU … … … …
Hex value 01 00 …
Table C26: Definition of Subnet Config List for LIN Busses dataIdentifier
DID Description R/W Data Type Len
$BE Subnet_Config_List_LIN (SCLLIN) R/W 8 BIN ≥2
This DID contains the SCLLIN for all Local Interconnect Network (LIN) buses supported by the LIN bus
Master. The DID shall include all LIN subnets that are connected to the Master. Two bytes shall be used
per LIN network as described in the table below. The length of the DID will be determined by the number
of connected LIN networks, i.e., length is equal to 2*n, where n is the number of connected LIN
networks.
The tool can write the configuration information of the LIN network(s) into the GMLAN node which is
also the master of the LIN network, for the purpose of network management.
The most significant bit of the two bytes for each LIN subnet shall indicate the LIN master configuration
status (CS) for this subnet. A logic “1” indicates that the LIN master has been configured for this subnet.
The remaining bits each represent one ECU (with unique Diagnostic Address, see Appendix D) that can
exist on the subnet. A logic “1” indicates that a given ECU is present on the vehicle. The bit mapping of
ECUs must be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
LIN bus 1 is configured.
DDM Driver Door Module
DDS Driver Door Switch
W8 = The writing of this DID may not be allowed in certain implementations. The CTS/SSTS or other
ECU specific diagnostic document referenced by the CTS or SSTS shall indicate if this DID can be
written.
Position 1 2 3 4
LIN bus 1 LIN bus 1 LIN bus 2 LIN bus 2
Bit location 7 to
7 6 to 1 0 1 0 7 6 to 1 0 7 6 to 1 0
2
Bit state 1 … 0 0 1 1 0 … 0 0 … 0
DA (hex) N/A … --- --- A4 A0 N/A … --- --- … ---
ECU name CS … --- --- DDS DDM CS … --- --- … ---
Hex value 80 03 00 00
Position 2n -3 2n -2 2n - 1 2n
LIN bus n-1 LIN bus n-1 LIN bus n LIN bus n
Bit location 7 6 to 1 0 7 6 to 1 0 7 6 to 1 0 7 6 to 1 0
Bit state 0 … 0 0 … 0 0 … 0 0 … 0
DA (hex) N/A … --- --- … --- N/A … --- --- … ---
ECU name CS … --- --- … --- CS … --- --- … ---
Hex value 00 00 00 00
Table C27: Definition of Subnet Config Lists for GMLAN Expansion Buses dataIdentifier
DID Description R/W Data Type Len
$BF Subnet_Config_List_GMLANChassisExpansionBus (SCLGCEB) R/W BIN ≥2
This DID contains the SCLGCEB.
Each bit represents one ECU (with unique Diagnostic Address, see Appendix D) that can exist on the
Chassis expansion bus subnet. A logic “1” indicates that a given ECU is present on the vehicle. The bit
mapping of ECUs must be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
SAS Steering Angle Sensor
Position 1 2
Bit location 7 6 to 1 0 7 6 to 1 0 ---
Bit state 0 … 0 0 … 1 ---
DA (hex) ---
--- … --- --- … 11
J3200
ECU name --- … --- --- … SAS ---
Hex value 00 01 ---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table C32: Definition of Boot Software Part Number Alpha Code dataIdentifier
DID Description R/W Data Type Len
$D0 BootSoftwarePartNumberAlphaCode R ASCII 2
This DID contains the 2-character representation of the Alpha Code (or Design Level suffix) associated
with the BootSoftwarePartNumber (stored in dataIdentifier $C0).
Position 1 2 ---
BootSoftwarePartNumberAlphaCode RS ---
Hex value 52 53 ---
Table C34: Definition of End Mode lPart Number Alpha Code dataIdentifier
DID Description R/W Data Type Len
$DB EndModelPartNumberAlphaCode R/W 10 ASCII 2
This DID contains the 2-character representation of the Alpha Code (or Design Level suffix) associated
with the EndModelPartNumber (stored in dataIdentifier $CB).
W10 = This DID may or may not be updated at the conclusion of a programming event based on
divisional practices. This DID is not required to be writeable if divisional practices do not require
this part number to be updated after module programming.
Position 1 2 ---
EndModelPartNumberAlphaCode RS ---
Hex value 52 53 ---
Table C35: Definition of Base Model Part Number Alpha Code dataIdentifier
DID Description R/W Data Type Len
$DC BaseModelPartNumberAlphaCode R ASCII 2
This DID contains the 2-character representation of the Alpha Code (or Design Level suffix) associated
with the BaseModelPartNumber (stored in dataIdentifier $CC).
Position 1 2 ---
BaseModelPartNumberAlphaCode RS ---
Hex value 52 53 ---
Table C40: Definition of Subnet Config Lists for GMLAN Expansion Busses dataIdentifier
DID Description R/W Data Type Len
$E8 Subnet_Config_List_GMLANPowertrainExpansionBus (SCLGPEB) R/W BIN ≥2
This DID contains the SCLGPEB.
Each bit represents one ECU (with unique Diagnostic Address, see Appendix D) that can exist on the
Powertrain expansion bus subnet. A logic “1” indicates that a given ECU is present on the vehicle. The
bit mapping of ECUs must be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
HCP Hybrid Control Processor
MCP1 Motor Control Processor 1
MCP2 Motor Control Processor 2
Position 1 2
Bit location 7 6 to 1 0 7 6 to 1 0 ---
Bit state 0 … 1 1 … 1 ---
DA (hex) ---
--- … CE CF … 17
J3200
ECU name --- … MCP1 MCP2 … HCP ---
Hex value 01 81 ---
Table C41: Definition of Subnet Config Lists for GMLAN Expansion Busses dataIdentifier
DID Description R/W Data Type Len
$E9 Subnet_Config_List_GMLANFrontObjectExpansionBus
R/W BIN ≥2
(SCLGFOEB)
This DID contains the SCLGFOEB.
Each bit represents one ECU (with unique Diagnostic Address, see Appendix D) that can exist on the
expansion bus subnet. A logic “1” indicates that a given ECU is present on the vehicle. The bit mapping
of ECUs must be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
EOCM-R External Object Control Module - Front
Position 1 2
Bit location 7 6 to 1 0 7 6 to 1 0 ---
Bit state 0 … 0 0 … 1 ---
DA (hex) ---
--- … --- --- … 6C
J3200
ECU name --- … --- --- … EOCM-F ---
Hex value 00 01 ---
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Table C42: Definition of Subnet Config Lists for GMLAN Expansion Busses dataIdentifier
DID Description R/W Data Type Len
$EA Subnet_Config_List_GMLANRearObjectExpansionBus (SCLGROEB) R/W BIN ≥2
This DID contains the SCLGROEB.
Each bit represents one ECU (with unique Diagnostic Address, see Appendix D) that can exist on the
expansion bus subnet. A logic “1” indicates that a given ECU is present on the vehicle. The bit mapping
of ECUs must be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
EOCM-R External Object Control Module - Rear
Position 1 2
Bit location 7 6 to 1 0 7 6 to 1 0 ---
Bit state 0 … 0 0 … 1 ---
DA (hex) ---
--- … --- --- … 64
J3200
ECU name --- … --- --- … EOCM-R ---
Hex value 00 01 ---
Table C43: Definition of Subnet Config Lists for GMLAN Expansion Busses dataIdentifier
DID Description R/W Data Type Len
$EB Subnet_Config_List_GMLANExpansionBus1-5 (SCLGEB1/2/3/4/5) R/W BIN ≥2
thru These DIDs contain the SCLGEB1/2/3/4/5.
$EF Each bit represents one ECU (with unique Diagnostic Address, see Appendix D) that can exist on the
expansion bus subnet. A logic “1” indicates that a given ECU is present on the vehicle. The bit mapping
of ECUs must be documented in a CTS, SSTS, or supplemental diagnostic specification.
Example:
SAS Steering Angle Sensor
Position 1 2
Bit location 7 6 to 1 0 7 6 to 1 0 ---
Bit state 0 … 0 0 … 1 ---
DA (hex) ---
--- … --- --- … 11
J3200
ECU name --- … --- --- … SAS ---
Hex value 00 01 ---
Controller Type/Category
(hex)
Powertrain Controllers 00 to 1F
Integration/Manufacturer Expansion 00 to 0F
Engine Controllers 10 to 17
Transmission Controllers 18 to 1F
Chassis Controllers 20 to 3F
Integration/Manufacturer Expansion 20 to 27
Brake Controllers 28 to 2F
Steering Controllers 30 to 37
Suspension Controllers 38 to 3F
Body Controllers 40 to C7
Integration/Manufacturer Expansion 40 to 57
Restraints 58 to 5F
Driver Information/ Displays 60 to 6F
Lighting 70 to 7F
Entertainment/ Audio 80 to 8F
Personal Communication 90 to 97
Climate Control(HVAC) 98 to 9F
Convenience (Doors, Seats, Windows, etc.) A0 to BF
Security C0 to C7
Electric Vehicle Energy C8 to CB
Transfer System
Utility Connection Services C8
AC to AC Conversion C9
AC to DC Conversion CA
Energy Storage Management CB
Future Expansion CC to FD
Reserved By Document FE to FF
7 warningIndicatorRequestedState M M M1 WIRS
Note 1
This bit shall report the status of any warning indicators
associated with a particular DTC. Warning outputs may consist of
indicator lamp(s), displayed text information, etc. If no warning
indicators exist for a given system or particular DTC, this bit shall
be set to a value of 0. If the warning output is on for a given DTC,
the history status flag shall also be true.
1. Bit set to 1 = Warning indicator requested to be ON.
2. Bit set to 0 = Warning indicator not requested to be ON.
3. Bit will be set to a value of 0 on a successful code clear.
6 currentDTCSincePowerUp M U U CDTCSPU
This bit shall indicate that a DTC became current during the
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Cvt
Bit Description (By Node Type) Mnemonic
4 historyDTC M M M HDTC
A history DTC indicates that a current DTC status has met
sufficient criteria for storing a code into long term memory.
Sufficient criteria may consist of a current status detected over a
span of time or over multiple test cycles.
If DTC criteria to activate a warning indicator are satisfied, then
the DTC history bit shall be set to a value of 1 and the DTC status
must be stored to long term memory.
1. Bit set to 1 = DTC is history.
2. Bit set to 0 = DTC is not history.
3. Bit will be set to a value of 0 on a successful code clear.
3 testFailedSinceDTCCleared M U U TFSDTCC
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
This bit shall indicate that a current DTC is or has been set
sometime since the last time the DTC status was reset.
1. Bit set to 1 = Test failed since DTCs have been cleared.
2. Bit set to 0 = Test not failed since DTCs have been cleared.
3. Bit will be set to a value of 0 on a successful code clear.
2 testNotPassedSinceDTCCleared M M1 M1 TNPSDTCC
Note 1 Note 1
This bit shall indicate a value of 0 once the test indicates a
passed result. A value of 1 indicates that the test has not run, or
that the test has run and failed.
1. Bit set to 1 = Test not passed since DTC cleared.
2. Bit set to 0 = Test passed since DTC cleared.
3. Bit will be set to a value of 1 on a successful code clear.
1 currentDTC M M M CDTC
A current DTC shall indicate that test conditions have been met
and the test results show that a fault is currently present. This bit
shall indicate the results of the last diagnostic test performed. A
current code status may span multiple power cycles since it
reflects the result of the last test performed.
1. Bit set to 1 = DTC is current.
2. Bit set to 0 = DTC is not current.
3. Bit will be set to a value of 0 on a successful code clear.
0 DTCSupportedByCalibration U U U DTCSBC
This bit shall indicate that a node will trigger the test associated
with a particular DTC as soon as the criteria for performing the
test have been satisfied.
1. Bit set to 1 = DTC supported.
2. Bit set to 0 = DTC not supported.
3. Bit is NOT altered by a code clear attempt.
Note 1: M1 – The intent of these bits is to provide build integrity and repair verification. Deviation from supporting these bits (e.g.,
Hardware limitations) shall be negotiated by service, assembly, and the DRE, and documented in the CTS.
Note: If either bit 6 or bit 5 is supported, then the other should also be supported. Also, if either bit 3 or bit 2 is
supported, then the other should also be supported. In other words, bits 6 and 5 should be supported as a pair,
and bits 3 and 2 should be supported as a pair.
E1.1 DTC Status Byte Bit Operation. The following figures illustrate the expected values of the status byte for
various types of DTCs under various operating conditions. In general, DTCs may be divided into two major
categories, Powertrain and Non-Powertrain DTCs.
For Non-Powertrain DTCs, the DTCs may be categorized based upon how the DTC is latched. Latching a DTC
refers to retaining the present state of the current bit in the status byte. This retention may be permanent or of
limited duration until an event occurs (e.g., ECU power up reset).
Latching a DTC alters the operation of the ECU with respect to the execution of and/or reaction to the results
of a supported diagnostic test. A diagnostic test consists of actions performed from a given moment when all
conditions to start a diagnostic fault detection algorithm are fulfilled until the moment a diagnostic fault
detection algorithm makes a pass/fail decision. A failed diagnostic test indicates that the detected failure is
severe enough to set a DTC with current status.
Certain diagnostic tests are only run once per ignition cycle (e.g., EEPROM checksum test where the
checksum is calculated at power down and recalculated at power up with a mismatch indicating a fault). Once
the Current status is set to true, it remains set to true for the duration of the ignition cycle because the
diagnostic test does not run until the next ignition cycle. This is not considered a latching DTC.
All Non-Powertrain DTCs may be classified as belonging to one of three types:
Non-Latching DTCs (Figures E1 and E2): (Also called Condition Latching DTCs) Once the Current
status has been set to “True”, it remains set to true until the diagnostic test makes a pass decision. Most
currently implemented DTCs are of the non-latching type.
Limited Duration Latching DTCs (Figures E3 and E4): Once the Current status has been set to true, it
remains set to “True” regardless of the results of the diagnostic test until a specified event (e.g., power up
reset) occurs.
Note: The DTC is cleared when a clear diagnostic information command is received. Since the DTC is
latched, the diagnostic algorithm does not run. Therefore, the repair cannot be verified unless the specified
event occurs (e.g., ignition is cycled).
Permanently Latched DTCs (Figures E5 and E6): Once the Current status has been set to true, it
remains set to true regardless of the results of the diagnostic test. This type of DTC cannot be permanently
cleared and requires ECU replacement. The DTC can be temporarily cleared using a scan tool, but the
DTC returns at the next power up of the ECU.
Powertrain DTCs are also categorized into three main categories; Type A, Type B, and Type C (there is a
fourth category for DTC not supported that is not illustrated here, as these DTCs are in the ECU software but
are not run) based upon illumination of the Malfunction Indicator Lamp (MIL).
Note: Due to varying regional requirements, the following tables cannot illustrate all possible cases. These
tables are provided as examples and, in case of a conflict, do not supersede any documented diagnostic
requirements.
Type A DTCs (Figures E7, E8, and E9): The ECU sets the status current, history, and requests
illumination of the malfunction indicator lamp (MIL) when the diagnostic runs and fails. The current status
is cleared when a Test Pass is reported but the MIL remains illuminated for 3 consecutive ignition cycles,
depending on the DTC, when the diagnostic runs and does not fail.
Type B DTCs (Figures E10, E11, and E12): The ECU illuminates the malfunction indicator lamp (MIL)
when the diagnostic runs and fails during 2 or 3 consecutive trips, depending on the regional requirements.
The first failure will cause the current status bit to be set, but the history and warning indicator requested
status bits do not set unless the diagnostic runs and fails during 2 or 3 consecutive trips.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Type C DTCs (Figures E13 and E14): The ECU stores the DTC information into memory when the
diagnostic runs and fails. Type C DTCs do not illuminate the malfunction indicator lamp (MIL) but may
cause another indicator to illuminate.
DTC information includes the base DTC (two bytes), failure type byte, status byte, freeze frame data (emission
related ECUs only), failure record information, and other data such as flags, counters, timers, etc., specific to
the DTC. This information has limited duration usefulness. An automatic clearing of DTC information function is
implemented in order to avoid reporting out of date information. For Non-Powertrain ECUs, all DTCs are
cleared at the same time. This means that the timing of the automatic clearing of DTCs is based upon the most
recently detected DTC.
Automatic Clearing of DTCs (Figure E15): Automatic clearing of DTC Information is clearing all DTCs in
the ECU memory after a predetermined number of consecutive ignition on/off cycles with no test fail result.
The typical number of fault free ignition cycles is 40.
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1
CDTCSPU 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1
TNPSCPU 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0
HDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TFSDTCC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TNPSDTCC 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
CDTC 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$25 $01 $01 $21 $01 $DB $DB $BB $FB $59 $59 $39 $19 $25 $01 $DB $DB
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
Information
Information
WIRS 1 1 0 1 1 1 1 0 0 0
CDTCSPU 1 0 0 1 1 0 1 0 0 0
TNPSCPU 0 1 1 1 1 1 1 1 1 1
HDTC 1 1 0 1 1 1 1 0 0 0 DTC Not Set
TFSDTCC 1 1 0 1 1 1 1 0 0 0
TNPSDTCC 0 0 1 1 1 1 1 1 1 1 History DTC
CDTC 1 1 0 1 1 1 1 0 0 0
DTCSBC 1 1 1 1 1 1 1 1 1 1 Current DTC, Warning Lamp On
$DB $BB $25 $FF $FF $BF $FF $25 $25 $25
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1
CDTCSPU 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1
TNPSCPU 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0
HDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1
TFSDTCC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1
TNPSDTCC 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
CDTC 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$25 $01 $01 $21 $01 $DB $DB $39 $FB $DB $DB $39 $19 $25 $01 $DB
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
Information
Information
WIRS 1 0 0 1 1 0 1 0 0 0
CDTCSPU 1 0 0 1 1 0 1 0 0 0
TNPSCPU 0 1 1 1 1 1 1 1 1 1
HDTC 1 1 0 1 1 1 1 0 0 0 DTC Not Set
TFSDTCC 1 1 0 1 1 1 1 0 0 0
TNPSDTCC 0 0 1 1 1 1 1 1 1 1 History DTC
CDTC 1 0 0 1 1 0 1 0 0 0
DTCSBC 1 1 1 1 1 1 1 1 1 1 Current DTC, Warning Lamp On
$DB $39 $25 $FF $FF $3D $FF $25 $25 $25
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1
CDTCSPU 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1
TNPSCPU 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0
HDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1
TFSDTCC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1
TNPSDTCC 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
CDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$25 $01 $01 $21 $01 $DB $DB $BB $FB $DB $DB $BB $9B $25 $01 $DB
ECU Power Up
Information
WIRS 1 1 0 0 1
CDTCSPU 1 0 0 0 0
TNPSCPU 0 1 1 1 1
HDTC 1 1 0 0 1 DTC Not Set
TFSDTCC 1 1 0 0 1
TNPSDTCC 0 0 1 1 0 History DTC
CDTC 1 1 0 0 1
DTCSBC 1 1 1 1 1 Current DTC, Warning Lamp On
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
CDTCSPU 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1
TNPSCPU 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0
HDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TFSDTCC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TNPSDTCC 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
CDTC 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$25 $01 $01 $21 $01 $DB $DB $BB $FB $D9 $D9 $B9 $99 $25 $01 $DB $DB
Power Cycle #5 Power Cycle #6 Power Cycle #7 Power Cycle #8 Power Cycle #9
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
ECU Power Up
ECU Power Up
Information
Information
WIRS 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1
CDTCSPU 0 0 1 1 0 1 0 0 0 1 1 0 0 0 0 0
TNPSCPU 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0
HDTC 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1
TFSDTCC 1 0 1 1 1 1 0 0 0 1 1 1 1 1 1 1
TNPSDTCC 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0
CDTC 1 0 1 1 1 1 0 0 0 1 1 1 0 0 0 0
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
$BB $25 $FF $FF $BF $FF $25 $25 $25 $FF $FF $BF $99 $99 $B9 $99
ECU Power Up
WIRS 1 1 1 1 0 0
CDTCSPU 0 0 0 0 0 0 DTC Not Set
TNPSCPU 0 1 0 0 1 0
HDTC 1 1 1 1 1 1 History DTC
TFSDTCC 1 1 1 1 1 1
TNPSDTCC 0 0 0 0 0 0 History DTC, Warning Lamp On
CDTC 0 0 0 0 0 0
DTCSBC 1 1 1 1 1 1 Current DTC, Warning Lamp On
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0
CDTCSPU 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1
TNPSCPU 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0
HDTC 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0
TFSDTCC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TNPSDTCC 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
CDTC 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$25 $01 $01 $21 $01 $4B $4B $2B $FB $D9 $D9 $B9 $99 $25 $01 $4B $4B
Power Cycle #5 Power Cycle #6 Power Cycle #7 Power Cycle #8 Power Cycle #9
ECU Power Up
ECU Power Up
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
CDTCSPU 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0
TNPSCPU 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0
HDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
TFSDTCC 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
TNPSDTCC 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
CDTC 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$2B $25 $6F $6F $2F $FF $FF $BF $99 $99 $B9 $99 $99 $B9 $99 $99
$39 $19
ECU Power Up
ECU Power Up
Information
WIRS 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 1
CDTCSPU 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 1 1
TNPSCPU 1 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 0
HDTC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TFSDTCC 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1
TNPSDTCC 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
CDTC 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 1
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$25 $01 $01 $21 $01 $DB $DB $3B $FB $59 $59 $39 $19 $25 $01 $DB $DB
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
Information
Information
WIRS 0 0 1 1 0 1 0 0 0
CDTCSPU 0 0 1 1 0 1 0 0 0 DTC Not Set
TNPSCPU 1 1 1 1 1 1 1 1 1
HDTC 1 0 1 1 1 1 0 0 0 History DTC
TFSDTCC 1 0 1 1 1 1 0 0 0
TNPSDTCC 0 1 1 1 1 1 1 1 1 Current DTC
CDTC 1 0 1 1 1 1 0 0 0
DTCSBC 1 1 1 1 1 1 1 1 1 Current DTC, Warning Lamp On
Ignition Cycles
ECU Power Down
38 Fault Free
Clear Diagnostic
ECU Power Up
ECU Power Up
ECU Power Up
Information
WIRS 0 1 0 0 0 0 0 0 0 0 0
CDTCSPU 0 1 1 1 0 0 0 0 0 0 0
TNPSCPU 1 1 0 0 1 0 0 1 0 1 0
HDTC 0 1 1 1 1 1 1 1 1 0 0 DTC Not Set
TFSDTCC 0 1 1 1 1 1 1 1 1 0 0
TNPSDTCC 1 1 0 0 0 0 0 0 0 1 0 History DTC
CDTC 0 1 0 0 0 0 0 0 0 0 0
DTCSBC 1 1 1 1 1 1 1 1 1 1 1 Current DTC, Warning Lamp On
$25 $FF $59 $59 $39 $19 $19 $39 $19 $25 $01
E1.2 DTC Failure Type Definition General Description. The DTC Failure Type consists of 16 different failure
categories, where each category is associated with 16 Sub Type Failures (also known as symptoms). The Sub
Type Failures are logically grouped in a DTC Failure Type Category. This was done to simplify the selection of
the appropriate Sub Type Failure (Symptom) for a DTC.
The DTC Failure Category is decoded in the High Nibble of the DTC Failure Type Byte and the Failure Sub
Type is decoded in the Low Nibble of the DTC Failure Type Byte. Refer to Table E2.
Table E3 provides the DTC Failure Type Byte category definitions.
E1.2.1 Definition and Appropriate Uses Of DTC Failure Type Value $00. The DTC Failure Type value zero
($00) is used to indicate that no additional information is available beyond that provided by the description for
the DTC two (2) byte base code. Although the value of zero ($00) falls into the General Electrical Failures
category, it can also be used for other types of DTCs as long as no other fault type values exist that would
provide additional information.
In cases where legislative requirements do not allow the reporting of DTCs with a fault type byte (e.g.,
emissions related DTCs), the ECU may choose to report its DTCs via enhanced diagnostic services with the
fault type byte coded to zero ($00). This approach allows the same DTC tables to be used for reporting DTCs
with both legislated and enhanced diagnostic services.
E1.3 DTC Failure Type Definition by Category. The DTC Failure Type Byte Definitions in the tables below
shall be used to provide additional fault information for all DTCs which do not meet one of the exceptions
outlined in section E1.2.1.
E1.3.1 DTC Failure Sub Type (Symptom) Definition of General Electrical Failures.
Table E4: DTC Failure Sub Type Definition for Failure Category “0”
Failure Sub General Electrical Failures
Type Type This category includes standard wiring failure modes (i.e., shorts and opens), direct
current (DC) quantities related by Ohm’s Law and quantities related to amplitude,
frequency or rate of change, and waveshape.
Byte Nibble Sub Type
(hex) (binary) Description Definition
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
E1.3.2 DTC Failure Sub Type (Symptom) Definition of Additional General Electrical Failures.
Table E5: DTC Failure Sub Type Definition for Failure Category “1”
Failure Sub Additional General Electrical Failures
Type Type Note: This category includes the overflow from category 0.
Byte Nibble Sub Type
(hex) (binary) Description Definition
10 0000 reserved
11 0001 above maximum threshold This sub type is used for failures where some circuit
quantity is above a specified range.
12 0010 below minimum threshold This sub type is used for failures where some circuit
quantity is below a specified range.
13 0011 voltage low/high temperature This sub type is used for failures where a temperature
sensor with a negative temperature coefficient detects a
voltage below a specified range.
14 0100 voltage high/low temperature This sub type is used for failures where a temperature
sensor with a negative temperature coefficient detects a
voltage above a specified range.
15 0101 signal rising time failure This sub type is used for failures where the signal rise
time is outside a specified range.
16 0110 signal falling time failure This sub type is used for failures where the signal fall
time is outside a specified range.
17 0111 signal shape/ waveform failure This sub type is used for failures where the shape of the
signal (plot of the amplitude with respect to time) is not
correct, e.g., improper circuit impedance.
18 1000 signal amplitude < minimum This sub type is used for failures where the ECU
measures a signal voltage below a specified range but
not necessarily a short to ground, e.g., gain too low.
19 1001 signal amplitude > maximum This sub type is used for failures where the ECU
measures a signal voltage above a specified range but
not necessarily a short to battery, e.g., gain too high.
1A 1010 bias level out of range This sub type is used for failures where the ECU applies
a bias voltage to a circuit upon which is superimposed a
signal voltage, e.g., Oxygen Sensor circuit.
1B 1011 signal cross coupled This sub type is used for failures where the ECU detects
a circuit shorted to another circuit when both circuits are
controlled by the ECU.
1C 1100 reserved
1D 1101 reserved
1E 1110 reserved
1F 1111 intermittent This sub type is used for failures where the ECU
momentarily detects one of the conditions defined above
but not long enough to set a specific sub type.
Table E6: DTC Failure Sub Type Definition for Failure Category “2”
Failure Sub FM/PWM (Frequency/Pulse Width Modulated) Failures
Type Type Note: This category includes faults related to Frequency Modulated (FM) and Pulse Width
Modulated (PWM) inputs and outputs of the ECU. This category also includes faults where
position is determined by counts.
Byte Nibble Sub Type
(hex) (binary) Description Definition
20 0000 reserved
21 0001 incorrect period This sub type is used for failures where the ECU
measures an incorrect duration for one cycle of the
output.
22 0010 low time < minimum This sub type is used for failures where the ECU detects
the low pulse is too narrow with respect to time.
23 0011 low time > maximum This sub type is used for failures where the ECU detects
the low pulse is too wide with respect to time.
24 0100 high time < minimum This sub type is used for failures where the ECU detects
the high pulse is too narrow with respect to time.
25 0101 high time > maximum This sub type is used for failures where the ECU detects
the high pulse is too wide with respect to time.
26 0110 frequency too low This sub type is used for failures where the ECU detects
too few cycles in a given time period.
27 0111 frequency too high This sub type is used for failures where the ECU detects
too many cycles in a given time period.
28 1000 incorrect frequency This sub type is used for failures where the ECU
measures an incorrect number of cycles in a given time
period.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
29 1001 too few pulses This sub type is used for failures where the ECU
measures too few pulses (e.g., position is calibrated in
counts from one extreme to the other).
2A 1010 too many pulses This sub type is used for failures where the ECU
measures too many pulses (e.g., position is calibrated in
counts from one extreme to the other).
2B 1011 missing reference This sub type is used for failures where the ECU does
not detect a reference for a signal circuit or a group of
signal circuits.
2C 1100 reserved Defined in previous revision of this specification as
reference compare error. Eliminated due to
redundancy with other existing fault types.
2D 1101 reserved
2E 1110 reserved
2F 1111 reserved
E1.3.4 DTC Failure Sub Type (Symptom) Definition of ECU Internal Failures.
Table E7: DTC Failure Sub Type Definition for Failure Category “3”
Failure Sub ECU Internal Failures
Type Type Note: This category includes faults related to memory, software, and internal electrical
circuitry; requiring component replacement.
Byte Nibble Sub Type
(hex) (binary) Description Definition
30 0000 reserved
31 0001 general checksum failure This sub type is used by the ECU to indicate an incorrect
checksum calculation where memory type is not
specified.
32 0010 general memory failure This sub type is used by the ECU to indicate a memory
failure where memory type is not specified.
33 0011 special memory failure This sub type is used by the ECU to indicate a memory
failure where the specific memory type is not defined in
this category.
34 0100 RAM failure This sub type is used by the ECU to indicate a Random
Access Memory (RAM) failure.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
35 0101 ROM failure This sub type is used by the ECU to indicate a Read
Only Memory (ROM) failure.
36 0110 EEPROM failure This sub type is used by the ECU to indicate an
Electrically Erasable Programmable Read Only Memory
(EEPROM) failure.
37 0111 watchdog/safety µC failure This sub type is used by the ECU to indicate a failure in
the execution of operational software.
38 1000 supervision software failure This sub type is used by the ECU to indicate a loop time
error in the execution of the operational software.
39 1001 internal electronic failure This sub type is used by the ECU to indicate the
detection of an internal circuit failure.
3A 1010 incorrect component installed This sub type is used by the ECU to indicate a mismatch
between the hardware connected to the ECU and the
hardware expected by the ECU.
3B 1011 Internal Self Test Failed This sub type is used by the ECU to indicate a sensor
self-test failure launched by an ECU command.
3C 1100 Internal Communications Failure This sub type is used by the ECU to indicate loss of an
internal communication line, e.g., between
microprocessors in a dual microprocessor configuration.
3D 1101 reserved
3E 1110 reserved
3F 1111 reserved
E1.3.5 DTC Failure Sub Type (Symptom) Definition of ECU Programming Failures.
Table E8: DTC Failure Sub Type Definition for Failure Category “4”
Failure Sub ECU Programming Failures
Type Type Note: This category includes faults related to operational software, calibrations, and
options; remedied by programming the ECU.
Byte Nibble Sub Type
(hex) (binary) Description Definition
40 0000 reserved
41 0001 operational software/calibration This sub type is used to indicate that only boot software
set not programmed is present in the ECU.
42 0010 calibration data set not This sub type is used to indicate that operational
programmed software is present but calibration data is not.
43 0011 EEPROM error This sub type is used to indicate an EEPROM error that
may be remedied by reprogramming the module.
44 0100 security access not activated This sub type is used to indicate that programming was
attempted without unlocking the ECU.
45 0101 variant not programmed This sub type is used to indicate the need to enter
(program) the sub system option content.
46 0110 vehicle configuration not This sub type is used to indicate the need to enter
programmed (program) the vehicle option content.
47 0111 VIN not programmed This sub type is used to indicate the need to enter
(program) the vehicle identification number (VIN).
48 1000 theft/security data not This sub type is used to indicate the need to enter
programmed (program) the theft/security code.
49 1001 RAM error This sub type is used by the ECU to indicate a Random
Access Memory (RAM) error remedied by
reprogramming.
4A 1010 checksum error This sub type is used by the ECU to indicate an incorrect
checksum calculation where memory type is not
specified.
4B 1011 calibration not learned This sub type is used by the ECU to indicate that a
password, operational range, etc. for a sensor or
actuator must be learned by the ECU.
4C 1100 DTC memory full This sub type is used by the ECU to indicate that more
DTCs have been detected than can be accommodated
by the memory allocated for DTC storage.
4D 1101 stack overflow This subtype is used by the ECU to indicate that more
memory has been used in a stack than is allocated to a
program.
4E 1110 reserved
4F 1111 reserved
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
GM WORLDWIDE ENGINEERING STANDARDS GMW3110
E1.3.6 DTC Failure Sub Type (Symptom) Definition of Algorithm Based Failures.
Table E9: DTC Failure Sub Type Definition for Failure Category “5”
Failure Sub Algorithm Based Failures
Type Type Note: This category includes faults based on comparing two or more input parameters for
plausibility or comparing a single parameter to itself with respect to time.
Byte Nibble Sub Type
(hex) (binary) Description Definition
50 0000 reserved
51 0001 reserved Defined in previous revision of this specification as
calculation failure. Eliminated due to redundancy with
other existing fault types.
52 0010 reserved Defined in previous revision of this specification as
compare failure. Eliminated due to redundancy with
other existing fault types.
53 0011 temperature low This sub type is used for failures where the ECU
calculates a low temperature condition based upon the
duration of certain operating parameters.
54 0100 temperature high This sub type is used for failures where the ECU
calculates a high temperature condition based upon the
duration of certain operating parameters.
55 0101 expected number of transitions/ This sub type is used for failures where the ECU
events not reached monitors a parameter over time within specified limits
and detects fewer than the expected number of
transitions.
56 0110 allowable number of transitions/ This sub type is used for failures where the ECU
events exceeded monitors a parameter over time within specified limits
and detects more than the expected number of
transitions.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
Table E10: DTC Failure Sub Type Definition for Failure Category “6”
Failure Sub Mechanical Failures
Type Type Note: This category includes faults detected by inappropriate motion in response to an
ECU controlled output.
Byte Nibble Sub Type
(hex) (binary) Description Definition
60 0000 reserved
61 0001 actuator stuck This sub type is used for failures where the ECU does
not detect any motion in response to energizing a motor,
solenoid, relay, etc.
62 0010 actuator stuck open This sub type is used for failures where the ECU does
not detect any motion upon commanding the operation
of a motor, solenoid, relay, etc., to close some piece of
equipment.
63 0011 actuator stuck closed This sub type is used for failures where the ECU does
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
E1.3.8 DTC Failure Sub Type (Symptom) Definition of Bus Signal Failures.
Table E11: DTC Failure Sub Type Definition for Failure Category “7”
Failure Sub Bus Signal/Message Failures
Type Type Note: This category includes faults related to bus hardware and signal integrity. This
category is also used when the physical input for a signal is located in one ECU and
another ECU diagnoses the circuit.
Byte Nibble Sub Type
(hex) (binary) Description Definition
70 0000 reserved
71 0001 invalid serial data received This sub type is used by the ECU to indicate a signal
was received with the corresponding validity bit equal to
invalid or post processing of the signal determines it is
invalid.
--``,,``````,``,,``,,,`,`,`,,-`-`,,`,,`,`,,`---
72 0010 alive counter incorrect/not This sub type is used by the ECU to indicate a signal
updated was received without the corresponding rolling count
value being properly updated.
73 0011 parity error This sub type is used by the ECU to indicate a message
was processed with an incorrect parity calculation.
74 0100 value of signal protection This sub type is used by the ECU to indicate a message
calculation incorrect was processed with an incorrect protection (checksum)
calculation.
75 0101 signal above allowable range This sub type is used for failures where some circuit
quantity, reported via serial data, is above a specified
range.
76 0110 signal below allowable range This sub type is used for failures where some circuit
quantity, reported via serial data, is below a specified
range.
77 0111 reserved
78 1000 reserved
79 1001 reserved
7A 1010 reserved
7B 1011 reserved
7C 1100 reserved
7D 1101 reserved
7E 1110 reserved
7F 1111 Erratic This sub type is used for failures where the signal,
reported via serial data, is momentarily implausible or
discontinuous.
E1.4 Requesting New DTC Numbers and/or Failure Types. The failure types listed beginning with
paragraph E1.3 are current at the time of the publication of this specification. Assignment of DTC numbers and
new DTC failure types (including any failure type assignments in the “F” failure type range) are managed by
the GM Service and Parts Operations organization. The GM Service and Parts Operations web site contains
the latest versions of the DTC documents and the site also contains a form for requesting new DTCs and/or
DTC failure types.