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
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
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
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
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
I donít know how well this would work with any other Toyota Stereo, but
hereís everything you need to build this project:
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
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
Back to main index