IPOD 3G Accessory Protocol





This document describes the serial protocol used by the orginal iPod remote , the different Voice Recorders, and maybe for the Alpine and BMW Car Adapters.

With this information you are able to

The G3 protocol


I only own a 3G model so i'm not able to verifiy this for the 4G model. But it should work also on 4G models
The format is a standard 8N+1 serial structure which means 1 startbit 8 databits no parity bit and 1 stopbit
the usual baud rate is 19200 baud. But it seems to work also on higher rates.
The iPod communication is done in strings.

This is the frame for each string.
0xFF 0x55 0x00 0x00
A B C D
A A is always 0xFF
B B is always 0x55
C C gives the number of data bytes between C and D
D D is the checksum always the last byte


These are the commands which are used by the original iPod Remote:

Button
String
Play/Pause
0xFF 0x55 0x03 0x02 0x00 0x01 0xFA
Vol+ 0xFF 0x55 0x03 0x02 0x00 0x02 0xF9
Vol- 0xFF 0x55 0x03 0x02 0x00 0x04 0xF7
Skip>> 0xFF 0x55 0x03 0x02 0x00 0x08 0xF3
<<Skip 0xFF 0x55 0x03 0x02 0x00 0x10 0xEB
End Button 0xFF 0x55 0x03 0x02 0x00 0x00 0xFB

As you can see C is for each of the Remote commands 0x03 because there are 3 databytes ( 0x02 0x00 0x01 for Play/Pause ). D is the checksum which is the number you have to add to the sum of the databytes ( 0x02 0x00 0x01 for Play/Pause ) plus the C byte to get an even multiple of 0x100.
For our Play Pause example: 0x02 + 0x00 + 0x01 + 0x03(C) + 0xFA(D) =0x100.

Connection

For the remote connector schematics look at the maushammer page
For the dock pinout of the serial connector take a look at partial dock pinout You should also use the setttings shown on the maushammer page for baudrate, character size, etc..

The Voice Recorder Mode

The first bitpattern you have to send to the iPod is 0xFF 0x55 0x03 0x00 0x01 0x01 0xFB.

-> The menu switches to the /Extras/Voice Memos/Record Now Folder.
Voice Memos / record now
Now you can choose between record and cancel. If you select Record the iPod is sending a request to check if there is an compatible microphone attached.
This request is 0xFF 0x55 0x02 0x00 0x00 0xFE You have to answer it again with 0xFF 0x55 0x03 0x00 0x01 0x01 0xFB to start recording.

iPod is recordingg
Until the iPod is starting recording the bitpattern 0xFF 0x55 0x02 0x01 0x00 0xFD gets send. This might tell the external device that recording has started.
If you pause or stop the recording 0xFF 0x55 0x02 0x01 0x01 0xFC might signal the external device the end or the pausing of the recording.

Because i had no microphone, i was using my sony headphones. The quality of the recording was not very good but it makes clear that a usual microphone would work. Overview:
Overview
Key press on iPod Data to ipod Data from ipod Reaction
0xFF 0x55 0x03 0x00 0x01 0x01 0xFB iPod switches to Voice Memos record now
Record 0xFF 0x55 0x02 0x00 0x00 0xFE iPod is waiting for correct answer
0xFF 0x55 0x03 0x00 0x01 0x01 0xFB
0xFF 0x55 0x02 0x01 0x00 0xFD iPod is starting recording
Pause 0xFF 0x55 0x02 0x01 0x01 0xFC iPod is pausing or has stoped recording
Resume 0xFF 0x55 0x02 0x01 0x00 0xFD iPod is resuming recording
Note.you are only responsible to send the green commands. The red commands are firmware based you only have to listen to them and to react as required.

Advanced iPod Remote (AiR)

If you want to receive artistname, albumname, songname or any other extra information you have to set the iPod in AiR Mode.

Send 0xFF 0x55 0x03 0x00 0x01 0x04 0xF8 for AiR Mode


This "ok to disconnect" message will last until you disconnect the serial lines from the iPod.This makes the iPod display useless in the AiR Mode. The only way i found to prevent the iPod to show this "ok to disconnect" image is to send the command before the iPod is in a specific playlist (after a reboot) and to send Play/Pause. However in both cases you are not able to use the iPod keys or the wheel.

The useful commands in AiR mode

CNum Command description String Answer
1 Get the iPod Name 0xFF 0x55 0x03 0x04 0x00 0x14 0xE5 0xFF 0x55 0x1C 0x04 0x00 0x15 0x69 0x50 0x6F 0x64 0x20 0x76 0x6F 0x6E 0x20 0x43 0x68 0x72 0x69 0x73 0x74 0x6F 0x70 0x68 0x20 0x45 0x64 0x6C 0x65 0x72 0x00 0xEC
2 Time an status information 0xFF 0x55 0x03 0x04 0x00 0x1C 0xDD 0xFF 0x55 0x0C 0x04 0x00 0x1D 0x00 0x03 0x95 0x3E 0x00 0x00 0x0F 0xAE 0x02 0x3E
3 Get current position in current playlist 0xFF 0x55 0x03 0x04 0x00 0x1E 0xDB 0xFF 0x55 0x07 0x04 0x00 0x1F 0x00 0x00 0x00 0x01 0xD5
4 Get number of songs in current playlist 0xFF 0x55 0x03 0x04 0x00 0x35 0xC4 0xFF 0x55 0x07 0x04 0x00 0x36 0x00 0x00 0x06 0x95 0x24
5 Get songtitle 0xFF 0x55 0x07 0x04 0x00 0x20 0x00 0x00 0x00 0x00 0x00 0xFF 0x55 0x11 0x04 0x00 0x21 0x54 0x68 0x65 0x20 0x53 0x63 0x69 0x65 0x6E 0x74 0x69 0x73 0x74
6 Get artistname 0xFF 0x55 0x07 0x04 0x00 0x22 0x00 0x00 0x00 0x00 0x00 0xFF 0x55 0x0C 0x04 0x00 0x23 0x43 0x6F 0x6C 0x64 0x70 0x6C 0x61 0x79 0x00 0x95
7 Get albumname 0xFF 0x55 0x07 0x04 0x00 0x24 0x00 0x00 0x00 0x00 0x00 0xFF 0x55 0x1F 0x04 0x00 0x25 0x41 0x20 0x52 0x75 0x73 0x68 0x20 0x4F 0x66 0x20 0x42 0x6C 0x6F 0x64 0x20 0x54 0x6F 0x20 0x54 0x68 0x65 0x20 0x48 0x65 0x61 0x64 0x00 0x1A
8 Jump to song 0xFF 0x55 0x07 0x04 0x00 0x28 0x00 0x00 0x00 0x05 0x00 0xFF 0x55 0x06 0x04 0x00 0x01 0x00 0x00 0x28 0xCD
9 Jump to song (V2) 0xFF 0x55 0x07 0x04 0x00 0x37 0x00 0x00 0x00 0x00 0x00 0xFF 0x55 0x06 0x04 0x00 0x01 0x00 0x00 0x37 0xBE
10 Go to Mainplaylist 0xFF 0x55 0x07 0x04 0x00 0x16 0x00 0x00 0x00 0x00 0xE3 0xFF 0x55 0x06 0x04 0x00 0x01 0x00 0x00 0x16 0xDF

  1. Get iPod Name: The iPod will send the name you gave your iPod. From the 7th byte (0x69) of the receiving String. In my example it's "iPod von Christoph Edler"

  2. Time and status information: will give from the 7th Byte 8 Bytes with time information the first four bytes (7 - 10) give the time which has passed in the current song (in milliseconds), (11 - 14) show the whole time of the current song (in milliseconds) the 15th byte gives the status of the playback 0x00 Stop 0x01 Pause 0x02 Play

  3. Get current position in current playlist: Gives a number indicating the current position in the playlist Byte (7 - 10)

  4. Get number of songs in current playlist: Gives a number representing the number of songs in the playlist

  5. Get songtitle: You have to send the number in the playlist for the song you are requesting the songname Byte (7 - 10) in the send string. In my example i'm asking for the 0x00 0x00 0x00 0x00 song (the first song). The String from the iPod contains from the 7th Byte on the songtitle.("The Scientist" in my example)

  6. Get artistname: You have to send the number in the playlist for the song you are requesting the artistname Byte (7 - 10) in the send string. In my example i'm asking for the 0x00 0x00 0x00 0x00 song (the first song). The String from the iPod contains from the 7th Byte on the artistname.("Coldplay" in my example)

  7. Get albumname: You have to send the number in the playlist for the song you are requesting the albumname Byte (7 - 10) in the send string. In my example i'm asking for the 0x00 0x00 0x00 0x00 song (the first song). The String from the iPod contains from the 7th Byte on the albumname.("A Rush Of Blood To The Head" in my example)

  8. Jump to song: You have to send the number in the playlist for the song you want to jump to Byte (7 - 10) in the send string. In my example i'm jumping to the 0x00 0x00 0x00 0x05 song (the sixth song). If you are already playing the requested song the jump will be a skip to the begining of the song.

  9. Jump to song (V2): The only difference to the jump in number 8 is that number 8 is a unconditional jump. If you are already playing the requested song the jump will lead to nothing.

  10. Go to Mainplaylist: If you are in a playlist not containing all songs on the iPod this command and a jump to a specific song will switch to the playlist containing all files and start to play the requested song in the jump command.


The answers from command 1 to 7 have a special feature, byte 6 is always byte 6 of the sent command +1. 0x22 -> 0x23 for the Get songtitle

Some thoughts on the playlist switching issue:
I think the free playlist selection is done by a command i was not able to discover yet. But i think this would be done like the jumps to specific songs the question is how is the target specified. I think this is done with the iTunes database stored on the iPod. In the database each playlist must be connected with a unique identifier. But this makes an usb or firewire synchronisation necessary to receive the database.But as far as i know this is down each time you plug in the iPod in the BMW Adapter.

Contact:

e0026607@student.tuwien.ac.at