Multimap's uz EDC15 (1.9TDI/2.5TDI). Dzinēja uzstādījumu pārslēgšana gaitā

Mazliet pastāstīšu, kā uztaisīju multimap’u uz EDC15VM+ vadības bloka, pēdējā un vismodernākā ECU, kas nācis 1.9 dīzeļiem ar Bosch VP37 sūkni. Lasāmais vairāk advancētiem lietotājiem, satur programmēšanas terminus un var izrādīties garlaicīgs/neinteresants! :grinning:

Ja tas, ko šodien saprotam ar vārdu - čiptūnings, tipiski ir vadības blokā esošo datu - karšu, slēdžu un citu parametru mainīšana (95% gadījumos jaudas palielināšanai), tad šeit ir jāizdara izmaiņas pašā vadības bloka programmatūrā.

Vadības bloka programmatūra ir neliela datorprogramma, kas darbojas uz konkrētā bloka procesora, kas šajā gadījumā ir Siemens C167 mikrokontrolieris. EDC15 vadības blokā šī “programma” glabājas gan pašā C167 mikrokontroliera 32KB atmiņā, gan 512KB flešatmiņā M29F400BB. Varam pārrakstīt visas no atmiņām, savukārt pašu mikrokontrolieri vajadzēs tikai nolasīt.

Principā šī ideja ir realizējama ar ļoti lielu daļu vadības bloku, bet, lai tiktu pie rezultāta, nepieciešams diezgan ilgs laiks un labas programmēšanas zināšanas. Kā arī kaut kāda sajēga par dažādiem dzinēja vadības blokiem, un kā tie vispār darbojas.

Iekš ecuconnections viens cilvēks bija šo izveicis uz EDC15P 1.9PD vadības bloka un atstājis diezgan daudz informācijas, ar ko pietika, lai varētu pats visā tajā iebraukt un kaut ko arī saveidot uz sūkņa dzinēja EDC15VM+.

Kā jau lielai daļai programmatūras, kas tiek iedzīta dažādos auto blokos, pati pirmā aizsardzība, lai cilvēks no malas tur nevarētu tik viegli iejaukties, ir kontrolsummu sistēma. Tas nozīmē, ka pamainot vajadzīgos datu laukus un nepārrēķinot kontrolsummas, bloks atteiksies darboties.

Instrumentu paneļos bieži tiek pielietota arī atmiņas šifrēšana, bet šajos blokos vienīgā drošība ir kontrolsummas. Kontrolsummas kalpo ne tikai kā aizsardzība, bet arī, ja gadījumā flešatmiņa tiek bojāta, tad kontrolsummas nesakritīs un auto nevarēs palaist, teorētiski, lai nesabojātu dzinēju.

Jaunāki vadības bloki jau gan ir cits stāsts, šos vecos vadības blokus varam nosaukt par tajā laikā ļoti attīstītu un modernu tehnoloģiju. Kopš kura laika pagājuši jau 25 gadi.

Par pašu procedūru un darbības gaitu:

Pirms ķeramies pie programmēšanas, šim blokam būs jāatslēdz kontrolsummu rēķināšanas funkcijas. Par laimi šīs funkcijas glabājas bloka flešatmiņā, kas nozīmē, ka mēs viegli tām tiksim klāt. Par kontrolsummu atslēgšanu.

Pamata ideja ir progammas kodā atrast vietas, kuras pārbauda kontrolsummas un nesakritību rezultātā apstādina bloka darbību. Šīs vietas apiet, nomainot instrukciju, kuru bloka procesors apstrādā.

code_edc15

Asemblera kods. Šeit ar dzeltenu ir iezīmētas tās vietas kodā, kuras satur instrukciju cc_Z, kas pārbauda vai kontrolsummas rezultāts ir 0. C167 procesoros varam izmantot instrukciju cc_UC, kas nozīmēs, ka pārbaude netiks izpildīta. Atrodam vēl 4 vietas, pa visu programmas kodu, par cik jāmaina tikai viens baits atmiņas, tad reāli vadības flešā ir jāatrod 4 adreses, kuras pamainot vēlamais rezultāts būs sasniegts un kontrolsummas būs šim blokam izslēgtas.

Tālāk. Kā strādās “regulējumu” pārslēgšana?

Daudziem jau ir zināms, ka šajos vadības blokos glabājas vairāki koda bloki (codeblocks). No rūpnīcas šie bloki domāti, lai dažādām auto/dzinēja versijām varētu pielāgot programmatūru. Piemēram, automātkārbām un manuālājām atšķiras sūkņa plunžeri, tādēļ katram vajadzīgs mazliet cits dzinēja un sūkņa saregulējums. Tipiski vienā blokā ir 2-3 bloki, bet iespējams saglabāt ir arī vairāk. Pārslēgt šos blokus var ar VCDS pie vadības bloka iekš “Soft coding”.

Tātad šos blokus varam sarakstīt vairākus savām vajadzībām, ar pamainītām kartēm, uzstādījumiem. Vienu variantu sataisīt gonkām, vienu ielai. Vai, piemēram, ar citu ieslēgt launch-kontroli. Šeit var izpausties idejās.

Katrs koda bloks ir sadalīts trīs adrešu apgabalos (DPP0, DPP1 un DPP2), rakstīsim kodu, kas šos apgabalus pārslēdz. Tad nu, ar ko pārslēgsim?

Vadības blokam ir vairākas noderīgas ieejas - sajūga, gāzes, bremžu pedāļi. Ja ir kruīzkontrole, tad varam izmantot kruīzkontroles pogas. Varam izmantot jebkuru šo ieeju/pogu kombināciju, kas labāk patīk. Sev es pārslēgšanai izmantošu kombināciju - sajūga pedālis + kruīza aktivizēšanas pogu, ko nospiežot reizē, tiks aktivizēts pārslēgšanās režīms. Varēsim pārslēgt arī braucot un esot gaitā, dzinēja uzstādījumi stāsies spēkā tūlītēji.

Tagad sākās grūtākā daļa, vadības bloka atmiņā ir jāsameklē adreses, kurās glabājās šo ieeju vērtības. Par to sīki nestāstīšu, jo tas vairs īsti tik vienkārši un diez vai kādam vispār interesēs.
Kad atmiņas adreses sajūga pedālim un kruīzam ir atrastas, tad vēl jānoskaidro DPP0, DPP1 un DPP2 adreses katram koda blokam.

Kad ir tikts tik tālu sekos pati galvenā ideja:

Tātad… lai parādītu dzinēja apgriezienus, vadības bloks, daudzas reizes sekundē sūta apgriezienu signālu uz instrumentu paneli pa CAN līniju. Mums nepieciešāms “iestarpināties” starp šo funkciju (asemblera valodā - rutīnu, un izveidot savu apakšrutīnu). Pirms apgriezienu nosūtīšanas vadības blokam uzrakstīsim kodu, kas pārbauda, vai ir nospiests sajūgs un kruīza poga reizē.
Izmantosim procesora instrukciju, kas aizsūta uz tukšu vietu flešatmiņa un iestarpināsim to pirms apgriezienu nosūtīšanas instrukcijas. Tas būs uz 0x1A000, un tur ievietosim mūsu jauno kodu.

Ja sajūgs un kruīza aktivizēšanas poga netiks nospiesta, nekas no parastās vadības bloka darbības nemainīsies. Pretējā gadījumā, sāks izpildīties kods fleša adresē 0x1A000.

Šo kodu es izmantoju, lai pārslēgtos starp 3 koda blokiem un parādītu aktīvo bloku uz tahometra kā 1000RPM, 2000RPM un 3000RPM. Koda ideja no ecuconnections, bet pielāgots priekš EDC15VM+.

movb rl1,0xc29d  ;sajuugs
jnb r1.0, needle
movb rl1,0xc2a7  ;cc_ieslēgta
jnb r1.0, parsl
movb rl1,#1
movb 0xc6e7,rl1
jmpr cc_uc, needle
parsl:
movb rl1,0xc6e7
jmpr cc_z, needle
movb rl1,#0
movb 0xc6e7,rl1
movb rl1,0xc6e6  ;atskaites sk
jmpr cc_nz, dpp
movb rl1,#0x7f  
0x7F= 5000ms
movb 0xc6e6,rl1
jmpr cc_uc, needle

dpp:
cmp dpp0,#0x39
jmpr cc_eq, dppll
cmp dpp0,#0x3c
jmpr cc_eq, dppl
mov dpp0,#0x3c
mov dpp1,#0x3d
mov dpp2,#0x3e
jmpr cc_uc,needle

dppl:
mov dpp0,#0x39
mov dpp1,#0x3a
mov dpp2,#0x3b
jmpr cc_uc,needle

dppll:
mov dpp0,#0x36
mov dpp1,#0x37
mov dpp2,#0x38

needle:
mov rl1,0xc6e6
jmpr cc_z,end1
subb rl1,#1
mov 0xc6e6,rl1
cmp dpp0,#0x3c
jmpr cc_eq, n1
cmp dpp0,#0x36
jmpr cc_eq, n2
mov r4,#0x0
jmpr cc_uc, end1

n1:
mov r4,#0x1f40
jmpr cc_uc, end1

n2:
mov r4,#0xfa0

end1:
add r0,#4
mov r9,r4
rets


DriverProc	ENDP
DriverCode0	ENDS
		END

Nospiežot pogas, vispirms tiek aktivizēts pārslēgšanas režīms, kas ilgst 5 sekundes. Pēc tam apgriezienu rādītājs atkal nostājas savā vietā. Lai pārslēgtos turam sajūgu un spiežam kruīza aktiv. pogu, kamer apgriezienu rādītājs nostājas mums vajadzīgajā vietā. Ja vēlamies, šeit varam uz tahometra skalas parādīt praktiski jebkuru vērtību, kas glabājas blokam atmiņā. Piemēram, pārslēgt starp apgriezienu rādīšanu un aktuālā turbo spiediena parādīšanu. Iespējas šeit ir milzīgas.

Ak, jā, kad kods ir sarakstīts, tad jānokoplilē ar kādu C167 kompilatoru. Es izmantoju uVision. Tad gatavo kodu, kas izskatīsies apmēram kā simbolu virkne, piemēram, 5ABBFF184B0505 kopējam iekša vadības bloka flešā, sākot no adreses 0x1A000.
Un lai no vadības bloka fleša izgūtu lasāmu asemblera kodu, izmantoju IDA.

Nu un rakstam iekšā vadības blokā, un skatamies, vai blokam būs kādas dzīvības pazīmes vai nē :grinning:

Tiesa, man nav tik specifiska aprīkojuma, lai tajā ielīstu un pētītu vēl dziļāk, man pietiek ar parastu bloku pārslēgšanu. :slightly_smiling_face: Tāds arī bija mans mērķis.
Aktīvais koda bloks gan pēc dzinēja restarta nesaglabājās (saglabājās tas, kas uzlikts ar VCDS). Ja gribētu sataisīt arī to, tad būtu jāpapildina kods un jāparokas vēl pa vadības bloka programmas kodu.

Šādi izskatās tahometrs pie izslēgta dzinēja:

Šeit testējot… parādās 2 bloki parādās kā 3000/4000RPM. Pamainās tukšgaitas apgriezieni, kas uz katra bloka ir citādāki. Tā saprotam, ka viss darbojas.

Pašam nevienam neiesaku to darīt. Bija jau šāda tāda informācija pa interneta forumiem, kas mazliet padarīja to pasākumu vieglāk paveicamu. Katrs dzinēja bloka fails ir mazliet atšķirīgs, bet vienreiz izveicot un atstājot kaut kādus pierakstus, nākošreiz sadarīt visu ir krietni ātrāk nekā pāris nedēļas. :grinning:

3 Likes