汽车 ECU 升级初探

  • A+
所属分类:未分类

    ECU固件升级,类似于手机固件升级,大概流程是实现 Bootloader,完成 EEPROM/Flash 的读写,当然需要了解 ECU 所使用的 MCU,MCU 内部EEPROM/Flash 和外部 EEPROM/Flash 的读写,学习门槛很高,别的不说,光是 ECU 固件逆向就不容易,因为需要了解 10 多种 MCU 汇编语言,还需要编写各种 IDA 插件,难度很大。本文对 ECU 固件升级进行基本的阐述,如果有错误的地方,恳请斧正。

一、UDS

UDS,UNIFIED DIAGNOSTIC SERVICES,它是汽车诊断的核心,常用的UDS服务SID如下:

OBD2_MODE_SHOW_CURRENT_DATA:0x01

OBD2_MODE_SHOW_FREEZE_FRAME:0x02

OBD2_MODE_READ_DTC:0x03

OBD2_MODE_CLEAR_DTC:0x04

OBD2_MODE_TEST_RESULTS_NON_CAN:0x05

OBD2_MODE_TEST_RESULTS_CAN:0x06

OBD2_MODE_READ_PENDING_DTC:0x07

OBD2_MODE_CONTROL_OPERATIONS:0x08

OBD2_MODE_VEHICLE_INFORMATION:0x09

OBD2_MODE_READ_PERM_DTC:0x0A

OBD2_MODE_ENHANCED_DIAGNOSTIC_REQUEST :0x22

UDS_SID_START_DIAGNOSTIC_SESSION:0x10

UDS_SID_ECU_RESET:0x11

UDS_SID_READ_FREEZE_FRAME_DATA:0x12

UDS_SID_READ_DIAGNOSTIC_TROUBLE_CODES: 0x13

UDS_SID_CLEAR_DIAGNOSTIC_INFORMATION:0x14

UDS_SID_READ_DIAGNOSTIC_TROUBLE_CODES_STATUS :0x17

UDS_SID_READ_DTC_BY_STATUS:0x18

UDS_SID_READ_DTC_INFORMATION:0x19

UDS_SID_READ_ECU_ID :0x1A

UDS_SID_STOP_DIAGNOSTIC_SESSION:0x20

UDS_SID_READ_DATA_BY_LOCAL_ID:0x21

UDS_SID_READ_DATA_BY_COMMAND_ID:0x22

UDS_SID_READ_MEMORY_BY_ADDRESS:0X23

UDS_SID_READ_SCALING_DATA_BY_IDENTIFIER:0x24

UDS_SID_STOP_REPEATED_DATA_TRANSMISSION:0x25

UDS_SID_SET_DATA_RATES:0X26

UDS_SID_SECURITY_ACCESS:0X27

UDS_SID_COMMUNICATION_CONTROL:0x28

UDS_SID_READ_DATA_BY_PERIODIC_IDENTIFIER:0x29

UDS_SID_READ_DATA_BY_ID_PERIODIC:0x2A

UDS_SID_DYNAMICALLY_DEFINE_LOCAL_ID:0x2C

UDS_SID_DEFINE_PID_BY_MEMORY_ADDRESS:0x2D

UDS_SID_WRITE_DATA_BY_COMMAND_ID:0x2E

UDS_SID_INPUT_OUTPUT_CONTROL_BY_COMMAND_ID:0x2F

UDS_SID_INPUT_OUTPUT_CONTROL_BY_LOCAL_ID:0x30

UDS_SID_START_ROUTINE_BY_LOCAL_ID:0x31

UDS_SID_STOP_ROUTINE_BY_LOCAL_ID:0x32

UDS_SID_REQUEST_ROUTINE_RESULTS_BY_LOCAL_ID:0x33

UDS_SID_REQUEST_DOWNLOAD:0x34

UDS_SID_REQUEST_UPLOAD:0x35

UDS_SID_ TRANSFER_DATA:0x36

UDS_SID_REQUEST_TRANSFER_EXIT:0x37

UDS_SID_START_ROUTINE_BY_ADDRESS:0x38

UDS_SID_STOP_ROUTINE_BY_ADDRESS:0x39

UDS_SID_REQUEST_ROUTINE_RESULTS_BY_ADDRESS:0x3A

UDS_SID_WRITE_DATA_BY_LOCAL_ID:0x3B

UDS_SID_WRITE_MEMORY_BY_ADDRESS:0x3D

UDS_SID_TESTER_PRESENT:0x3E

UDS_SID_NEGATIVE_RESPONSE:0x7F

UDS_SID_ESC_CODE:0x80

UDS_SID_START_COMMUNICATION :0x81

UDS_SID_STOP_COMMUNICATION:0x82

UDS_SID_ACCESS_TIMING:0x83

UDS_SID_SECURED_DATA_TRANS:0x84

UDS_SID_CONTROL_DTC_SETTINGS:0x85

UDS_SID_RESPONSE_ON_EVENT:0x86

UDS_SID_LINK_CONTROL:0x87

FORD_REQUEST_DATA_DIAGNOSTIC_DATA_PACKET:0xA0

FORD_DYNANICALLY_DEFINE_DIAGNOSTIC_DATA_PACKET:0xA1

FORD_DIAGNOSTIC_COMMAND:0xB1

GM_PROGRAMMED_STATE:0xA2

GM_PROGRAMMING_MODE:0xA5

GM_READ_DIAGNOSTIC_INFO:0xA9

GM_READ_DATA_BY_ID:0xAA

GM_DEVICE_CONTROL:0xAE

二、AUTOSAR

AUTOSAR(AUTomotive Open System ARchitecture),支持的协议有:CAN, FlexRay, LIN, Ethernet等。它是ECU固件开发的标准,UDS属于AUTOSAR的一部分,越来越多的ECU固件开发使用AUTOSAR。

三、XCP

XCP(Universal Measurement and Calibration Protocol),支持的协议有: CAN、SPI、 SCI,、TCP/IP,、UDP/IP,、USB、FlexRay等。它是ECU校准协议,扩展于CCP(CAN Calibration Protocol)。

四、ODX

ODX((Open Diagnostic Data Exchange),基于XML,用于描述与汽车诊断相关数据,是汽车诊断格式标准。

五、VCI和MVCI

VCI(Vehicle Communication Interfaces),MVCI(Multiple Vehicle Connect Interface),都是汽车外部ECU(诊断工具、诊断软件等)和内部ECU的通信接口标准,对于常用的ECU诊断(包含固件升级),使用VCI就足够了。VCI支持的协议有:SAE J1850 PWM/VPW、ISO 15765-4(CAN)、ISO 9141-2、ISO 14230-4(KWP 2000)、SAE J2818(KWP 1281)、SAE J1979。SAE J1979主要是大型车使用,SAE J2818主要是大众使用,在CAN协议上,又分高速CAN、中速CAN、低速CAN。ISO 9141-2、KWP 2000、KWP 1281类似于串口,统称K-Line。

六、汽车发动机

发动机有:TD、TDI 、TSI 、FSI、 TFSI、 TDCI 、TDDI 、TURBO 、V6 、VR6、 V8等,TDI、TSI、FSI、TFSI用的好像比较多。

七、MCU

汽车有非常多个的ECU,非射频相关可称为AP(Application Processor),射频相关可称为BP(Baseband Processor),本文讨论的是AP,主要ECU有:BCM(Body Control Module),PCM(Power Control Module),PAM(Park Assist Module)。BCM,即主板,需要了解BCM固件中PAM和PCM的通信;PCM,发动机ECU,需要了解该ECU固件中MAP表的处理过程;UDS有可能集成在BCM或PAM,需要了解该ECU固件中汽车诊断协议的处理过程。本文假设BCM、PCM、PAM三者独立存在,当然PCM和PAM有可能集成,还有可能与BCM集成。PCM和PAM这两个ECU非常关键,需要了解PCM和PAM这两个ECU所采用的ECU厂商,ECU厂商所使用的MCU,以及ECU厂商所使用的EEprom/Flash等,本文主要关注PCM。

1、PCM

主要使用的MCU有:Infineon/ST C16X/ST10、Infineon/ST Tricore TC17XX、Freescale/Motorola MPC5XX、Freescale/Motorola MPC5XXX、Freescale/Motorola HC12X、Renesas SH 70XX、Renesas SH 72XXX、Renesas V850、Renesas M16/M32、Renesas H8SX等。

2、PAM

主要使用的MCU有:Renesas V850、Freescale/Motorola HC12X、Renesas M16/M32、常见MCU(8051、PIC、AVR)等。主要使用V850、HC12X。

3、BCM

可以分为主模块和副模块。主模块已知使用的MCU有ARM、M16/M32,副模块可以认为是CAN模块,已知使用的MCU有V850、HC12X。

4、EEPROM/Flash

尚未关注。MCU外部EEPROM/Flash读写方式有:SPI、I2C、MircoWire、4Wire等。

八、ECU厂商

1、BOSCH

采用的MCU有3个版本:EDC15、EDC16、MED7、MD7使用C16X;EDC16+U/C/CP、MED9、MD9使用MPC 5XX/MPC 5XXX;EDC17、MED17、MD17使用Tricore。使用Tricore TC1796/TC1797的有:EDC17CP、MED17、MD17。

2、SIEMENS CONTINENTAL

主要使用C16X/ST10、Tricore、MPC5XX、MPC5XXX,少量使用SH705X、SH72XXX。使用Tricore TC1796/TC1797的有:Siemens SIMOS 8/12/18、Siemens SID 208/807、Siemens SDI4、 Continental PCR 2.1。

3、DELPHI

主要使用C16X/ST10、Tricore、MPC5XX、MPC5XXX,部分使用SH705X、SH72XXX。使用Tricore TC1766/TC1767的有:MT80/MT86,使用MPC 5566/5567的有:DCM3.5、DCM3.7,使用SH72543/SH72544的有DCM3.7。

4、MAGNETI MARELLI

主要使用C16X/ST10、MPC5XX、MPC5XXX、HC12X。

5、MOTOROLA

主要使用MPC5XX、MPC5XXX、HC12X。

6、FORD EFI

主要使用MPC5XX、MPC5XXX、HC12X。

7、TRW

主要使用MPC5XX、MPC5XXX、HC12X。

8、TEMIC

主要使用C16X/ST10、MPC5XX、MPC5XXX、HC12X。

9、DENSO:

主要使用SH705X、SH72XXX、H8SX,Renesas旗下的MCU都有可能使用。

10、MITSUBISHI MELCO:

主要使用M16/M32、SH705X、SH72XXX,Renesas旗下的MCU都有可能使用。

11、SAGEM:

主要使用SH705X、SH72XXX,Renesas旗下的MCU都有可能使用。

12、VALEO:

主要使用SH705X、SH72XXX,Renesas旗下的MCU都有可能使用。

九、汽车厂商

1、日系

主要使用的MCU是SH70XX、SH72XXX,当然日系旗下的豪华品牌(本田讴歌、丰田雷克萨斯、日产英菲尼迪等)好像不一样,还有可能使用MPC5XX、MPC5XXX、C16X、Tricore等。

2、福特与通用

UDS使用的CAN协议不同,福特使用高速和中速CAN,通用使用高速和低速CAN,正常的是使用高速CAN。主要采用的MCU有:MPC5XX、MPC 5XXX、C16X、Tricore。

3、其它

Bosch在ECU厂商中的市场份额最大。国产、韩系如果使用Tricore,好像只采用Tricore TC1766/TC1767,应该没有采用TC1796/TC1797。

十、ECU固件升级方式

有两种方式,一种是调用ECU已经实现的BootLoader完成升级,这种方法称为通过EOBD(Enhance On-Board Diagnostic)进行固件升级,另一种是独立实现Bootloader,这种方法称为通过Boot Mode进行固件升级,第二种方法还有一种表现形式称为BDM模式。实际上,通过EOBD升级能够支持大部分车型,对于采用Tricore、MPC5XXX、SH72XXX的ECU,Bootloader已锁,需要知道解锁算法/解锁密钥才能通过EOBD进行固件升级,对于这种情况,主流的升级工具都是采用Boot Mode进行固件升级。主流的升级工具好像很少考虑Renesas MCU,以K-TAG、KESS V2、CMD FLASH为例,这三大升级工具都不能完美支持Renesas MCU固件升级,KESS V2支持Renesas MCU相对比较好,倒是有专门针对Renesas MCU的固件升级工具,如Piasini Serial Suite。

十一、ECU 固件升级工具的实现

有两种实现,一种是EOBD的实现,可以支持大部分车型,可以参考AUTOSAR或VCI来实现,MCU从V850、C16X、Tricore、MPC5XX、MPC5XXX、HC12X、SH705X、SH72XXX选取,或者选取常见的MCU,如ST的STM32、NXP的LPC、MircoChip的PIC等。

文章http://bbs.pediy.com/showthread.php?t=213087可供参考,注意该文章中关于ECU的描述是错误的;另一种是Boot Mode的实现,可以参考XCP来实现,虽然该实现是最通用的,硬件成本比EOBD的实现低,但在固件实现上需要实现各主流MCU的Bootloader,还要实现各EEPROM/Flash芯片的读写,难度很大。还有一种可能是选取K-TAG、KESS V2、CMD FLASH一种,逆向其固件,并重写其固件,这些升级工具PCB应该是单层的,逆向其PCB也是可能的。三大ECU升级工具(K-TAG、KESS V2、CMD FLASH)价格不菲,动辄上万,硬件成本最多价值1000,可以看出诊断数据很值钱,并且它们都不能完美支持Renesas旗下的MCU固件升级。

十二、ECU 固件逆向

需要了解的汇编语言有:Infineon/ST C16X/ST10、Infineon/ST Tricore、PowerPC(MPC5XX/MPC5XXX)、M68K(HC12X)、Renesas V850 E1/E2、Renesas SH2/SH4、Renesas M16/M32、Renesas H8SX、8051、ARM、PIC、AVR、X86/X64等。

固件逆向通常是逆向固件加解密算法、固件检验算法、Bootloader解锁算法/解锁密钥、MAP表检验算法、ECU安全访问算法、UDS中汽车诊断协议的实现、UDS中ECU固件升级的实现、UDS消息检验算法、随机数生成算法等。对于大部分MCU固件,IDA都能反汇编,如果不能反汇编还需要编写反汇编插件,IDA并不知道固件Bin的内存映射方式,还需要编写ECU固件Bin的Loader插件。IDA插件编写方式有IDAPython和IDA SDK两种,推荐IDAPython。从这里可以看出,固件逆向主要是逆向算法,如果能实现一种IDA插件,该插件能够识别包含算术运算符、逻辑运算符的循环块,则将会大幅度减少固件逆向所需要的时间,实现该插件应该需要控制流分析方面的知识。

如果BCM、PCM、PAM有使用操作系统,还要知道使用哪种操作系统,越来越多的汽车PCM采用的MCU是Tricore、MPC5XXX、SH72XXX,越来越多的ECU固件根据AUTOSAR标准开发。

十三、汽车改装

动力相关的汽车改装,个人认为可以分为以下5个等级:

1、外观改装,根据空气动力学进行动力升级等。

2、修改PCM固件中的MAP表,修改UDS中的汽车诊断协议,修改BCM固件中与PCM和PAM的通信协议,用探针检测汽车各部件运行状态。该等级只涉及软件改装,主要涉及的MAP表有:Driver wish map、Torque limiter map、Smoke limiter map、Injection duration map、Boost target map、Boost limit map 、Single value boost limiter map、EGR map、Pump voltage table等,当然日系并不是这些表。使用的ECU MAP修改软件有:ECM Titanium、WinOls、官方软件(不容易获取)等。这个步骤也就是通常我们所说的ECU调校(ECU tuning)。因为在这个等级上进行改装很容易出现问题,所以需要在UDS中增加汽车诊断消息,并且还要修改BCM固件中PCM和PAM的通信协议,用探针检测汽车各部件运行状态。探针好像价格不菲,很多ECU调校只是修改MAP表,汽车很容易出现问题。严格意义上讲,一个map表是一个或多个偏微分方程的解,当然在实践中都是根据经验进行修改map表。在这个等级上,汽车动力能提升10%-30%左右,要想再提升就需要下一个等级。

3、替换传感器、喷油嘴、变速箱、刹车片等。在这个等级上,等级2改装是必备的,汽车动力能提升50%-70%左右,要想再提升就需要下一个等级。

4、替换PCM、PAM、发动机等。在这个等级上,等级2、等级3改装是必备的,汽车动力提升

80%-100%左右,要想再提升的话就可能要涉及汽车底盘。

5、增加ECU。在这个等级上,主要是减少等级4的改装复杂度的,因为等级4要想更换PCM、

PAM等ECU是非常困难的,所以是采用外挂ECU进行硬件hook来实现。当然,还有可能是增加汽车更多的功能。

国外关于汽车改装的相关产业已非常成熟,等级1-5都有实现,而国内呢,还处在等级1的外观美容上,大量的等级2改装只是国外的代理,只有少量的等级2改装是本地的。

十四、总结

汽车诊断,涉及多方面的内容,本文主要是对非射频相关的ECU中的发动机ECU进行初探,对于射频相关的ECU(WIFI、汽车钥匙等),尚未关注,对于ECU使用的EEPROM/Flash,尚未关注,对于汽车诊断中的探针部件,尚未关注。

PS:附件带有KESS V2支持的汽车品牌列表,根据本文可以推断出各汽车品牌所使用的MCU(日系主要使用Renesas MCU,国产主要使用C16X/ST10、Tricore)

附件:

ecu.zip

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: