Thank you for an excellent writeup! I have the same options as listed in the first post (except I only have the normal hifi stereo, not the pro). I now have bluetooth in my 2008 e91, and it works beautifully, with voice control and everything. The car even displays my phone's cellular signal strength, which I suppose would be handy if I had AT&T.
All in all, this took me quite a few hours. Most of that was research and getting the coding working (first time I've done any coding on any car). Here are my notes on the items that I had trouble with:
-During my first attempt at programming, the car started beeping and the wipers started going (slowly). I freaked out. Turns out I'd just drained the battery, like an idiot.
-I initially tried a cheap VAG cable, correctly reprogrammed for the ignition/battery pins. Didn't work. I had success with the $100 cable.
-In windows' device manager, I had to change the timeout latency to 1ms on the cable's com port. It was able to FA_WRITE the CAS before I did this, but couldn't do anything with the other modules.
-If your laptop is windows 7 and you're using XP mode, you may have to plug into a USB 2 port (as opposed to USB 3) before you can access the cable inside XP mode.
-Initially, I wasn't able to do anything to the MULF2 in NCS Expert. After I'd coded the other modules, bluetooth showed up in my settings, but clicking on the turn on bluetooth box did absolutely nothing. No check mark appeared, no error message, nothing.
-Inside NCS Expert, when attempting to "Process ECU" (such as the "2MULF"), NCS displays which files it needs in order to interact with that module. After many frustrations, I noticed that I was missing the file ULF2_HI.PRG. Once I'd obtained the file and put it in the correct folder, I was able to reset (SG_RESET) the MULF. I was not able to enact the SG_CODIEREN command on it. Immediately after resetting, though, bluetooth started working!
-While trying to get the coding to work, I reset the ECU that controls the sunroof. This caused the car to throw an error code - it needs to have the sunroof's travel distance calibrated, otherwise it can't tell the difference between pinching someone's fingers and being all the way closed. To fix this (with the sunroof and shade completely closed), I pressed up on the sunroof button and held for 2-3 minutes. After a while, everything opened all the way, and then closed all the way. This was its calibration procedure.
I believe the same applies to the windows - if you somehow lose the calibration data, it'll get upset, and a similar procedure will re-calibrate it.