Toyota Stereo to Bluetooth Bridge: Aftermarket Car Parts from Scratch

Written 5/6/2019

I took apart some cheap Bluetooth headphones in January of 2018 and tried to figure out what made them tick. It turned out that all the Bluetooth communication was done by a single chip. The BK8000L is actually really inexpensive, so I ordered a couple of modules to experiment with. I thought that integrating one of these little modules into my car stereo would be a fun and easy way to get my feet wet with Bluetooth.

Every part of this assumption was wrong.

The first step to integration is to see what kinds of inputs and outputs I have between these two systems. The BK8000L has a differential stereo output which is almost ready for a 3.5mm stereo jack. Itís also got some basic button inputs for volume and playback control. If you want to get fancy with it, the module also accepts commands and questions over UART.

The head unit is much less forgiving. I took out my Toyota Corollaís head unit and stripped it to pieces to see if there was any place that I could attackÖ but I found nothing that was easy to work with. I thought there would be some unused audio lines that I could tap in to, but all I found was a proprietary jack on the back side.

This jack has been explored a bit online. I found that the TX+ and TX- lines are speaking AVC LAN. This protocol is proprietary, nearly undocumented, and seems to get a major overhaul every few years. You can read almost every known thing about it here. I searched the web and only found a few documented attempts to use this jack. What caught my attention is that sending the right code to the head unit can enable an auxiliary audio input.

So hereís my plan of attack: I get a microcontroller to read the AVC bus. I use this microcontroller to log the types of messages that I find there and then I try to talk back to the head unit. I tell the head unit that I want to use the aux line. Finally, I tell the BK8000L to start playing some music into the aux jack.

Getting my Arduino to read from the AVC bus was very simple and took me only a few days. Writing to the AVC bus took me eleven months. I had never worked with digital circuits before, so Iíll allow myself the learning time.

Thereís two main things that make the AVC communication so difficult. Firstly, the bus is differential: information exists in the difference between the lines instead of the difference between a line and ground.

The second major problem is the way the information is encoded. Each pulse on the bus signifies a bit, and the length of the pulse determine whether that bit should be understood as a zero or a one. Thereís a lot more to it than that, but thereís the gist.

Getting an Arduino to read from a differential bus is pretty tricky. My initial method was to use bias resistors and get the differential lines to cross over each other when a message comes through. Then the Atmega328p's internal analog comparator could detect the pulses. Unfortunately that relies on a really steady bias voltage, and I haven't found my car battery to be terribly steady.

Another thing that I tried was to use an op-amp and build a differential amplifier. I'd never used an op-amp up to that point so I'm proud to say that I got it working quickly. However, the peak-to-peak voltage was only one volt. That wasn't enough for my TTL or LVTTL microcontrollers to read.

I ended up using an RS-485 differential transciever to do the heavy lifting on my behalf.

Even after getting the head unit to acknowledge me, I still needed to experiment around for a couple of days before I figured out how to earn its trust. The head unit seems to acknowledge whatever ĎAVC LAN compliantí message you give it, but it will only reply to special messages. I found one that gives me a burst of replies, and after that I can press the CD button on the head unit twice to enable the auxiliary stereo input.

This mode seems to be reserved for communications with an external CD changer. The head unit sends messages to the Arduino for almost every button I can press, so I can trigger the Arduino to take action automatically from all of these button presses.

At some point during all of this customization it occurred to me that it would have been much easier to just inject my Bluetooth audio into the CD audio lines. As long as I had a silent CD track playing I would have no problems. I decided against that, though. It seems like a much less graceful solution.

I donít know how well this would work with any other Toyota Stereo, but hereís everything you need to build this project:

Coming Soon!

It works perfectly on my 2006 Corolla and my dadís 2004 Tundra.

Many thanks to Louis Frigon, whose work was a wonderful template to work from. I got in contact with him after his website went down, and heís given me permission to re-host his work here. I donít claim to understand everything he did here, and his approach was just slightly different than what I've used, but what he has shared with me was instrumental to my success.

Click here to download Louis Frigon's AVC LAN project files.

Lastly I'll re-host the documentation for the BK8000L here since it's hard to come by. Thanks to Balaz Kelemen for keeping this all safe in the Google Group.

BK8000L Documentation

Back to main index