Announcement

Collapse
No announcement yet.

CSL '0401' Program Binary Disassembly Notes

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • karter16
    replied
    Originally posted by Tomba View Post
    Depended if you reach the engine speed limiter at the end of the test track or other conditions is in which gear you need to start.
    That would quite possible explain then why the "NOISE_GANG" for the CSL is 4th gear, but for the Euro M3 it's 3rd. Maybe the extra power + reduced weight of the CSL was enough to cause the starting gear to be different.

    Thanks for this - very interesting!!

    Leave a comment:


  • Tomba
    replied
    Great work Karter, I have been reading this for a while and would like to have the skills to do this as well. Thanks for sharing all this.


    Originally posted by karter16 View Post
    Okay so this is very limited.

    Essentially what it does is monitor for the condition where the car is in 4th gear and has been cruising between 44 and 54 km/h for more than 3 seconds. At that point it enters "noise" mode where the max requestable torque is limited. As soon a different gear is selected or the car drops below 44 km/h or goes about 70 km/h noise mode ends....
    For European markets there is a noise measurement around 50km/h and then full load. Similar function is in my 2010 S1000RR which closes the exhaust valve to reduce noise during this event.
    Depended if you reach the engine speed limiter at the end of the test track or other conditions is in which gear you need to start. I believe the Ferrari 360 Modena would reach the limiter in 2nd gear and therefore the test conditions were adjusted.

    Leave a comment:


  • karter16
    replied
    Originally posted by Bry5on View Post

    Oh man that’s super interesting. Like a secret raw mode. Interested to hear what you find as you dig in more. This might be easier to set to 6 than setting every flap open engine speed for those that don’t have the flap installed. Thank you for all this work!
    Finally coming back to this:

    The code looks like this:

    Click image for larger version  Name:	Screenshot 2025-08-05 at 8.24.45 PM.png Views:	0 Size:	212.7 KB ID:	314460
    Click image for larger version  Name:	Screenshot 2025-08-05 at 8.24.56 PM.png Views:	0 Size:	181.3 KB ID:	314459
    Click image for larger version  Name:	Screenshot 2025-08-05 at 8.25.02 PM.png Views:	0 Size:	151.3 KB ID:	314458

    Setting k_ask_zustand_cfg to 0x06 will force the flap to open as soon as RPM goes above 1000 and it will stay open until RPM goes below 800. So effectively open all the time except at idle.

    This seems on the face of it that it could be an easier way to set the flap to "always" be open. However looking at the code you'll note that setting k_ask_zustand_cfg to 0x06 also skips checks for KATH_ST, etc. which has the effect of opening the snorkel flap even during warm up. This in turn has the effect, because of the way the code is written, of not blending the kf_egas_wdk_kh table during warm up, rather the DME will pull straight from the kf_egas_wdk_ask (CSL flap) table.

    Click image for larger version

Name:	Screenshot 2025-08-05 at 8.35.04 PM.png
Views:	77
Size:	83.6 KB
ID:	314461

    This appears to be the only side effect. The AlphaN tables are fine because they are blended based on AVAN1_SOLL_FAKTOR as discussed previously, and the adder table is blended in based on flap status (e.g. it's added on top of the standard map or the KATH map depending on which one is active).

    Given the effect of the egas_wdk tables I think it's probably best to continue with the approach of adjusting the flap open rpm tables rather than changing k_ask_zustand_cfg in order to avoid the undesirable side effect of the kf_egas_wdk_kh table being ignored during cold start/warm up.

    Leave a comment:


  • Bry5on
    replied
    Originally posted by karter16 View Post
    Well I hate to think how many hours I've spent on this in the last 9 months but this evening I figured out and named the last of the 138 CSL specific parameters.

    The last one was the parameter that defines how long the sport button needs to be held down for to trigger displaying the oil level sensor readout on the dash. The function that does this is schalt_m_st_calc (Master CPU "switches" status byte). The function runs every 10ms therefore a hex value of 0x64 (decimal 100) means that by default the button needs to be held down for 1 second.


    Click image for larger version Name:	Screenshot 2025-08-02 at 7.49.42 PM.png Views:	0 Size:	11.6 KB ID:	314088

    I might have names for all 138 parameters but the job doesn't finish here. I'm still in the middle of tidying up, refining and aligning names. Once that's done I then need to add/refine the descriptions of the parameters (Edit: this is the most important bit. Over the last 9 months I've got pretty good at understanding obscure German abbreviations for technical terms, but I need to make sure this ends up being something others can reference and use without the backstory), configure conversion factors, etc.

    Nevertheless this is a pretty big milestone and I have to say I've managed to get an awful lot further than I was expecting when I embarked on this.
    Legendary work my friend

    Leave a comment:


  • karter16
    replied
    Well I hate to think how many hours I've spent on this in the last 9 months but this evening I figured out and named the last of the 138 CSL specific parameters.

    The last one was the parameter that defines how long the sport button needs to be held down for to trigger displaying the oil level sensor readout on the dash. The function that does this is schalt_m_st_calc (Master CPU "switches" status byte). The function runs every 10ms therefore a hex value of 0x64 (decimal 100) means that by default the button needs to be held down for 1 second.


    Click image for larger version  Name:	Screenshot 2025-08-02 at 7.49.42 PM.png Views:	0 Size:	11.6 KB ID:	314088

    I might have names for all 138 parameters but the job doesn't finish here. I'm still in the middle of tidying up, refining and aligning names. Once that's done I then need to add/refine the descriptions of the parameters (Edit: this is the most important bit. Over the last 9 months I've got pretty good at understanding obscure German abbreviations for technical terms, but I need to make sure this ends up being something others can reference and use without the backstory), configure conversion factors, etc.

    Nevertheless this is a pretty big milestone and I have to say I've managed to get an awful lot further than I was expecting when I embarked on this.
    Last edited by karter16; 08-02-2025, 12:02 AM.

    Leave a comment:


  • ac427
    replied
    Originally posted by karter16 View Post
    I've now figured out 128 of the 138 parameters specific to the CSL. You'll see that my naming conventions aren't entirely consistent, but once I've figured out the last 10 and have a complete view I can then align the naming accordingly.
    Excellent work mate 👍
    Last edited by ac427; 07-29-2025, 10:52 AM.

    Leave a comment:


  • karter16
    replied
    I've now figured out 128 of the 138 parameters specific to the CSL. You'll see that my naming conventions aren't entirely consistent, but once I've figured out the last 10 and have a complete view I can then align the naming accordingly.

    Click image for larger version  Name:	Screenshot 2025-07-26 at 10.34.26 AM.png Views:	0 Size:	194.7 KB ID:	313273
    Click image for larger version  Name:	Screenshot 2025-07-26 at 10.34.42 AM.png Views:	0 Size:	206.6 KB ID:	313275
    Click image for larger version  Name:	Screenshot 2025-07-26 at 10.34.54 AM.png Views:	0 Size:	179.9 KB ID:	313276
    Click image for larger version

Name:	Screenshot 2025-07-26 at 10.35.04 AM.png
Views:	168
Size:	30.7 KB
ID:	313272
    Last edited by karter16; 07-25-2025, 02:41 PM.

    Leave a comment:


  • karter16
    replied
    Came across the OBD2 readiness monitor functions today:

    This function passes a pointer to obd_check_monitor(). The pointer points to an array of bytes which list the DTCs that are applicable to the monitor in question. The DTCs are evaluated against stored status and the monitor status (ready or not) is returned.

    Click image for larger version

Name:	Screenshot 2025-07-23 at 10.38.36 PM.png
Views:	195
Size:	146.5 KB
ID:	312884

    Leave a comment:


  • karter16
    replied
    Awesome thanks for that - I haven't had a chance to go through the log you sent in detail yet, but what you've posted there makes sense. The frame is exactly the same for either bank, just bank 1 sent on 0x700 and bank 2 on 0x701.

    Will be super interesting to see what you get if you can cause some knock. As I mentioned I *think* that byte 1 is the amount of retardation being applied for the cylinder - will be interested to see what you get.

    Leave a comment:


  • Bry5on
    replied
    So it looks like the 0x03+ message format is the same for both IDs 0x700 and 0x701

    For Byte 0
    bits 0-2: cylinder ID (0x700 only reports 001, 010, 011 and 0x700 only reports 100, 101, 110 as expected)
    bit 3: no function (for MSS54/HP, this is probably used in the V8 M5 though to ID cylinder 8)
    bit 4: knock detected (1 for knock detected)
    bit 5: no function identified yet. Could be related to bit 4 with a type of knock detection state.
    bits 6 and 7: some sort of evaluation state. So far I only see values of 11 and 00, where the transition happens after cranking the engine. Probably ‘engine running’ or something similar.

    I have a datalog recorded that I’ll need to parse tonight to evaluate the other Bytes.

    I’ve also flashed a new file to my car with some extra ignition advance to see if I can trip some knock.
    Last edited by Bry5on; 07-17-2025, 12:24 PM.

    Leave a comment:


  • karter16
    replied
    Originally posted by ac427 View Post

    Is there likely to be other information that maybe enabled for broadcast on the CAN bus, already in the 0401 code?
    Not really - the only ARBID on the main canbus that I haven't entirely figured out yet is 0x770 and that seems to be a mechanism to jump to whatever this sort of multi-frame mechanism is for transferring memory blocks. It's more of a development/memory transfer function I believe than for transmitting values in the traditional sense. I am super curious as to exactly how it works but I don't think it's going to suddenly open up some sort of general mechanism for retrieving more values.

    Leave a comment:


  • karter16
    replied
    Originally posted by Chris_de View Post
    Someone in the old forum already found the message that could be sent on the smg can bus. But detailed information wasn’t published by the time.
    Yes I actually remember reading those posts - I'll publish all of that as well when I get the time to go through it, at the moment am trying to round out the main canbus and get all that documented first.

    Leave a comment:


  • ac427
    replied
    Originally posted by karter16 View Post
    A few weeks ago Bry5on and I briefly discussed that it would be useful, for the purposes of tuning, to be able to broadcast and log knock data over CAN as it requires a per-segment data rate which far surpasses DS2. It turns out that BMW's engineers thought this was a good idea too!

    In working through all of the CAN functions, last weekend I uncovered that the purpose of ARBID's 0x700 and 0x701 is to broadcast pre-constructed frames from the Knock Manager module. The messages are turned off by default in the 0401 partial, however various configurations can be enabled by setting K_KA_CAN_AUS.

    With nam3forum being down at the time I excitedly fired off an email to Bryson and he was able to quickly check that he could receive messages, along with validating the contents of the messages. My original interpretation based on having quickly looked at it was that ARBID 0x700 was for bank 1 and ARBID 0x701 was for bank 2. What Bryson found from testing was that all cylinders were being broadcast on 0x700. Further investigation of the code reveals that 0x701 appears to only be used in certain configurations (Bryson will test this and confirm back).

    Exciting to have uncovered this and very useful to have access to these messages for tuning. Presumably these messages are a leftover from when BMW's engineers were tuning the S54.

    Here's what we currently have (will continue to amend and update as we uncover and test more):

    Click image for larger version  Name:	Screenshot 2025-07-17 at 12.48.30 PM.png Views:	12 Size:	261.7 KB ID:	312281
    Click image for larger version  Name:	Screenshot 2025-07-17 at 12.48.36 PM.png Views:	12 Size:	264.9 KB ID:	312282
    Click image for larger version  Name:	Screenshot 2025-07-17 at 12.48.40 PM.png Views:	12 Size:	260.1 KB ID:	312283
    Is there likely to be other information that maybe enabled for broadcast on the CAN bus, already in the 0401 code?

    Leave a comment:


  • Chris_de
    replied
    Someone in the old forum already found the message that could be sent on the smg can bus. But detailed information wasn’t published by the time.

    Leave a comment:


  • karter16
    replied
    A few weeks ago Bry5on and I briefly discussed that it would be useful, for the purposes of tuning, to be able to broadcast and log knock data over CAN as it requires a per-segment data rate which far surpasses DS2. It turns out that BMW's engineers thought this was a good idea too!

    In working through all of the CAN functions, last weekend I uncovered that the purpose of ARBID's 0x700 and 0x701 is to broadcast pre-constructed frames from the Knock Manager module. The messages are turned off by default in the 0401 partial, however various configurations can be enabled by setting K_KA_CAN_AUS.

    With nam3forum being down at the time I excitedly fired off an email to Bryson and he was able to quickly check that he could receive messages, along with validating the contents of the messages. My original interpretation based on having quickly looked at it was that ARBID 0x700 was for bank 1 and ARBID 0x701 was for bank 2. What Bryson found from testing was that all cylinders were being broadcast on 0x700. Further investigation of the code reveals that 0x701 appears to only be used in certain configurations (Bryson will test this and confirm back).

    Exciting to have uncovered this and very useful to have access to these messages for tuning. Presumably these messages are a leftover from when BMW's engineers were tuning the S54.

    Here's what we currently have (will continue to amend and update as we uncover and test more):

    Click image for larger version

Name:	Screenshot 2025-07-17 at 12.48.30 PM.png
Views:	106
Size:	261.7 KB
ID:	312281
    Click image for larger version

Name:	Screenshot 2025-07-17 at 12.48.36 PM.png
Views:	98
Size:	264.9 KB
ID:	312282
    Click image for larger version

Name:	Screenshot 2025-07-17 at 12.48.40 PM.png
Views:	97
Size:	260.1 KB
ID:	312283

    Leave a comment:

Working...
X