E38 ETC/Slave - Deeper Dive
Posted: Thu May 29, 2025 4:39 pm
This post is about a deeper dive into the E38 Slave/ETC Motor Control Processor. Started out playing with the ETC limp mode challenges doing LS conversions 15+ years ago. Could not get that deep as apart from HPT with E40 (R&W), only GM could write the ETC (& HPT post 2009). ULink-NT is a tool that has helped make things clearer given it can write the ETC via CAN & R/W via BDM.
One thing for sure was that the Slave OS needs to be compatible with main OS, & the Slave Cal needs to be compatible with Slave OS & main cal/s & sometimes the TCM. Incompatibility could lead to limp mode throttle events, features like 08+ C6 Vette A6 rev matching on manual downshift not working.
Most will be familiar with these background details, but for those that aren’t:
GM Gen III LS’s originally had cable operated throttle bodies. Late in the Gen III lifecycle (MY2004?) a stand-alone TAC module was added into the picture to electronically control the throttle via an electronic pedal & UART serial communication/control/monitoring with the LS1 PCM.
For MY2005 the E40 ECM (24x crank – 1Mb flash) was introduced which moved the TAC module “inside” the engine controller with its own separate CPU – the MCP – motor control processor, a Motorola MC68F375 along with its own flash memory & RAM. A “slave” to the main MC68377 processor. While it is called the Slave, it supervises & provides limits to throttle control. The E40 supported the Gen 4 engines like 05 LS2’s, but the crank & cam were still 24x/1x.
MY2006 saw the introduction of the Gen 4 LS range via E38 (&E67?) (for 58x cranks/4x cam – 2Mb flash) ECM’s again with the ETC MCP (Motorola/FS MC9S12/HCS12) embedded in the controller alongside the main MPC561/5 CPU as a “slave” processor. Linkage between the main & slave was via an SPI link the same as E40.
With the back off an E38 it is pretty straight-forward to hook up a ULink-NT in BDM mode and explore the Slave flash (read & write).
The 32k binary image of the Slave flash comes out reverse to the main flash.
Operating System: 0x0000 to 0x67FF (0x6800 – 26k)
Calibration Segment: 0x6800 to 0x6DFF (0x0600 – 1.5k)
Non Volatile Mem 1: 0x6E00 to 0x6FFF (NVM/NVRAM/EEPROM/Long Term Mem – 0x0200 – 512bytes)
Non Volatile Mem 2: 0x7000 to 0x71FF (NVM/NVRAM/EEPROM/Long Term Mem – 0x0200 – 512bytes)
Boot block: 0x7200 to 0x7FFF (0x0E00 – 3.5k)
Guessing this boots from the boot block at 0x7FFF (Seg ID 12589243). Similar format to the main flash, just mapped in reverse.
The NVM is similar to the main CPU NVM, 2 banks, 4 blocks per bank (13 or more blocks in main NVM). Blocks get saved per key off cycle and when 4 used the bank is switched. Contains the OS & cal ID’s, Alpha Codes, and other bytes which are probably throttle learn values, status & error codes. No CVN’s or checksums stored.
The OS & Cal have Checksums & CVN’s the same as the main OS/Cals but CVN’s are 1 byte earlier.
Flashing the ETC/slave via CAN requires the OS to be as provided by GM with the duplicated header/index block which is deleted during the flash routine (similar to main OS), whereas the BDM read is just the flash image. (i.e. don’t try and edit out the OS from the BDM image and flash via CAN – ULink NT knows this and caters for it.)
One thing for sure was that the Slave OS needs to be compatible with main OS, & the Slave Cal needs to be compatible with Slave OS & main cal/s & sometimes the TCM. Incompatibility could lead to limp mode throttle events, features like 08+ C6 Vette A6 rev matching on manual downshift not working.
Most will be familiar with these background details, but for those that aren’t:
GM Gen III LS’s originally had cable operated throttle bodies. Late in the Gen III lifecycle (MY2004?) a stand-alone TAC module was added into the picture to electronically control the throttle via an electronic pedal & UART serial communication/control/monitoring with the LS1 PCM.
For MY2005 the E40 ECM (24x crank – 1Mb flash) was introduced which moved the TAC module “inside” the engine controller with its own separate CPU – the MCP – motor control processor, a Motorola MC68F375 along with its own flash memory & RAM. A “slave” to the main MC68377 processor. While it is called the Slave, it supervises & provides limits to throttle control. The E40 supported the Gen 4 engines like 05 LS2’s, but the crank & cam were still 24x/1x.
MY2006 saw the introduction of the Gen 4 LS range via E38 (&E67?) (for 58x cranks/4x cam – 2Mb flash) ECM’s again with the ETC MCP (Motorola/FS MC9S12/HCS12) embedded in the controller alongside the main MPC561/5 CPU as a “slave” processor. Linkage between the main & slave was via an SPI link the same as E40.
With the back off an E38 it is pretty straight-forward to hook up a ULink-NT in BDM mode and explore the Slave flash (read & write).
The 32k binary image of the Slave flash comes out reverse to the main flash.
Operating System: 0x0000 to 0x67FF (0x6800 – 26k)
Calibration Segment: 0x6800 to 0x6DFF (0x0600 – 1.5k)
Non Volatile Mem 1: 0x6E00 to 0x6FFF (NVM/NVRAM/EEPROM/Long Term Mem – 0x0200 – 512bytes)
Non Volatile Mem 2: 0x7000 to 0x71FF (NVM/NVRAM/EEPROM/Long Term Mem – 0x0200 – 512bytes)
Boot block: 0x7200 to 0x7FFF (0x0E00 – 3.5k)
Guessing this boots from the boot block at 0x7FFF (Seg ID 12589243). Similar format to the main flash, just mapped in reverse.
The NVM is similar to the main CPU NVM, 2 banks, 4 blocks per bank (13 or more blocks in main NVM). Blocks get saved per key off cycle and when 4 used the bank is switched. Contains the OS & cal ID’s, Alpha Codes, and other bytes which are probably throttle learn values, status & error codes. No CVN’s or checksums stored.
The OS & Cal have Checksums & CVN’s the same as the main OS/Cals but CVN’s are 1 byte earlier.
Flashing the ETC/slave via CAN requires the OS to be as provided by GM with the duplicated header/index block which is deleted during the flash routine (similar to main OS), whereas the BDM read is just the flash image. (i.e. don’t try and edit out the OS from the BDM image and flash via CAN – ULink NT knows this and caters for it.)