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 ac427 View Post

    What difference did you notice with k_rf_cfg to 0x02, poor part throttle performance?
    Yep less responsive part throttle and more jerkiness. Exactly the same effect as disconnecting (electrically) the MAP sensor and going for a drive.

    Leave a comment:


  • ac427
    replied
    Originally posted by karter16 View Post
    Today I finally got round to trying setting k_rf_cfg to 0x02 (from 0x12) to take the MAP sensor out of the final RF calculation path.

    The result is that the car behaves and drives in the same way as if the MAP sensor is physically disconnected. The car runs in AlphaN + TABG adjustment mode.

    I didn't personally have any doubt that this would be the case (although I know others did), but good to prove this. I think I mentioned previously that it seems like this would be good practice to take the MAP sensor out of the RF calculation path when doing the VE tuning process. I can't think of an objective way to measure this though. If anyone has any ideas I'm all ears!
    What difference did you notice with k_rf_cfg to 0x02, poor part throttle performance?

    Leave a comment:


  • karter16
    replied
    Today I finally got round to trying setting k_rf_cfg to 0x02 (from 0x12) to take the MAP sensor out of the final RF calculation path.

    The result is that the car behaves and drives in the same way as if the MAP sensor is physically disconnected. The car runs in AlphaN + TABG adjustment mode.

    I didn't personally have any doubt that this would be the case (although I know others did), but good to prove this. I think I mentioned previously that it seems like this would be good practice to take the MAP sensor out of the RF calculation path when doing the VE tuning process. I can't think of an objective way to measure this though. If anyone has any ideas I'm all ears!

    Leave a comment:


  • karter16
    replied
    Continuing on with the MAP sensor work. I'll write this up properly and put it in the MAP sensor wiki, but for now here's the disassembled code listing. This is the function that takes the raw MAP sensor AD values from the ring buffer and calculates MAP pressure and manifold vacuum pressure.

    It really would be very nice to have the actual parameter/variable names, but you'll have to suffer through my made up names (identified as all lowercase) :-)

    Key things of note:
    - The code loops through the ring buffer every time it runs and pulls and averages a number of valid samples (by default it's actually only 1 valid value that it samples).
    - It then takes the raw value and offsets it and scales it according to the MAP scaler and offset parameters that have been known for some time.
    - Manifold vacuum pressure is calculated as P_UMG (ambient pressure from the on-DME pressure sensor) minus MAP pressure.
    - The function runs in both the segment task and the 10ms task.


    Click image for larger version

Name:	Screenshot 2025-04-04 at 7.48.16 AM.png
Views:	299
Size:	157.7 KB
ID:	300283
    Click image for larger version

Name:	Screenshot 2025-04-04 at 7.48.27 AM.png
Views:	279
Size:	190.6 KB
ID:	300284

    Leave a comment:


  • karter16
    replied
    This one is interesting. This (function at 0x00011e3c) is a debug function that runs in the background task. It tracks the time in milliseconds since the function last run and captures the longest time in DB_TBGND_MAX and the average in DB_TBGND_AV. This would have been useful during development as the BMW engineers were adding to the codebase to monitor the system and make sure that the CPU was getting to the background task regularly enough.

    Click image for larger version

Name:	Screenshot 2025-04-02 at 8.32.58 PM.png
Views:	183
Size:	54.9 KB
ID:	300070

    Leave a comment:


  • karter16
    replied
    0x00ffeb36 is the 32 bit telegram from the MFL to the DME with the cruise control buttons status. This variable in turn is populated from the TPU config RAM (0x00ffff08) which is a shared RAM section between the DME and the TPU to allow transfer of data. The TPU facilitates the one-wire serial interface to the MFL.

    Section 8.3.2 in 3.05 EGAS Safety Concept in the funktionsrahmen describes how this works and it seems that this is pretty much how it's implemented in the code as well. The safety concept code is really interesting to dig into and seems in general to be pretty close to how it's documented in the funktionsrahmen.

    Leave a comment:


  • karter16
    replied
    0x00ffe508 and 0x00ffe50a appear to be "total count of interrupts" and "number of interrupt service routines currently in progress" (note it is possible for this to be greater than 1 as a higher priority interrupt will "interrupt" a lower priority ISR) respectively.

    I've named these "sys_interrupt_counter" and "sys_active_interrupts".

    edit: renamed to sys_isr_count to mirror BMW's naming of CAN_ISR_COUNT
    Last edited by karter16; 03-29-2025, 10:32 PM.

    Leave a comment:


  • karter16
    replied
    If anyone has any info about these 4 curves it would be super useful to know. From the code I I've worked through so far I *think* that 0xe708 and 0xe732 respectively are possibly representing molar mass of the residual gas mix based on camshaft position, but not overly confident about that yet.

    Click image for larger version

Name:	Screenshot 2025-03-23 at 7.54.58 AM.png
Views:	237
Size:	7.4 KB
ID:	298726

    Leave a comment:


  • karter16
    replied
    These are all of the parameters from the master binary which we currently don't have the actual names for. For anyone who's wondering the addresses below are as the prog binary references them, so the actual addresses in the partial would be the value below minus 0x80000. e.g. 00088826 would be 0x8826.
    00088826
    00089840
    00089a4c
    0008a6c5
    0008a97a
    0008a97c
    0008a97e
    0008a9a2
    0008a9a3
    0008a9a4
    0008a9a6
    0008a9a8
    0008a9aa
    0008c354
    0008c35a
    0008c35c
    0008c376
    0008c378
    0008c37a
    0008c37b
    0008c37c
    0008c37e
    0008c380
    0008c382
    0008c384
    0008c3db
    0008c558
    0008c55a
    0008c55c
    0008c56c
    0008c56e
    0008c582
    0008c59e
    0008c5ba
    0008c5e6
    0008c682
    0008d000
    0008d002
    0008d201
    0008d202
    0008d204
    0008d205
    0008d220
    0008d222
    0008d2ee
    0008d2f0
    0008d2f2
    0008d2f4
    0008d2f6
    0008d2f8
    0008d2fa
    0008d2fc
    0008d716
    0008db30
    0008df4a
    0008dfac
    0008e056
    0008e088
    0008e08a
    0008e08c
    0008e08d
    0008e08e
    0008e25c
    0008e5e4
    0008e5e8
    0008e5ea
    0008e5ec
    0008e5ed
    0008e5ee
    0008e5f0
    0008e5f2
    0008e5fa
    0008e5fc
    0008e5fe
    0008e600
    0008e602
    0008e604
    0008e61e
    0008e638
    0008e69a
    0008e69c
    0008e69e
    0008e6a0
    0008e6a2
    0008e6a4
    0008e6c6
    0008e6ce
    0008e6d0
    0008e6d2
    0008e6d4
    0008e6d6
    0008e708
    0008e732
    0008e764
    0008e7ae
    0008e8fe
    0008e918
    0008e91a

    And these are all the parameters from the slave binary which we currently don't have actual names for. I've included all the SMG parameters (0008a8xx to 0008aexx) which are missing actual names as well. Not sure if anyone has those, but thought I'd include them for completeness. To convert the below addresses to the offset in the partial it's what's below minus 0x88000. e.g. 0008808a would be 0x008a.
    0008808a
    0008903f
    0008a1da
    0008a1dc
    0008a1de
    0008a1df
    0008a1e0
    0008a1e2
    0008a1e4
    0008a1fa
    0008a1fc
    0008a1fe
    0008a200
    0008a202
    0008a204
    0008a206
    0008a228
    0008a24a
    0008a24c
    0008a24e
    0008a251
    0008a252
    0008a253
    0008a254
    0008a255
    0008a256
    0008a258
    0008a259
    0008a25a
    0008a25c
    0008a25e
    0008a260
    0008a262
    0008a263
    0008a264
    0008a265
    0008a80e
    0008a811
    0008a814
    0008a816
    0008a817
    0008a818
    0008a819
    0008a81a
    0008a81b
    0008a81c
    0008a81e
    0008a821
    0008a824
    0008a826
    0008a82a
    0008a82c
    0008a830
    0008a832
    0008a838
    0008a83c
    0008a83d
    0008a840
    0008a842
    0008a844
    0008a846
    0008a848
    0008a84a
    0008a84c
    0008a850
    0008a852
    0008a853
    0008a856
    0008a85a
    0008a85e
    0008a860
    0008a862
    0008a865
    0008a866
    0008a867
    0008a883
    0008a88a
    0008a88c
    0008a88d
    0008a896
    0008a898
    0008a89c
    0008a89d
    0008a8a2
    0008a8b8
    0008a8ba
    0008a8c4
    0008a8d4
    0008a8e2
    0008a918
    0008a96e
    0008a9a0
    0008a9aa
    0008a9b4
    0008a9be
    0008a9cc
    0008a9da
    0008aa30
    0008aa44
    0008aa52
    0008aad2
    0008aadc
    0008aae4
    0008aeb4
    0008e706
    0008e707
    Attached Files

    Leave a comment:


  • karter16
    replied
    ppm008 really appreciate your help - any chance I could list out all the parameter addresses I'm working on and see if you've got details for any others? I've come up with names for a bunch but if it's possible to confirm the actual names that would be even more ideal. (don't want to bug you too much though so feel free to say no!)

    Leave a comment:


  • karter16
    replied
    Originally posted by ppm008 View Post
    8a980 KL_TANM_PT1_INIT
    8e5f4 K_RF_DIAG_F_KATH
    8e5f6 K_RF_DIAG_F_VAN
    8e5f8 K_RF_DIAG_SCHWELLE
    8e848 KF_RF_KORR_DRREL
    8e6c8 K_RG_R
    8e6ca K_RG_V_HUB
    8e6cc K_RG_ZYLANZ_BANK
    Amazing - thank you so so much!


    Sent from my iPhone using Tapatalk

    Leave a comment:


  • ppm008
    replied
    8a980 KL_TANM_PT1_INIT
    8e5f4 K_RF_DIAG_F_KATH
    8e5f6 K_RF_DIAG_F_VAN
    8e5f8 K_RF_DIAG_SCHWELLE
    8e848 KF_RF_KORR_DRREL
    8e6c8 K_RG_R
    8e6ca K_RG_V_HUB
    8e6cc K_RG_ZYLANZ_BANK

    Leave a comment:


  • ac427
    replied
    Originally posted by karter16 View Post
    I'm continuing to make good progress. I've now understood and named about 70 of the 112-odd CSL specific parameters. The names are of course my best guess as to what they would logically be named based on what I can figure out from BMW's naming convention. Unless anyone who has access to the actual names of these parameters is willing to share then my made-up names will have to do :-)

    There's about 40 more parameters which I'm still working through to establish their purpose and what they should be called, but I'm very pleased with how it's going. I'm categorizing as I go (as can be seen in the screenshot below), which shows the modules which contain changes for 0401.
    Great work as always mate.

    Leave a comment:


  • karter16
    replied
    I'm continuing to make good progress. I've now understood and named about 70 of the 112-odd CSL specific parameters. The names are of course my best guess as to what they would logically be named based on what I can figure out from BMW's naming convention. Unless anyone who has access to the actual names of these parameters is willing to share then my made-up names will have to do :-)

    There's about 40 more parameters which I'm still working through to establish their purpose and what they should be called, but I'm very pleased with how it's going. I'm categorizing as I go (as can be seen in the screenshot below), which shows the modules which contain changes for 0401.

    Click image for larger version

Name:	Screenshot 2025-03-20 at 9.47.07 PM.png
Views:	242
Size:	284.7 KB
ID:	298465

    Leave a comment:


  • karter16
    replied
    I've renamed the function "calculate_pressure_from_air_mass()" in my previous post to "p_egbp_calc()" given, as I've been working through everything, I've identified that this function is looking up a value for exhaust gas back pressure.

    This is the function with parameter and variable names that make sense:

    Click image for larger version

Name:	Screenshot 2025-03-14 at 6.15.12 PM.png
Views:	263
Size:	171.3 KB
ID:	297810

    The function looks up a curve which provides an estimated value of exhaust gas back pressure based on current ML (air mass flow).

    This value is relative (e.g. it's just the back pressure component). so this is then added to P_UMG_FILTER (ambient air pressure) to get an absolute exhaust gas back pressure measurement.

    This value is filtered through a PT1 filter and then checked for max/min values for plausibility, before returning.

    Here's what the parameters look like:

    Click image for larger version

Name:	Screenshot 2025-03-14 at 6.18.02 PM.png
Views:	251
Size:	41.4 KB
ID:	297811


    The calculated value p_egbp is then used in the calculation of rg_m.

    Leave a comment:

Working...
X