Toyota Expansion Board - Intro

21 February 2021

I’m an owner of a Toyota Corolla E12 from 2002, as of time of writing this post, it’s 19 years old. While old age doesn’t bother me (for a 19 years old car it’s insanely reliable and cheap to repair), multimedia capabilities does. Stock radio isn’t capable of either playing MP3s, play audio via Bluetooth or allow hands-free voice calls. Natural solution would be to replace stock radio with a more recent unit with all the features I needed - and that’s exactly what I did, but that wasn’t the end.


  1. Intro
  2. Design
  3. Hardware
  4. Software


Stock unit was a Toyota W58802 2-DIN radio with support for steering wheel remote. The last part is a key factor why I’ve been stuck with this unit for so long. While driving I almost exclusively use the remote to control the radio. Unfortunately Toyota uses AVC-LAN proprietary digital protocol to make remote talk to the radio unit - that’s a bit of a problem, because pretty much any 3rd-party radio won’t understand it (as far as ISO plug goes, it doesn’t even connect to AVC-LAN data lines). Most units implement remote control support with a dumb analog resistor ladder - and as far as I know, many car manufactures actually uses this type of design too (to be fair, I found information, that post-lift Corollas also uses resistor ladders) - that’s why there’s a good chance that if you replace stock unit with a custom one, it may work out of the box.

For a long time I was using an CD changer emulator - first one with SD card support and the second one with Bluetooth support. Both were advertised as ones supporting the stock remote - and they kinda supported it, except they didn’t. With first one, you could change track up, but not down, with the second one you could answer a call but you couldn’t hang up. Both had a fatal flaw - they had a nasty habit of randomly locking up (either stuck on playback or simply dropping communication with the radio). Getting third one just to test it was simply too much for me (combined cost of three emulators would equal to decent 2DIN radio). I decided it is time to replace the unit so I started looking what’s available.

First few searches made me realise that the market is flooded with cheap chinese Android-based units. I didn’t want to get those, because they looked awful and I was afraid of getting something that wasn’t properly designed to be used in a car. That led me to well-known vendor of 3rd-party units - Pioneer. My basic requirement was Bluetooth support and Pioneer was able to deliver - I found DMH-G220BT with Bluetooth Audio and wired remote support (though not the kind I had in Corolla). I found a radio, but I still needed a remote. Since I was stuck with AVC-LAN-based one, those were my options:

  1. Give up a remote.
  2. Replace a remote with wireless one.
  3. Make a translator.
  4. Make a new remote and stick it into old’s one body.

Option 1 was a out of the question, option 2 seemed like a workaround, not a fix. Options 3 would be a bit tricky, because I would need to tap into AVC-LAN bus, implement (undocumented) proprietary protocol and pass it as analog signal back to Pioneer. Seems doable, but the effort needed to work around the protocol was my main concern. By elimination, I wound up with a task of creating my own remote.

While searching the Internet for information about Pioneer wired remotes, you most probably would find a table with resistors values and corresponding function that it triggers. There is no official documentation for this feature, but since its basic design principle is that given function is triggered by a specific voltage drop on signal line, it was very easy to reverse-engineer what voltage drop triggers desired function. By googling, I found that most units should support following actions:

  • Source change (Bluetooth / Radio)
  • Attention / Mute
  • Next track
  • Previous track
  • Tune up
  • Tune down
  • Volume up
  • Volume down
  • Band / escape
  • Phone book / Bluetooth menu
  • Answer call
  • Hang-up call

Multiple actions can be triggered by one button (target action depends on how long you press the button or the context), but my remote has only six buttons and it seemed that I would have to either give up some functions or somehow get more buttons - not an option if you want to keep the stock remote’s body. Button count constraint forced me to consider creating a middle-man that would read buttons, check for how long they were pressed and trigger specific action based on button timing precondition. All that with only four wires available, where two are VCC and GND.

That sounded like a challenge and a fun thing to do - so I decided to design and make such device. In following posts I’ll describe the process, components and end result.