Alright so knowing roughly how BMW generally handled things in PT6 and what messages come from where here's how I believe the flow of info is in the M3. I'll confirm shortly when I get mine (hopefully it's functional enough.)
BMW will not [I think] have multiple modules look for the M button press. Since it's momentary the issue is that if one module misses it then the car will have mis matched settings. I think that's the point of 0x399.. it reads the button presses, then has a steady indicator of M Drive on/off that all the other modules will use as a known good state. Everything that takes a momentary input will be read in by only one module, then that module will output it's new settings and cascade from there.
- Initial state:
- DME is broadcasting M Drive and M Power off in 0x399
- DKG is broadcasting it's current DriveLogic/Sport mode in 0x1D2
- DSC is broadcasting it's current state in 0x19E (to be confirmed)
- FRM is looking at 0x399 to determine Power Button light
- KOMBI is looking at 0x399 for the M light, 0x19E for DSC status, and 0x1D2 for DL setting
- You set your M Drive settings in the iDrive:
- CCC_GM will change the 0x3CA (format TBD) packet to broadcast the current desired M Drive settings
- You press the M button the steering wheel:
- SZL broadcasts this press in 0x1D9 (exactly where is TBD)
- DME sees this press, grabs the pertinent data from 0x3CA, then advertises new M Drive and M Power status on 0x399
- DKG sees the M Drive is on in 0x399, grabs the DL state from 0x3CA, then advertises new DL state in 0x1D2
- DSC sees the M Drive in on in 0x399, grabs the DL state from 0x3CA, then advertises new DSC state in 0x19E
- FRM updates lights
- KOMBI updates indicators
I'm thinking the path to success for a non-M car with M modules and everything is very likely going to be making a module that reads some button press, and broadcasts 0x3CA with the desired settings, and 0x399 as the trigger to adopt those settings. A good trigger for this would probably be the sport button, as that's in 0x198 from the GWS and could easily be picked up by the CAN. I believe the non-M KOMBI can be coded to display the DL settings and DSC modes but I doubt it'll have the green M indicator.
The only issue I could see may be the translation between the CAN busses by the JBFF, I'm not sure how it determines what packets to pass on but it definitely acts like a firewall between the busses.
DSC is broadcasting it's current state in 0x19E (to be confirmed) <-- i can confirm this exists in my old canbus logs
can id also matches with what i found in tool32 for the dsc
SZL broadcasts this press in 0x1D9 (exactly where is TBD) <-- jbbf is responsible for sending the 0x1D9 after receiving the keypress from szl as szl does not have a direct connection to pt-can per the docs i have seen
according to the pdf docs available on google for e90 m3 mdrive, the center console buttons (6/7/8) and steering wheel buttons (9) are connected directly to the jbbf and talks to dme eng egs through pt-can